2025/04/10

【AI】Dify x Ollama: ローカルPCの構築ガイド

Dify x Ollama: ローカルPCへの構築ガイド

大規模言語モデルを社内で安全に活用するためのステップバイステップガイド

はじめに

近年、大規模言語モデル(LLM)の活用が注目されています。しかし、外部APIへの依存やセキュリティ上の懸念から、社内でLLMを構築・運用したいというニーズが高まっています。本記事では、オープンソースのLLMフレームワークであるDifyと、ローカルLLM実行エンジンであるOllamaを組み合わせ、社内のローカルPCにLLM環境を構築する方法を解説します。この構築方法により、セキュリティを確保しつつ、柔軟かつ効率的にLLMを活用することが可能になります。

DifyとOllamaとは?

Difyは、LLMアプリケーションを構築するためのオープンソースフレームワークです。RAG(Retrieval-Augmented Generation)パイプラインを簡単に構築でき、多様なデータソースとの連携も可能です。一方、Ollamaは、ローカルPC上でLLMを簡単に実行できるツールです。コマンドラインインターフェースを通じて、様々なモデルをダウンロードし、実行できます。DifyとOllamaを組み合わせることで、ローカル環境でRAGアプリケーションを構築し、社内データに基づいたLLM活用を実現できます。

構築方法:Ollamaのセットアップ

まず、Ollamaを社内のローカルPCにインストールします。Ollamaの公式サイト(https://ollama.com)から、お使いのOSに合ったインストーラをダウンロードし、指示に従ってインストールしてください。インストールが完了したら、ターミナルを開き、`ollama --version`コマンドを実行して、Ollamaが正しくインストールされていることを確認します。次に、使用したいモデルをダウンロードします。例えば、Llama 2 7Bモデルをダウンロードするには、`ollama pull llama2`コマンドを実行します。モデルのダウンロードには時間がかかる場合があります。

Difyの構築:Difyをローカルで実行

次に、DifyをローカルPCに構築します。Difyは、Docker Composeを使用して簡単に構築できます。DifyのGitHubリポジトリ(https://github.com/dify-ai/dify)から、`docker-compose.yml`ファイルをダウンロードし、ローカルディレクトリに保存します。ターミナルを開き、`docker-compose up -d`コマンドを実行すると、DifyがDockerコンテナとして起動します。DifyのWebインターフェースにアクセスするには、ブラウザで`http://localhost:8000`を開きます。

DifyとOllamaの連携

DifyとOllamaを連携させるには、Difyの設定でOllamaをLLMプロバイダーとして指定します。DifyのWebインターフェースで、設定メニューを開き、LLMプロバイダーを選択します。Ollamaを選択し、Ollamaが起動しているローカルホストのアドレスとポートを指定します。これで、DifyからOllama経由でローカルLLMにアクセスできるようになります。

新しいモデルの導入

Ollamaを使用すると、新しいモデルを簡単に導入できます。Ollama Hub(https://ollama.com/library)から、使用したいモデルを選択し、`ollama pull <モデル名>`コマンドを実行してダウンロードします。ダウンロードが完了したら、Difyの設定で新しいモデルを選択することで、すぐに新しいモデルを使用できます。様々なモデルを試して、最適なモデルを見つけることをお勧めします。

マシンスペックについて

ローカルPCでLLMを実行するには、十分なマシンスペックが必要です。特に、GPUメモリとCPUメモリが重要です。大規模なモデルを使用する場合は、少なくとも16GB以上のGPUメモリと32GB以上のCPUメモリを推奨します。もし、マシンスペックが不足している場合は、より小さなモデルを使用するか、クラウドGPUを利用することを検討してください。今回構築した環境では、ある程度のスペックが必要となります。 もう少しマシンスペックが必要になる可能性も考慮し、余裕を持った構成を検討してください。

技術ブログのまとめ

本記事では、DifyとOllamaを組み合わせ、社内のローカルPCにLLM環境を構築する方法を解説しました。この構築方法により、セキュリティを確保しつつ、柔軟かつ効率的にLLMを活用することが可能になります。ぜひ、本記事を参考に、社内でLLM活用を推進してください。この技術ブログが、皆様のLLM活用の一助となれば幸いです。

この記事はAIによって作成されました。

2025/04/04

【生成AI】LangChain×Ollamaでgemma3:27b活用

ローカル最強!LangChain×Ollamaでgemma3:27b活用

1. 導入

生成AIアプリ開発は、クラウド環境が主流でしたが、近年、ローカル環境での開発が注目を集めています。ローカル環境で開発するメリットは、プライバシーの保護、オフラインでの動作、そしてコスト削減などが挙げられます。特に、高性能なローカルPCと適切なツールを組み合わせることで、クラウド環境と同等のパフォーマンスを実現することも可能です。この記事では、高性能GPU RTX-3090を搭載したローカルPCで、LangChainとOllamaを用いてgemma3:27bモデルを活用した生成AIアプリ開発について解説します。

2. OllamaとRTX-3090のセットアップ

Ollamaは、ローカルで大規模言語モデルを実行するためのツールです。RTX-3090のような高性能GPUを活用することで、高速な推論が可能になります。Ollamaのインストールは非常に簡単です。公式ドキュメントに従って、お使いのOSに合わせた手順でインストールしてください。インストール後、GPUが正しく認識されているか確認しましょう。確認方法は、OllamaのコマンドラインツールでGPU情報を表示することで確認できます。RTX-3090が認識されていれば、gemma3:27bのような大規模モデルの実行準備は完了です。

3. gemma3:27bの実行

Ollama上でgemma3:27bモデルを実行するには、以下のコマンドを実行します。ollama run gemma3:27b。初回実行時には、モデルのダウンロードが行われます。ダウンロード完了後、Ollamaの対話モードが起動し、gemma3:27bモデルと会話できるようになります。簡単な質問を投げかけて、正常に動作しているか確認しましょう。例えば、「今日の天気は?」と質問すると、gemma3:27bモデルが回答を生成します。GPUが正常に認識されていれば、高速な応答が期待できます。

4. LangChainによるアプリ開発

LangChainは、大規模言語モデルを連携させてアプリケーションを開発するためのフレームワークです。gemma3:27bモデルをLangChainに組み込むことで、より複雑な処理を実現できます。LangChainのインストールは、pip install langchainで簡単に行えます。LangChainでgemma3:27bモデルを使用するには、OllamaをLangChainのLLMとして設定します。設定後、LangChainのChainやAgentを使用して、gemma3:27bモデルを活用したアプリケーションを開発できます。例えば、質問応答システムや文章要約システムなどを開発できます。

5. プロンプト作成のコツ

生成AIの性能を最大限に引き出すためには、効果的なプロンプトを作成することが重要です。プロンプトは、AIに対する指示であり、AIの応答に大きな影響を与えます。プロンプトを作成する際には、明確で具体的な指示を与えるように心がけましょう。また、AIに役割を与えたり、文脈を与えたりすることも有効です。例えば、「あなたは優秀なアシスタントです。以下の質問に答えてください。」のように指示を与えることで、より適切な応答が期待できます。さらに、一度生成AIにプロンプトを作成してもらい、その内容を分析することで、より良いプロンプトを作成するためのヒントを得ることができます。AIがどのようなプロンプトを作成するのかを観察し、その傾向を把握することで、効果的なプロンプト作成スキルを向上させることができます。

6. まとめ

この記事では、高性能GPU RTX-3090を搭載したローカルPCで、LangChainとOllamaを用いてgemma3:27bモデルを活用した生成AIアプリ開発について解説しました。ローカル環境で開発するメリットは、プライバシーの保護、オフラインでの動作、そしてコスト削減などです。LangChainとOllamaを組み合わせることで、ローカル環境でも高性能な生成AIアプリを開発することが可能です。今後の展望としては、ローカル環境でのAI開発ツールがさらに充実し、より手軽にAIアプリを開発できるようになることが期待されます。また、より高性能なGPUが登場することで、ローカル環境でのAI開発の可能性がさらに広がることが予想されます。

この記事はAIが作成しました。

【iOS】2.3.10 performance: accurate metadata 対策

iOS審査リジェクト: 2.3.10 performance: accurate metadata 対策

AppleのiOSアプリ審査におけるリジェクト問題と、特に「2.3.10 performance: accurate metadata」によるリジェクト事例の徹底解説。

1. AppleのiOSアプリ審査

AppleのiOSアプリ審査は、ユーザーエクスペリエンスの向上とプラットフォームの品質維持を目的としていますが、その厳しさから、多くの開発者がリジェクトに悩まされています。特に、審査基準が明確に定義されていない場合や、審査員の解釈によって判断が異なる場合があり、リジェクト理由の特定や対策が困難になることがあります。本記事では、最近頻発している「2.3.10 performance: accurate metadata」によるリジェクト事例に焦点を当て、その原因と対策、そして審査に通過するためのポイントを解説します。

2. 問題の詳細

「2.3.10 performance: accurate metadata」とは、AppleのApp Store Review Guidelinesに記載されている、アプリのパフォーマンスと正確なメタデータに関する項目です。具体的には、アプリの説明、キーワード、スクリーンショットなどが、アプリの機能やコンテンツを正確に反映しているかどうか、そして、アプリのパフォーマンスがユーザーエクスペリエンスに悪影響を与えないかどうかを審査します。この項目に違反した場合、アプリはリジェクトされ、App Storeでの公開が遅れる可能性があります。審査ガイドラインでは、メタデータが誤解を招くものであったり、アプリの機能を誇張していたりする場合、または、アプリのパフォーマンスが低い場合、リジェクトされる可能性があると明記されています。

3. リジェクト事例の分析

実際にリジェクトされたアプリの事例を分析した結果、メタデータの不備が主な原因であることがわかりました。例えば、アプリの説明文が実際の機能と異なっていたり、キーワードがアプリのコンテンツと関連性がない場合、または、スクリーンショットが古いバージョンを表示していたりすることがあります。また、アプリのパフォーマンスが低い場合、例えば、起動時間が長かったり、動作が重かったりする場合、リジェクトされる可能性が高くなります。これらの事例から、メタデータの正確性とアプリのパフォーマンスが、審査において非常に重要な要素であることがわかります。

4. 対策と回避策

リジェクトを回避するためには、まず、App Store Review Guidelinesを熟読し、審査基準を理解することが重要です。次に、アプリの説明文、キーワード、スクリーンショットなどを、アプリの機能やコンテンツを正確に反映するように作成します。また、アプリのパフォーマンスを向上させるために、コードの最適化やUIの改善などを行います。さらに、アプリをリリースする前に、テスト環境で十分にテストを行い、問題がないことを確認します。これらの対策を行うことで、リジェクトのリスクを大幅に減らすことができます。

5. 競合プラットフォームとの比較

AndroidのGoogle Play Storeの審査と比較すると、iOSのApp Storeの審査はより厳格であると言えます。Google Play Storeでは、審査が比較的緩やかで、アプリの公開までの時間が短い傾向があります。一方、App Storeでは、審査が厳格で、アプリの品質やユーザーエクスペリエンスが重視されます。そのため、App Storeでアプリを公開するためには、より多くの時間と労力をかける必要があります。しかし、App Storeで公開されたアプリは、Google Play Storeのアプリよりも高品質であると評価される傾向があります。

6. 開発者へのアドバイス

iOSアプリ開発者は、審査に通過するために、以下の点に注意する必要があります。まず、App Store Review Guidelinesを常に最新の状態に保ち、審査基準の変更に迅速に対応する必要があります。次に、アプリの説明文、キーワード、スクリーンショットなどを、アプリの機能やコンテンツを正確に反映するように作成する必要があります。また、アプリのパフォーマンスを向上させるために、コードの最適化やUIの改善などを行う必要があります。さらに、アプリをリリースする前に、テスト環境で十分にテストを行い、問題がないことを確認する必要があります。これらの点に注意することで、審査に通過する可能性を高めることができます。

7. まとめ

今回のリジェクト事例から、メタデータの正確性とアプリのパフォーマンスが、iOSアプリ審査において非常に重要な要素であることがわかりました。開発者は、App Store Review Guidelinesを熟読し、審査基準を理解し、アプリの説明文、キーワード、スクリーンショットなどを、アプリの機能やコンテンツを正確に反映するように作成する必要があります。また、アプリのパフォーマンスを向上させるために、コードの最適化やUIの改善などを行う必要があります。これらの対策を行うことで、審査に通過する可能性を高め、高品質なアプリをApp Storeで公開することができます。

AIが作成しました

【MySQL】MySQL文字コード変更エラー

MySQL文字コード変更で「utf8 is not a compiled character set」エラー発生!原因と解決策を解説

発生した問題

古いサーバーでMySQLの文字コードをutf8からutf8mb4に変更しようとしたところ、MySQLにログイン時に以下のエラーが発生しました。

mysql: Character set 'utf8' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file

/usr/share/mysql/charsets/Index.xmlも設定変更済みであり、my.cnfも以下のように修正済みです。

[mysqld]
character-set-server = utf8mb4

[client]
default-character-set = utf8mb4

エラーの原因

このエラーは、MySQLがutf8の文字コード設定を認識できていないことが原因です。考えられる原因は以下の通りです。

  • MySQLの再起動漏れ: my.cnfを変更後、MySQLを再起動していない。
  • Index.xmlの編集ミス: Index.xmlの編集内容に誤りがある。
  • MySQLのバージョン: 古いバージョンのMySQLではutf8mb4が正しくサポートされていない場合がある。
  • OSの文字コード設定: OSの文字コード設定がMySQLと競合している。

解決策

以下の手順で問題解決を試みてください。

  1. MySQLの再起動:
    sudo systemctl restart mysqld
  2. Index.xmlの確認:

    /usr/share/mysql/charsets/Index.xmlの内容を確認し、utf8utf8mb4の設定が正しいことを確認してください。

    バックアップファイルと比較し、変更点を確認してください。

  3. MySQLのバージョン確認:

    mysql --versionコマンドでMySQLのバージョンを確認し、utf8mb4がサポートされているバージョンであることを確認してください。

    古いバージョンの場合は、MySQLのバージョンアップを検討してください。

  4. OSの文字コード設定確認:

    localeコマンドでOSの文字コード設定を確認し、MySQLと競合していないことを確認してください。

  5. MySQLの再インストール:

    上記の方法で解決しない場合は、MySQLの再インストールを検討してください。

ポイント

  • my.cnfを変更した後は、必ずMySQLを再起動してください。
  • Index.xmlを編集する際は、バックアップを取ってから行ってください。
  • 古いバージョンのMySQLを使用している場合は、バージョンアップを検討してください。

まとめ

MySQLの文字コード設定変更は、慎重に行う必要があります。設定変更前に必ずバックアップを取り、設定変更後は動作確認をしてください。

補足

  • utf8utf8mb4の違いについて説明を加えると、読者の理解が深まります。
  • 具体的なIndex.xmlの編集例や、MySQLのバージョンアップ手順などを加えると、より実践的な記事になります。

2025/04/03

【iOS】UIStackViewでマージンを設定する方法

UIStackViewでマージンを設定する方法

UIStackViewは、iOSアプリ開発でUI要素を効率的に配置するための強力なツールです。しかし、デフォルトでは要素間のスペースやStackView自体の外側のマージンを設定するのに少し工夫が必要です。この記事では、UIStackViewでマージンを設定するさまざまな方法を紹介します。

1. layoutMarginsプロパティを使用する

UIStackViewのlayoutMarginsプロパティを使用すると、StackView自体の外側にマージンを設定できます。これにより、StackViewを親ビューから一定の間隔で配置できます。

コード例


    let stackView = UIStackView()
    stackView.layoutMargins = UIEdgeInsets(top: 10, left: 20, bottom: 10, right: 20)
    stackView.isLayoutMarginsRelativeArrangement = true
    

isLayoutMarginsRelativeArrangementtrueに設定することで、layoutMarginsがStackViewの配置に影響を与えるようになります。

2. spacingプロパティを使用する

spacingプロパティを使用すると、UIStackView内の要素間のスペースを設定できます。これにより、要素間に均等なスペースを設けることができます。

コード例


    let stackView = UIStackView()
    stackView.spacing = 10
    

上記の例では、StackView内の要素間に10ポイントのスペースが設定されます。

3. ダミービューを使用する

UIStackViewの最初または最後にダミーのUIViewを追加することで、擬似的にマージンを設定できます。この方法は、より細かいマージン制御が必要な場合に便利です。

コード例


    let stackView = UIStackView()
    let dummyView = UIView()
    dummyView.translatesAutoresizingMaskIntoConstraints = false
    dummyView.widthAnchor.constraint(equalToConstant: 20).isActive = true

    stackView.addArrangedSubview(dummyView)
    // 他の要素を追加
    

上記の例では、StackViewの最初に幅20ポイントのダミービューを追加しています。

まとめ

UIStackViewでマージンを設定する方法はいくつかあります。layoutMarginsspacingプロパティ、またはダミービューを使用することで、柔軟なレイアウトを実現できます。これらの方法を組み合わせて、要件に合った最適なマージン設定を行いましょう。

この記事は生成AIによって作成されました。

2025/04/02

【AI】Xのおすすめキーワード入れると、記事を生成AIがhtml自動生成してくれるのを作成

怒り、Switch、日経平均…現代社会の歪みと消費者の行動

導入

ファンの怒り、Switch2の遅延、日経平均の変動、関税発表、けつあな確定申告、化学調味料への依存、そして定時退社への渇望。一見、全く関連性のないこれらのキーワードは、実は現代社会における消費者の行動、経済動向、そして生活習慣の歪みを反映した鏡なのです。本記事では、これらのキーワードを紐解き、その複雑な関連性を考察します。

キーワード解説と関連性

まず、それぞれのキーワードを解説します。「ファンの怒り」は、期待していた製品やサービスが満たされない場合に発生する感情的な反応です。Switch2の遅延は、ゲームファンにとって大きな失望となり、SNSなどを通じて怒りが拡散する可能性があります。「日経平均」の変動は、経済全体の状況を反映し、消費者の購買意欲に影響を与えます。関税発表は、輸入品の価格に直接影響し、消費者の購買行動を左右します。そして、「けつあな確定申告」という極端な行動は、税制への不満や経済的な困窮を象徴していると言えるでしょう。一方、「化学調味料」への依存は、手軽さと味を追求する現代人の食生活を反映し、「定時退社」への渇望は、ワークライフバランスを重視する価値観の高まりを示しています。

これらのキーワードは、互いに複雑に絡み合っています。例えば、日経平均の悪化により消費者の購買意欲が低下し、企業は価格競争に陥り、結果的に化学調味料の使用が増加する可能性があります。また、関税発表により輸入品の価格が上昇し、消費者は国内製品に目を向ける一方で、Switch2のような海外製品の購入を控える可能性があります。そして、経済的な困窮や税制への不満が、けつあな確定申告のような極端な行動に繋がる可能性も否定できません。定時退社を求める声が高まる背景には、過酷な労働環境や経済的な不安があり、これらの要因が消費者の行動に影響を与えていると考えられます。

現代社会への影響

これらのキーワードが現代社会に与える影響は多岐にわたります。消費者の行動の変化は、企業のマーケティング戦略に大きな影響を与えます。例えば、SNSでの炎上を恐れる企業は、より慎重なコミュニケーションを心がけ、消費者の意見を積極的に取り入れるようになるでしょう。また、経済動向の変化は、個人の消費行動だけでなく、政府の経済政策にも影響を与えます。日経平均の悪化は、政府が景気対策を打ち出すきっかけとなり、関税発表は、貿易交渉の行方に影響を与える可能性があります。生活習慣の変化は、個人の健康状態だけでなく、社会全体の医療費にも影響を与えます。化学調味料への依存は、生活習慣病のリスクを高め、定時退社を求める声の高まりは、労働生産性の向上に繋がる可能性があります。

具体的な事例として、あるゲーム会社のSwitch2の発売延期が、ファンの間で大きな怒りを引き起こし、SNS上で批判が殺到しました。また、日経平均の変動により、ある企業の株価が急落し、投資家が損失を被るという事例も発生しています。さらに、関税発表により、ある輸入品の価格が大幅に上昇し、消費者が購入を控えるという事例も報告されています。これらの事例は、キーワードが現代社会に与える影響を具体的に示しています。

結論

ファンの怒り、Switch2、日経平均、関税発表、けつあな確定申告、化学調味料、定時退社。これらのキーワードは、現代社会における消費者の行動、経済動向、そして生活習慣の歪みを反映した鏡です。これらのキーワードを紐解くことで、私たちは現代社会の複雑な構造を理解し、より良い未来を築くためのヒントを得ることができます。消費者は、自身の行動が社会に与える影響を意識し、企業は、消費者のニーズに応えるだけでなく、社会全体の利益に貢献する責任を果たす必要があります。そして、政府は、経済の安定と国民の生活の向上を目指し、適切な政策を推進する必要があります。

本記事が、現代社会の課題を理解し、より良い未来を築くための一助となれば幸いです。

2025/03/28

【AI】ブロック崩し 作ってもらった

【iOS】WWDC 2025でiOS 19がくるよ。

どんな機能や仕様が追加されるかは、チェックだけはしておかないとなぁ。

6月にWWDCとの事なので、忘れないようにしたんと

2025/03/26

【生成AI】「一生ヘタレプログラマ」ブログの感想を聞いてみた

「一生ヘタレプログラマ」ブログの感想

一生ヘタレプログラマ」は、技術的な話題や日記、雜記を中心に描いたブログです。

最新の記事では、AIを活用した小説や、大規模言語モデル (LLM)のローカル環境での動作に関する技術的な取り組みが紹介されています。

特に、Ollamaを使用してGemma3:27Bを動かす試みや、LLaMA-Factoryを使ったファインチューニングの方法など、最新の技術トピックに突っ込んでいることが伝わってきます。

また、SEO対策やHTMLのレイアウトに関する考察もあり、広い技術的関心を持っていることが伝わってくるコンテンツです。

2025/03/21

【iOS】UILabel等でヒラギノフォント表示問題:文字が切れる原因と対策【sizeToFit()対策も】

iOS開発でヒラギノフォントを指定した場合、UILabelUIButtonで文字が表示される際に、一部の文字が切れてしまう問題は、多くの開発者が遭遇する悩ましい問題です。特にsizeToFit()メソッドを使用すると、その傾向が顕著になります。

本記事では、この問題の原因を深堀りし、いくつかの対策方法を紹介します。

なぜ文字が切れてしまうのか?

ヒラギノフォントは、他のフォントと比較して、文字の高さやベースラインの位置が微妙に異なる場合があります。iOSのレイアウトエンジンが、この差異を適切に処理できない場合に、文字が途中で切れてしまう現象が発生します。

特に、以下の文字で発生しやすいです。

  • ①gjpqyÄÖÜßĀĂĄąĆĈĊČĎŅ

これらの文字は、文字の形状が複雑であったり、上付き文字や下付き文字を含むため、レイアウトエンジンが正しく処理できない場合があります。

対策方法

いくつかの対策方法を試してみましょう。

1. AttributedStringの調整 (ベースラインオフセット)

他のサイトで紹介されているように、NSAttributedStringbaselineOffsetを調整する方法は有効な手段の一つです。

let attributedString = NSAttributedString(string: "問題のある文字列", attributes: [
   .font: UIFont(name: "ヒラギノ角ゴシック W3", size: 16)!,
   .baselineOffset: 1.0 // 少し上にずらす
])
label.attributedText = attributedString

しかし、この方法だけでは、ÄÖÜの「..」部分が切れてしまうケースがあります。

2. clipsToBounds = false

そこで、意外と盲点になりがちなのが、clipsToBoundsプロパティです。

label.clipsToBounds = false

この設定により、文字が切れる問題を回避できる場合があります。ただし、画面の上下にViewがピッタリと配置されている場合は、文字がはみ出てしまう可能性があるため、注意が必要です。

3. 行間調整 (Line Height)

フォントサイズだけでなく、行間を調整することで、文字の表示領域を広げることができます。

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = .byTruncatingTail
paragraphStyle.lineSpacing = 2.0 // 行間を調整
let attributedString = NSAttributedString(string: "問題のある文字列", attributes: [
   .font: UIFont(name: "ヒラギノ角ゴシック W3", size: 16)!,
   .paragraphStyle: paragraphStyle
])
label.attributedText = attributedString

4. フォントの変更 (最終手段)

どうしても解決しない場合は、別のフォントへの変更も検討しましょう。ヒラギノフォントに似た別のフォントを使用することで、問題が解決する場合があります。

まとめ

iOSでヒラギノフォントを使用する際に発生する文字切れ問題は、NSAttributedStringの調整、clipsToBoundsの調整、行間調整、フォントの変更などの対策を組み合わせることで、解決できる可能性があります。

本記事で紹介した対策方法を参考に、最適な解決策を見つけてください。

補足:

  • 上記はあくまで一般的な対策方法であり、すべてのケースで有効とは限りません。
  • 問題が発生する文字やViewの配置によって、最適な対策方法は異なります。
  • iOSのバージョンやデバイスによって、表示結果が異なる場合があります。

このブログが、あなたの役に立つことを願っています。

【Swift】テストできない、純粋関数を意識しようよ。

はじめに

SwiftUIでアプリを開発していると、Viewの中にロジックを書いてしまい、いざ単体テストをしようとするとテストできない……そんな経験はありませんか?

「実装者がどこまで想定して動作確認をおこなったのか分からない」「テストがしにくく、バグが潜んでいても気付きにくい」など、テストのしづらさは品質の低下につながります。

そこで重要なのが 純粋関数(Pure Function) です。本記事では、純粋関数を活用して、テストしやすいコードを設計する方法について解説します。


SwiftUIのViewの中にロジックを書くと何が問題?

SwiftUIでは、Viewの中にロジックを書くと次のような問題が発生します。

1. テストが困難になる

ViewはUIの描画を行うためのものであり、状態を持つことが多いため、

純粋に入力→出力の関係に基づいたテストができなくなる ことが多いです。

struct ContentView: View {
   @State private var count: Int = 0
    
   var body: some View {
       VStack {
           Text("\(count)")
           Button("Increment") {
               count += 1
           }
       }
   }
}

この例では、ボタンを押すたびにcountが増えますが、

このロジックを単体テストしようとすると、UIのイベントをシミュレートする必要があります。

2. 動作確認の範囲が曖昧になる

実装者がどの条件を想定して動作確認を行ったのか分からないため、

バグが潜んでいても気付きにくくなります。


純粋関数を活用しよう

純粋関数とは、

  • 副作用がない(外部の状態を変更しない)
  • 同じ入力に対して常に同じ出力を返す

という特性を持つ関数のことです。

純粋関数を用意すると、テストがしやすくなります。

例:ビジネスロジックを分離する

先ほどのcountの更新を純粋関数に切り出してみましょう。

func increment(_ value: Int) -> Int {
   return value + 1
}

この関数は、入力(現在の値)に対して常に同じ出力を返します。

このincrement関数の単体テストは簡単に書けます。

import XCTest
class LogicTests: XCTestCase {
   func testIncrement() {
       XCTAsserEqual(increment(0), 1)
       XCTAsserEqual(increment(5), 6)
   }
}

Viewにロジックを埋め込まずに使う

increment関数を利用して、Viewの中のロジックを整理します。

struct ContentView: View {
   @State private var count: Int = 0
    
   var body: some View {
       VStack {
           Text("\(count)")
           Button("Increment") {
               count = increment(count)
           }
       }
   }
}

こうすることで、Viewの責務はUIの描画に集中し、

ロジックはテスト可能な純粋関数として分離できます。


まとめ

SwiftUIのViewの中にロジックを書くと、

  • テストが難しくなる
  • 実装者の動作確認範囲が不明瞭になる

といった問題が発生します。

これを防ぐために、

✅ 純粋関数を活用し、テスト可能な形にロジックを分離する

Viewの責務をUIの描画に集中させる

ということを意識しましょう。

テスト可能で保守しやすいSwiftUIアプリを開発できます!

2025/03/19

【LLM】生成AIのシステムプロンプトのサンプル

 システムプロンプトのサンプル


日本語指定

2025/03/14

【AI小説】10年前の話 とある村に立ち寄った時に、老人から教わった家庭の魔法

 リュウは、埃っぽい古書を読み漁りながら、記憶を辿っていた。10年前、まだ幼かった彼は、師匠であるフリンの指示で、魔力調査のため、人里離れた小さな村を訪れていた。フリンは、稀に現れる特殊な魔力を持つ人間を探しており、リュウはその手伝いを任されていた。


村はずれの、苔むした石畳の道を歩いていると、古びた家屋の前に、腰の曲がった老人が座っているのを見つけた。老人は、庭で野菜を育てており、リュウは思わず声をかけた。


「こんにちは、おじいさん。何か手伝うことはありますか?」


老人は、顔を上げ、穏やかな笑顔でリュウを迎えた。


「おや、若い魔法使いじゃな。わしは、この村の庭師のゲンゾうじゃ。手伝うことは特にないが、もしよければ、わしの庭で少し休憩していきなさい」


リュウは、ゲンゾウの誘いに応じ、庭で休憩することにした。ゲンゾウは、リュウに庭で育てている野菜を振る舞い、畑仕事の合間に、様々な話をしてくれた。


「わしは、若い頃から、この畑で野菜を育ててきた。魔法の力は使えないが、土と対話するように育てれば、どんな野菜でも美味しく育つものじゃ」


リュウは、ゲンゾウの言葉に興味を持ち、畑仕事を手伝うことにした。ゲンゾウは、リュウに、野菜の育て方だけでなく、畑仕事に使う簡単な魔法を教えてくれた。


「これは、野菜の成長を促進する魔法じゃ。土に魔力を込めれば、野菜はぐんぐん育つ。ただし、魔力を込めすぎると、野菜は腐ってしまうから、注意が必要じゃ」


リュウは、ゲンゾウから教わった魔法を使い、野菜の成長を促進した。魔法の力で、野菜はみるみるうちに大きくなり、リュウは驚きを隠せなかった。


「すごい!本当に成長が早くなってる!」


ゲンゾウは、リュウの興奮した様子を見て、微笑んだ。


「魔法は、あくまで道具じゃ。大切なのは、土と対話し、野菜を慈しむ心じゃ」


ゲンゾウは、リュウに、他にも様々な魔法を教えてくれた。料理の味を良くする魔法、洗濯物を綺麗にする魔法、壊れた道具を一時的に修復する魔法など、どれも実用的な魔法ばかりだった。


「これらの魔法は、わしが若い頃に、旅先で出会った魔法使いから教わったものじゃ。生活を豊かにする魔法は、戦闘魔法ほど派手ではないが、人々の暮らしを支える大切な魔法じゃ」


リュウは、ゲンゾウから教わった魔法を、フリンに報告した。フリンは、リュウの報告に興味を示さなかったが、リュウが熱心に魔法を実践しているのを見て、少しだけ微笑んだ。


「ふむ、生活魔法か。無駄なことではないだろう。魔力制御の練習にもなる」


リュウは、フリンの言葉に満足し、その後も、ゲンゾウから教わった魔法を、日常生活で活用するようになった。フリンの傍で、食事の味を良くする魔法を使ったり、洗濯物を綺麗にする魔法を使ったり、壊れた道具を修復したり。


フリンは、リュウの行動を、最初は冷たい目で見つめていたが、徐々に、その姿に、人間らしい温かさを感じ始めていた。リュウが魔法を使うたびに、フリンの表情は、ほんの少しだけ柔らかくなっていた。


リュウは、フリンの心の変化に気づきながら、これからも、ゲンゾウから教わった魔法を、大切に使い続けていこうと心に誓った。

【AI小説】「師匠の価値観アップデート」

「ねえ、リュウ。今日、人間たちは何か特別なことをするのかしら?」


フリンは、琥珀色の瞳を輝かせ、リュウに問いかけた。居酒屋のカウンターに並んだ、魔法で冷やされた麦酒を一口飲みながら。


「え?今日はホワイトデーですよ、師匠」


リュウは、フリンの質問に少し驚きながら答えた。この世界には、そもそもチョコレートという概念すらない。ホワイトデーについても、フリンが知っているはずがない。


「ホワイトデー?それは、一体何かしら?」


フリンの質問に、リュウは少し戸惑った。どう説明すれば、この1200歳のエルフに、人間界の習慣を理解させられるだろうか。


「あの、バレンタインデーにチョコレートをもらった人が、お返しをする日です。感謝の気持ちを込めて、お菓子とか、プレゼントを贈るんです」


リュウの説明に、フリンは眉をひそめた。


「チョコレート?お返し?感謝の気持ち?どういうことかしら?エルフの世界では、贈り物をするのは、特別な場合に限られる。感謝の気持ちは、言葉で伝えるものよ」


フリンの言葉に、リュウは苦笑した。


「師匠、人間は、言葉だけでは伝えきれない感情を、贈り物で表現することがあるんです。例えば、チョコレートは、甘いだけでなく、相手への愛情や感謝の気持ちを込めることができる、特別な食べ物なんです」


「なるほど…特別な食べ物、ね。でも、なぜ、チョコレートをもらった人が、お返しをしなければならないの?受け取った時点で、感謝の気持ちは伝わっているはずよ」


フリンの質問は、核心を突いていた。リュウは、少し考えてから答えた。


「それは…人間関係のバランスを取るため、というか…相手に気を遣わせないように、という気持ちもあるんです。お返しをすることで、相手との関係を円滑に保つことができる、と考えている人もいます」


フリンは、リュウの言葉に納得していない様子だった。


「人間関係のバランス?円滑に保つ?そんな面倒なこと、エルフの世界にはないわ。私たちは、自分の気持ちに正直に生きている。相手に気を遣ったり、バランスを取ったりするようなことはしないわ」


フリンの言葉に、リュウは少し笑ってしまった。


「師匠は、本当に人間とは違う考え方をしているんですね」


「当たり前よ。私は、1200年も生きてきたエルフだもの。人間の短い人生の価値観なんて、理解できないことばかりよ」


フリンは、そう言いながら、麦酒を飲み干した。


その時、居酒屋の入り口から、一人の男がやってきた。男は、リュウとフリンのテーブルに近づき、声をかけた。


「リュウ、調子はどうだ?今日は、ホワイトデーのお返しに、ちょっと良い酒を買ってきたんだ。一緒に飲まないか?」


男は、リュウに笑顔で話しかけた。リュウは、男の言葉に嬉しそうに答えた。


「おお、ありがとう!ちょうど、師匠とホワイトデーの話をしていたところなんです。師匠、この方が、ホワイトデーのお返しをしてくれる人ですよ」


リュウは、フリンに男を紹介した。フリンは、男に軽く会釈をした。


「ホワイトデー、ね。人間は、本当に不思議な生き物だわ」


フリンは、そう呟きながら、麦酒グラスを手に取った。そして、グラスを見つめながら、何かを考えているようだった。


リュウは、フリンの表情をじっと見つめた。フリンの瞳には、今までとは違う光が宿っているように見えた。


フリンは、少しずつ、人間らしい感情を理解し始めているのかもしれない。


リュウは、フリンの成長を、心から嬉しく思った。

2025/03/13

【LLM】Ollamaをつかってgemma3:27bを動かしてみた。

Gemma 3 動作環境と利用状況

Gemma 3 を動作させるための環境と、実際に利用してみた状況についてまとめました。

動作環境

  • GPU: RTX-3090
  • OS: Ubuntu

利用条件

Gemma 3 を利用するには、Ollama 0.6 以上をインストールする必要があります。

実行コマンド

  • 4Bモデル: ollama run gemma3:4b
  • 12Bモデル: ollama run gemma3:12b
  • 27Bモデル: ollama run gemma3:27b

利用感

  • 個人または少人数での利用であれば、十分な性能を発揮できます。
  • GPU使用率は90%程度まで上昇しますが、それなりに利用可能です。
  • 多人数での利用の場合、多少の待ち時間が発生する可能性があります。
  • GPUメモリが不足する場合は、量子化された軽量モデル、または12Bモデルなどを利用することを推奨します。

2025/02/25

【LLM】LLaMA-Factoryを使ってファインチューニングする方法(調査中)

 確認中・・・・。


LLaMA-Factoryをセットアップ

UI起動

データセット用意

解析


ーーー

データセットの用意方法と解析用のパラメータを調査する


2025/02/10

【LLM】ollama modelfile error

サンプルを試したら下記のようなエラーがでた

 Error: (line 7): command must be one of "from", "license", "template", "system", "adapter", "parameter", or "message"


from とかが全部大文字で書いていたけど、小文字にするのが正しいらしいです。

2025/02/05

【LLM】ベースモデルはgemma2を使って、LoRAで追加してみた。(これから)

 やり方は、これから調べながらやる。



ollamaが動く環境があることを前提とする。


すでに、Docker使って、ollama + OpenWebUIの環境作って動作できている状態で


そこからgemma2:9Bがいい感じに動いたので、独自の値を追加し当たらな情報を返したい


例えば、子どもの誕生日とか、特定の情報を追加してオレオレ生成AIを作っていきたい。


そしたら、思い出とかも追加して、いつ何があったか?とか出力してくれるのでは?と。




2025/01/23

LLM(大規模言語モデル)をOllama使ってローカルで動かす。

タイトルの通りです。

ただのこれからやってみるよ。 って言う 宣言です。

これから、実際にPCを構築して、動作確認していきます。

そのうち、更新していきます・・・。


とりあえず。


RTX-3090 で LLM動かせた。


RTX-3090でOllamaを利用して動作可能な言語モデルは、

Gemma2:27B やdeepseek-r1:32bのあたりが限界でした。

これ以上大きい言語モデルはOOMが発生して、起動できなかったです。



2025/01/21

htmlでSEO対策ってさ。

SEO対策の基本を語ります

お久しぶりです!最近、仕事が立て込んでおり、ブログの更新が遅くなっていました。ようやく落ち着いてきたので、久々に執筆させていただきます。

今回のテーマは、ウェブサイトの集客に欠かせないSEO対策です。

SEO対策には、専門の業者に依頼するのが一番手っ取り早いと思っています。指摘された箇所を修正するだけで、効果を実感できるでしょう。しかし、資金に余裕がない私のような場合は、自力で試行錯誤し、効果測定を繰り返すしかありません。

そこで今回は、SEO対策の基本中の基本をお伝えします。

# SEO対策ってどうするの?

SEO対策は、様々なテクニックがありますが、まずは以下の2点を意識するだけで、大きく改善する可能性があります。

  • コンテンツの内容が充実しているか?
  • 検索する人のことを考えているか?

これら2点をしっかり守れば、なんとかなります!細かいSEO対策テクニックは、専門誌やウェブサイトで学ぶのがおすすめです。

コンテンツの内容が充実しているか?

ここが一番重要です。あなたのウェブサイトのコンテンツは、「読みたい!」と思わせる内容になっていますか?

ただのメモ書きや、自慢話だけになっていませんか? 読者の役に立つ情報、面白い情報、共感できる情報など、読者の心に響くコンテンツ作りを心がけましょう。

検索する人のことを考えているか?

読者がどんなキーワードであなたのサイトを探しているのかを考えましょう。

Googleの検索窓で、あなたのサイトを見つけるために使われるであろうキーワードは?

例えば、「美味しいケーキ レシピ 簡単」のように、具体的なキーワードを意識してコンテンツを作成することで、検索結果の上位表示を目指せます。

以上、SEO対策の基本でした。

最後に、こんなサイトを見に来てくれてありがとうございます!