<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://tail-studio.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://tail-studio.com/" rel="alternate" type="text/html" hreflang="ja" /><updated>2026-06-04T23:31:14+09:00</updated><id>https://tail-studio.com/feed.xml</id><title type="html">Tail Studio</title><subtitle>Tail Studio の開発・生成AIにまつわるノート</subtitle><author><name>Tail Studio</name></author><entry><title type="html">Androidアプリを作ってみた【Google Play公開を断念した理由】</title><link href="https://tail-studio.com/blog/2026/05/22/android-google-play-giveup/" rel="alternate" type="text/html" title="Androidアプリを作ってみた【Google Play公開を断念した理由】" /><published>2026-05-22T23:34:00+09:00</published><updated>2026-05-22T23:34:00+09:00</updated><id>https://tail-studio.com/blog/2026/05/22/android-google-play-giveup</id><content type="html" xml:base="https://tail-studio.com/blog/2026/05/22/android-google-play-giveup/"><![CDATA[<p>iOSアプリで少し手応えを感じてきたので、「Androidでも出してみようか」と思い立ちました。アプリ自体はすでに作ってあったので、あとは公開するだけ……のつもりでした。</p>

<h2 id="-アプリはすでに完成していた">◆ アプリはすでに完成していた</h2>

<p>今回用意したのは、AIを使って音声から鳥の鳴き声を検出するアプリです。iOSで動くもの（以下）があったので、Android版も作ってみました。</p>

<p><a href="https://apps.apple.com/jp/app/%E9%87%8E%E9%B3%A5%E9%B3%B4%E3%81%8D%E5%A3%B0%E3%82%B5%E3%83%BC%E3%83%81/id6761675286">野鳥鳴き声サーチアプリ - App Store</a></p>

<p>開発にはClaude Codeをエージェントとして使いました。Mac mini M4上で動かしたところ、数時間でアプリが完成しました。生成AIの進化を改めて実感した瞬間です。</p>

<p>ただし、見た目はiOS版とかなり変わりました。ReactNativeやFlutterを使えばiOSとデザインを揃えられるようですが、今回はすでにiOS版が完成していたので、そこから低コストでAndroid版を作ることを優先しました。見た目の統一は次回の課題です。</p>

<h2 id="-google-play公開を調べて断念した">◆ Google Play公開を調べて断念した</h2>

<p>Google Playでの公開は、初回登録料（$25）を払えば開発者名も自由に設定できるとのこと。一見ハードルは低そうです。ところが実際に調べてみると、いくつかの壁がありました。</p>

<p>まず、2023年11月以降に作成した個人アカウントでは、12人以上のテスターを集めて14日間クローズドテストを実施することが必須になっています。これは完全無料アプリであっても避けられない要件です。個人開発者にはなかなか厳しい条件で、代行サービスを使えば5,000円ほどで解決できますが、それだけでは終わりませんでした。</p>

<h3 id="-収益化しようとするとさらに壁があった">・ 収益化しようとするとさらに壁があった</h3>

<p>広告を入れようとするとAdMobが必要で、AdMobの審査にはGoogle Playでの公開が必要という条件があります。さらに収益化すると住所の公開が義務付けられます。なお、完全無料アプリ（広告なし・課金なし）であれば住所の公開は不要ですが、その場合は当然収益も得られません。自宅住所を公開するわけにもいかないので、バーチャルオフィスを契約する必要があり、月1,650円〜のコストがかかります。広告収入の見込みが月数千円程度だと、コストが見合いません。</p>

<h3 id="-断念した理由">・ 断念した理由</h3>

<p>整理するとこうなります。</p>

<ul>
  <li>テスター代行：約5,000円（一回）</li>
  <li>Google Play登録料：約3,800円（一回）</li>
  <li>バーチャルオフィス：月1,650円〜</li>
  <li>広告収入の見込み：月数千円</li>
</ul>

<p>完全無料で公開するだけならバーチャルオフィスは不要ですが、テスターの壁は残ります。収益化まで考えると初期費用だけでも約1万円かかります。仮に広告収入が月2,000円だとすると、毎月のバーチャルオフィス代1,650円を差し引いて手元に残るのは月350円。初期費用を回収するだけで約2年5ヶ月かかる計算です。費用対効果を考えると、Google Play公開は見送りが妥当という結論に至りました。</p>

<h3 id="-出した結論">・ 出した結論</h3>

<p>Google Playでの公開は見送り、自サイトでAPKを無料公開することにしました。広告収入はサイト自体にAdSenseを導入して得ることにします。そのためにはブログ記事を充実させてAdSenseの審査を通す必要がありますが、こちらのほうが長期的にも意味があると判断しました。</p>

<h2 id="-今思うこと">◆ 今思うこと</h2>

<p>アプリを作ること自体はそれほど難しくありませんでした。難しかったのは「公開する」という部分でした。個人開発者にとってGoogle Playのハードルはじわじわと上がっています。同じ壁にぶつかっている方の参考になれば幸いです。</p>]]></content><author><name>Tail Studio</name></author><category term="アプリ開発" /><summary type="html"><![CDATA[Android版アプリを作ってGoogle Playで公開しようとしたものの、テスター要件や住所公開などの壁により断念した理由をまとめました。]]></summary></entry><entry><title type="html">【体験記】Claudeアプリが年齢要件を満たさずアクセス制限された話とその対処法</title><link href="https://tail-studio.com/blog/2026/05/07/claude-age-restriction/" rel="alternate" type="text/html" title="【体験記】Claudeアプリが年齢要件を満たさずアクセス制限された話とその対処法" /><published>2026-05-07T09:00:00+09:00</published><updated>2026-05-07T09:00:00+09:00</updated><id>https://tail-studio.com/blog/2026/05/07/claude-age-restriction</id><content type="html" xml:base="https://tail-studio.com/blog/2026/05/07/claude-age-restriction/"><![CDATA[<p><img src="/assets/images/notes/nfe69dc58b9f4_8bd5459868c505e5bf3f55c223192c3c.png" alt="" /></p>

<p>私はiOSでClaudeアプリを使っています。
先日突然、年齢要件を満たさないとアクセス制限されて使えなくなってしまいました。
一時的にはブラウザ経由で使用しましたが、iOSアプリで使いたかったので対処しました。
ちなみに、年齢設定は間違っていない状態でしたし、4月末まで使えていたのでiOS設定周りを確認しました。</p>

<ul>
  <li>「設定」&gt;「[ユーザ名]」の順に選択します。</li>
  <li>「個人情報」をタップします。</li>
  <li>アプリ用の年齢範囲をタップして「しない」を選択します。</li>
</ul>

<p><img src="/assets/images/notes/nfe69dc58b9f4_1778077080-60XWol47ucmAPHKknIFSdEGT.png" alt="" /></p>

<p><em>「しない」を選択すればアプリが使えた</em></p>

<p><img src="/assets/images/notes/nfe69dc58b9f4_1778077080-vBM8tPd4JaqNbwx6FLgk3D2z.png" alt="" /></p>

<p><em>変更前は共有（17歳以下）になっていた
（思い返してみると前回起動時に一瞬問いが出た気がするが、
画面を触ってしまって、よく分からないまま設定した気がする）</em></p>

<p>年齢範囲の共有について詳しい話は以下のようです。ファミリー共有をする場合は、よく考えて設定した方が良さそうです。</p>

<p><a href="https://support.apple.com/ja-jp/122770">https://support.apple.com/ja-jp/122770</a></p>]]></content><author><name>Tail Studio</name></author><category term="生成AI" /><summary type="html"><![CDATA[Claudeアプリで年齢要件によるアクセス制限が発生した体験と対処法を紹介します。]]></summary></entry><entry><title type="html">AppStoreにアプリをリリースしてみた【その後】</title><link href="https://tail-studio.com/blog/2026/04/29/appstore-after/" rel="alternate" type="text/html" title="AppStoreにアプリをリリースしてみた【その後】" /><published>2026-04-29T09:00:00+09:00</published><updated>2026-04-29T09:00:00+09:00</updated><id>https://tail-studio.com/blog/2026/04/29/appstore-after</id><content type="html" xml:base="https://tail-studio.com/blog/2026/04/29/appstore-after/"><![CDATA[<p><img src="/assets/images/notes/n148967e5bdbb_2a52c2dab922ea49d49a67aff23e2a95.png" alt="" /></p>

<p>これまで、アプリのリリース体験について以下の記事で書いてきました。</p>

<p>・<a href="/blog/2026/01/29/appstore-release-1/">App Storeにアプリをリリースしてみた【その１】</a> → リリースまでの話
・<a href="/blog/2026/01/29/appstore-release-2/">App Storeにアプリをリリースしてみた【その２】</a> → 屋号を変えた話
・<a href="/blog/2026/02/01/appstore-release-dev-env/">App Storeにアプリをリリースしてみた【開発環境編】</a> → 開発環境の話</p>

<p>以前、「遊べるアプリを作りたい」と書いていたのですが、その後、実際にいくつか形にすることができました。
そこで今回は、「その5」……もとい【その後】として、一旦の区切りをつけ、これまでに制作したものや活動を通じて感じたことを振り返ってみたいと思います。</p>

<h2 id="-結局自分が欲しいものを作っている">◆ 結局、自分が欲しいものを作っている</h2>

<p>【その１】でも少し触れましたが、作るアプリのきっかけはいつも「こういうの、あったらいいな」という小さな不満や欲求からです。「<a href="https://apps.apple.com/jp/app/%E6%9A%A6%E5%A4%89%E6%8F%9Bai/id6756545072">暦変換</a><a href="https://apps.apple.com/jp/app/%E6%9A%A6%E5%A4%89%E6%8F%9Bai/id6756545072">AI</a>」も「<a href="https://apps.apple.com/jp/app/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E9%A3%9F%E6%9D%90%E3%83%AA%E3%82%B9%E3%83%88/id6757102546">スマート食材リスト</a>」も、そうでした。今回リリースした3本も、出発点は同じです。</p>

<h2 id="-遊べるアプリをリリース">◆ 遊べるアプリをリリース</h2>

<p>今回リリースしたのは、ゲーム2本、趣味アプリ1本です。
ゲームは好きですが、旅行先や移動中に、同行している人と一緒に何か遊べたら、という場面を想像しながら作りました。
趣味アプリは、自分が使いたいものが見つからなかったので作りました。
以下、詳細です。</p>

<p><strong>・ボードゲームAI　</strong><a href="https://apps.apple.com/jp/app/boardgameai/id6759185448"><strong>App Store</strong></a><a href="https://apps.apple.com/jp/app/boardgameai/id6759185448"><strong>はこちら</strong></a>
オセロ・将棋・チェスに対応していて、AI対戦もできますが、スマホ1台あれば対人戦ができるというのがポイントです。どこかに出かけた時に、これ1本あれば何とかなる、くらいの感覚で設計しています。拡張も視野には入っています。</p>

<p><strong>・スマホで麻雀　</strong><a href="https://apps.apple.com/jp/app/%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%A7%E9%BA%BB%E9%9B%80-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%AF%BE%E6%88%A6/id6761806803"><strong>App Store</strong></a><a href="https://apps.apple.com/jp/app/%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%A7%E9%BA%BB%E9%9B%80-%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E5%AF%BE%E6%88%A6/id6761806803"><strong>はこちら</strong></a>
このアプリも同じ発想で作りました。iOS端末1台をホストにして、他のメンバーはAndroidやPCのブラウザから参加できます。
麻雀は机を囲んで実物でワイワイした方が楽しいとは思うのですけど、皆バラバラでスマホを見ているよりは良いと思って作ってみました。
ホストを立てるという発想など、エンジニアとしての普段の仕事で得たノウハウが、こういうところで活きてくるのはちょっと面白いなと思っています。点数計算機能も付けようかと思っています。（後述のWebアプリにするかもしれませんが）</p>

<p><strong>・野鳥鳴き声サーチ　</strong><a href="https://apps.apple.com/jp/app/%E9%87%8E%E9%B3%A5%E9%B3%B4%E3%81%8D%E5%A3%B0%E3%82%B5%E3%83%BC%E3%83%81/id6761675286"><strong>App Store</strong></a><a href="https://apps.apple.com/jp/app/%E9%87%8E%E9%B3%A5%E9%B3%B4%E3%81%8D%E5%A3%B0%E3%82%B5%E3%83%BC%E3%83%81/id6761675286"><strong>はこちら</strong></a>
趣味で野鳥を撮影することがあるのですが、鳴き声から調べられるアプリを探しても自分が使いたいものが見つからなかったので作りました。内部的にはAIを使っています。※
AIを使って鳴き声から種類を判定する仕組みにしたのですが、これが単純には精度が出なくて、かなり試行錯誤しました。ゲームアプリと比べると泥臭い作業が多かったですが、それなりに動くようになったときの手応えはありました。
また、登山中などオフラインでも使える点や、実用になる程度の精度が出せたことは気に入っています。録音機能もあるので家に帰って調べ直すこともできますし、コレクター魂を揺さぶる図鑑機能もあります。</p>

<p>※<a href="https://www.apple.com/jp/newsroom/2025/09/apples-foundation-models-framework-unlocks-new-intelligent-app-experiences/">Foundation Models</a><a href="https://www.apple.com/jp/newsroom/2025/09/apples-foundation-models-framework-unlocks-new-intelligent-app-experiences/">フレームワーク</a>（Appleが開発者向けに提供している、デバイス上で動作する生成AIモデルをアプリに組み込むためのフレームワーク）ではなく、独自のモデルを使っています。そのため、アプリのサイズが大きくなってしまいました。</p>

<h2 id="-収益が出るか">◆ 収益が出るか</h2>

<p>アプリ自体は使ってもらうことを優先して無料にしています。ただ、Apple Developer Programの年会費や開発者ページの維持などにかかる経費を回収できると良いなと思い、広告を邪魔にならない程度に入れています。
収益は現状、月100円いくかどうかといった感じですが、今後も継続してアプリをリリースし、改善を重ねながら、少しずつ使ってもらえるようになっていったらうれしいです。</p>

<p><img src="/assets/images/notes/n148967e5bdbb_1776920965-t0YcIBRZ9pwDLlxT8Q4y3fFq.png" alt="" /></p>

<p><em>現時点では『野鳥鳴き声サーチ』の反応が一番良い
（「スマホで麻雀」はリリース直後で集計対象外）</em></p>

<h2 id="-リリースしてみて感じること">◆ リリースしてみて感じること</h2>

<p>3本作ってみても、相変わらずApple Developer Programの年会費を回収できる見込みはありません（笑）
それでも、「こういうの欲しかった」と思って作ったものが実際に動いているのは、やっぱり気持ちのいいものです。</p>

<h2 id="-webアプリも作ってみた">◆ Webアプリも作ってみた</h2>

<p>iOSアプリではリリースにかかる時間や制約があったりして、ちょっとしたアプリを作るには向いていない気がしています。
ということでWebアプリを開発者ページで使えるようにしてみました。これなら手軽に公開できるのでちょっとしたアプリはこちらで公開しようと思っています。
なお、開発者ページは、まだ広告を表示できておらず収益にはなりませんが、今後、開発者ページの広告も追加してみる予定です。
<a href="https://tail-studio.com/#web-apps">Web</a><a href="https://tail-studio.com/#web-apps">アプリはこちら</a></p>

<p>全てのアプリは <a href="https://tail-studio.com/">開発者ページ</a> にまとめています。日々の暮らしのお供になれたらうれしいです。今後も、少しずつ良いものを作れるよう頑張っていきます。</p>

<p><a href="https://tail-studio.com/">https://tail-studio.com/</a></p>]]></content><author><name>Tail Studio</name></author><category term="アプリ開発" /><summary type="html"><![CDATA[AppStoreにアプリをリリースしたその後の話です。]]></summary></entry><entry><title type="html">App Storeにアプリをリリースしてみた【開発環境編】</title><link href="https://tail-studio.com/blog/2026/02/01/appstore-release-dev-env/" rel="alternate" type="text/html" title="App Storeにアプリをリリースしてみた【開発環境編】" /><published>2026-02-01T11:37:38+09:00</published><updated>2026-02-01T11:37:38+09:00</updated><id>https://tail-studio.com/blog/2026/02/01/appstore-release-dev-env</id><content type="html" xml:base="https://tail-studio.com/blog/2026/02/01/appstore-release-dev-env/"><![CDATA[<p><img src="/assets/images/notes/n67f38e306601_2333bfb54e1250a91ce7f255d0f991f0.png" alt="" /></p>

<p>前回の記事で開発環境についてあまり触れていなかったので、今回は開発環境について詳しく書いてみます。</p>

<h2 id="1-xcodeの使いどころ">1. Xcodeの使いどころ</h2>

<p><strong>Xcodeはあまり使っていません。</strong>
主に以下の用途に限定して使用しています。</p>

<ul>
  <li>デバッグ作業</li>
  <li>シミュレータでの確認（画面崩れのチェックやスクリーンショット撮影）</li>
  <li>App Storeへの審査申請</li>
</ul>

<p>Xcodeにも「Coding Intelligence」でClaudeが使える機能がありますが、個人的には少し使い勝手がイマイチに感じました。上記作業に特化して使い勝手が良くなると使おうと思えるのですが今後に期待したいです。</p>

<h3 id="2026513追記">【2026/5/13追記】</h3>

<p>Xcodeの「Coding Intelligence」がAgentモードにも対応したようで使いやすくなっていました！今ではVSCodeは使わずに基本Xcode、時々Claude Codeのクラウド環境で作業しています。</p>

<h2 id="2-メイン環境はvscode--claude">2. メイン環境は「VSCode ＋ Claude」</h2>

<p>普段のコーディングは、<strong>VSCode上でClaudeを活用</strong>して進めています。
AIにベースのコードを書いてもらい、そこから細かい調整を指示していくスタイルです。</p>

<h2 id="3-スマホでも開発">3. スマホでも開発</h2>

<p>実は、開発の半分くらいはスマホ上の「Claude Code」で行いました。
GitHubリポジトリに接続して直接プッシュまで行えるため、以下のような流れで開発しています。</p>

<ul>
  <li>外出先やリラックス中に、スマホで思いついたアイデアや修正を指示</li>
  <li>そのままGitHubへプッシュ</li>
  <li>後でPCを開いた時にデバッグを行う</li>
</ul>

<p>場所を選ばず、ゴロゴロしながらでも開発を進められるので非常に楽です。</p>

<h2 id="4-なぜmac-mini-m4を選んだのか">4. なぜ「Mac mini M4」を選んだのか</h2>

<p>最後にPCについて。iOSアプリ開発PCはMac mini M4をメインにしています。
持ち運びを考えればMacBook AirやProも候補でしたが、あえてMac mini M4を選んだ理由は以下の通りです。</p>

<ul>
  <li><strong>価格：</strong> 他に比べて安い</li>
  <li><strong>サポート：</strong> Apple Siliconは今後も長くサポートされることを期待</li>
  <li><strong>据え置きメイン：</strong> 外に持ち出す機会が少ない</li>
  <li><strong>お気に入りの周辺機器：</strong> HHKB（キーボード）を使いたいのでキーボード不要（Chromebookで愛用していたものを引き続きMacでも使用）</li>
  <li><strong>リモート運用：</strong> Chromebook等からリモートで接続して使うことが多い</li>
  <li><strong>AIメイン：</strong> AIコーディングが中心なので、本体のディスプレイは必須ではない。M4ならある程度のローカルLLMも動かせる</li>
  <li><strong>静音： **以前はIntel CPUのMacBookを使用していましたが、ファンの音が気になっていました。その点、</strong>Mac mini M4は無音で非常に快適**</li>
</ul>

<h3 id="mac-mini-m4のお気に入りポイント">Mac mini M4のお気に入りポイント</h3>

<p>豊富なポート類と、コンパクトなデザインが気に入っています。</p>

<p><strong>充実のインターフェース</strong></p>

<p>USB-Cポートが5つもあり、Chromebookなどのデバイス充電にも重宝しています。ちなみにストレージもUSB-Cで外付けSSDを付けて拡張しています。PC周辺機器については他にもあるので今後記事にしたいと思います。</p>

<ul>
  <li>USB-C ×2（USB 3 / 最大10Gb/s）</li>
  <li>
    <p>3.5mmヘッドフォンジャック</p>
  </li>
  <li>Thunderbolt 5（USB-C形状）×3</li>
  <li>HDMI ×1</li>
  <li>Ethernet（1Gb / 10Gbに変更可能）×1</li>
</ul>

<p><strong>デザインと使用感</strong></p>

<p>コロッとした手のひらサイズの形状が地味に気に入っています。電源は入れっぱなしで運用しているので、ボタンが底面にあって押しにくいのも、今では「ご愛嬌」だと思っています。</p>

<hr />

<p>以上、私の開発環境の紹介でした。
これからアプリ開発を始める方の参考になれば嬉しいです。</p>

<p>・私が使用しているMac mini m4（ストレージは256GBにして外付けSSDで不足分を補っています）</p>

<p><a href="https://amzn.to/4rSHb2b">https://amzn.to/4rSHb2b</a></p>]]></content><author><name>Tail Studio</name></author><category term="アプリ開発" /><summary type="html"><![CDATA[App Storeリリースに向けて整えた開発環境についてまとめました。]]></summary></entry><entry><title type="html">App Storeにアプリをリリースしてみた【その２】</title><link href="https://tail-studio.com/blog/2026/01/29/appstore-release-2/" rel="alternate" type="text/html" title="App Storeにアプリをリリースしてみた【その２】" /><published>2026-01-29T22:01:11+09:00</published><updated>2026-01-29T22:01:11+09:00</updated><id>https://tail-studio.com/blog/2026/01/29/appstore-release-2</id><content type="html" xml:base="https://tail-studio.com/blog/2026/01/29/appstore-release-2/"><![CDATA[<p>前回の「リリース編」に続き、今回はその後の展開についてお話しします。</p>

<p>◆** 一番の難所だった「屋号」への変更**
アプリをリリースした際、デベロッパ名が個人名のままなのがどうしても気になり、屋号への変更を決意しました。しかし、これが想像以上に大変な作業でした。
開業届の提出から始まり、DUNSナンバーの取得、独自ドメインとメールアドレスの準備（フリーメールは却下される可能性があるため、お名前.comとさくらインターネットを利用）、さらにはGitHub Pagesでのプライバシーポリシー公開など、やるべきことが山積みでした。
最終的に、英語に翻訳した開業届などをAppleに提出し、ようやく屋号で活動できるようになりました。</p>

<p>◆** 第二弾アプリ「スマート食材リスト」をリリース**
屋号変更と並行して開発を進め、新作アプリをリリースしました。レシピサイトからAIが自動で買い出しリストを作成するアプリです。（<a href="https://apps.apple.com/jp/app/%E3%82%B9%E3%83%9E%E3%83%BC%E3%83%88%E9%A3%9F%E6%9D%90%E3%83%AA%E3%82%B9%E3%83%88/id6757102546">App Storeはこちら</a>）
「塩分控えめ」といったユーザーの要望に応じた調整や、分量の変更も可能です。また、食材名を自動で絵文字に変換し、視覚的に分かりやすくする工夫も取り入れました。</p>

<p>◆** 今後の展望**
現在は、次に制作する「遊べるアプリ」の構想を練っています。
正直なところ、アプリは無料で公開しているため、Apple Developer Programの年会費を回収できる見込みはまだ立っていません。年会費を払い続けるかも悩ましいですが、スキルアップも兼ねた「勉強代」と考え、しばらくは続けていこうと思います。</p>]]></content><author><name>Tail Studio</name></author><category term="アプリ開発" /><summary type="html"><![CDATA[App Storeリリース体験記【その２】。審査と公開周辺の話です。]]></summary></entry><entry><title type="html">App Storeにアプリをリリースしてみた【その１】</title><link href="https://tail-studio.com/blog/2026/01/29/appstore-release-1/" rel="alternate" type="text/html" title="App Storeにアプリをリリースしてみた【その１】" /><published>2026-01-29T21:48:46+09:00</published><updated>2026-01-29T21:48:46+09:00</updated><id>https://tail-studio.com/blog/2026/01/29/appstore-release-1</id><content type="html" xml:base="https://tail-studio.com/blog/2026/01/29/appstore-release-1/"><![CDATA[<p>これまで「アプリのリリースは調べることが多くて大変そう」と敬遠していましたが、生成AIが活用できる今なら自分でもできるのでは？と思い立ち、実際にアプリをリリースしてみました。今回は、開発から公開までの道のりを時系列で振り返ります。</p>

<p><strong>◆ 開発のきっかけ</strong>
愛用していた暦変換アプリが配信終了してしまったことが始まりです。代替アプリは他にもありましたが、デザインや使い勝手にこだわりたくなり、「いっそ自分で作ってしまおう」と決意。最近話題の「バイブコーディング（AIに任せる開発）」ならいけるという直感もあり、せっかくなのでアプリ開発してみました。ついでなので流行りのAI機能も盛り込むことにしました。</p>

<p><strong>◆ 開発は驚くほどスムーズだった</strong>
開発パートナーに選んだのはClaude、言語は未経験だったSwiftです。実際に進めてみると、仕様を細かく伝えなくてもAIが「なんとなく」の形を提案してくれ、そこから微調整を繰り返すだけで動くアプリが完成しました。動くアプリの開発までのコーディング自体は、わずか1日程度でした。</p>

<p><strong>◆ 意外な壁、ハードウェアの更新</strong>
順調だった開発ですが、シミュレータでのテストで壁にぶつかりました。デバッグやApp Store用のキャプチャ撮影にはiPadのシミュレータが必要でしたが、手持ちの2014年製MacBook Proではスペック不足。仕事でも使うことを言い訳に、思い切って最新のMac mini M4を購入しました。</p>

<p><strong>◆ 審査依頼とプライバシーポリシーの準備</strong>
アプリ完成後はAppleの審査が必要です。サイト制作の手間を省くため、GitHub Pagesを利用してプライバシーポリシーを用意しました。
審査から承認までは1週間ほど見ておくのが無難です。審査員からの指摘への対応も、生成AIに相談すればスムーズに解決できました。ちなみに、やり取りは日本語で対応してもらえました。</p>

<p><strong>◆ リリースしたアプリ「暦変換AI」</strong>
こうして誕生したのが「暦変換AI」です。（<a href="https://apps.apple.com/jp/app/%E6%9A%A6%E5%A4%89%E6%8F%9Bai/id6756545072">App Storeはこちら</a>）
西暦・和暦の変換はもちろん、その年の流行や世代背景、あるあるネタをAIがコメントしてくれる機能を搭載しました。また、家族の年齢などを忘れないよう、メモとして保存できる機能も付けています。</p>

<p><strong>◆ かかった費用と期間</strong>
Apple Developer Programの年会費（約15,000円）のほか、ドメイン取得などで数千円かかりました。（開発環境も必要ですが…）
開発自体は1日でしたが、環境構築や手続きを含めると、最終的に1ヶ月ほどのプロジェクトになりました。</p>

<p>（その2へ続く）</p>]]></content><author><name>Tail Studio</name></author><category term="アプリ開発" /><summary type="html"><![CDATA[個人開発したアプリをApp Storeにリリースするまでの記録【その１】です。]]></summary></entry><entry><title type="html">NPU環境で「InternVL2.5-1B」を試すまでの手順まとめ【Module-LLM (AX630C)+Windows 11 Pro】</title><link href="https://tail-studio.com/blog/2025/06/23/npu-internvl2-5/" rel="alternate" type="text/html" title="NPU環境で「InternVL2.5-1B」を試すまでの手順まとめ【Module-LLM (AX630C)+Windows 11 Pro】" /><published>2025-06-23T16:56:41+09:00</published><updated>2025-06-23T16:56:41+09:00</updated><id>https://tail-studio.com/blog/2025/06/23/npu-internvl2-5</id><content type="html" xml:base="https://tail-studio.com/blog/2025/06/23/npu-internvl2-5/"><![CDATA[<p>近年、エッジAIなど、軽量なLLM（大規模言語モデル）やマルチモーダル推論の実装が急速に進んでいます。今回は、M5Stack Module-LLM (AX630C)を使用したNPU対応のモデルを試しましたので手順をまとめました。</p>

<p>具体的には、<strong>中国</strong>深圳に拠点を持つスタートアップ企業であるM5Stackが提供するModule LLMを使ったセットアップから、InternVL2.5-1Bを使って実際に画像に対する質問を行うところまでを、<strong>Module-LLM(AX630C)+Windows 11 Pro環境</strong>で検証しました。</p>

<hr />

<h2 id="-検証環境スペック">◆ 検証環境スペック</h2>

<ul>
  <li><strong>OS</strong>：Windows 11 Pro</li>
  <li><strong>CPU</strong>：Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz</li>
  <li><strong>メモリ</strong>：16GB</li>
  <li><strong>Module-LLM NPU：AX630C</strong></li>
</ul>

<p>Windows 11環境はAPI接続用です。推論モデルはAX630Cで動作させます。</p>

<hr />

<h2 id="-環境準備">◆ 環境準備</h2>

<p>Module LLMはスイッチサイエンスさんで購入しました。1万円しませんでした。
<a href="https://www.switch-science.com/products/10334">https://www.switch-science.com/products/10334</a>Amazonでは以下が同等のようです。</p>

<p><a href="https://amzn.to/4kDIYpr">https://amzn.to/4kDIYpr</a></p>

<p>その他の環境構築（接続方法等）については、kouさんのnote記事「<a href="https://note.com/kou519/n/n8dd8b52e4511">llm module</a><a href="https://note.com/kou519/n/n8dd8b52e4511">へ</a><a href="https://note.com/kou519/n/n8dd8b52e4511">TeraTerm</a><a href="https://note.com/kou519/n/n8dd8b52e4511">で接続する方法【</a><a href="https://note.com/kou519/n/n8dd8b52e4511">Windows</a><a href="https://note.com/kou519/n/n8dd8b52e4511">版】</a>」を参考にしました。</p>

<h2 id="-module-llmでのapiサーバ構築">◆ Module LLMでのAPIサーバ構築</h2>

<h3 id="ax630c-に接続するwindowsのコマンドプロンプトでabdツールを使って実施">AX630C に接続する(Windowsのコマンドプロンプトでabdツールを使って実施)</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd &lt;abdツールを展開したフォルダ&gt;
adb shell
</code></pre></div></div>

<h3 id="ax630c-に接続後の作業">AX630C に接続後の作業</h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bash
ifconfig  # AX630CのIPアドレス確認
cd /opt/m5stack/
git clone https://github.com/m5stack/ModuleLLM-OpenAI-Plugin.git
cd ModuleLLM-OpenAI-Plugin
pip install -r requirements.txt
python3 api_server.py
</code></pre></div></div>

<p>この手順でAX630C上にAPIサーバを立ち上げます。</p>

<hr />

<h2 id="-windows-側でapiクライアント実装例">◆ Windows 側でAPIクライアント実装例</h2>

<p>以下は画像をbase64エンコードし、Module-LLMに送信するPythonスクリプトです。<a href="https://github.com/nnn112358/ModuleLLM_OpenAI_API_example">ModuleLLM_OpenAI_API_example</a>を流用させていただき、
AX630CのIPアドレスでserver_urlを書き換えました。
その他、画像ファイル名とmodelも書き換えています。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>import requests
import json
import base64
import os

def image_to_base64(image_path):
    with open(image_path, "rb") as f:
        return base64.b64encode(f.read()).decode('utf-8')

def query_vlm(image_path, prompt="この画像に何が見えますか？", model="internvl2.5-1B-ax630c", server_url="http://192.168.1.100:8080"):
    if not os.path.exists(image_path):
        return {"error": f"画像ファイル '{image_path}' が見つかりません"}

    base64_image = image_to_base64(image_path)

    data = {
        "model": model,
        "messages": [{
            "role": "user",
            "content": [
                {"type": "text", "text": prompt},
                {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}}
            ]
        }],
        "temperature": 0.2
    }

    response = requests.post(
        f"{server_url}/v1/chat/completions",
        headers={
            "Content-Type": "application/json",
            "Authorization": "Bearer YOUR_KEY"
        },
        json=data
    )
    return response.json()

if __name__ == "__main__":
    result = query_vlm("test.png", prompt="この画像に何が見えますか？", model="internvl2.5-1B-364-ax630c", server_url="http://192.168.1.100:8000")
    print(json.dumps(result, indent=2, ensure_ascii=False))
</code></pre></div></div>

<p><strong>実行結果は約10秒で応答が得られ、実用レベルでした。</strong></p>

<h2 id="-おわりに">◆ おわりに</h2>

<p><strong>高価なGPUが無くても、安価なNPUでマルチモーダルな質問応答が可能</strong>になってきています。</p>

<p>今後は、Intel Core UltraのNPUを使った推論にもチャレンジしてみたいと考えています。</p>

<hr />

<h2 id="-参考リンク">◆ 参考リンク</h2>

<ul>
  <li><a href="https://www.switch-science.com/products/10334">Module LLM</a></li>
  <li><a href="https://note.com/kou519/n/n8dd8b52e4511">llm moduleへTeraTermで接続する方法【Windows版】</a></li>
  <li><a href="https://github.com/m5stack/ModuleLLM-OpenAI-Plugin.git">ModuleLLM_OpenAI_API</a></li>
  <li><a href="https://github.com/nnn112358/ModuleLLM_OpenAI_API_example">ModuleLLM_OpenAI_API_example</a></li>
</ul>]]></content><author><name>Tail Studio</name></author><category term="AI" /><category term="開発" /><summary type="html"><![CDATA[M5Stack Module-LLM (AX630C) のNPUでInternVL2.5-1Bを動かしてみた手順まとめです。]]></summary></entry><entry><title type="html">CPU環境で「llama.cpp + InternVL3-1B-Instruct-GGUF」を試すまでの手順まとめ【Windows11】</title><link href="https://tail-studio.com/blog/2025/06/19/llama-cpp-internvl3/" rel="alternate" type="text/html" title="CPU環境で「llama.cpp + InternVL3-1B-Instruct-GGUF」を試すまでの手順まとめ【Windows11】" /><published>2025-06-19T17:23:31+09:00</published><updated>2025-06-19T17:23:31+09:00</updated><id>https://tail-studio.com/blog/2025/06/19/llama-cpp-internvl3</id><content type="html" xml:base="https://tail-studio.com/blog/2025/06/19/llama-cpp-internvl3/"><![CDATA[<p>近年、エッジAIなど、軽量なLLM（大規模言語モデル）やマルチモーダル推論の実装が急速に進んでいます。今回は、<a href="https://github.com/ggerganov/llama.cpp">ggerganov/llama.cpp</a>を使用したCPU対応のモデルを試しましたので手順をまとめました。</p>

<p>具体的には、Microsoftが提供するvcpkgを使った依存ライブラリの導入から、InternVL3-1B-Instruct-GGUFを使って実際に画像に対する質問を行うところまでを、<strong>Windows 11 Pro + Visual Studio 2022環境</strong>で検証しました。</p>

<hr />

<h2 id="-検証環境スペック">◆ 検証環境スペック</h2>

<ul>
  <li><strong>OS</strong>：Windows 11 Pro</li>
  <li><strong>CPU</strong>：Intel(R) Core(TM) i5-8250U CPU @ 1.60GHz</li>
  <li><strong>メモリ</strong>：16GB</li>
  <li><strong>Visual Studio</strong>：Visual Studio 2022（x64 Native Tools Command Prompt使用）</li>
</ul>

<p>ローエンド寄りのCPU構成ではありますが、 <strong>GPU非搭載の環境でも動作可能か？</strong> という観点から敢えてこの環境で挑戦しています。</p>

<p>同等環境はこちら。</p>

<p><a href="https://amzn.to/3MLHe0G">https://amzn.to/3MLHe0G</a></p>

<hr />

<h2 id="-環境準備">◆ 環境準備</h2>

<p>環境構築（Visual Studio/CMake/vcpkgの導入）については、ChitakoさんのZenn記事「<a href="https://zenn.dev/chitako/articles/0ad26c5807b18e#1.-%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99">Windows 11</a><a href="https://zenn.dev/chitako/articles/0ad26c5807b18e#1.-%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99">で</a><a href="https://zenn.dev/chitako/articles/0ad26c5807b18e#1.-%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99">llama.cpp</a><a href="https://zenn.dev/chitako/articles/0ad26c5807b18e#1.-%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99">を構築する</a><a href="https://zenn.dev/chitako/articles/0ad26c5807b18e#1.-%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99">(CUDA</a><a href="https://zenn.dev/chitako/articles/0ad26c5807b18e#1.-%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99">サポート付き</a><a href="https://zenn.dev/chitako/articles/0ad26c5807b18e#1.-%E7%92%B0%E5%A2%83%E6%BA%96%E5%82%99">)</a>」を参考にしました。</p>

<h2 id="-vcpkg-による依存関係の構築">◆ vcpkg による依存関係の構築</h2>

<p>まずは curl のビルドとリンクを簡略化するために、<a href="https://github.com/microsoft/vcpkg">vcpkg</a> を導入します。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pushd &lt;任意の作業ディレクトリ&gt;

git clone https://github.com/microsoft/vcpkg.git
cd vcpkg
.\bootstrap-vcpkg.bat
</code></pre></div></div>

<p>次に、curl[core,ssl]をインストール。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>.\vcpkg install curl[core,ssl]:x64-windows
</code></pre></div></div>

<hr />

<h2 id="-llamacpp-のビルドvisual-studio-2022">◆ llama.cpp のビルド（Visual Studio 2022）</h2>

<p>次に、llama.cppのソースをクローンしてビルドを行います。</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
mkdir build &amp;&amp; cd build
</code></pre></div></div>

<p>CMakeを以下のように構成します：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cmake .. ^
  -G "Visual Studio 17 2022" ^
  -A x64 ^
  -DCMAKE_BUILD_TYPE=Release ^
  -DCMAKE_TOOLCHAIN_FILE="&lt;path&gt;/vcpkg/scripts/buildsystems/vcpkg.cmake"
</code></pre></div></div>

<p>ビルド実行：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cmake --build . --config Release
</code></pre></div></div>

<p>正常にビルドが完了すると、build\bin\Release 配下に以下のような実行ファイルが生成されます：</p>

<ul>
  <li>llama-cli.exe</li>
  <li>llama-mtmd-cli.exe（マルチモーダル対応）</li>
</ul>

<hr />

<h2 id="-モデルファイルの取得internvl3">◆ モデルファイルの取得（InternVL3）</h2>

<p>本来は以下のように huggingface-cli でダウンロード可能です：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>huggingface-cli download ggml-org/InternVL3-1B-Instruct-GGUF --local-dir &lt;path&gt;\llama.cpp\models\InternVL3
</code></pre></div></div>

<p>しかし、筆者の環境では上手くいかなかったため、手動でモデルファイル（.gguf形式）をダウンロードし、以下の構成で配置しました：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>llama.cpp
└── models
    └── InternVL3
        ├── InternVL3-1B-Instruct-Q8_0.gguf
        └── mmproj-InternVL3-1B-Instruct-Q8_0.gguf
</code></pre></div></div>

<hr />

<h2 id="-実行コマンド例">◆ 実行コマンド例</h2>

<p>推論実行のためには、画像ファイル（例：input.png）を指定し、以下のコマンドを使用します：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cd llama.cpp\build\bin\Release

.\llama-mtmd-cli.exe ^
  -m ..\..\..\models\InternVL3\InternVL3-1B-Instruct-Q8_0.gguf ^
  --mmproj ..\..\..\models\InternVL3\mmproj-InternVL3-1B-Instruct-Q8_0.gguf ^
  --no-mmproj-offload ^
  --threads %NUMBER_OF_PROCESSORS% ^
  --image &lt;path&gt;\input.png ^
  -p "この画像に何が写っていますか？"
</code></pre></div></div>

<p>画像に対する自然言語での問いかけを行い、その答えを得ることができました。筆者の環境では10～20秒程度で応答しました。</p>

<hr />

<h2 id="-補足とハマりポイント">◆ 補足とハマりポイント</h2>

<ul>
  <li><strong>CMake の構成・実行</strong>：プロキシ環境など、環境によっては、CURL 機能を無効化してビルドしないとエラーになることがあります。その場合は、以下のように構成して実行すると解決できる可能性があります。
「cmake .. -DCMAKE_BUILD_TYPE=Release -DLLAMA_CURL=OFF」
ただし、手動でモデルファイルをダウンロード、配置する必要があります。</li>
  <li>上記のように構成を見直す場合、「llama.cpp\build」フォルダ内にファイルが残っていると失敗することがあるのでフォルダ内を空にしてから実行ください。</li>
</ul>

<hr />

<h2 id="-おわりに">◆ おわりに</h2>

<p>軽量なLLMと画像認識モデルの組み合わせによって、<strong>GPUがなくてもマルチモーダルな質問応答が可能</strong>になってきています。モデルサイズを調整すれば、<strong>よりスペックの低い端末やローカルデバイスでも動かせる可能性</strong>があります。</p>

<p>今後は、NPUを使った推論にもチャレンジしてみたいと考えています。</p>

<hr />

<h2 id="-参考リンク">◆ 参考リンク</h2>

<ul>
  <li>Windows11でllama.cppを構築する(CUDA）:<a href="https://zenn.dev/chitako/articles/0ad26c5807b18e">https://zenn.dev/chitako/articles/0ad26c5807b18e</a></li>
  <li>llama.cpp: <a href="https://github.com/ggerganov/llama.cpp">https://github.com/ggerganov/llama.cpp</a></li>
  <li>InternVL3 Model: <a href="https://huggingface.co/ggml-org/InternVL3-1B-Instruct-GGUF">https://huggingface.co/ggml-org/InternVL3-1B-Instruct-GGUF</a></li>
  <li>vcpkg: <a href="https://github.com/microsoft/vcpkg">https://github.com/microsoft/vcpkg</a></li>
</ul>]]></content><author><name>Tail Studio</name></author><category term="AI" /><category term="開発" /><summary type="html"><![CDATA[CPUのみの環境でllama.cppとInternVL3-1B-Instruct-GGUFを動かすまでの手順をWindows 11でまとめました。]]></summary></entry></feed>