<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns="http://purl.org/rss/1.0/"
>

<channel rdf:about="https://angelpinpoint.seesaa.net/">
<title>黄昏のスペシャルパンダのブログ</title>
<link>https://angelpinpoint.seesaa.net/</link>
<description>私が日常で調べたことややってみたこと、よくやっていること、思ったことを適当に記録していくブログです。</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="https://blog.seesaa.jp/" />
<items>
<rdf:Seq>
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/520797638.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/520034608.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/519717529.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/519641753.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/518457260.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/518313768.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/518225887.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/517145288.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/517103331.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/516642715.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/512169096.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/495595307.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/488129908.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/483827280.html" />
<rdf:li rdf:resource="https://angelpinpoint.seesaa.net/article/483446520.html" />
</rdf:Seq>
</items>
</channel>

<item rdf:about="https://angelpinpoint.seesaa.net/article/520797638.html">
<link>https://angelpinpoint.seesaa.net/article/520797638.html</link>
<title>三菱UFJモルガンスタンレー証券のパスキー登録でD-Confiaのマイナンバーカード読取エラーで苦労した話</title>
<description>先日、三菱UFJモルガンスタンレー証券のパスキー認証への切り替えをやっていて、D-ConfiaアプリのマイナンバーカードNFC読み取りエラーが発生して苦労しましたが、なぜか解決したのでメモしておきます。具体的には、方法1で何度やっても読取エラーになったので、試しに方法2をやったら成功しました。あくまで2026年5月23日時点の、私の場合の話ですので、同じになるとは限りません。</description>
<dc:subject>IT関連</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2026-05-29T02:58:52+09:00</dc:date>
<content:encoded><![CDATA[
先日、三菱UFJモルガンスタンレー証券のパスキー認証への切り替えをやっていて、D-ConfiaアプリのマイナンバーカードNFC読み取りエラーが発生して苦労しましたが、なぜか解決したのでメモしておきます。<br /><br />具体的には、方法1で何度やっても読取エラーになったので、試しに方法2をやったら成功しました。<br />あくまで2026年5月23日時点の、私の場合の話ですので、同じになるとは限りません。<br /><a name="more"></a><h3>目次</h3><br /><span class="indenttext">・<a href="#premise">前提</a><br />・<a href="#phenomenon">発生した現象</a><br />・<a href="#solution">解決方法</a><br />・<a href="#tips">その他に間違えやすいポイント</a><br />・<a href="#summary">まとめ</a><br /></span><br /><br /><h3 id="premise">前提</h3><br /><span class="indenttext">三菱UFJモルガンスタンレー証券では2026年2月下旬以降、ログイン時の認証方法がワンタイムパスワードからパスキー認証へ順次切り替わっています。切替日は人によって異なります。<br /><br />パスキー認証では、初回にパスキーの登録が必要です。<br />パスキーの登録には、D-Confiaという本人確認アプリをスマホにインストールして本人確認する必要があり、3種類の方法が用意されています。<br /><br />・<strong>方法1</strong>：署名用電子証明書用パスワード（英数字6〜16桁）を入力してマイナンバーカードをNFCで読み取る<br />・<strong>方法2</strong>：写真撮影と券面情報（①生年月日②有効期限③4桁の券面番号）を入力してマイナンバーカードをNFCで読み取る<br />・<strong>方法3</strong>：写真撮影と運転免許証の暗証番号2組を入力して運転免許証をNFCで読み取る<br /><br />私のスマホはGalaxy S9（Android）です。<br /></span><br /><br /><h3 id="phenomenon">発生した現象</h3><br /><span class="indenttext">方法1を試したところ、間違ったパスワードを入力した場合は、マイナンバーカードを読み取る際に「残り〇回」というエラーが出るのですが、正しいパスワードを入力した場合は、マイナンバーカードを読み取る際に何度やっても<strong>「読取でエラーが発生しました」</strong>というエラーが出るという現象です。<br /><br />以下も試しましたが、現象は変わりませんでした。<br />・スマホケースを外す<br />・カードケースからマイナンバーカードを取り出す<br />・マイナンバーカードを木の机の上に置いてスキャン<br />・スマホの再起動<br />・スマホのNFCのオンオフ<br />・スマホのNFCのロック設定がオフを確認<br />・スマホのNFCの標準アプリをオフにする<br />・D-Confiaアプリのキャッシュをクリア<br /><br />また、他のアプリ、例えばマイナポータルでは普通にマイナンバーカードを読み取れています。<br /></span><br /><br /><h3 id="solution">解決方法</h3><br /><span class="indenttext"><strong>方法2を実施したら成功しました</strong>。<br /><br />方法2は、写真撮影と券面情報（①生年月日②有効期限③4桁の券面番号）入力のあと、マイナンバーカードを読み取るやり方です。<br /><br />方法2も方法1と同じくマイナンバーカードを読み取るやり方なので、方法1が駄目なら方法2も駄目だろうと思っていたので試すのが遅れましたが、試しにやってみたらなぜか成功しました。<br /><br />原因はわかりませんが、私のスマホは古い機種なのでマイナンバーの読み取り負荷が高かったりして、方法1と方法2では読み取るマイナンバーカードの情報や量が違っていて、その差で読み取りがうまくいったり、いかなかったりしたのかもしれません。<br /><br />ちなみに方法3を試した際は、デバイスが対応していない、というようなエラーになったと思います。<br /></span><br /><br /><h3 id="tips">その他に間違えやすいポイント</h3><br /><span class="indenttext">私がやっていて、間違えやすいと思ったポイントをいくつか記載しておきます。<br /><br />・D-Confiaは直接起動せずに、証券会社のサイトに表示されているQRコードを読み取って、そこからアプリを起動する。<br />・生年月日はカードに書かれている通り、和暦で入力する<br /></span><br /><br /><h3 id="summary">まとめ</h3><br /><span class="indenttext">私と同じ現象が発生している場合は、もしかしたら方法2で解決できるかもしれません。<br /><br />以上</span><br />

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/520034608.html">
<link>https://angelpinpoint.seesaa.net/article/520034608.html</link>
<title>Ren&#39;pyのNVLモードを試したメモ</title>
<description>ちょっと思い立って、Ren&#39;Pyというツールを使ってノベルゲームを作ってみようと思い、試してみました。今回は、NVLモードを試したので、その時に気付いたことやつまったことを備忘録としてまとめておきます。</description>
<dc:subject>プログラミング</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2026-03-01T00:10:00+09:00</dc:date>
<content:encoded><![CDATA[
ちょっと思い立って、<a href="https://www.renpy.org/" target="_blank">Ren'Py</a>というツールを使ってノベルゲームを作ってみようと思い、試してみました。<br /><br />今回は、NVLモードを試したので、その時に気付いたことやつまったことを備忘録としてまとめておきます。<br /><a name="more"></a><h3>目次</h3><br /><span class="indenttext">・Ren'Pyとは<br />・NVLモードとは<br />・行送り・ページ送りアイコンのカスタマイズ<br />・カメラワーク（ズームアウト）をcropで実現する<br />・NVLモードで複数行テキストをまとめて表示する<br />・まとめ<br /></span><br /><br /><h3>Ren'Pyとは</h3><br /><span class="indenttext"><a href="https://www.renpy.org/" target="_blank">Ren'Py</a>は、ビジュアルノベルやノベルゲームを作るための無料のオープンソースのゲームエンジンです。Pythonをベースにした専用スクリプト言語で記述し、Windows・Mac・Linux・Android・iOSなど幅広いプラットフォームに対応しています。<br /><br />商業ゲームでも使われており、「ドキドキ文芸部！」などもRen'Pyで作られているそうです。現在もGitHub（<a href="https://github.com/renpy/renpy" target="_blank">renpy/renpy: The Ren'Py Visual Novel Engine</a>）で開発が続いるようです。<br /><br />今回Ren'Pyを選んだ理由は、Pythonが使えるという点です。将来、生成AIのAPIを呼び出して動的にストーリーを変えるなどもできそうかなと思ったためです。<br /><br />私は公式サイトから、そのときの最新の8.5.2をダウンロードしました。<br /><a href="https://www.renpy.org/" target="_blank">Ren'Py</a><br /><br />スクリプトの編集には、VS Codeの公式拡張機能「<a href="https://marketplace.visualstudio.com/items?itemName=renpy.language-renpy" target="_blank">Ren'Py Language (Official)</a>」が公開されていて、それを使わせてもらいました。<br />VS Codeの拡張機能検索で「Renpy」と入力すると見つかると思います。<br /></span><br /><br /><h3>NVLモードとは</h3><br /><span class="indenttext">Ren'Pyには大きく2つのテキスト表示モードがあります。<br /><br /><strong>ADVモード</strong>：<br />画面下部のウィンドウに1行ずつテキストを表示する、一般的なノベルゲーム形式<br /><br /><strong>NVLモード</strong>：<br />画面全体にテキストを表示する、小説・サウンドノベル風の形式<br /><br />NVLモードは、一度に複数行を画面に表示し続けるモードで、たくさんのテキストを表示するには向いているように思います。<br />今回はこのNVLモードを使ってみました。<br /><br />以降、やってみて詰まったところなどをメモしておきます。<br /></span><br /><br /><h3>行送り・ページ送りアイコンのカスタマイズ</h3><br /><span class="indenttext">テキストの末尾にクリック待ちのアイコン（ctc：click to continueって言うらしい）を表示しようとしました。<br /><br />標準の<code>nvl_narrator</code>ではctcを設定できず、調べたところ、<code>Character(None, kind=nvl, ctc="ctc_normal")</code>のように、narratorをCharacterとして定義し直す必要があることがわかりました。<br /><br />ただ、これをやると、<strong>ナレーターのテキスト設定がnvl_thoughtからnvl_textに切り替わる</strong>ようで、gui.rpyで設定しているテキストの位置や幅が変わってしまいました。nvl_narratorを使う場合はgui.nvl_thought_XXXの設定だったのが、Character(None, kind=nvl)で定義した場合は、gui.nvl_text_XXXの設定が使われるようです。<br /><br />さらにページ送りのアイコンは、別の設定があり、<code>config.nvl_page_ctc</code>で設定できました。<br /><br />アイコンとしては、文字「▽」「▼」をアイコンとし、点滅するようにしました。<br />サイズや表示位置は、文字サイズに合わせて微調整しています。<br /><br />最終的なコードはこうなりました。<br /><pre class="prettyprint"># 行送り用アイコン（▽をフェードでアニメーション）<br />image ctc_normal:<br />    Text("▽", size=15, yoffset=10)<br />    linear 0.5 alpha 0.0<br />    linear 0.5 alpha 1.0<br />    repeat<br /><br /># ページ送り用アイコン（▼を黄色で表示）<br />image ctc_page_turn:<br />    Text("▼", size=20, yoffset=8, color="#ffcc00")<br />    linear 0.5 alpha 0.0<br />    linear 0.5 alpha 1.0<br />    repeat<br /><br /># キャラクター定義時にctcを指定<br />define narrator = Character(None, kind=nvl, ctc="ctc_normal", ctc_position="nestled")<br />define config.nvl_page_ctc = "ctc_page_turn"<br />define config.nvl_page_ctc_position = "nestled"</pre><br />動かすとこんな感じです。<br /><img border="0" alt="ctcアイコン" src="https://angelpinpoint.up.seesaa.net/image/ctcicon.gif" style="max-width:100%; height:auto;"><br /></span><br /><br /><h3>カメラワーク（ズームアウト）をcropで実現する</h3><br /><span class="indenttext">特定の部分をアップで表示して、そこからズームアウトして全体を見せる演出をやりたかったですが、思ったより苦戦しました。<br />ズームには、<code>zoom</code>という機能が使えそうなんですが、試してみるとカメラ移動とズームの動きが不自然になってしまいました。<br /><br />うごきがいまいちだったコード↓<br /><pre class="prettyprint">transform face_closeup:<br />    xalign 0.35 yalign 0.05 zoom 5<br /><br />transform reveal_body:<br />    xalign 0.35 yalign 0.05 zoom 5<br />    ease 1.5 zoom 2 yalign 0.5 xalign 0.5</pre><br /><br />そこで、<code>crop</code>を使って切り取り範囲を変化させることで自然にできました。<br /><pre class="prettyprint">transform face_closeup:<br />    crop (248, 36, 272, 153) size (1920, 1080)<br /><br />transform reveal_body:<br />    ease 2.0 crop (0, 0, 1024, 559) size (1920, 1080)</pre><br />表示する箇所<pre class="prettyprint">アップ表示<br />show 画像 at face_closeup with dissolve<br /><br />ズームアウト<br />show 画像 at reveal_body</pre><br /></span><br /><br /><h3>NVLモードで複数行テキストをまとめて表示する</h3><br /><span class="indenttext">NVLモードで段落ごとにまとまったテキストを表示したいと思ったのですが、改行を含む場合には、コードが読みにくくなったり、微妙に行頭の位置がずれるなどの問題が発生して試行錯誤しました。<br /><br /><strong>断念案１：1つのダブルクォートで囲んで、改行コード\nで改行</strong><br /><pre class="prettyprint">"一行目のテキスト。\n二行目のテキスト。\n三行目のテキスト。"</pre>動作はしますが、テキストが長くなるとコードが読みにくくなります。<br /><br /><strong>断念案２：３つのダブルクォートで囲んで、改行コード\nで改行</strong><br /><pre class="prettyprint">"""一行目のテキスト。\n<br />二行目のテキスト。\n<br />三行目のテキスト。"""</pre>コードは多少読みやすいですが、2行目以降、行頭に謎のスペースが入り、微妙に行頭位置がずれてしまいました。<br /><img border="0" alt="断念案２" src="https://angelpinpoint.up.seesaa.net/image/text.png" style="max-width:100%; height:auto;"><br />しかも、空行を入れると、そこでクリック待ちも発生してしまいます。<br /><br />そこで今回は、<br /><strong>採用案：行ごとにダブルクォートで囲い、{nw}タグで連続表示</strong><br /><pre class="prettyprint">"一行目のテキスト。{nw}"<br />"二行目のテキスト。{nw}"<br />"三行目のテキスト。"</pre>{nw}タグを末尾につけると、クリック待ちをせずに次の行へ続けて表示します。<br />1行ずつ書けるのでコードが読みやすく、今回はこの方法を採用しました。<br />ただし、gui.rpy を少しいじっています。<br /><pre class="prettyprint">define gui.nvl_height = None<br />define gui.nvl_spacing = 0</pre><br />こんな感じになります。<br /><img border="0" alt="採用案" src="https://angelpinpoint.up.seesaa.net/image/text2.png" style="max-width:100%; height:auto;"><br /></span><br /><h3>まとめ</h3><br /><span class="indenttext">今回、はじめてRen'Pyを使ってみましたが、思っていた以上に簡単にノベルゲームを作れそうと思いましたが、細かい制御をしようとすると、なかなか苦戦しました。<br />同じように詰まった方の参考になれば幸いです。<br /></span>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/519717529.html">
<link>https://angelpinpoint.seesaa.net/article/519717529.html</link>
<title>スプラ3の戦績を無料のGemini APIで自動記録するツールをClaude Codeで作った話</title>
<description>スプラトゥーン3の戦績(ルールや勝敗、キル数、デス数など)を記録して分析したかったのですが、既存のツールが使えなくなっていたので、Switch/Switch2の映像をキャプチャボード + 無料のGemini APIで解析して戦績を記録するツールを自作しました。プレイヤー識別の方法や、APIの制限対策、重複チェックなど、いくつか試行錯誤したので、その辺りをメモしておきます。Switchのキャプチャ環境についても、記事後半の「キャプチャ環境について」に記載しています。</description>
<dc:subject>プログラミング</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2026-01-13T00:45:48+09:00</dc:date>
<content:encoded><![CDATA[
スプラトゥーン3の戦績(ルールや勝敗、キル数、デス数など)を記録して分析したかったのですが、既存のツールが使えなくなっていたので、Switch/Switch2の映像をキャプチャボード + 無料のGemini APIで解析して戦績を記録するツールを自作しました。<br /><br />プレイヤー識別の方法や、APIの制限対策、重複チェックなど、いくつか試行錯誤したので、その辺りをメモしておきます。<br /><br />Switchのキャプチャ環境についても、記事後半の「キャプチャ環境について」に記載しています。<br /><a name="more"></a><h3>目次</h3><br /><style>img { max-width: 100%; height: auto; }</style><br />・<a href="#background">背景と経緯</a><br />・<a href="#spec">作ろうとしたもの</a><br />・<a href="#ocr">最初はOCRを試したが...</a><br />・<a href="#gemini-about">Gemini APIについて</a><br />・<a href="#gemini">Gemini APIでの試行錯誤</a><br />　　- <a href="#model">モデル選定とAPI制限対策</a><br />　　- <a href="#player">プレイヤー識別の工夫</a><br />　　- <a href="#timelag">時刻のずれ</a><br />　　- <a href="#stage">ステージ名認識の揺れ</a><br />・<a href="#capture">キャプチャ環境について</a><br />・<a href="#current">現在の運用と今後</a><br /><br /><br /><h3 id="background">背景と経緯</h3><br /><span class="indenttext">スプラ3をプレイしていて、自分の戦績を記録して振り返りたいと思ったのですが、Nintendoの非公式APIを使った既存のツールは仕様変更で動かなくなっていました。<br /><br />調べてみると、今から使うにはそれなりに手間がかかりそうだったのと、非公式なので将来的にまた使えなくなるリスクもあり、断念しました。<br /><br />そこで、Switchの映像をキャプチャボードで取り込んで、リザルト画面をAIで解析すればいけるんじゃないかと思って、作ることにしました。<br /></span><br /><br /><h3 id="spec">作ろうとしたもの</h3><br /><span class="indenttext">作ろうとしたのは、こんなツールです：<br /><br /><strong>基本的な動作</strong><br />(1) Switchのスプラトゥーン3の「最近のバトル」画面をキャプチャボードで取り込む<br />(2) Enterキーを押すと画像として保存<br />(3) Gemini APIで画像を解析して、戦績データ（日時、ステージ、ルール、勝敗、キル、デス、スペシャル）を抽出<br />(4) CSV形式で保存<br /><br /><strong>コーディングについて</strong><br />実装はClaude Codeに任せました。私からは「こういう機能が欲しい」と指示を出して、あとはClaude Codeが実装してくれました。<br /></span><br /><br /><br /><h3 id="ocr">最初はOCRを試したが...</h3><br /><span class="indenttext">最初は<code>pytesseract</code>などのOCRライブラリで文字認識を試してみました。<br /><br />ただ、スプラ3の特殊なフォントせいか認識精度が低かったです。また、戦歴の画面では、自分の戦績の表示位置が固定されていません。固定座標で文字を切り出せないのもあって、認識しにくく、今回は断念しました。<br /><br />そこで、生成AIの<strong>Gemini API</strong>を試すことにしました。Gemini APIなら、ある程度は無料で使えますし。<br /></span><br /><br /><h3 id="gemini-about">Gemini APIについて</h3><br /><span class="indenttext">Gemini APIは、Googleが提供する生成AI「Gemini」のAPIです。画像を解析してテキストを抽出するような用途にも使えます。<br /><br /><a href="https://aistudio.google.com/app/apikey" target="_blank">Google AI Studio</a>でAPIキーを発行すれば、Googleアカウントがあれば誰でも無料で使い始められます。<br /><br />Gemini APIは無料の枠があり、1日あたり一定回数まで無料で使えます。<br />モデルごとに「RPD」（Requests Per Day：1日あたりのリクエスト数）が設定されています。<br /><br />Google AI Studioの画面で、各モデルの利用状況を確認できます：<br /><div style="text-align: center"><a href="https://angelpinpoint.up.seesaa.net/image/E382B9E382AFE383AAE383BCE383B3E382B7E383A7E38383E38388202026-01-1320233057.png" target="_blank"><img border="0" alt="スクリーンショット 2026-01-13 233057.png" src="https://angelpinpoint.up.seesaa.net/image/E382B9E382AFE383AAE383BCE383B3E382B7E383A7E38383E38388202026-01-1320233057.png"></a></div><br />例えば、<code>gemini-2.5-flash-lite</code>は1日20回、<code>gemini-2.5-flash</code>も1日20回という制限があります。<br /></span><br /><br /><h3 id="gemini">Gemini APIでの試行錯誤</h3><br /><span class="indenttext">Claude Codeに基本的な仕様を伝えて、PythonでOpenCVとGemini APIを使ったツールを作ってもらったのですが、実際に動かしてみると、いくつか問題が出てきました。<br /></span><br /><br /><h4 id="model">(1) モデル選定とAPI制限対策</h4><br /><span class="indenttext">開発中、すぐに気づいたのが<strong>Geminiの無料枠の制限</strong>です。<br /><br />最初に使っていたモデルは1日20回までで、開発中はプロンプトを試行錯誤するのもあって、すぐ制限に達してしまいました。<br />1日に20試合以上することもあるし、どうしようかなと思っていました。<br /><br /><strong>複数モデルの自動切り替え</strong><br />そこで、複数のモデルを自動で切り替えることにしました。<br /><br />具体的には、利用可能なモデルをリストアップしておいて、制限エラーが出たら次のモデルに自動で切り替えて再試行します。<br /><br />最初は「どのモデルが使えるのか」もよくわからなかったので、簡単なテストスクリプトを作って、実際に画像を投げてみて、使えるモデルを探しました。<br /><br />最終的には3つのモデルファミリーを使い分けることで、<strong>合計60回/日まで使える</strong>ようになりました。<br />1日に60試合もすることはまずないので、実用上は十分です。<br /><br /><pre class="prettyprint"># 利用モデルの自動切り替え<br />self.available_models = [<br />    'gemini-2.5-flash-lite',   # 20回/日<br />    'gemini-2.5-flash',        # 20回/日<br />    'gemini-3-flash-preview',  # 20回/日<br />]<br /></pre><br />今はこれですが、定期的な見直しが必要になります。<br /><br /><strong>モデル名の罠</strong><br />ここで混乱したのが、<strong>API側のモデル名と画面の表示名が微妙に違う</strong>ことです。<br /><br />例えば、コードで<code>gemini-3-flash-preview</code>を指定して使うと、この画面では<code>gemini-3-flash</code>の使用回数が増えていきます。<br /><br />つまり、同じモデルの中でもバージョン違いのようなものがあるようですが、<strong>使用制限はまとめてカウントされる</strong>のかもしれません。<br /><br />このあたりの仕様はよくわかっていません。<br /></span><br /><br /><h4 id="player">(2) プレイヤー識別の工夫</h4><br /><span class="indenttext">画面上には8人の成績が並んでいるので、この中から自分がどれなのかをGeminiに判断してもらう必要があります。<br /><br /><strong>最初の方法：ユーザー名で指定</strong><br />最初は、プロンプトでプレイヤーを指定していました。<br />しかし、<strong>Xマッチではプレイヤー名が表示されない</strong>ことに気づきました。<br /><br />正確には、表示されるのですが、一定時間ごとに装備の名前に切り替わってしまうので、キャプチャのタイミングによってはユーザー名が映っていないことがあります。<br /><br /><strong>解決策：黄色いL字矢印で指定</strong><br />そこで、プロンプトを「黄色いL字矢印があるプレイヤーのデータを取得」に変更しました。<br />ただ、画面上には黄色い要素は他にもあるし、矢印っぽい形もあるので、誤認識が起きていました。<br /><br />最終的には、プロンプトで<strong>「画面中央やや右側のプレイヤーリストの中で、プレイヤー名のすぐ左側にある黄色いL字矢印」</strong>と、位置も含めて指定することで、精度が上がりました。<br /><br /><strong>実際に使ったプロンプト（抜粋）</strong><br />最終的に使っているプロンプトはこんな感じです：<br /><br /><pre class="prettyprint">この画像はスプラトゥーン3の試合結果画面です。<br /><br />【ステップ1: 自分のプレイヤー行を特定する】<br />画面右側のプレイヤーリストを見てください。上段が「WIN!」チーム、下段が「LOSE...」チームです。<br />各プレイヤー行の左端（武器アイコンのさらに左）に「黄色いL字型の矢印マーク（↳）」が付いている行が自分のプレイヤーです。<br />- この矢印は画面左端のイカマークとは別物です<br />- 見つからない場合はプレイヤー名「どこにでもいるひと」の行を使用してください<br /><br />【ステップ2: 勝敗を判定する】<br />自分の行が「WIN!」ブロック（上段・緑色）にあれば WIN、「LOSE...」ブロック（下段・ピンク色）にあれば LOSE です。<br /><br />【ステップ3: K/D/SP数値を読み取る】<br />自分の行を右方向に見ていくと：<br />  [武器アイコン] [プレイヤー名] [ポイント（例: 547p）] [小さな数値グループ×3]<br />この「小さな数値グループ×3」が K/D/SP です。<br />- 3つは左から順に: キル数(K) ／ デス数(D) ／ スペシャル数(SP)<br />- 「+5」のように「+」記号が付いている場合は、その数字（5）だけを読んでください<br />- 他のプレイヤーの行と混同しないよう、自分の行のみを水平方向に読んでください</pre></span><br /><br /><h4 id="timelag">(3) 時刻のずれ</h4><br /><span class="indenttext">ここではじめて気が付いたのですが、画面によって表示される時刻が違っていました。<br /><br />スプラ3では、同じ試合でも：<br />・戦歴画面：試合開始時刻<br />・メモリープレイヤー画面：試合終了時刻<br /><br />が表示されるので、画面が違うと時刻が一致しません。<br />そこで、使う側で<strong>必ず戦歴画面をキャプチャする</strong>ようにしています。<br /></span><br /><br /><h4 id="stage">(4) ステージ名認識の揺れ</h4><br /><span class="indenttext">ステージ名の認識ミスが多く、特に「クサヤ」を「クツヤ」とか誤認識したりします。また、「マヒマヒリゾート＆スパ」の＆が全角になったり半角になったり、表記揺れが多発しました。そこで、プロンプトでステージ名を指定することにしました。<br /><br />プロンプトを抜粋します。<br /><pre class="prettyprint">以下の情報を抽出してください：<br />1. 日時（画面左上に表示されている時刻）<br />2. ステージ名（必ず以下のリストから正確に選んでください）：<br />   - オヒョウ海運<br />   - カジキ空港<br />   - キンメダイ美術館<br />   - クサヤ温泉<br />   - ゴンズイ地区<br />   - コンブトラック<br />   - ザトウマーケット<br />   - スメーシーワールド<br />   - タカアシ経済特区<br />   - タラポートショッピングパーク<br />   - チョウザメ造船<br />   - デカライン高架下<br />   - ナメロウ金属<br />   - ナンプラー遺跡<br />   - ネギトロ炭鉱<br />   - バイガイ亭<br />   - ヒラメが丘団地<br />   - マサバ海峡大橋<br />   - マテガイ放水路<br />   - マヒマヒリゾート＆スパ<br />   - マンタマリア号<br />   - ヤガラ市場<br />   - ユノハナ大渓谷<br />   - リュウグウターミナル<br />   - 海女美術大学<br /><br />3. マッチタイプ（バンカラマッチ (オープン)、バンカラマッチ (チャレンジ)、Xマッチ など）<br />4. ルール（ガチアサリ、ガチエリア、ガチホコバトル、ガチヤグラ など）<br />5. 勝敗（WIN または LOSE）<br />6. キル数（自分の行の3数値グループの一番左）<br />7. デス数（自分の行の3数値グループの真ん中）<br />8. スペシャル利用数（自分の行の3数値グループの一番右）<br /><br />注意:<br />- ステージ名は必ず上記リストの表記と完全に一致させてください。特に「クサヤ温泉」「マヒマヒリゾート＆スパ」（全角＆）に注意してください。<br />- キル・デス・スペシャルは整数で返してください（「+」記号は除く）。<br />- 隣のプレイヤーの数値と混同しないよう注意してください。<br /><br />以下のJSON形式で回答してください（JSONのみ、他の説明文は不要）:<br />{<br />  "日時": "2025/12/31 00:52",<br />  "ステージ": "カジキ空港",<br />  "マッチタイプ": "バンカラマッチ (オープン)",<br />  "ルール": "ガチアサリ",<br />  "勝敗": "WIN",<br />  "キル": 10,<br />  "デス": 8,<br />  "スペシャル": 4<br />}</pre></span><br /><br /><h3 id="capture">キャプチャ環境について</h3><br /><span class="indenttext">最後に、私のSwitch/Switch2のキャプチャ環境についても簡単に紹介します。<br /><br /><strong>接続構成</strong><br />Switch → HDMI分配器 → キャプチャボード → PC → ヘッドホン<br />　　　　　　　　　└→ ゲーム用ディスプレイ<br /><br />HDMI分配器を使って、一方をキャプチャボードに、もう一方をゲーム用のディスプレイに接続しています。<br />キャプチャボード経由だと遅延が発生するので、ゲームプレイ用には分配器の直接出力を使うためです。<br /><br /><strong>音声の統合</strong><br />ゲームの音声は、PCのUSBから入力された音声を「このデバイスを聴く」に設定して、PCのヘッドホンで聞いています。<br /><br />私は普段、YouTubeを見ながらゲームをするので、PCの音（YouTube）とゲーム音をひとつのヘッドホンで聞きたかったので、こうしています。<br /><br />こういう構成なので、キャプチャボードは比較的安いもので十分です。<br /></span><br /><br /><h3 id="current">現在の運用と今後</h3><br /><span class="indenttext">現在は、試合が終わったら戦歴画面を表示した状態でEnteryキーを押すだけで、自動的に画像保存 → Gemini解析 → CSV保存まで完了します。<br /><br />ある程度の誤認識はありますが、その場合はExcelでCSVを手修正しています。<br />ひとつ注意が必要なのは、CSVファイルをExcelで開いたまま次の解析を実行すると、ファイルがロックされていて書き込みエラーになってしまうことです。<br />そのため、修正したら必ずExcelを閉じてから次のキャプチャをする、という運用にしています。若干面倒ですので、この辺りも改善できそうです。<br /><br />現状、CSVファイルをExcelで取り込んで、分析したり、グラフ化したりしています。<br />今後はこれをWebツールにでもしてみようかと考えています。<br /><br />同じように戦績記録したい方や、Gemini APIで画像解析をしたい方の参考になれば幸いです。<br /></span><br />

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/519641753.html">
<link>https://angelpinpoint.seesaa.net/article/519641753.html</link>
<title>VSCode拡張機能でモーラ数カウンターを作った - デコレーションの配置調整で苦労した話</title>
<description>Sunoで簡単に曲が作れることがわかったので、一度やってみたかった作詞を始めてみたのですが、モーラ数を数えるのが面倒すぎて挫折しました。既存のツールも見つからなかったので、自分でVS Code拡張機能を作ることにしました。特にデコレーション（Decoration）の配置調整で苦労したので、その解決方法をまとめておきます。今回は、Claude Codeを使って開発しました。</description>
<dc:subject>プログラミング</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2026-01-06T01:17:49+09:00</dc:date>
<content:encoded><![CDATA[
<a href="https://suno.com/" target="_blank">Suno</a>で簡単に曲が作れることがわかったので、一度やってみたかった作詞を始めてみたのですが、モーラ数を数えるのが面倒すぎて挫折しました。<br /><br />既存のツールも見つからなかったので、自分で<a href="https://code.visualstudio.com/" target="_blank">VS Code</a>拡張機能を作ることにしました。<br /><br />特にデコレーション（Decoration）の配置調整で苦労したので、その解決方法をまとめておきます。<br />今回は、Claude Codeを使って開発しました。<br /><a name="more"></a><h3>目次</h3><br /><br />・<a href="#what-i-made">作ったもの</a><br />・<a href="#tech-used">使用した技術</a><br />・<a href="#decoration-trouble">デコレーションの配置調整で苦労した話</a><br />　　- <a href="#problem1">問題1：モーラ数の右寄せができない</a><br />　　- <a href="#problem2">問題2：母音「i」の位置がずれる</a><br />・<a href="#claude-code-dev">Claude Codeを使った開発について</a><br />・<a href="#mora-count">モーラ数のカウント方法</a><br />・<a href="#summary">まとめ</a><br /><br /><h3 id="what-i-made">作ったもの</h3><br /><span class="indenttext"><strong>Japanese Lyrics Editor (J-Lyrics)</strong>という、日本語の歌詞作成を支援するVSCode拡張機能です。<br /><br />主な機能：<br />・各行のモーラ数（拍数）をリアルタイム表示<br />・行末の母音を表示（韻を踏む際の参考に）<br />・Sunoのメタタグ形式もサポート<br /><br />元々VSCodeで作詞をしていたので、VSCode拡張機能にしてみました。歌詞の履歴管理もしやすいですし。<br /><br />GitHubで公開しています：<br /><a href="https://github.com/dokonidemoiruhito/japanese-lyrics-editor" target="_blank">https://github.com/dokonidemoiruhito/japanese-lyrics-editor</a><br /><img border="0" alt="jlyrics.png" src="https://angelpinpoint.up.seesaa.net/image/jlyrics.png" width="500" height="259"><br /></span><br /><br /><h3 id="tech-used">使用した技術</h3><br /><span class="indenttext">・<strong><a href="https://code.claude.com/docs/ja/overview" target="_blank">Claude Code</a></strong>：開発支援ツール<br />・<strong>TypeScript + <a href="https://code.visualstudio.com/api" target="_blank">VSCode Extension API</a></strong><br />・<strong><a href="https://github.com/hexenq/kuroshiro" target="_blank">Kuroshiro</a></strong>：漢字をひらがなに変換するライブラリ<br /><br />Claude Codeを使って開発しましたが、細かい仕様は会話しながら詰めていく感じで進めました。詰まった時はGeminiも併用しながら相談していました。<br /></span><br /><br /><h3 id="decoration-trouble">デコレーションの配置調整で苦労した話</h3><br /><span class="indenttext">VSCode拡張機能で行頭に情報を表示する「デコレーション（Decoration）」の配置調整が、思った以上に厄介でした。<br /></span><br /><br /><h4 id="problem1">問題1：モーラ数の右寄せができない</h4><br /><span class="indenttext">モーラ数を行頭に表示するとき、右寄せで一桁と二桁で桁を揃えたかったんです。<br /><br />しかし、VSCodeのデコレーションには以下の制限がありました：<br />・<strong>右寄せや中央寄せの設定ができない</strong><br />・<strong>フォントを指定できない</strong>ため、ユーザー環境によってプロポーショナルフォントが使われる<br /><br />右寄せを設定できなかったため、最初は半角スペースで左埋めを試しましたが、スペース埋めでは桁が揃わず、見た目がバラバラになってしまいました。<br /><br /><strong>解決方法：デコレーションを2つ使う</strong><br /><br />無理やりですが、デコレーションを2つ用意して解決しました：<br /><br />(1) 1つ目のデコレーション：透明な「0」で左埋め<br />(2) 2つ目のデコレーション：実際のモーラ数を表示<br /><br />例えば：<br />・モーラ数が5の場合：透明な「0」+「5」を表示<br />・モーラ数が12の場合：透明文字なし+「12」を表示<br /><br />こうすることで、見た目上は右寄せになります。<br /><br />コードとしては、以下のような感じです：<br /><br /><pre class="prettyprint">// 1つ目：透明な"0"で左埋め<br />paddingDecorationType = vscode.window.createTextEditorDecorationType({<br />    before: {<br />        color: 'transparent',<br />    }<br />});<br /><br />// 2つ目：モーラ数を表示<br />moraDecorationType = vscode.window.createTextEditorDecorationType({<br />    before: {<br />        color: new vscode.ThemeColor('editorCodeLens.foreground'),<br />    }<br />});<br /></pre><br /><br />実際の配置では、モーラ数が1桁の時は<code>paddingText = '0'</code>、2桁の時は<code>paddingText = ''</code>として調整しています。<br /></span><br /><br /><h4 id="problem2">問題2：母音「i」の位置がずれる</h4><br /><span class="indenttext">当初は母音（a, i, u, e, o）を行頭のデコレーションに表示していました。<br /><br />しかし、プロポーショナルフォントでは<strong>「i」の文字幅が狭い</strong>ため、他の母音と比べて中央位置がずれて見えてしまいます。<br /><br />上で書いた通り、中央揃えもできませんので、最初は「i」の時だけ左マージンを調整しようとしましたが、ユーザー環境によってフォントが異なるため、調整量も変わってしまい断念しました。<br /><br /><strong>解決方法：ガター領域にSVG画像で表示</strong><br /><br />行番号の左側（ガター領域）に、SVGで母音を描画する方法に変更しました。<br /><br /><pre class="prettyprint">function createVowelSvg(vowel: string, displayStyle: string = 'katakana'): vscode.Uri {<br />    const color = vowelColors[vowel] || '#808080';<br />    const displayMap = vowelDisplayMaps[displayStyle] || vowelDisplayMaps['katakana'];<br />    const displayText = displayMap[vowel] || vowel;<br />    const svg = `&lt;svg xmlns="<a href="http://www.w3.org/2000/svg" target="_blank">http://www.w3.org/2000/svg</a>" width="16" height="16" viewBox="0 0 16 16"&gt;<br />        &lt;rect x="0" y="0" width="16" height="16" fill="${color}" /&gt;<br />        &lt;text x="8" y="13" text-anchor="middle" font-size="14" font-family="Consolas" fill="black"&gt;${displayText}&lt;/text&gt;<br />    &lt;/svg&gt;`;<br />    const encoded = Buffer.from(svg).toString('base64');<br />    return vscode.Uri.parse(`data:image/svg+xml;base64,${encoded}`);<br />}<br /></pre><br /><br />ただ、ガター領域は狭いので視認性が悪く、最初は文字色を変えたりしていましたが、最終的に背景色を付けることにしました。色は<a href="https://m2.material.io/design/color/the-color-system.html" target="_blank">Googleのマテリアルカラー</a>の100番台から選んでいます（柔らかいパステルカラー）。<br /><br />結果：<br />・文字位置のずれ問題が解消<br />・色分けで母音が見やすくなった<br />・韻を踏む際の参考にしやすい<br /><br />デコレーションは思っていたより制約が多く、試行錯誤しながらの解決になりました。<br /></span><br /><br /><h3 id="claude-code-dev">Claude Codeを使った開発について</h3><br /><span class="indenttext"><br /><strong>良かった点：</strong><br />・細かい仕様を最初から決めず、会話しながら詰めていけた<br />・「こんな感じで」と伝えて、動作確認しながら進められた<br /><br /><strong>向いてない作業：</strong><br />・表示の微調整（色、サイズ、位置など）<br />・これらは自分で直接コードを修正した方が早かったです<br /><br /><strong>詰まった時の対応：</strong><br />・Geminiも併用して相談しながら進めました<br /><br />特殊なことはしていないと思いますが、最初から完璧な仕様を提示するのではなく、会話しながら仕様を詰めて動作確認する、というのを繰り返しながらなんとなく作っていった感じです。<br /></span><br /><br /><h3 id="mora-count">モーラ数のカウント方法</h3><br /><span class="indenttext">モーラ数のカウントは、ほぼClaude Codeに任せました。<br /><br />基本的な流れ：<br />・Kuroshiroライブラリで漢字をひらがなに変換<br />・拗音（きゃ、しゅ等）は1モーラとしてカウント<br />・促音（っ）も1モーラとしてカウント<br />・Sunoのルビ記法 <code>漢字(よみ)</code> にも対応<br /><br />唯一自分で修正したのは「っ」の扱いだったと記憶しています。細かいロジックはClaude Codeが提案してくれたものをベースにしています。<br /></span><br /><br /><h3 id="summary">まとめ</h3><br /><span class="indenttext">VSCode拡張機能の開発では、デコレーションの配置調整が意外と厄介でした。フォント指定や配置設定ができないため、今回のような工夫が必要になります。<br /><br />特にデコレーションには以下の制限があります：<br />・右寄せ、中央寄せができない<br />・フォントを指定できない<br />・ユーザー環境に依存する部分が大きい<br /><br />同じようにVSCode拡張機能でデコレーション周りで苦戦している方の参考になれば幸いです。<br /><br />拡張機能はGitHubで公開しているので、興味があればぜひ使ってみてください。<br /><a href="https://github.com/dokonidemoiruhito/japanese-lyrics-editor" target="_blank">https://github.com/dokonidemoiruhito/japanese-lyrics-editor</a><br /></span><br />

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/518457260.html">
<link>https://angelpinpoint.seesaa.net/article/518457260.html</link>
<title>Udemyアフィリエイト登録のやり方メモ【2025年10月版】</title>
<description>Udemyという学習プラットフォームはよく使っているのですが、これのアフィリエイトがあるというのを知って登録してみました。本日は2025年10月7日ですが、ちょうど2025年の10月からImpactでの登録に変更になったらしく、結構、設定で苦戦したのでメモを残しておきます。ただし、これはあくまで私の場合の入力です。ご参考程度に見てもらって、各自の状況に合わせて設定してください。とりあえず、この記事の設定で登録まではできました。＞＞【公式サイト】Udemyトップページへはこちら..</description>
<dc:subject>ブログ関係</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2025-10-07T01:46:00+09:00</dc:date>
<content:encoded><![CDATA[
Udemyという学習プラットフォームはよく使っているのですが、これのアフィリエイトがあるというのを知って登録してみました。<br /><br />本日は2025年10月7日ですが、ちょうど2025年の10月からImpactでの登録に変更になったらしく、結構、設定で苦戦したのでメモを残しておきます。<br />ただし、これはあくまで私の場合の入力です。ご参考程度に見てもらって、各自の状況に合わせて設定してください。<br /><br />とりあえず、この記事の設定で登録まではできました。<br /><br />＞＞<a href="https://trk.udemy.com/MAeOLP" target="_blank">【公式サイト】Udemyトップページへはこちらから</a><br /><br /><a name="more"></a><h3>目次</h3><br /><span class="indenttext">・Udemyのアフィリエイト<br />・STEP 1：Impactへのアカウント登録とメディア設定<br />・STEP 2：報酬受け取り設定（Bank Account）<br />・STEP 3：税務書類の提出<br />・STEP 4：電子署名<br />・まとめ<br /></span><br /><br /><h3>Udemyのアフィリエイト</h3><br /><span class="indenttext">Udemyは、世界最大級のオンライン学習プラットフォームです。プログラミング、デザイン、ビジネススキルなど、実践的なスキルに特化した講座が数多く提供されています。現役のエンジニアや専門家が講師を務めているため、現場で本当に役立つ知識を学べるのが最大の特徴です。<br />私もよく利用しています。<br />＞＞<a href="https://trk.udemy.com/MAeOLP" target="_blank">【公式サイト】Udemyトップページへはこちらから</a><br /><br />私のこのブログは技術記事が多いのですが、記事にあった商品を紹介できるアフィリエイトがあまり無く、どうしようかなと思っていた時にUdemyのアフィリエイトがあると知りました。<br /><br />技術的な課題解決の記事を書くようなブログとUdemyアフィリエイトは、相性がいいかもしれないと思って導入してみることにしました。<br /><br />ただ、登録はアメリカのプラットフォーム（Impact）経由で、非常に複雑で、かなり苦労しました。<br />・海外の税務書類「W-8BEN」の提出（マイナンバー、租税条約の申請）<br />・海外送金対応の「日本の銀行口座情報」の入力（SWIFTコード、支店コード）<br />・電子署名<br />など。<br /><br />この記事では、私が実際にUdemyアフィリエイトに登録した際の情報をメモしておきます。<br /><br />ただ、全画面のキャプチャを貼ると長くなるので、入力で迷った箇所、苦労した箇所のみに絞ってメモを残しておきます。<br />（画面は変わることもありそうだし）<br /></span><br /><br /><h3>STEP 1：Impactへのアカウント登録</h3><br /><span class="indenttext">登録は、<br /><a href="https://www.udemy.com/affiliate/" target="_blank">https://www.udemy.com/affiliate/</a><br />「今すぐ登録しよう！」ボタンから登録を開始したと思います。<br /><br />大体の項目はなんとなくで入力していきました。<br />今回は、アカウントはGoogleのアカウントを使いました。<br /><br />迷ったところは以下です。<br /><br />・How would you categorize your business?：Technology Solution<br />　技術的な解決のブログ記事からUdemyを訴求できそうなので。<br /><br /><strong>Tell us about yourself</strong>：<br />そんなに難しい項目は無いのですが、日本の住所をどう入力して良いかわからず悩みました。<br /><br />・I am a/an	：Individual (個人)	<br />・Account display name：ハンドルネーム<br />・Street address 1：市より下の町名から番地をローマ字で入れました<br />・Street address 2：マンションの部屋番号を入れました（Room XXX）<br />・City：Yokohama-shi, Xxxxx-ku（市と区を入れました）<br />・Zip：郵便番号<br />・Timezone：(GMT +09:00) Osaka、Sapporo、 Tokyo<br /><br />他にも、よく覚えてないのですが、ブログのURLを入力したりしました。<br />何度も行ったり来たりしていたら、おかしくなって最初からやり直したりしました。<br /><br />最後まで行くと、無事、登録完了のメールが届きました。<br /><br />でも、ここから先が長かったです・・・<br /></span><br /><br /><h3>STEP 2：報酬受け取り設定（Bank Account）</h3><br /><span class="indenttext">登録完了のメールに従ってアクセスし、ログインします。<br />この時点でまだ報酬を受け取る設定をしていないと気付いたので、設定を探しました。<br /><br />右上のアイコンで「Settings」を選ぶといくつもの設定があり、まずは「Finance」にある「Bank Account」を設定しました。<br /><br />・Bank Location Country：Japan<br />・Payment Method：FX Wire (Processing Fee ¥0) で固定。<br />・Beneficiary Account Name：ローマ字で名前（例 TARO YAMADA）<br />・Bank Account Type：Checking （普通口座なので）<br />・Bank Account Number：口座番号<br />・BIC/SWIFT Code：国際送金を受け付けるための銀行の識別コード <strong>11桁</strong><br />　銀行名と「SWIFTコード」で検索すると出てくると思います。<br />　が、11桁という点に要注意！三菱UFJ銀行の場合は、BOTKJPJTXXX<br />　（下3桁にX（エックス）を加える、と三菱UFJ銀行ページに書かれてた）<br />・Bank Name：銀行の正式名称（ローマ字）例：MUFG BANK,LTD.<br />・Bank Code：これ、表示のミス。実際はBranch Code、つまり<strong>支店コード</strong>です。<br />・PayPal：選択しない<br />・Autopay：Pay me when my balance reaches threshold<br />・Threshold：¥2,400（最低金額）<br /><br />で「Save」しました。<br /></span><br /><br /><h3>STEP 3：税務書類の提出</h3><br /><span class="indenttext">同じくSettingsで「Finance」にある「Tax Documents」で設定していきます。<br />（実行後は「審査中」となっていましたが、翌日「完了」になっていました）<br /><br />まず、<br />・Account Holder Details：Individual (個人) を選択。<br /><br />以降、かなり大変でしたのでポイントだけ。<br /><br /><strong>Basic details </strong><br />・Are you a U.S. Individual?：No<br />・Unique Identifier：最初から設定されてた。多分、Impactが割り振ってる<br />・Name of disregarded entity...	：空欄<br /><br /><strong>Tax Identification Numbers</strong><br />・U.S. TIN Type：--select--のまま<br />・U.S. TIN (SSN/EIN)：空欄<br />・Foreign TIN Country：Japan <br />・Foreign TIN：マイナンバー (12桁の個人番号)<br />・その下のNot availableやAlternative TIN Formatは未選択<br /><br /><strong>Permanent residence address</strong><br />住所とかはさっきと同じ感じで。<br />・Is this address a Post Office Box?：No<br />・Is this an In Care Of address?	：No<br />・Is there an alternative mailing or business address in the US?：No<br /><br /><strong>Contact details</strong><br />名前とかはこれまでと同様。<br />・Alternative phone number：空欄<br />・I confirm the information above is correct：チェック<br /><br />この次は、電子署名の手続きに入っていきます。<br /></span><br /><br /><h3>STEP 4：電子署名</h3><br /><span class="indenttext">Confirmation Codeという6桁の文字列が表示されるので、これを保存しておきます。<br />また、秘密の質問を設定します。大文字・小文字を区別するので、気を付けます。<br /><br /><strong>Form Selection Page</strong><br />・W-8BEN (MOST COMMON) を選択<br /><br /><strong>United States Citizenship Status</strong><br />・Are you a U.S. citizen?：No<br />・Date of birth (mm/dd/yyyy)：誕生日 そのまま<br />・Are you subject to taxation as a U.S. citizen or resident alien?：No<br />・Is the individual a Permanent Resident Card Holder (Green Card)?：No<br />・Does the individual hold dual citizenship status?：No<br />・Have you been physically present in the United States on at least 31 days during the current calendar year?：No<br /><br /><strong>Taxpayer Identification Number</strong><br />・U.S. TIN type：U.S. TIN not applicable <br />・U.S. TIN：空欄<br />・Foreign TIN country：Japan<br />・Foreign TIN：マイナンバーが設定されてた<br />・Check if FTIN not legally required：チェック無し<br />・Not availableやAlternative TIN Formatは未選択<br /><br /><strong>Treaty Claim Statement</strong><br />・Do you want to claim treaty benefits to eliminate or reduce your US withholding tax liability?：Yes<br />・I certify the beneficial owner is a resident of：Japan<br /><br /><strong>Special Rates and Conditions</strong><br />・Is the submission being made to claim treaty benefits on items not covered by the representations made above and where special withholding rates and conditions may apply?：No<br /><br /><strong>Attach Supporting Documentation</strong><br />何も添付せずに、次へ<br /><br /><strong>Certification</strong><br />すべてチェック<br /><br /><strong>W-8BEN Electronic Substitute Form Statement </strong><br />・Signed by：ローマ字で名前 例：TARO YAMADA<br />・Enter confirmation code：保存しておいたコード（コピペで入力できた）<br /><br /><strong>Affidavit of Unchanged Status - Retroactive Statement </strong><br />・Please "Check" box if you have any change to declare：チェックしない<br />・Signed by：ローマ字で名前 <br />・Enter confirmation code：保存しておいたコード<br />・I confirm my acceptance of the above declarations：チェック<br /><br /><strong>Electronic Signature Confirmation</strong><br />・I agree with the above declaration：チェック<br />・I give consent to receiving a recipient statement electronically：チェック<br /><br />で、なんとか終了しました。<br /></span><br /><br /><h3>まとめ</h3><br /><span class="indenttext">これで、報酬を受け取るための手続きを全て完了しました。<br /><br />あとは、Udemyのサイトで好きな講座を選んで、そのURLをImpactのページに貼ってリンクを生成し、リンクを記事に貼るだけです。<br /><br />＞＞<a href="https://trk.udemy.com/MAeOLP" target="_blank">【公式サイト】Udemyトップページへはこちらから</a><br /></span>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/518313768.html">
<link>https://angelpinpoint.seesaa.net/article/518313768.html</link>
<title>ゲーム開発記録 #2 Unity Input Systemでのゲームパッド対応で発生した問題と解決策</title>
<description>今回は、Unityでのゲーム開発において、ゲームパッド対応したときに発生した問題と解決策を紹介する記事です。（第1回の記事：https://angelpinpoint.seesaa.net/article/518225887.html）前提・Unity 6000.2～・Unity Input System・Windows 11・ゲームパッド：エレコム JC-U4013SBK</description>
<dc:subject>ゲーム開発</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2025-09-28T22:26:00+09:00</dc:date>
<content:encoded><![CDATA[
今回は、Unityでのゲーム開発において、ゲームパッド対応したときに発生した問題と解決策を紹介する記事です。<br />（第1回の記事：<a href="https://angelpinpoint.seesaa.net/article/518225887.html" target="_blank">https://angelpinpoint.seesaa.net/article/518225887.html</a>）<br /><br />前提<br />・Unity 6000.2～<br />・Unity Input System<br />・Windows 11<br />・ゲームパッド：エレコム JC-U4013SBK<br /><br /><a name="more"></a><h3>目次</h3><br /><span class="indenttext">・はじめに<br />・問題1: UI表示時、ゲームパッドで操作できない<br />・問題2: UI画面遷移時にフォーカスが失われる<br />・問題3: ゲームウィンドウ外からフォーカスが戻った時に操作不能<br />・問題4: シーンリロード後にボタン入力が再発生<br />・問題5: UI遷移時の効果音が初期表示でも鳴る<br />・問題6: 設定画面とゲーム入力の競合<br />・まとめ<br /></span><br /><br /><h3>はじめに</h3><br /><span class="indenttext">Unityで「Cat Tower」というゲームを開発した際、ゲームパッドかキーボードで遊べるようにしました。ゲームパッド（Aボタン、左スティック）とキーボード（スペース、矢印キー）の両方に対応しています。<br /><br />- Cat Tower<br />　- <a href="https://dokonidemoiruhito.github.io/pages/CatTower/" target="_blank">CatTower (Web版)</a><br />　- <a href="https://doko-games.itch.io/cat-tower" target="_blank">Cat Tower (ダウンロード版)</a><br />　<img border="0" alt="プレイ画像" src="https://angelpinpoint.up.seesaa.net/image/cattower_play.gif" width="400" height="225"><br /><br />今回は、Unity Input Systemを使って実現しました。<br />Unity Input Systemは、Unityの新しい入力システムで、従来の<code>Input.GetKey()</code>を使う旧システムと比べ、ゲームパッドとキーボードの扱いが簡単になるそうです。<br /><br />ただ、私もゲームパッド対応は初めてだったこともあり、いくつか問題が発生したので、その問題と解決策をまとめておきます。<br />※ Unity Input Systemの基本的な使い方などの説明は割愛します。<br /></span><br /><br /><h3>問題1: UI表示時、ゲームパッドで操作できない</h3><br /><span class="indenttext"><h4>現象</h4><br />タイトル画面や、ポーズメニュー表示時、ゲームオーバー時など、UIボタンを操作させたいとき、ゲームパッドでUIボタンを操作できない問題が発生しました。<br /><br /><h4>原因</h4><br />Unity Input SystemでUIを操作する場合、<strong>UIのいずれかの要素にフォーカスが当たっている必要があります</strong>。フォーカスがない状態では、ゲームパッドの入力がUIに伝わりません。<br /><br /><h4>解決策</h4><br />UI表示時に、明示的に初期フォーカスを設定します：<br /><pre class="prettyprint">// タイトル画面のStartボタンに初期フォーカスを設定<br />private void SetInitialFocus()<br />{<br />    if (startButton != null)<br />    {<br />        EventSystem.current.SetSelectedGameObject(startButton.gameObject);<br />        startButton.Select();<br />    }<br />}</pre><br />ポイント：<br />・<code>EventSystem.SetSelectedGameObject()</code>でフォーカス対象を設定<br />・<code>.Select()</code>で確実に選択状態にする（念のため）<br />・UI画面表示時に必ず実行<br /></span><br /><br /><h3>問題2: UI画面遷移時にフォーカスが失われる</h3><br /><span class="indenttext"><h4>現象</h4><br />ポーズメニューなどUI操作中に、設定画面などのダイアログを開き、再び戻った時にゲームパッドで操作できなくなる問題が発生しました。<br /><br /><h4>原因</h4><br />戻った時に、フォーカスが失われたまま元の画面に戻るため、操作不能になります。<br /><br /><h4>解決策</h4><br />ダイアログを表示する際に、直前のフォーカスを記憶しておいて、閉じる際に復元しました。<br /><pre class="prettyprint">private GameObject previousSelectedButton;<br /><br />public void ShowSettingsPanel()<br />{<br />    // 現在のフォーカスを記憶<br />    previousSelectedButton = EventSystem.current.currentSelectedGameObject;<br />    settingsPanel.SetActive(true);<br />    <br />    // 設定画面の最初のボタンにフォーカス<br />    if (closeButton != null)<br />    {<br />        EventSystem.current.SetSelectedGameObject(closeButton.gameObject);<br />        closeButton.Select();<br />    }<br />}<br /><br />public void HideSettingsPanel()<br />{<br />    settingsPanel.SetActive(false);<br />    <br />    // フォーカスを元に戻す<br />    if (previousSelectedButton != null && previousSelectedButton.activeInHierarchy)<br />    {<br />        EventSystem.current.SetSelectedGameObject(previousSelectedButton);<br />    }<br />}</pre><br />ポイント：<br />・UI画面遷移時は必ずフォーカス管理を行う<br />・元の画面に戻る時は記憶したフォーカスを復元<br /></span><br /><br /><h3>問題3: ゲームウィンドウ外からフォーカスが戻った時に操作不能</h3><br /><span class="indenttext"><h4>現象</h4><br />Alt+Tabなどで別ウィンドウに切り替えた後、ゲームに戻るとゲームパッドで操作できなくなる問題が発生しました。<br /><br /><h4>原因</h4><br />ゲームウィンドウがフォーカスを失うと、UIへのフォーカスが無くなっているため。<br /><br /><h4>解決策</h4><br />フォーカスのあるオブジェクトを記憶するようにしておいて、どこにもフォーカスが無い場合には直前までフォーカスがあったオブジェクトにフォーカスを復元します：<br /><pre class="prettyprint">private GameObject lastSelectedGameObject;<br /><br />void Update()<br />{<br />    // 現在選択されているオブジェクトを記憶<br />    if (EventSystem.current.currentSelectedGameObject != null)<br />    {<br />        lastSelectedGameObject = EventSystem.current.currentSelectedGameObject;<br />    }<br /><br />    // フォーカスが外れた場合、直前のオブジェクトに戻す<br />    if (EventSystem.current.currentSelectedGameObject == null)<br />    {<br />        EventSystem.current.SetSelectedGameObject(lastSelectedGameObject);<br />    }<br />}</pre><br />ポイント：<br />・Update()で常時監視<br />・フォーカスが外れたら自動復元<br />・ゲームウィンドウ外への切り替えにも対応<br /></span><br /><br /><h3>問題4: シーンリロード後にボタン入力が再発生</h3><br /><span class="indenttext"><h4>現象</h4><br />ゲームオーバー後など、リトライボタンを押してシーンをリロードすると、リロード直後に再びボタン入力が発生してしまう問題がありました。これにより、ゲームが開始直後に意図しない動作をしてしまいます。<br /><br /><h4>原因</h4><br />シーンをリロードしても、ゲームパッドの入力状態がなぜか保持されたままになっていました。ボタンを押しっぱなしの状態でシーン遷移すると、新しいシーンでもその入力が残ってしまいます。その原因はよくわかっていません。<br />（実は、最初に疑ったのはゲームパッドの連射機能でしたが、連射機能をオフにしても発生しました…）<br /><br /><h4>解決策</h4><br />シーン開始時に、明示的にゲームパッドの入力状態をリセットします：<br /><pre class="prettyprint">void Start()<br />{<br />    // ゲームパッド入力をリセット<br />    if (Gamepad.current != null)<br />        InputSystem.ResetDevice(Gamepad.current);<br />    <br />    // その他の初期化処理...<br />}</pre><br />ポイント：<br />・<code>InputSystem.ResetDevice()</code>で入力デバイスの状態をリセット<br />・シーン開始時（Start()）で実行<br />・Gamepad.currentがnullの場合も考慮<br /></span><br /><br /><h3>問題5: UI遷移時の効果音が初期表示でも鳴る</h3><br /><span class="indenttext"><h4>現象</h4><br />UIボタンの選択を移動した際に効果音を付けたくて、HoverSoundというクラスを作り、UI選択時の処理を<code>ISelectHandler</code>で実装して効果音を鳴らすようにし、これを各ボタンにアタッチしたところ、UI画面の初回表示時にも勝手に効果音が鳴ってしまう問題が発生しました。<br /><br /><h4>原因</h4><br />問題1や問題2でUI画面表示時に自動的にUIにフォーカスするようにしていたため。<br />そこで、UIボタン選択時ではなく<strong>別のボタンにフォーカスが移った時（<code>IDeselectHandler</code>）に音を鳴らす</strong>ように変更したところ、初期表示時の問題は解決しました。<br /><br />しかし、新たな問題が発生しました。<br />ボタンにフォーカスがある状態で設定画面を開くと、フォーカスが設定画面のボタンに移るため、元のボタンの<code>OnDeselect</code>が発火して効果音が鳴ってしまいます。<br /><br /><h4>解決策</h4><br />グローバルフラグで効果音を制御します：<br /><pre class="prettyprint">// HoverSound.cs（各UIボタンにアタッチ）<br />public class HoverSound : MonoBehaviour, IDeselectHandler<br />{<br />    public static bool GloballyEnabled = true;<br />    <br />    public void OnDeselect(BaseEventData eventData)<br />    {<br />        if (GloballyEnabled && AudioManager.Instance != null)<br />        {<br />            AudioManager.Instance.PlayButtonHoverSound();<br />        }<br />    }<br />}<br /><br />// UI画面表示時<br />public void ShowSettingsPanel()<br />{<br />    HoverSound.GloballyEnabled = false; // 効果音を一時無効化<br />    settingsPanel.SetActive(true);<br />    <br />    if (closeButton != null)<br />    {<br />        EventSystem.current.SetSelectedGameObject(closeButton.gameObject);<br />        closeButton.Select();<br />    }<br />    <br />    StartCoroutine(EnableHoverSoundDelayed());<br />}<br /><br />IEnumerator EnableHoverSoundDelayed()<br />{<br />    yield return new WaitForSecondsRealtime(0.1f);<br />    HoverSound.GloballyEnabled = true;<br />}</pre><br />ポイント：<br />・UI表示直後の効果音を無効化<br />・0.1秒後に再有効化<br />・<code>WaitForSecondsRealtime</code>でポーズ中でも動作<br /></span><br /><br /><h3>問題6: 設定画面とゲーム入力の競合</h3><br /><span class="indenttext"><h4>現象</h4><br />設定画面を開いている間も、ゲーム側の入力が有効になってしまい、意図しないゲーム操作が発生する可能性がありました。<br /><br /><h4>解決策</h4><br />ゲーム全体の入力を制御するフラグを用意：<br /><pre class="prettyprint">// GameManager.cs<br />public bool CanReceiveInput => canReceiveInput;<br />private bool canReceiveInput = true;<br /><br />public void ShowSettingsPanel()<br />{<br />    canReceiveInput = false; // ゲーム入力を無効化<br />    settingsPanel.SetActive(true);<br />}<br /><br />public void HideSettingsPanel()<br />{<br />    settingsPanel.SetActive(false);<br />    StartCoroutine(EnableInputNextFrame());<br />}<br /><br />IEnumerator EnableInputNextFrame()<br />{<br />    yield return null; // 1フレーム待機<br />    canReceiveInput = true;<br />}<br /><br />// AcrobatCharacter.cs（ゲーム側）<br />void HandleJumpInput()<br />{<br />    if (GameManager.Instance != null && !GameManager.Instance.CanReceiveInput)<br />    {<br />        return;<br />    }<br />    <br />    // ジャンプ処理...<br />}</pre></span><br /><br /><h3>まとめ</h3><br /><span class="indenttext">Unity Input Systemでゲームパッド対応を実装する際に発生した問題と解決策を紹介しました。<br /><br />(1) UI表示時は必ず初期フォーカスを設定<br />(2) UI画面遷移時はフォーカスを記憶・復元<br />(3) ゲームウィンドウ外への切り替えに対応<br />(4) シーン遷移時は入力状態をリセット<br />(5) UI効果音は初期表示時を考慮<br />(6) ゲーム入力とUI入力を分離して管理<br /><br />これらの対策により、Cat Towerではゲームパッドとキーボードの両方で操作できるようになりました。もっと良いやり方があるかもしれませんが。<br /><br />完成したゲームはこちらです：<br /><strong>Cat Tower</strong> - 猫をジャンプさせて積み上げるゲーム<br />- <a href="https://dokonidemoiruhito.github.io/pages/CatTower/" target="_blank">CatTower (Web版)</a><br />- <a href="https://doko-games.itch.io/cat-tower" target="_blank">Cat Tower (ダウンロード版)</a><br /><img border="0" alt="スクリーンショット" src="https://angelpinpoint.up.seesaa.net/image/E382B9E382AFE383AAE383BCE383B3E382B7E383A7E38383E38388202025-09-2120012000.png" width="500" height="292"><br /><br />無料でプレイできますので、ぜひ遊んでみてください。<br /></span>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/518225887.html">
<link>https://angelpinpoint.seesaa.net/article/518225887.html</link>
<title>ゲーム開発記録 #1 「Cat Tower」の開発と公開</title>
<description>数ヶ月前から、なんとなくゲーム開発を始めていました。せっかくなので、今後、ゲーム開発の記録をこのブログに残していこうと思います。技術的な試行錯誤や使ったツール、苦労した点など。第1回は、先日完成してitch.ioで公開した「Cat Tower」について書きます。企画から公開までの流れと、開発で印象的だった出来事をまとめました。- CatTower (Web版)- Cat Tower (ダウンロード版)　</description>
<dc:subject>ゲーム開発</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2025-09-22T01:13:15+09:00</dc:date>
<content:encoded><![CDATA[
数ヶ月前から、なんとなくゲーム開発を始めていました。<br />せっかくなので、今後、ゲーム開発の記録をこのブログに残していこうと思います。<br />技術的な試行錯誤や使ったツール、苦労した点など。<br /><br />第1回は、先日完成してitch.ioで公開した「Cat Tower」について書きます。<br />企画から公開までの流れと、開発で印象的だった出来事をまとめました。<br /><br />- <a href="https://dokonidemoiruhito.github.io/pages/CatTower/" target="_blank">CatTower (Web版)</a><br />- <a href="https://doko-games.itch.io/cat-tower" target="_blank">Cat Tower (ダウンロード版)</a><br /><br />　<img border="0" alt="スクリーンショット" src="https://angelpinpoint.up.seesaa.net/image/E382B9E382AFE383AAE383BCE383B3E382B7E383A7E38383E38388202025-09-2120012000.png" width="500" height="292"><br /><br /><br /><a name="more"></a><h3>目次</h3><br />・Cat Towerとは<br />・初期の企画書<br />・開発環境<br />・開発で印象的だったこと<br />・今回の開発で学んだこと<br />・今後の予定<br />・最後に<br /><br /><h3>Cat Towerとは</h3><br /><span class="indenttext">Cat Towerは、かわいい猫がジャンプして積み重なっていく2Dアクションゲームです。プレイヤーはジャンプのタイミングと空中での位置調整により、猫を積み重ねて可能な限り多くの猫でタワーを作ります。<br /><br />そもそもの発想は、「キャットタワー」という猫の遊具の名前から、連想したものをゲームにしただけです。<br />また、ゲームの素案には、子供の頃に「マイコンBASICマガジン（通称ベーマガ）」で、どなたかが投稿されたゲームで、たしか中国雑技団か何かをモチーフにしたゲームの記憶が頭の中に浮かんでました。実際にどんなゲームだったかはうろ覚えですが。<br /><br />itch.ioで無料公開中です：<a href="https://doko-games.itch.io/cat-tower" target="_blank">https://doko-games.itch.io/cat-tower</a></span><br />　<img border="0" alt="プレイ画像" src="https://angelpinpoint.up.seesaa.net/image/cattower_play.gif" width="400" height="225"><br /><br />開発期間は約４週間で、企画から公開まで一人で進めました。<br /><br /><h3>初期の企画書</h3><br /><span class="indenttext">初期に書いた企画書兼設計書をそのまま公開します。<br />実際の完成版では変更した部分もありますが。<br />ーーー<br /><pre>ゲーム企画・設計<br />「キャットタワー」CatTower<br /><br /># コンセプト<br />CatTowerは、かわいい猫がジャンプして積み重なっていく2Dアクションゲームです。<br />プレイヤーはジャンプのタイミングと空中での位置調整により、猫を積み重ねて可能な限り多くの猫でタワーを作ります。<br />「キャットタワー」という猫の遊具から発想しただけのゲームです。<br />シンプルだけど思わずはまってしまうようなゲーム性と、猫の可愛さに癒されるようなゲーム(になるはず)。<br /><br /># 1. 概要<br />* ジャンル: シンプルアクションゲーム<br />* テーマ: 猫がタワーになる<br />* 目的: 猫のキャラクターを積み重ねていき、何匹積み重ねられるかを競う。積み重ねた匹数がスコアとなる。<br />* 特徴: タイミングと微調整が重要な、シンプルながらも奥深いゲームプレイ。<br /><br /># 2. ゲームプレイ<br />* コアとなるアクション:<br />    * 左側のキャラクターを操作：左側のキャラクターの横に、ジャンプ力を示すゲージが増減している。<br />    * ジャンプ：プレイヤーはゲームパッドの決定ボタンを任意のタイミングで押す。ボタンを押した瞬間のゲージの大きさでジャンプ力が決まり、キャラクターが右に向かってジャンプする。<br />    * 着地調整：ジャンプ中、ゲームパッドの左右入力でキャラクターの位置を微調整できる。<br /><br />* 成功と失敗のルール:<br />    * 成功:<br />        * 右側のキャラクターの頭の上や肩の上に着地すること。<br />        * 1匹のキャラクターの上に複数のキャラクターが乗ることも可能だが、キャラクター同士が重なることはできない。<br />        * 着地が成功すると、そのキャラクターはタワーの一部として固定され、崩れることはない。<br />    * 失敗:<br />        * キャラクターがタワーの側面にぶつかる。<br />        * キャラクターがタワー以外の場所に落ちる。<br /><br />* ゲームの流れ:<br />    * 開始：右側にタワーの土台となるキャラクターが1匹いる状態でスタート。<br />    * 進行：左側に1匹目のキャラクターが出現。プレイヤーはジャンプさせて、土台の上に乗せる。成功すれば次のキャラクターが出現し、これを繰り返す。<br />    * 終了：失敗すると、その時点でゲームオーバーとなる。<br /><br /># 3. システム<br />* ゲージシステム:<br />    * ジャンプ力ゲージは一定のリズムで増減を繰り返す。<br />    * ジャンプ力ゲージの最大値でボタンを押すと、最も高く、遠くまでジャンプする。<br />* スコアリング:<br />    * タワーに積み重ねたキャラクターの総匹数がスコアとなる。<br /><br /># 4. ゲームフロー<br />    ゲーム起動 → ゲーム画面 → 「開始！」と表示してゲーム開始<br />    猫登場 → ジャンプ力ゲージ増減 → ジャンプ → 位置調整 <br />        → 成功：次の猫が登場<br />        → 失敗：ゲームオーバー<br />    ゲームオーバー：「ゲームオーバー！」と匹数、リトライ、終了<br /><br /># 5. 画面<br />　画面イメージ（Excelで作成）</pre>　<img border="0" alt="CatTower画面イメージ.png" src="https://angelpinpoint.up.seesaa.net/image/CatTowerE794BBE99DA2E382A4E383A1E383BCE382B8.png" width="500" height="772"><br /><br /><h4>企画から変更した点</h4><br /><span class="indenttext">初期企画では<strong>ジャンプ力ゲージ</strong>でジャンプ力が決まる方式でしたが、最終的には<strong>ボタンの長押し時間</strong>でジャンプ力が決まる方式に変更しています。<br />深い理由はないのですが、開発途中で遊んでいて「ゲージの増減を待つ時間のテンポが悪く感じた」ためです。<br />実際に触ってみてプレイ感覚を重視した判断でした。<br /><br />振り返ってみると、かなり最初の設計に近いものをつくっていたようです。</span></span><br /><br /><h3>開発環境</h3><br />　・OS：Windows 11<br />　・開発：Unity 6000.2～、Visual Studio 2022<br />　・コーディング：Claude Code <br />　・BGM制作：Suno Pro<br />　・画像制作：Power Point、FireAlpaca、Canva<br />　・企画・設計：VS Code、Excel<br /><br />　素材<br />　・<a href="https://iconbu.com/" target="_blank">フリーペンシル</a>さんの猫の素材<br />　・<a href="https://soundeffect-lab.info/" target="_blank">効果音ラボ</a>さんの猫の声<br />　など<br /><br /><h3>開発で印象的だったこと</h3><br /><span class="indenttext">今回の開発で、印象的だったことです。<br />詳細はまた後日に別の記事にでも、できればと思っています。<br /><br /><h4>Claude CodeでUnityでの開発</h4><br />最近、話題にもなっているClaude Codeを使って開発しました。<br />Unityで使う場合はなかなか苦戦しまして、最終的にはいろいろ諦めたりもしました。<br />ものすごい勢いでコーディングしてくれて助かるのですが、問題発生時の修正提案が的外れなことが多く、結局手動デバッグに頼ることが多かったです。<br /><br /><h4>SunoでのBGM制作</h4><br />BGMをSunoというAI音楽生成サービスで作成しました。Proを使っています。<br />最終的には、プロンプトを自分で弄るのはやめて、Simpleモードで適当に指示して作りました。<br />なので、どう入力したか覚えてないです。プロンプトなら残ってますけど。<br /><br /><h4>ゲームパッド対応で苦戦</h4><br />ゲームパッド対応で、ボタンへのフォーカスとか、シーンロード時になぜか前の入力が残っているとか、細かい問題が多発しました。<br />多分、今回の開発で一番苦労したところの気がします。<br /><br /><h4>itch.ioでの公開</h4><br />itch.ioでのゲーム公開は、今回で2回目でしたので、普通に公開するのは特に苦労しませんでした。<br />ただ、今回は初めて、無料だけど寄付も受け付ける方式を選んだところ、思いのほか設定が大変でした。<br />企画から公開までトータルで一番疲れたのは、ここだった気がします。</span><br /><br /><h3>今回の開発で学んだこと</h3><br /><span class="indenttext"><h4>シンプルなゲームでも、ある程度は全体の企画・設計をしておいた方が良さそう</h4><br />通常は、思いついたらすぐプロトタイプ開発してたのですが、今回は、全体像を整理してからプロト開発に入ったおかげで、進めやすかったです。書いてみるもんだなと思いました。<br /><br /><h4>プロト開発は確認したい本質の部分のみ</h4><br />今回の場合、ジャンプして着地する部分をまず作って、本当に面白いのか確認しました。最初は適当に書いた絵でした。<br />結果、ジャンプゲージによるジャンプ力決定の操作感が気になって、ボタン長押しに変更しました。<br /><br /><h4>音が思っていたより重要だった</h4><br />開発の中盤くらいにBGMや効果音を付け始めたのですが、猫の鳴き声を付けた瞬間に面白さが全然変わってびっくりしました。<br />こだわるべきポイントだと気づきました。<br /><br /><h4>Claude CodeからUnityの操作は限界がある</h4><br />Unityを操作できるMCPをいくつか試したり、自分で作ったりしたのですが、限界がありますね。<br />UI作成など、Unity上の操作は自分でやった方が早かったです。<br /></span><br /><br /><h3>今後の予定</h3><br /><span class="indenttext">この「ゲーム開発記録」では、今後以下のようなトピックを書いていければと思っています。<br />・Claude Codeでのゲーム開発体験記<br />・Sunoを使ったゲーム音楽制作記<br />・ゲームパッド対応苦戦記<br />・itch.io公開で苦戦した話<br />・次回作の開発記録</span><br /><br /><h3>最後に</h3><br /><span class="indenttext">同じように個人でゲーム開発をされている方や、これから始めてみたい方の参考になれば幸いです。<br />Cat Towerもよろしければ遊んでみてください！<br /><br />- <a href="https://dokonidemoiruhito.github.io/pages/CatTower/" target="_blank">CatTower (Web版)</a><br />- <a href="https://doko-games.itch.io/cat-tower" target="_blank">Cat Tower (ダウンロード版)</a><br /></span>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/517145288.html">
<link>https://angelpinpoint.seesaa.net/article/517145288.html</link>
<title>Windowsコマンドプロンプトで『グラフィックスドライバーの問題』エラーダイアログが出る原因と解決策</title>
<description>Windowsのコマンドプロンプトで日本語を入力していたら、「このターミナルでグラフィックスドライバーの問題が発生し、時間内に回復できませんでした。」というエラーが頻発していたのですが、どうにか回避できたのでメモです。私はClaude Codeでの入力中に発生しましたが、PowerShellなどのコマンドプロンプトなら同様に発生します。環境・OS：Windows11・GPU：NVIDIA GeForce RTX 2070・NVIDIAドライバー： 577.00・日本語入力：M..</description>
<dc:subject>プログラミング</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2025-07-27T16:12:01+09:00</dc:date>
<content:encoded><![CDATA[
Windowsのコマンドプロンプトで日本語を入力していたら、「このターミナルでグラフィックスドライバーの問題が発生し、時間内に回復できませんでした。」というエラーが頻発していたのですが、どうにか回避できたのでメモです。<br /><br />私はClaude Codeでの入力中に発生しましたが、PowerShellなどのコマンドプロンプトなら同様に発生します。<br /><br />環境<br />・OS：Windows11<br />・GPU：NVIDIA GeForce RTX 2070<br />・NVIDIAドライバー： 577.00<br />・日本語入力：Microsoft IME<br /><a name="more"></a><h3>目次</h3><br />・<a href="#phenomenon">発生していた現象</a><br />・<a href="#solution">解決策</a><br />・<a href="#reference">参考</a><br />　　- <a href="#other-causes">その他の原因と対策</a><br />　　- <a href="#ref-links">参考リンク</a><br />・<a href="#summary">まとめ</a><br /><br /><h3 id="phenomenon">発生していた現象</h3><br /><span class="indenttext">具体的には、こんなエラーダイアログが出ます：<br /><br /><strong>「このターミナルでグラフィックスドライバーの問題が発生し、時間内に回復できませんでした。ターミナルは一時停止されています。」</strong><br /><img border="0" alt="ターミナルエラー.png" src="https://angelpinpoint.up.seesaa.net/image/E382BFE383BCE3839FE3838AE383ABE382A8E383A9E383BC.png" width="600" height="65"><br /><br />このエラーが出るタイミングは、<strong>日本語入力中</strong>だったのですが、常に発生するわけではありません。<br />私の場合は「、」とか「。」とか「？」を入力した前後に発生することが多く、どういう条件なんだろうと試行錯誤していて、ようやく条件を特定できました。<br /><br />日本語を入力して、一旦スペースキーで変換し、そのまま入力を継続しようとすると確実に発生します。（上記の「、」とか「。」を入力するとき、私の癖でそういう操作をしていたようです）<br /><br />例えば、次の操作で100%発生します。<br />・「なんか」と入力<br />・スペースキーで変換<br />・そのまま「あ」と続けて入力<br /><br />厄介なのは、このダイアログが出てもダイアログ自体にフォーカスが移るわけではないので気づきにくく、入力を何も受け付けない状態になり、マウスでわざわざ「再開」ボタンをクリックしないといけないことです。<br />作業の流れが止まって非常にストレスでした。<br /></span><br /><br /><h3 id="solution">解決策</h3><br /><span class="indenttext">最初はエラーメッセージ通りグラフィックドライバーの問題だと思って、NVIDIAの設定やドライバー更新、ターミナルのレンダリングの設定変更などを試しましたが効果なし。<br />IMEで入力中に発生するので、もしかしたらと思ってIMEの設定を確認してみたところ当たりでした。<br />私の環境の場合、原因は<strong>Microsoft IMEの設定</strong>でした。<br /><br />具体的には、<code>Microsoft IME</code>の<strong>「以前のバージョンのMicrosoft IMEを使う」</strong>という設定がオンになっていることが原因でした。<br /><br />解決手順：<br />(1) Windowsのタスクバーにある検索窓で「IME」と入力<br />(2) 検索結果から<strong>「日本語 IME設定」</strong>をクリック<br />(3) 「全般」を選択<br />(4) 画面下の方にある「互換性」の欄を探す<br />(5) <strong>「以前のバージョンのMicrosoft IMEを使う」をオフ</strong>にする<br />(6)「IMEのバージョンの変更」のダイアログで「OK」<br /><img border="0" alt="互換性.png" src="https://angelpinpoint.up.seesaa.net/image/E4BA92E68F9BE680A7.png" width="600" height="236"><br /><br />私は、これで現象が発生しなくなりました。<br />もう一度、オンにすると、今でもすぐ現象が再現します。<br /></span><br /><br /><h3 id="reference">参考</h3><br /><h4 id="other-causes">その他の原因と対策</h4><br /><span class="indenttext">調べてみると、他の原因で同様の現象が起こる場合もあるようです。<br />Windows Terminal GitHub Issue #15601：<a href="https://github.com/microsoft/terminal/issues/15601" target="_blank">https://github.com/microsoft/terminal/issues/15601</a><br /><br /><strong>1. NVIDIAドライバーとの相性問題</strong><br />・特定のNVIDIAドライバーバージョン（例：572.70）で発生<br />・Windows Terminalの公式GitHubで複数の報告あり<br />・対策：ドライバーの更新または古いバージョンへの戻し、など。解決してない？<br /><br /><strong>2. Windows Terminalのレンダリング設定</strong><br />・1.21以降でAtlasEngineがデフォルトになり問題が顕在化<br />・対策：WARPレンダリング（ソフトウェアレンダリング）への切り替え<br /><br />もしIME設定変更で解決しない場合は、これらの他の対策も試してみてください。<br /></span><br /><br /><h4 id="ref-links">参考リンク</h4><br /><span class="indenttext">同様の現象について、Fedibirdで投稿されている方がいました：<br /><a href="https://fedibird.com/@mutaguchi/113445661339264892" target="_blank">https://fedibird.com/@mutaguchi/113445661339264892</a><br />こちらの投稿でも同じ現象が紹介されていたのですが、IMEのところまで読んでなくて遠回りしてしまいました...<br /></span><br /><br /><h3 id="summary">まとめ</h3><br /><span class="indenttext">本当に困っていたので、どうにか回避できて良かったです。<br />そもそも古いIMEをあえて使い続けていたのは理由があった気がするのですが、既に忘れてしまいました。変な影響がなければよいのですが。<br /><br />同じ現象で困っている方の参考になれば幸いです。<br /></span><br />

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/517103331.html">
<link>https://angelpinpoint.seesaa.net/article/517103331.html</link>
<title>Unity 6000エディタのちらつき問題の解決事例</title>
<description>Unity 6000以降を使用していて、エディタの表示がちらつく・点滅する現象が発生していました。私の環境では長い間この問題に困っていましたが、解決策を発見したので記録として残しておきます。環境・GPU： NVIDIA GeForce RTX 2070・OS： Windows 10/Windows 11(どちらの環境でも発生)・Unity： 6000以降のバージョン・NVIDIAドライバー： 577.0（もっと前からずっと発生してましたけど）・ディスプレイ： マルチディスプレ..</description>
<dc:subject>プログラミング</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2025-07-26T06:13:47+09:00</dc:date>
<content:encoded><![CDATA[
Unity 6000以降を使用していて、エディタの表示がちらつく・点滅する現象が発生していました。<br />私の環境では長い間この問題に困っていましたが、解決策を発見したので記録として残しておきます。<br /><br /><strong>環境</strong><br />・<strong>GPU：</strong> NVIDIA GeForce RTX 2070<br />・<strong>OS：</strong> Windows 10/Windows 11(どちらの環境でも発生)<br />・<strong>Unity：</strong> 6000以降のバージョン<br />・<strong>NVIDIAドライバー：</strong> 577.0（もっと前からずっと発生してましたけど）<br />・<strong>ディスプレイ：</strong> マルチディスプレイ（4K：150％拡大 + フルHD：100％）<br /><br />この記事は私の環境での事例です。<br />他の環境だと違うかもしれません。けど、色々試して駄目だったら、これも試してみたら解決するかもしれません。<a name="more"></a><h3>発生していた問題：Unity 6000エディタの表示異常</h3><br /><span class="indenttext">私はWindows 11、RTX 2070のマルチディスプレイ環境でUnity開発を行っていますが、Unity 6000にアップデートしてから、エディタの表示に以下のような現象が発生していました。<br /><br /><strong>発生していた現象：</strong><br />・エディタ画面全体が<strong>ちらつく・点滅する</strong><br />・パネルがまともに表示されない。真っ黒になる<br />・Unity 6000以降で発生（以前のバージョンでは問題なし）<br />・他のアプリケーションでは問題なし<br /><br />まったく作業にならないレベルでした。<br /></span><br /><br /><h3>解決策</h3><br /><span class="indenttext">私の場合、解決方法が２つありました。<br />どちらでも良いと思いますが、可能なら方法１の方が良いかなと思います。<br /><br /><h4>解決方法１：NVIDIAのマルチフレームサンプリングAA(MFAA) 無効化</h4><br />(1)デスクトップを右クリックして「<strong>NVIDIAコントロールパネル</strong>」を開く<br />(2)左メニューから「<strong>3D設定の管理</strong>」をクリック<br />(3)「<strong>プログラム設定</strong>」タブを選択<br />(4)カスタマイズするプログラムとして unity.exeを選択<br />　選択リストに無い場合は「追加」ボタンをクリックしてUnity.exeを選択<br />(5)設定一覧から「<strong>マルチフレームサンプリングAA（MFAA）</strong>」を探し、<br />　「<strong>オフ</strong>」に変更<br />(6)「<strong>適用</strong>」をクリック<br />(7)Unityエディタを再起動<br /><br /><strong>MFAAとは</strong><br />MFAA（Multi-Frame Anti-Aliasing）は、アンチエイリアシング技術だそうです。一部のアプリケーションで表示問題を引き起こすことがあるようで、Unity 6000のDirectX 12レンダラーとの相性が悪いようです。<br /><br /><h4>解決方法２：コマンドライン引数 -force-d3d11 を設定</h4><br />(1)Unity Hubのプロジェクトで、開きたいプロジェクトの「…」をクリック<br />(2)「コマンドライン引数を加える」を選択<br />(3)<strong>-force-d3d11</strong> を追加<br />(4)「保存」をクリックしてプロジェクトを開く<br /><br />この方法はDirectX 11を強制使用するため、Unity 6000のDirectX 12の機能を利用できなくなると思います。</span><br /><br /><h3>他の解決方法</h3><br /><span class="indenttext">他にも同様の現象に対して、以下の方法で解決したという報告もありました。<br />私の環境では解決しませんでしたが、試してみても良いかも。<br /><br />・<strong>DPIスケーリング関連：</strong> Windowsの表示スケーリングを100%に変更、Unity.exeの互換性設定変更、カスタムスケーリングリセット<br />・<strong>モニター環境変更：</strong> メインディスプレイを1080pに変更、シングルディスプレイでの動作確認<br />・<strong>NVIDIA設定：</strong> 垂直同期の変更、電源管理モードの変更<br />・<strong>G-Sync関連の問題</strong>：G-Sync対応モニターの場合、NVIDIAコントロールパネルでG-Syncを無効化。うちのは対応してないので関係なかった。<br /></span><br /><br /><h3>まとめ</h3><br /><span class="indenttext">どうにか解決して良かったです。<br />Unity 6000エディタのちらつき問題は、環境によって様々な原因が考えられます。<br />原因の詳細は不明です。<br /><br />同じ問題で困っている方の参考になれば幸いです。<br /></span>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/516642715.html">
<link>https://angelpinpoint.seesaa.net/article/516642715.html</link>
<title>WindowsのWSLでClaude Codeを動かそうとして試行錯誤したメモ</title>
<description>Claude Codeがすごいらしいという噂を聞いたので、インストールしようとしたのですが、変なところで苦戦したのと、一度、起動できたのに後日になぜか起動できなくなった、ということが起こったので、とりあえずメモです。※いろいろ試行錯誤したので、記憶が不確かな部分もありますが。私の環境はWindows11ですので、WSLにインストールしています。追記：現在は、Claude CodeがWindowsを正式にサポートしていますので、このような作業は不要になっています。</description>
<dc:subject>プログラミング</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2025-06-29T02:45:56+09:00</dc:date>
<content:encoded><![CDATA[
Claude Codeがすごいらしいという噂を聞いたので、インストールしようとしたのですが、変なところで苦戦したのと、一度、起動できたのに後日になぜか起動できなくなった、ということが起こったので、とりあえずメモです。<br />※いろいろ試行錯誤したので、記憶が不確かな部分もありますが。<br /><br />私の環境はWindows11ですので、WSLにインストールしています。<br /><br /><strong>追記：現在は、Claude CodeがWindowsを正式にサポートしていますので、このような作業は不要になっています。</strong><a name="more"></a><h3>目次</h3><br /><span class="indenttext">・<a href="#part1">(1)WSL + nvm + Claude Codeのインストール</a><br />・<a href="#part2">(2)「後日、動かなくなった」問題の解決</a></span><br /><br /><h3 id="part1">(1)WSL + nvm + Claude Codeのインストール</h3><br /><span class="indenttext">基本的な手順は<a href="https://docs.anthropic.com/ja/docs/claude-code/setup">Claude Code公式セットアップガイド</a>に記載されていますが、WSLやnvm、npmのインストール方法については詳しく書かれていないため、手順をまとめました。</span><br /><br /><h4 id="wsl-setup">1. WSLのセットアップ</h4><br /><span class="indenttext">PowerShellを管理者権限で開いて、以下を実行します：<br /><pre class="prettyprint"># 現在のWSL状況確認<br />wsl --list --verbose<br /><br /># Ubuntu 22.04のインストール<br />wsl --install -d Ubuntu-22.04</pre><br />インストール後、Ubuntu-22.04を起動して初期設定を完了させます。</span><br /><br /><h4 id="ubuntu-setup">2. Ubuntu環境の準備</h4><br /><span class="indenttext"><pre class="prettyprint"># パッケージリストの更新<br />sudo apt update<br /><br /># 基本的なツールのインストール<br />sudo apt-get install curl</pre></span><br /><br /><h4 id="nvm-install">3. nvmのインストール</h4><br /><span class="indenttext">Node.jsのバージョン管理にはnvmを使用します：<br /><pre class="prettyprint">curl -o- <a href="https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh" target="_blank">https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh</a> | bash</pre></span><br /><br /><h4 id="env-reload">4. 【重要】環境変数の反映</h4><br /><span class="indenttext"><strong>ここが最初の落とし穴です！</strong><br />nvmをインストールした直後は、同じターミナルセッションでは認識されません。以下のいずれかを実行してください：<br /><strong>方法1：新しいターミナルを開く</strong><br />　現在のターミナルを閉じて、新しいWSLターミナルを開く<br /><br /><strong>方法2：環境変数を手動で読み込む</strong><br /><pre class="prettyprint">source ~/.bashrc</pre><br />この工程を飛ばすと、nvmのエラーが発生します。<br />私の場合は、これにはまってその日は諦め、翌日にターミナルを起動したら、すんなり動いたのでした。</span><br /><br /><h4 id="nvm-check">5. nvmの動作確認</h4><br /><span class="indenttext"><pre class="prettyprint"># nvmが認識されているか確認<br />nvm --version<br /><br /># 利用可能なNode.jsバージョンを確認<br />nvm list</pre></span><br /><br /><h4 id="nodejs-install">6. Node.js LTS版のインストール</h4><br /><span class="indenttext">安定版（LTS版）のNode.jsを使用した方が良いです。ここで最新版を入れて後で問題になったので。<br />また、デフォルトのバージョンとして設定しておいた方が良いです。これも後の問題の原因になったので。<br /><pre class="prettyprint"># LTS版をインストール<br />nvm install --lts<br /><br /># デフォルトバージョンとして設定<br />nvm alias default v22.16.0<br /><br /># インストール確認<br />node --version<br />npm --version</pre></span><br /><br /><h4 id="claude-install">7. Claude Codeのインストール</h4><br /><span class="indenttext"><pre class="prettyprint"># Claude Codeをグローバルインストール<br />npm install -g @anthropic-ai/claude-code<br /><br /># 動作確認<br />claude --version</pre><br />成功すれば、Claude Codeのバージョン情報が表示されます。<br />うまくいかない場合、下記の問題も確認してみてください。</span><br /><br /><h3 id="part2">(2)「後日、動かなくなった」問題の解決</h3><br /><h4 id="problem">遭遇した問題：突然のcommand not foundエラー</h4><br /><span class="indenttext">数週間後、Claude Codeを使おうとしたところ：<br /><pre class="prettyprint">$ claude<br />claude: command not found</pre><br />このエラーに遭遇しました。<br />以前は動作していたのに、なぜ動かなくなったのか調べました。</span><br /><br /><h4 id="investigation">原因の調査：Node.jsバージョン</h4><br /><span class="indenttext"><strong>■1. 現在のNode.jsバージョンを確認</strong><br /><pre class="prettyprint">nvm current<br /># v24.2.0<br /><br />nvm list<br />#        v22.16.0<br />#         v24.2.0<br /># default -> node (-> v24.2.0)<br /># node -> stable (-> v24.2.0) (default)<br /># lts/* -> lts/jod (-> v22.16.0)</pre><br />上でも書いたのですが、nodejsのバージョンは何が良いかわからなくて、最初に当時最新版のv24.2.0を入れて、デフォルトをv24.2.0にしてました。その後に、LTSのv22.16.0を入れてインストールを進めたので、v22.16.0を使う設定になった状態だったため以前はうまく動いていたのだと思います。<br />が、後日、コンソールを再起動した際に、デフォルトの設定で、最新版v24.2.0を使う状態になっていました・・・<br /><br /><strong>■2. Claude Codeの存在確認</strong><br /><pre class="prettyprint">nvm use v22.16.0<br />which claude<br /># /home/user/.nvm/versions/node/v22.16.0/bin/claude<br /><br />npm list -g --depth=0 | grep claude<br /># ├── @anthropic-ai/claude-code@1.0.35</pre><br />Claude Codeは確実にv22.16.0環境にインストールされていました。</span><br /><br /><h4 id="root-cause">WSL環境でのNode.js v24.2.0の互換性問題</h4><br /><span class="indenttext"><strong>私の環境のWSL環境は、Node.js v24.2.0がうまく動いてなかったです。</strong><br />v24.2.0を使用すると、npmコマンド自体にも問題が発生：<br /><pre class="prettyprint">nvm use v24.2.0<br />npm --version<br /># /home/user/.nvm/versions/node/v24.2.0/bin/node: 1: Syntax error: ")" unexpected</pre><br />つまりNode.jsのバージョンが原因だったようです。<br /></span><br /><br /><h4 id="solution">解決方法：LTS版への切り替えとデフォルト設定</h4><br /><span class="indenttext"><strong>■1. LTS版に切り替え</strong><br /><pre class="prettyprint">nvm use v22.16.0<br />claude --version<br /># 正常に動作！</pre><br /><strong>■2. デフォルトバージョンを修正</strong><br /><pre class="prettyprint">nvm alias default v22.16.0</pre><br /><strong>■3. 動作確認</strong><br /><pre class="prettyprint"># 新しいターミナルを開いて確認<br />nvm current<br /># v22.16.0<br /><br />claude --version<br /># 正常に動作</pre></span><br /><br /><h4>まとめ</h4><br /><span class="indenttext">WSLでのClaude Codeセットアップで、以下の2つがポイントでした。<br />・<strong>nvmインストール後は必ず新しいターミナルを開く</strong><br />・<strong>Node.js LTS版を使用し、デフォルト設定を明示的に行う</strong><br />同様の問題で困っている方の参考になれば幸いです。<br /></span><br /><br /><h4>参考リンク</h4><br /><span class="indenttext">・<a href="https://docs.anthropic.com/ja/docs/claude-code/setup">公式のClaude Codeのセットアップ</a><br /></span>

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/512169096.html">
<link>https://angelpinpoint.seesaa.net/article/512169096.html</link>
<title>【解決】ClaudeのProject KnowlegeでGitHub連携しても同期できないファイルがある</title>
<description>Anthropic社のAIアシスタント「Claude」の「Project Knowledge」機能でGitHubリポジトリを連携しようとしたとき、一部のファイルだけが同期されないという現象が発生しました。解決できたので、記録として残しておきます。原因は日本語を含むファイルの文字コードでした。要約・ClaudeのProject Knowledge機能でGitHubリポジトリを連携すると、選択した全ファイルが同期されず、一部だけが同期された・原因は日本語を含むファイルの文字コード..</description>
<dc:subject>プログラミング</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2025-03-20T19:50:23+09:00</dc:date>
<content:encoded><![CDATA[
Anthropic社のAIアシスタント「Claude」の「Project Knowledge」機能でGitHubリポジトリを連携しようとしたとき、一部のファイルだけが同期されないという現象が発生しました。<br />解決できたので、記録として残しておきます。<br /><br />原因は日本語を含むファイルの文字コードでした。<br /><br />要約<br />・ClaudeのProject Knowledge機能でGitHubリポジトリを連携すると、選択した全ファイルが同期されず、一部だけが同期された<br />・原因は日本語を含むファイルの文字コード<br />・すべてのファイルをUTF-8（BOMなし）に統一することで解決<br /><a name="more"></a><h3>遭遇した問題：選んだはずのファイルが同期されない</h3><br /><span class="indenttext">私はWindows環境で、Unity、Visual Studio、GitHubで開発していて、AIアシスタント「Claude」との会話でコードについて質問するために、Project Knowledge機能でGitHubリポジトリを連携しようとしました。GitHubリポジトリ自体には問題なくコードがプッシュできていましたが、それをClaudeに連携しようとしたときに問題に遭遇しました。<br /><br /><strong>問題の現象:</strong><br /><ul><li>GitHubリポジトリから<strong>48個のファイル</strong>を選択したのに、「最終同期：●分前•<strong>10個のファイル</strong>」と表示される</li><li>再度同期しても常に10個のファイルしか同期されない</li><li>選択するファイル数を減らしても、いくつかのファイルが同期できない</li></ul><br />何度試しても解決せず、「ClaudeのProject Knowledge機能に何か制限があるのだろうか？」と頭を抱えていました。ファイルサイズやファイル数は関係なさそうです。そこで、同期できたファイルと同期できなかったファイルの違いを調べてみることにしました。</span><br /><br /><br /><h3>原因究明：日本語と文字コードの謎</h3><br /><span class="indenttext">同期に成功した10個のファイルを詳細に調べたところ、共通点が見えてきました。<br /><strong>発見:</strong> 同期できたファイルには<strong>日本語が一切含まれていなかった！</strong><br />この発見をもとに、次の2つの仮説を立てて検証しました：<br /><ol><li><strong>日本語の有無が影響している</strong>: 日本語コメントを含むファイルを編集して日本語を削除し、同期テスト</li><br /><li><strong>文字コードの問題</strong>: 日本語を含むファイルのエンコーディングをUTF-8に変更して同期テスト</li></ol><br />テストしてみた結果、<strong>どちらの方法でも、問題のファイルが正常にClaudeのProject Knowledgeに同期されるようになりました！</strong></span><br /><br /><h3>原因は文字コード：Windows開発環境とClaudeのGitHub連携の落とし穴</h3><br /><span class="indenttext">問題の根本原因は、Windowsの開発環境（Visual Studio）でのデフォルトの文字コード設定とClaudeのAPI処理の間のミスマッチにあったようです。<br /><br />日本語Windowsでは、テキストファイルのデフォルトエンコーディングが「Shift-JIS」になっていることが多いと思いますが、「Shift-JIS」だと、Claudeにファイルをアップロードするときに問題が起きていたようです（※ 2025年3月20日時点）<br /><br /><table class="table-stylish"><tr><th>エンコーディング</th><th>特徴</th><th>Claude連携</th></tr><tr><td>Shift-JIS</td><td>日本の伝統的な文字コード。Windowsで長く使用されてきた</td><td>〓 同期できない</td></tr><tr><td>UTF-8 (no BOM)</td><td>BOMなしのUTF-8。Webやクロスプラットフォームで標準的</td><td>〓 正常に同期できる</td></tr></table><br /><br />ClaudeのProject Knowledge機能が想定している文字コードは不明ですが、とりあえずUTF-8(BOMなし)での処理は大丈夫っぽいです。今回は検証していませんが、BOMありでも大丈夫なんじゃないかと思います。<br />これはGitHubの問題ではなく、Claude側の制限かなと思います。</span><br /><br /><h3>解決方法：すべてのファイルをUTF-8に統一する</h3><br /><span class="indenttext">結局、すべてのファイルをUTF-8にしただけです。<br /><br /><h4>１．Visual Studioの文字コードの設定を変更する</h4><br />Visual Studioのメニューの「ツール」－「オプション」－「ドキュメント」で、「特定のエンコードでファイルを保存」にチェックして、「Unicode（UTF-8 署名無し）」を選択して「OK」。<br />ただ、この設定を変更しただけでは、文字コードは変わりません。<br /><br /><h4>２．Visual Studioで各ファイルの文字コードを変更</h4><br />問題のファイルをVisual Studioで開いて、保存(Ctrl+S)する、というのをすべてのファイルに対して繰り返す。<br />これで文字コードが変更して保存されました。<br /><br />この方法ですべてのC#ファイルを変換したあと、GitHubリポジトリにPushして、ClaudeのGitHub連携を同期します。<br />結果、48ファイル全てがClaudeのProject Knowledgeに正常に同期されるようになりました！</span><br /><br /><h3>参考リンク</h3><br /><span class="indenttext"><ul><li><a href="https://support.anthropic.com/ja/articles/10167454-github%E7%B5%B1%E5%90%88%E3%81%AE%E4%BD%BF%E7%94%A8">ClaudeのGitHub連携の公式ドキュメント</a> … 文字コードについては何も書かれていません。</li><li><a href="https://docs.microsoft.com/ja-jp/visualstudio/ide/how-to-save-and-open-files-with-encoding">Visual Studioでのエンコーディング設定</a></li></ul></span><br />以上

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/495595307.html">
<link>https://angelpinpoint.seesaa.net/article/495595307.html</link>
<title>Amazonでカートに入れられないエラー「入力されたウェブアドレスは当社サイトの有効なページではありません。」の解決</title>
<description>2022年も大晦日になって買い忘れてるものがあって、Amazonでカートに入れようとしたらエラーになりました。ちょっと調べたら、カートに入れずに「今すぐ購入」で解決するという情報があったのですが、全然納得いかないので、色々試してみてどうにか解決できたので、メモとして残しておきます。環境・PC・Windows 10・Chrome、Edge</description>
<dc:subject>IT関連</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2022-12-31T17:35:01+09:00</dc:date>
<content:encoded><![CDATA[
2022年も大晦日になって買い忘れてるものがあって、Amazonでカートに入れようとしたらエラーになりました。<br /><br />ちょっと調べたら、カートに入れずに「今すぐ購入」で解決するという情報があったのですが、全然納得いかないので、色々試してみてどうにか解決できたので、メモとして残しておきます。<br /><br />環境<br />・PC<br />・Windows 10<br />・Chrome、Edge<br /><a name="more"></a><h3>目次</h3><br />・<a href="#1">１．発生していた現象</a><br />・<a href="#2">２．解決策：ChromeのCookie削除</a><br />・<a href="#3">３．そのほかにやってみたけど関係なかったこと</a><br /><br /><h3 id="1">１．発生していた現象</h3><br />Amazonで商品をカートに入れようとすると、<br /><blockquote>何かお探しですか？<br />申し訳ございません。入力されたウェブアドレスは当社サイトの有効なページではありません。<br /><br /> Amazonのトップページに戻るには、ここをクリックします。</blockquote>というエラーが出て、カートに入れられないです。<br /><br />下のような画面が表示されます。<br /><div style="text-align: center"><a href="https://angelpinpoint.up.seesaa.net/image/amzon.PNG" target="_blank"><img border="0" alt="amzon.PNG" src="https://angelpinpoint.up.seesaa.net/image/amzon.PNG" width="600" height="139"></a></div><br />さらに試してみたところ、以下の状況でした。<br />・どの商品でも発生する<br />・ログアウトしてサインインしなおしても発生する<br />・再読み込み、ハード再読み込み(Ctrl＋Shift+R)、キャッシュの消去とハード再読み込み(F12→再読み込みボタン長押しして選択)をしても発生する<br />　→キャッシュの問題ではなさそう<br />・Edgeでも発生した(過去に利用したこと有り)<br />　→Chrome固有の問題(バグ)でもなさそう<br /><br />・Chromeのシークレットウィンドウなら発生しない<br />・スマホのChromeなら発生しない<br />・別のPCのChromeなら発生しない<br /><br />上記の状況から、端末・ブラウザの過去のCookieが怪しいというのが第一印象です。<br />もし、同じような現象でしたら、下記の解決策で解決するかもしれません。<br /><br /><h3 id="2">２．解決策：ChromeのCookie削除</h3><br />Amazon関連のCookieを削除したら、予想通り解決しました。<br /><br /><h4>手順１：Chromeのアドレスの左にある錠みたいなマークをクリック</h4><br />　Amazonのサイトにアクセスして、Chromeの上の方のURLが表示されている左にある錠みたいマークのボタンをクリックします。<br /><div style="text-align: center"><img border="0" alt="am_chrome.PNG" src="https://angelpinpoint.up.seesaa.net/image/am_chrome.PNG" width="442" height="122"></div><br /><br /><h4>手順２：表示されたウィンドウの「Cookie」をクリック</h4><br />　下のような画面で「Cookie」をクリックします。<br /><div style="text-align: center"><img border="0" alt="am_chrome2.PNG" src="https://angelpinpoint.up.seesaa.net/image/am_chrome2.PNG" width="327" height="192"></div><br />　「○○個が使用中」というところは人によって違うと思います。<br /><br /><h4>手順３：表示されたウィンドウで表示されたCookieを「削除」</h4><br />　下のような画面が出て、上のエリアのCookieのドメイン(URL)を選んで、下にあるボタン「削除」をクリック、という操作を全てのCookieドメインに対してやりました。<br /><div style="text-align: center"><a href="https://angelpinpoint.up.seesaa.net/image/am_c1.PNG" target="_blank"><img border="0" alt="am_c1.PNG" src="https://angelpinpoint.up.seesaa.net/image/am_c1.PNG" width="300" height="345"></a></div><br /><br />そうすると、Amazonからログアウトしたので、再度、サインインしなおして、商品をカートに入れてみると、無事、カートに追加できました。<br />あっさり解決してしまいました。<br /><br />ちなみにEdgeで試すと、やっぱりまだエラーになりました。<br />普段はEdgeを使わないので特に問題ないのですが、気持ち悪いのでEdgeもCookieを削除すると、同様に解決しました。<br />EdgeでのCookieの削除のやり方は、Chromeと同じです。<br /><br /><h3 id="3">３．そのほかにやってみたけど関係なかったこと</h3><br />多分、関係ないと思いつつ、やってみたけど解決しなかったこと<br />・Chromeの再起動<br />・ChromeでGoogleからログアウトしてログイン<br />・Amazon.comへのログイン（co.jpじゃなくて）<br /><br />以上<br />

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/488129908.html">
<link>https://angelpinpoint.seesaa.net/article/488129908.html</link>
<title>C#で拡大率が違うマルチディスプレイ１画面キャプチャ</title>
<description>複数の異なる解像度、異なる拡大率のディスプレイを使っているときに、一つの画面のスクリーンキャプチャを頻繁に保存したかったのですが、良い感じのツールがなかったので自分で作った時のメモです。環境・マルチディスプレイ　メイン：3840 x 2160 150％　サブ：1920 x 1080 100％・Windows10・Visual Studio 2017、または2022・C#</description>
<dc:subject>プログラミング</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2022-05-19T00:56:15+09:00</dc:date>
<content:encoded><![CDATA[
複数の異なる解像度、異なる拡大率のディスプレイを使っているときに、一つの画面のスクリーンキャプチャを頻繁に保存したかったのですが、良い感じのツールがなかったので自分で作った時のメモです。<br /><br />環境<br />・マルチディスプレイ<br />　メイン：3840 x 2160 150％<br />　サブ：1920 x 1080 100％<br />・Windows10<br />・Visual Studio 2017、または2022<br />・C#<br /><a name="more"></a><h3>きっかけ</h3><br />最近は、いろいろなライブイベントがオンラインで開催されるようになりました。<br />オンラインライブの場合、録音録画はNGですが、スクショしてTwitter等で共有するのはOKの場合があります。<br />なので、ライブを見ながらどんどん画面キャプチャして、保存したいです。<br /><br />私の場合、デュアルディスプレイにしているので、ライブ中は大きなディスプレイにライブ映像を映し、サブモニターにTwitter等を表示していますので、ライブ映像のディスプレイの画面だけのスクリーンショットを撮りたいです。<br /><br />画面キャプチャして保存する方法と言えば、「Windowsキー ＋ PrtScキー」ですが、マルチディスプレイの環境だと両方のディスプレイを統合したような画面が「ピクチャ」の「スクリーンショット」フォルダに保存されてしまいます。<br />↓こんな感じに2画面分が結合された画像になります。<br /><a href="https://angelpinpoint.up.seesaa.net/image/ss1.png" target="_blank"><img border="0" alt="ss1.png" src="https://angelpinpoint.up.seesaa.net/image/ss1-thumbnail2.png" width="320" height="120"></a><br /><br />いくつかフリーのキャプチャツールを探してみたのですが、私の環境では以下の現象が発生してしまいました。<br />・やはり両方のディスプレイが結合されたキャプチャになる<br />・ディスプレイ設定で拡大率を変えていると、キャプチャした画像サイズがおかしい<br />（もっと探せば、良いツールもあると思いますが・・・）<br /><br />というわけで、自分に合ったものを作ろうと思って試行錯誤した話です。<br />今回はC#で作ることにしました。<br /><br /><h3>C#でのディスプレイのキャプチャと保存</h3><br />調べてみると、キャプチャして保存するだけなら、やり方はすぐ見つかりました。<br />ざっくり書くとこんな感じです。(※ 下記のtargetScreenオブジェクトは、キャプチャしたいディスプレイのScreenオブジェクトです)<br /><pre class="prettyprint">Bitmap bm = new Bitmap(targetScreen.Bounds.Width, targetScreen.Bounds.Height);<br />Graphics gr = Graphics.FromImage(bm);<br /><br />gr.CopyFromScreen(new Point(0, 0), new Point(0, 0), bm.Size);<br /><br />string saveFolderPath = Path.Combine(Application.StartupPath, "Capture");<br />string ext = ".jpeg";<br />string filepath = Path.Combine(saveFolderPath, DateTime.Now.ToString("yyyyMMdd_HHmmssfff") + ext);<br /><br />ImageFormat imageFormat = ImageFormat.Jpeg;<br />bm.Save(filepath, imageFormat);<br /><br />gr.Dispose();<br /></pre><br /><br />しかし、やはり拡大率が100％以外がディスプレイが混ざっている場合、キャプチャした画像のサイズがおかしくなります・・・<br /><br /><h3>高DPI対応</h3><br />ひとつの原因は、下記の高DPI対応をしていないことでした。<br /><a href="https://docs.microsoft.com/ja-jp/dotnet/desktop/winforms/high-dpi-support-in-windows-forms?view=netframeworkdesktop-4.8" target="_blank" rel="noopener">高 DPI サポート - Windows Forms .NET Framework | Microsoft Docs</a><br /><br />私のVisual Studio 2017の環境の場合、Windows 10以降向けだけなら、<br /><pre class="prettyprint">app.configの&lt;configuration>の中に<br />&lt;System.Windows.Forms.ApplicationConfigurationSection><br />    &lt;add key="DpiAwareness" value="PerMonitorV2" /><br />&lt;/System.Windows.Forms.ApplicationConfigurationSection><br />を記載</pre><br />で、良いようです。<br />以前は、<br /><pre class="prettyprint"><windowsSettings>マニュフェストファイル(app.manifest)を作成して<br />&lt;application xmlns="urn:schemas-microsoft-com:asm.v3"><br />    &lt;windowsSettings><br />      &lt;dpiAware xmlns="<a href="http://schemas.microsoft.com/SMI/2005/WindowsSettings" target="_blank">http://schemas.microsoft.com/SMI/2005/WindowsSettings</a>">true&lt;/dpiAware><br />      &lt;longPathAware xmlns="<a href="http://schemas.microsoft.com/SMI/2016/WindowsSettings" target="_blank">http://schemas.microsoft.com/SMI/2016/WindowsSettings</a>">true&lt;/longPathAware><br />    &lt;/windowsSettings><br />&lt;/application><br /></pre>だったようですが、app.config ファイルの設定が上書きされるため、現在では推奨されないそうです。<br />また、Visual Studio 2022だと、この設定を明示的に設定しなくても、デフォルトでDPI対応になっているようです。<br /><br />ただ、上記設定をしてもマルチディスプレイで、それぞれの解像度、拡大率が異なる場合、やはりうまくキャプチャできませんでした。<br /><br /><h3>EnumDisplaySettingsAによる実解像度の取得</h3><br />明確なことはわかりませんが、メインディスプレイの拡大率をベースにScreenオブジェクトのサイズが設定されている気がします。<br />なので、拡大率の異なるサブディスプレイでは、解像度をうまく取得できてないっぽいです。<br /><br />そこで、実際の物理ディスプレイの解像度を取得するため、Windows APIのEnumDisplaySettingsAを利用することにしました。<br /><a href="https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-enumdisplaysettingsa" target="_blank" rel="noopener">EnumDisplaySettingsA function (winuser.h) - Win32 apps | Microsoft Docs</a><br /><br />C#でEnumDisplaySettingsAを利用するためには、まずEnumDisplaySettingsAを宣言し、引数で必要なDEVMODE構造体を定義します。<br /><pre class="prettyprint">const int ENUM_CURRENT_SETTINGS = -1;<br /><br />[DllImport("user32.dll")]<br />public static extern bool EnumDisplaySettingsA(string lpszDeviceName, int iModeNum, ref DEVMODE lpDevMode);<br /><br />[StructLayout(LayoutKind.Sequential)]<br />public struct DEVMODE<br />{<br />    private const int CCHDEVICENAME = 0x20;<br />    private const int CCHFORMNAME = 0x20;<br />    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]<br />    public string dmDeviceName;<br />    public short dmSpecVersion;<br />    public short dmDriverVersion;<br />    public short dmSize;<br />    public short dmDriverExtra;<br />    public int dmFields;<br />    public int dmPositionX;<br />    public int dmPositionY;<br />    public ScreenOrientation dmDisplayOrientation;<br />    public int dmDisplayFixedOutput;<br />    public short dmColor;<br />    public short dmDuplex;<br />    public short dmYResolution;<br />    public short dmTTOption;<br />    public short dmCollate;<br />    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 0x20)]<br />    public string dmFormName;<br />    public short dmLogPixels;<br />    public int dmBitsPerPel;<br />    public int dmPelsWidth;<br />    public int dmPelsHeight;<br />    public int dmDisplayFlags;<br />    public int dmDisplayFrequency;<br />    public int dmICMMethod;<br />    public int dmICMIntent;<br />    public int dmMediaType;<br />    public int dmDitherType;<br />    public int dmReserved1;<br />    public int dmReserved2;<br />    public int dmPanningWidth;<br />    public int dmPanningHeight;<br />}</pre><br /><br />このEnumDisplaySettingsAで引数にディスプレイのデバイス名を指定し、取得できたDEVMODEのdmPelsWidthとdmPelsHeightが実際のディスプレイのサイズです。<br /><br />また、dmPositionXとdmPositionYが、仮想的な(？)ディスプレイの中での物理ディスプレイの原点のようです。<br />(EnumDisplaySettingsAのAPI仕様には、書かれてないですけどなぜか取得できてる)<br /> <br />で、これを呼び出すように書き換えます。<br /><pre class="prettyprint">DEVMODE dm = new DEVMODE();<br />dm.dmSize = (short)Marshal.SizeOf(typeof(DEVMODE));<br />EnumDisplaySettingsA(targetScreen.DeviceName, ENUM_CURRENT_SETTINGS, ref dm);<br /><br />Bitmap bm = new Bitmap(dm.dmPelsWidth, dm.dmPelsHeight);<br />Graphics gr = Graphics.FromImage(bm);<br /><br />gr.CopyFromScreen(new Point(dm.dmPositionX, dm.dmPositionY), new Point(0, 0), bm.Size);<br /><br />string saveFolderPath = Path.Combine(Application.StartupPath, "Capture");<br />string ext = ".jpeg";<br />string filepath = Path.Combine(saveFolderPath, DateTime.Now.ToString("yyyyMMdd_HHmmssfff") + ext);<br /><br />ImageFormat imageFormat = ImageFormat.Jpeg;<br />bm.Save(filepath, imageFormat);<br /><br />gr.Dispose();<br /></pre><br /><br />これで特定のディスプレイのみのスクリーンをちゃんとしたサイズでキャプチャできるようになりました。<br /><br /><h3>できたツール</h3><br />他の環境で動くかまったくわかりませんが、一応、できたツールを置いておきます。<br />全然テストしてないので、何が起こっても自己責任でお願いします。<br /><a href="https://angelpinpoint.up.seesaa.net/dl/ScreenCapture.zip">ScreenCapture.zip</a><br />解凍して「ScreenCaptureWithMultiDisplay.exe」を実行してください。<br /><br />以上

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/483827280.html">
<link>https://angelpinpoint.seesaa.net/article/483827280.html</link>
<title>mediapipeとVSeeFace(Leap Motionなし)でVRMモデルを動かす実験メモ</title>
<description>以前に書いた記事では、ThreeDPoseTrackerとVSeeFaceを使って、上半身のWebカメラ映像だけでVRMモデルの手や顔を動かしてみました。今度はThreeDPoseTrackerではなくmediapipeのHolisticとHandsを使って、手や体の動きをトラッキングすることで、mediapipeとVSeeFace(Leap Motionなし)で、Webカメラだけでモーションキャプチャ―してVRMモデルを動かす実験をしました。まだまだ試行錯誤している途中です..</description>
<dc:subject>プログラミング</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2021-11-22T22:08:14+09:00</dc:date>
<content:encoded><![CDATA[
<a href="https://angelpinpoint.seesaa.net/article/483208154.html" target="_blank" rel="noopener">以前に書いた記事</a>では、ThreeDPoseTrackerとVSeeFaceを使って、上半身のWebカメラ映像だけでVRMモデルの手や顔を動かしてみました。<br /><br />今度はThreeDPoseTrackerではなくmediapipeのHolisticとHandsを使って、手や体の動きをトラッキングすることで、mediapipeとVSeeFace(Leap Motionなし)で、Webカメラだけでモーションキャプチャ―してVRMモデルを動かす実験をしました。<br /><br />まだまだ試行錯誤している途中ですが、ここまでの記録をメモとして残しておきます。<br /><br />※追記：今はこんなことをしなくても、ThreeDPoseTrackerだけで同等以上のことができます。<br /><a name="more"></a><h3>やりたかったこと</h3><br /><span class="indenttext">Webカメラ1台の上半身の映像で、顔や手など上半身の動きをトラッキングして、VRMモデルを動かすことです。<br />要はバストアップのvtuberみたいなことを、Leap Motionや特別なVR機器なしで実現することです。<br /><br /><a href="https://angelpinpoint.seesaa.net/article/483208154.html" target="_blank" rel="noopener">以前の記事</a>では、腕の動きをThreeDPoseTrackerでトラッキングしましたが、本来ThreeDPoseTrackerは全身をトラッキングするものなので、上半身のトラッキングならもっと良いやり方がありそうだし、当時は手首や指の動きもトラッキングできなかったので、別のやり方を探していました。<br /><br />そこでmediapipeを見つけたので、試してみることにしました。<br /><br />今回はmediapipeの中でもHolisticとHands を使って実験しました。<br />mediapipeの説明は省略します。公式サイトを参照してください<br /><a href="https://google.github.io/mediapipe/solutions/holistic.html" target="_blank" rel="noopener">Holistic - mediapipe</a><br /><a href="https://google.github.io/mediapipe/solutions/hands.html" target="_blank" rel="noopener">Hands - mediapipe</a><br /><br />環境<br />・OS：Windows10<br />・Python：3.9.7<br />・mediapipe：0.8.9<br />・python-osc：1.8.0<br /></span><br /><br /><h3>基本方針</h3><br /><span class="indenttext">VSeeFaceは、機能や顔の動きの認識など、かなり優れているため、基本はこれを使わせていただいて、腕の動きをmediapipeのholisticで、手の動きをHandsで認識して、その情報をVSeeFaceにVMCプロトコルで送信してVRMモデルを動かす、という方針にしました。<br /><br />一旦、下の図のような構成を想定してはじめました。<br /><div style="text-align: center"><a href="https://angelpinpoint.up.seesaa.net/image/mp1.png" target="_blank"><img border="0" alt="mp1.png" src="https://angelpinpoint.up.seesaa.net/image/mp1.png" width="600" height="237"></a></div><br /><br />SplitCamとは、Webカメラの映像を複数のアプリケーションで利用できるソフトウェアです。<br /><a href="https://splitcam.com/" target="_blank" rel="noopener">Live streaming software with multistreaming & free restreaming | SplitCam</a><br />VSeeFaceとmediapipeでWebカメラを使いたかったので、入れています。<br /><br />今回は、この図の「何かプログラム」のところの説明です。<br />それ以外のところや、インストールの話は省略します。</span><br /><br /><h3>説明の流れ</h3><br /><span class="indenttext">以降、<br />(1)mediapipeを呼び出す部分<br />(2)mediapipeから腕/手の座標を取得する部分<br />(3)取得した座標をVRMモデルの動きに変換する部分<br />(4)モデルの動きをVMCプロトコルで送信する部分<br />についての実験を簡単に説明します。<br /></span><br /><br /><h3>(1)mediapipeを呼び出す</h3><br /><span class="indenttext">mediapipeを呼び出す部分はPythonで作ることにしました。簡単そうだったので。<br />sample_holistic.py、sample_hand.pyというサンプルがあって、ほぼそのまま使わせて頂きました。<br />なので説明は省略します。<br /><br /><a href="https://github.com/Kazuhito00/mediapipe-python-sample" target="_blank" rel="noopener">mediapipe-python-sample/</a><br /><br />ちなみに、私はmodel_complexity=1で実行しています。</span><br /><br /><h3>(2)mediapipeから腕/手の座標を取得する</h3><br /><h4>(2-1)腕の座標の取得</h4><br /><span class="indenttext">Holisticの説明(<a href="https://google.github.io/mediapipe/solutions/holistic.html" target="_blank" rel="noopener">Holistic - mediapipe</a>)を見ると、POSE_WORLD_LANDMARKSというので、ワールド座標(x,y,z)を取得できそうです。<br />先ほどのサンプルを改変して、resultsのpose_world_landmarksで腕の座標を取得できました。<br /><pre class="prettyprint">center = landmark_point[11][1]<br />child = landmark_point[13][1]</pre><br />取得した値を見てみたところ、左右が逆でしたがそういうものっぽいです。<br />例えば、<a href="https://google.github.io/mediapipe/solutions/pose.html#pose-landmark-model-blazepose-ghum-3d" target="_blank" rel="noopener">Pose - mediapipe</a>によると、左肩(left_shoulder)は11番ですが、私の環境では12番でした。<br /></span><br /><br /><h4>(2-2)手の座標の取得</h4><br /><span class="indenttext">Holisticでは、手や指の座標は取得できないので、Handsで手の座標を取得します。<br />いつからかわかりませんが、HandsにもMULTI_HAND_WORLD_LANDMARKSという出力があって、これでワールド座標(x,y,z)を取得できようになっていました。<br /><br />そこで、handsのサンプル <a href="https://github.com/Kazuhito00/mediapipe-python-sample/blob/main/sample_hand.py" target="_blank" rel="noopener">mediapipe-python-sample/sample_hand.py at main · Kazuhito00/mediapipe-python-sample · GitHub</a> を流用することにしました。<br /><br />例えば、resultsにHandsの結果が格納されている場合、人差し指の付け根は、<br /><pre class="prettyprint">for hand_landmarks, handedness in zip(results.multi_hand_world_landmarks, results.multi_handedness):<br />    if handedness.classification[0].label == "Left":<br />        center = hand_landmarks.landmark[5]<br />        child = hand_landmarks.landmark[6]</pre>という感じです。<br /></span><br /><br /><h3>(3)取得した座標をVRMモデルの動きに変換する</h3><br /><span class="indenttext">このやり方がなかなかわからなくて、苦労しました。<br />pythonでVRMモデルを扱う方法が知らなかったのと、VRMモデルを動かすための「Quaternion」が全然わからなかったのと、さらにQuaternionをpythonで扱う方法も知らなかったためです。<br /><br />そこで苦肉の策として、座標から動きへの変換はUnityで実現することにしました。<br />UnityだとVRMモデルを扱えるUniVRMが簡単に使えるし、Quaternionも扱いやすそうに見えたので。<br /><br />この結果、下の図のような構成になりました。<br />オレンジ色の箇所ように、PythonとUnityの2つのプログラムに分けました。<br />ちょっと馬鹿っぽいですが、今回は実験なので良いことにします。<br /><div style="text-align: center"><a href="https://angelpinpoint.up.seesaa.net/image/mp2.png" target="_blank"><img border="0" alt="mp2.png" src="https://angelpinpoint.up.seesaa.net/image/mp2.png" width="600" height="223"></a></div><br /></span><br /><br /><h4>(3-1)PythonからUnityへのデータ送受信</h4><br /><span class="indenttext">やり方は、何でも良いと思います。<br />今回はあえて、VMCプロトコルの練習も兼ねて、VMCプロトコル(というか、Open Sound Control(osc)プロトコル)で送受信してみることにしました。<br />pythonでoscを使うには、pythonoscをpipでインストールして使いました。<br /><br />送るデータは、送りたい座標とその子座標を送ってみました。<br />左肘のデータの場合、左肘が14番、子の左手首は16番です。<br />なんとなくこんな感じに。<br /><pre class="prettyprint">center = landmark_point[14][1]<br />child = landmark_point[16][1]<br />client.send_message("/VMC/Ext/Bone/Pos3d", ["LeftLowerArm", center[0],center[1],center[2], child[0],child[1],child[2]])</pre>通常のVMCプロトコルと区別するために、typeを"/VMC/Ext/Bone/Pos3d"にしました。<br /><br />メッセージは、一括して送った方が良いかなと思ったので、<br /><pre class="prettyprint">msg = osc_message_builder.OscMessageBuilder(address="/VMC/Ext/Bone/Pos3d")<br />for val in ["LeftLowerArm", center[0],center[1],center[2], child[0],child[1],child[2]]:<br />      msg.add_arg(val)<br />bundle.add_content(msg.build())<br />～（他にもいろいろ送受信メッセージをbundleに追加）～<br />bundle = bundle.build()<br />client.send(bundle)</pre>と変更しました。<br /><br />unity側でVMCプロトコルを受信する部分は、VMC公式サンプルを流用しました。<br /><a href="https://github.com/sh-akira/VirtualMotionCaptureProtocol/blob/master/sample/VRM0/SampleBonesReceive.cs" target="_blank" rel="noopener">VirtualMotionCaptureProtocol/SampleBonesReceive.cs at master · sh-akira/VirtualMotionCaptureProtocol · GitHub</a><br />これを、読み込んだVRMモデルに紐づけただけで、あっさり受信できました。</span><br /><br /><h4>(3-2)座標からモデルを動かすところ</h4><br /><span class="indenttext">受信した座標からVRMモデルの動きに変換する部分はUnityで実現しました。<br />これが本当に難しかったです。いまだによくわかってません。<br />Quaternionを本質的にまだ理解しきれていないのですが、色々なサイトを読んで、それっぽく実装しました。<br />上記のSampleBonesReceive.csを改変しています。<br /><br />まず、Start()のタイミングで、VRMモデルの各パーツの初期ベクトルを計算して保持します。<br />例えば、左ひじから手首の場合は、<br /><pre class="prettyprint">target = animator.GetBoneTransform(HumanBodyBones.LeftLowerArm);<br />child = animator.GetBoneTransform(HumanBodyBones.LeftHand);<br />fromDirection[HumanBodyBones.LeftLowerArm] = target.position - child.position;<br /></pre>みたいな感じ。<br /><br />次に、OnDataReceived()で、VRMモデルの各ボーンを回転させます。<br />mediapipeから取得した座標データで、Quaternion.FromToRotation()を使って回転させています。<br /><pre class="prettyprint">Vector3 center = new Vector3((float)message.values[1], -(float)message.values[2], -(float)message.values[3]);   // 中心<br />Vector3 child = new Vector3((float)message.values[4], -(float)message.values[5], -(float)message.values[6]);    // 子<br /><br />HumanBodyBones bone;<br />if (Enum.TryParse<HumanBodyBones>((string)message.values[0], out bone))<br />{<br />    Transform target = animator.GetBoneTransform(bone);<br />    target.rotation = Quaternion.FromToRotation(fromDirection[bone], center - child);<br />}</pre>みたいな感じの計算です。<br />これで大体の関節は動くようになりました。<br />ただ、手首の回転と親指の動きがうまくいかないので、まだ試行錯誤しています。</span><br /><br /><h3>(4)モデルの動きをVMCプロトコルで送信する</h3><br /><span class="indenttext">UnityからVSeeFaceへのVMCプロトコルの送信部分も公式サンプルをそのまま使いました。<br /><a href="https://github.com/sh-akira/VirtualMotionCaptureProtocol/blob/master/sample/VRM0/SampleBonesSendBundle.cs" target="_blank" rel="noopener">VirtualMotionCaptureProtocol/SampleBonesSendBundle.cs at master · sh-akira/VirtualMotionCaptureProtocol · GitHub</a><br /><br />VSeeFace側でのVMCプロトコル受信は、<a href="https://angelpinpoint.seesaa.net/article/483208154.html" target="_blank" rel="noopener">以前に</a>やったのと同じで良いと思います。<br />これと言って苦労はなかったです。<br />注意点は、pythonからUnityに送るときに使っているPortと違うPortを使うことくらいです。</span><br /><br /><h3>結果</h3><br /><span class="indenttext">結果として、今のところこんな感じで動いています。<br /><iframe width="560" height="315" src="https://www.youtube.com/embed/Eij4K44hrFg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe><br /><br />・腕や指の動きは、ある程度再現できた<br />・手首の動きがうまくできていない<br />・親指の動きも何か変な気がする。<br />・認識精度はまあまあ<br />・ポイントがカメラからはずれたときの動きが変<br /><br />ほどほどの結果にはなったので、割と満足しています。<br />ただ、説明がわかりにくい部分も多々あると思います。もう諦めました・・・<br /><br />ここまでやっておいて言うのもあれですが、素直にLeap Motion使った方が早い気もしています。私は使ったことないのでわかりませんが。<br /><iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="https://rcm-fe.amazon-adsystem.com/e/cm?ref=tf_til&t=dokonidemoiruhito-22&m=amazon&o=9&p=8&l=as1&IS2=1&detail=1&asins=B075T4MH77&linkId=1b6545e5bd5fc9663ccde3f211752fa2&bc1=000000&amp;lt1=_blank&fc1=333333&lc1=0066c0&bg1=ffffff&f=ifr"></iframe></span><br /><br />追記<br />ThreeDPoseTrackerがバージョンアップして、mediapipeでハンドトラッキングできるようになっていますので、ThreeDPoseTrackerを使うのも良いかなと思います。<br /><br />追記２<br />私の書いたプログラムのソースコードの提供はお断りさせていただいております。<br />（再頒布に関する権利関係がよくわかっていないためです。）<br /><br /><h3>参考にしたサイト様</h3><br /><span class="indenttext">・<a href="https://google.github.io/mediapipe/solutions/holistic.html" target="_blank" rel="noopener">Holistic - mediapipe</a><br />・<a href="https://google.github.io/mediapipe/solutions/hands.html" target="_blank" rel="noopener">Hands - mediapipe</a><br />・<a href="https://protocol.vmc.info/" target="_blank" rel="noopener">Virtual Motion Capture Protocol (VMCProtocol 公式ページ)</a><br />・<a href="https://github.com/Kazuhito00/mediapipe-python-sample" target="_blank" rel="noopener">GitHub - Kazuhito00/mediapipe-python-sample</a><br /><br />関連<br />・<a href="https://www.vseeface.icu/" target="_blank" rel="noopener">VSeeFace</a><br />・<a href="https://qiita.com/yukihiko_a/items/43d09db5628334789fab" target="_blank" rel="noopener">USBカメラモーションキャプチャーThreeDPoseTrackerの説明 - Qiita</a><br /><br />以上

]]><![CDATA[
]]></content:encoded>
</item>
<item rdf:about="https://angelpinpoint.seesaa.net/article/483446520.html">
<link>https://angelpinpoint.seesaa.net/article/483446520.html</link>
<title>Windowsでmediapipeのサンプルを動かしたときのメモ</title>
<description>Windowsでmediapipeのサンプルをいくつか動かしたときのメモです。基本的に公式の手順通りなんですが、関連するソフトウェアのバージョンの違いで変なところで苦労したので、その記録です。OS：Windows 10</description>
<dc:subject>プログラミング</dc:subject>
<dc:creator>黄昏のスペシャルパンダ</dc:creator>
<dc:date>2021-09-20T00:28:10+09:00</dc:date>
<content:encoded><![CDATA[
Windowsでmediapipeのサンプルをいくつか動かしたときのメモです。<br />基本的に公式の手順通りなんですが、関連するソフトウェアのバージョンの違いで変なところで苦労したので、その記録です。<br /><br />OS：Windows 10<br /><a name="more"></a><h3>目次</h3><br /><span class="indenttext"><ul><li><a href="#op">はじめに</a><br /><li><a href="#msys2">１．MSYS2インストールしてパスを通す</a><br /><li><a href="#git">２．git、patch、unzipをインストール</a><br /><li><a href="#python">３．Python をインストールしてパスを通す</a><br /><li><a href="#sdk">４．Visual C++ Build Tools 2019 と Microsoft Visual C++ 2019 Redistributable と WinSDKをインストール</a><br /><li><a href="#bazel">５．Bazel をインストール</a><br /><li><a href="#env">６．Bazel の環境変数を設定</a><br /><li><a href="#medi">７．MediaPipe リポジトリをCheckout チェックアウト</a><br /><li><a href="#opencv">８．OpenCVをインストール</a><br /><li><a href="#hello">９．Hello World! in C++ example をビルドして実行</a><br /><li><a href="#hand">１０．hand_tracking をビルドして実行</a><br /><li><a href="#holistic">１１．holistic_tracking をビルドして実行</a><br /><li><a href="#fin">最後に</a></ul></span><br /><br /><h3 id="op">はじめに</h3><br /><span class="indenttext">mediapipeは、Googleが公開している、ライブおよびストリーミングメディア向けの機械学習のソリューションだそうです。<br />私は、ハンドトラッキングに興味があって、これをWindowsで動かしてみることにしました。<br /><br />基本的な手順は、mediapipe公式の手順の通りです。<br /><a href="https://google.github.io/mediapipe/getting_started/install#installing-on-windows" target="_blank" rel="noopener">Installation - mediapipe</a><br />書かれている通り、現時点でWindowsで動かすことは実験的なもののようです。<br /><br />また、<a href="http://kunsen.net/2021/01/30/post-3543/" target="_blank" rel="noopener">Windows 10にMediaPipe をインストール (WSL不使用)</a> もかなり参考にさせていただきました。<br /><br />以下、手順通りのところは省略し、苦戦したところだけメモします。</span><br /><br /><h3 id="msys2">１．MSYS2インストールしてパスを通す</h3><br /><span class="indenttext">ここは手順通りで特に問題なかったです。<br />このあともパスを通したり、環境変数を設定したりする作業がありますが、私はすべてユーザー環境変数に設定しました。</span><br /><br /><h3 id="git">２．git、patch、unzipをインストール</h3><br /><span class="indenttext">ここも<a href="https://google.github.io/mediapipe/getting_started/install#installing-on-windows" target="_blank" rel="noopener">手順</a>２の通りで特に問題なかったです。</span><br /><br /><h3 id="python">３．Python をインストールしてパスを通す</h3><br /><span class="indenttext">これどうするか悩みました。<br />私の環境は既にminicondaのpython環境が入っていたので、minicondaを使って大丈夫なのか、手順に書かれている通り<a href="https://www.python.org/downloads/windows/" target="_blank">https://www.python.org/downloads/windows/</a> からダウンロードした方が良いのか？で悩みました。<br />どちらも試してみた結果、私の場合はどちらでも大丈夫そうでした。<br />環境によっては違うかもしれません。<br />バージョンの指定が無かったので、この時点で最新の3.9.7を使いました。</span><br /><br /><h3 id="sdk">４．Visual C++ Build Tools 2019 と Microsoft Visual C++ 2019 Redistributable と WinSDKをインストール</h3><br /><h4>Visual C++ Build Tools 2019をインストール</h4><br /><span class="indenttext">手順に書かれているところからダウンロードしてインストールしました。<br />特に問題はなかったと思います。<br />私の場合は16.11.3がインストールされたようです。</span><br /><br /><h4>Microsoft Visual C++ 2019 Redistributableをインストール</h4><br /><span class="indenttext">どこからダウンロードするのかよくわからなかったです。<br /><a href="https://visualstudio.microsoft.com/ja/downloads/" target="_blank" rel="noopener">Visual Studio Tools のダウンロード - Windows、Mac、Linux 用の無料インストール</a>の「その他のツールとフレームワーク」の中に「Visual Studio 2019 の Microsoft Visual C++ 再頒布可能パッケージ」がありましたので、これをダウンロードしてインストールしました。</span><br /><br /><h4>WinSDKをインストール</h4><br /><span class="indenttext">これは、手順のリンク先の<a href="https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk/" target="_blank" rel="noopener">Windows 10 SDK - Windows app development</a>に書かれている通り、Visual Studio 2019 Installerで「Windows 10 SDK (10.0.19041.0)」をインストールしました。<br /><br />Visual Studio 2019 Installerを起動して「変更」ボタン→「個別のコンポーネント」で「Windows 10 SDK (10.0.19041.0)」にチェックを入れて「変更」で、インストールできました。</span><br /><br /><h3 id="bazel">５．Bazel をインストール</h3><br /><span class="indenttext">Bazel、もしくはBazeliskをインストールすればよいらしいですが、私はBazelをインストールしました。<br />(Bazeliskのインストールはやってないのでよくわからないです。)<br /><br />ここが、あとで一番ハマる原因になりました。<br />ダウンロードするバージョンを気にした方が良いです。<br />私は4.2.1で、うまくいきました。<br />(ちなみに5.0.0-pre.20210907.1 では、あとでエラーになりました)<br /><br />ダウンロードしたら、ファイル名をbazel.exeに変更して、パスを通すか、パスが通ったフォルダに置きます。</span><br /><br /><h3 id="env">６．Bazel の環境変数を設定</h3><br /><span class="indenttext">手順には環境変数を設定することしか書かれていませんが、リンク先<a href="https://docs.bazel.build/versions/main/windows.html#build-c-with-msvc" target="_blank" rel="noopener">Windows - Bazel main</a>に書かれている通り、まずVisual C++ コンパイラが必要です。</span><br /><br /><h4>Visual C++ コンパイラのインストール</h4><br /><span class="indenttext">私は、もともとVisual Studio Community 2019をインストールしてあったので、コンパイラも入っているかと思っていたんですが入ってなかったようです。多分、C#しか入れてなかったせいだと思います。(VCフォルダはあったのですが)<br />これを忘れていて、後でエラーになりました。<br /><br />どうやるのが正解かわかりませんが、私はVisual Studio 2019 Installerからインストールしました。<br />Visual Studio 2019 Installerを起動し、「変更」ボタン→「個別のコンポーネント」で「MCVC v142 - VS 2019 C++ x64/x86 ビルドツール(最新)」にチェック→「変更」でインストールしました。<br /><br />先にCommunity 2019をインストールしてあったせいかわかりませんが、C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VCの下にインストールされました。<br /></span><br /><br /><h4>環境変数を設定</h4><br /><span class="indenttext">以下、４つの環境変数を設定します。<br />・BAZEL_VS<br />・BAZEL_VC<br />・BAZEL_VC_FULL_VERSION<br />・BAZEL_WINSDK_FULL_VERSION<br /><br />設定する値は、<a href="https://docs.bazel.build/versions/main/windows.html#build-c-with-msvc" target="_blank" rel="noopener">Windows - Bazel main</a>に書かれていますが、まあまあ悩みました。<br /><br />・BAZEL_VS<br />　BuildToolsのフォルダのようです。私は、手順に書いてある通りで大丈夫でした。<br />　C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools<br /><br />・BAZEL_VC<br />　Visual C++ コンパイラの場所を指定します。<br />　私の場合は下記フォルダでした。<br />　C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC<br /><br />・BAZEL_VC_FULL_VERSION<br />　VCのバージョンを設定するのですが、さっきの C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC の下をTools→MSVCと辿った下にあるフォルダがVCのバージョン番号になっています。<br />　14.29.30133<br /><br />・BAZEL_WINSDK_FULL_VERSION<br />　インストールしたWinSDKのバージョンです。<br />　10.0.19041.0</span><br /><br /><h3 id="medi">７．MediaPipe リポジトリをCheckout チェックアウト</h3><br /><span class="indenttext">手順に書いてある通りで特に問題なく実行できました。</span><br /><br /><h3 id="opencv">８．OpenCVをインストール</h3><br /><span class="indenttext">手順に書かれてある通り、最新版ではなく、3.4.10をインストールしました。<br />Cドライブの直下C:\opencvにしました。<br />(他のバージョンは確認していません)</span><br /><br /><h3 id="hello">９．Hello World! in C++ example をビルドして実行</h3><br /><span class="indenttext">手順に書いてある通りで、bazel build の引数 PYTHON_BIN_PATHをPythonのexeファイルに設定して実行しました。<br />パスの「￥」は「//」で記述する必要があるのと、フォルダ指定じゃなくてexeのファイルを指定するのが注意点でした。<br /><br />ここで私の場合、いくつかエラーが出てビルド失敗しました。<br /><a href="https://google.github.io/mediapipe/getting_started/troubleshooting.html" target="_blank" rel="noopener">Troubleshooting - mediapipe</a>で解決するものも多かったですが、一応、私のエラーと対策も残しておきます。<br /><br /><h4>ANDROID_NDK_HOMEが設定されてない？</h4><br /><pre class="prettyprint">ERROR: C:/users/(ユーザ名)/mediapipe_repo/mediapipe/WORKSPACE:253:23: fetching android_ndk_repository rule //external:androidndk: Either the path attribute of android_ndk_repository or the ANDROID_NDK_HOME environment variable must be set.<br />ERROR: Analysis of target '//mediapipe/examples/desktop/hello_world:hello_world' failed; build aborted: Either the path attribute of android_ndk_repository or the ANDROID_NDK_HOME environment variable must be set.</pre><span class="indenttext">Bazel のバージョンによっては、このエラーが発生するようです。<br />私は、5.0.0-pre.20210907.1で上記エラーとなり、4.2.1をインストールしなおして解決しました。</span><br /><br /><h4>numpyが入ってなかった</h4><br /><pre class="prettyprint">ImportError: No module named numpy</pre><span class="indenttext">minicondaでインストール済みのPythonでは問題なかったのですが、別途インストールしたPythonではnumpyが入っていませんでした。<br />そっちのPythonではpipも古かったのでアップデートして、</span><br /><pre class="prettyprint">python.exe -m pip install --upgrade pip<br />python -m pip install numpy</pre><span class="indenttext">でインストールして解決しました。</span><br /><br /><h4>Visual C++コンパイラが無い</h4><br /><pre class="prettyprint">The target you are compiling requires Visual C++ build tools.<br />Bazel couldn't find a valid Visual C++ build tools installation on your machine.<br /><br />Visual C++ build tools seems to be installed at C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC<br />But Bazel can't find the following tools:<br />    VCVARSALL.BAT, cl.exe, link.exe, lib.exe, ml64.exe<br />for x64 target architecture</pre><span class="indenttext">Visual C++ コンパイラのインストールを忘れていて、このエラーが出ました。<br />上述の<a href="#env">６．Bazel の環境変数を設定</a>で、インストールしたら解決しました。</span><br /><br /><h4>何かビルドエラー</h4><br /><pre class="prettyprint">.\mediapipe/framework/packet.h(452): error C2143: 構文エラー: ';' が '&&' の前にありません。<br />.\mediapipe/framework/packet.h(452): error C2512: 'std::is_base_of<google::protobuf::MessageLite,MessageType>': クラス、構造体、共用体に既定のコンストラクターがありません。<br />.\mediapipe/framework/packet.h(452): note: ターゲット型にコンストラクターはありません。<br />.\mediapipe/framework/packet.h(452): note: コンパイルされたクラスの テンプレート のインスタンス化 'mediapipe::packet_internal::is_concrete_proto_t<T>' の参照をご確認ください<br />.\mediapipe/framework/packet.h(452): error C2143: 構文エラー: '>' が ';' の前にありません。<br />.\mediapipe/framework/packet.h(452): error C2143: 構文エラー: ',' が ';' の前にありません。<br />.\mediapipe/framework/packet.h(452): error C2143: 構文エラー: ';' が '}' の前にありません。<br />.\mediapipe/framework/packet.h(452): fatal error C1004: 予期せぬ EOF が検出されました。<br />Target //mediapipe/examples/desktop/hello_world:hello_world failed to build<br />Use --verbose_failures to see the command lines of failed build steps.</pre><span class="indenttext">Visual C++ コンパイラのバージョン指定違いでこのエラーが発生しました。<br />最初、Visual C++ コンパイラを入れ忘れていて、後からいろんなバージョンをインストールしたので、どのバージョンを使うのが良いかわからなくなって、違うバージョンのコンパイラをBAZELの環境変数で設定していたことが原因でした。<br />上で書いたバージョンをインストールして環境変数に設定することで解決しました。<br /></span><br /><br />他にもいくつかエラーが発生しましたが、すべて<a href="https://google.github.io/mediapipe/getting_started/troubleshooting.html" target="_blank" rel="noopener">Troubleshooting - mediapipe</a>で解決できました。<br /></span><br /><br /><h3 id="hand">１０．hand_tracking をビルドして実行</h3><br /><span class="indenttext">ここからは手順に書かれてないけど、それぞれのAPIのサンプルのところに説明がありました。<a href="https://google.github.io/mediapipe/solutions/hands.html#desktop" target="_blank" rel="noopener">Hands - mediapipe</a><br />Windows版ではGPUは動かないので、CPUで動かしました。<br /><br />ビルド</span><br /><pre class="prettyprint" style="font-size:12px">bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C://Python39//python.exe" mediapipe/examples/desktop/hand_tracking:hand_tracking_cpu</pre><br /><span class="indenttext">実行</span><br /><pre class="prettyprint" style="font-size:12px">bazel-bin\mediapipe\examples\desktop\hand_tracking\hand_tracking_cpu.exe<br /> --calculator_graph_config_file=mediapipe/graphs/hand_tracking/hand_tracking_desktop_live.pbtxt</pre><br /><span class="indenttext">やってみると、Webカメラの映像が映るはずのウィンドウが真っ黒でした。<br />以前にも似たようなことが起きたことがあり、私の環境のUSBのWebカメラのデバイスは#0じゃなくて、#1になっているので、そのせいかなと思いました。<br />ソースコードをたどっていくと、<br />mediapipe\examples\desktop\demo_run_graph_main.cc<br />の中が、<br />capture.open(0);<br />と決め打ちになっていたので、<br />capture.open(1);<br />に変更して、再度ビルドして実行したらうまく動きました。</span><br /><br /><h3 id="holistic">１１．holistic_tracking をビルドして実行</h3><br /><span class="indenttext">基本的に上のhand_tracking と同じでやり方で動きました。<br /><a href="https://google.github.io/mediapipe/solutions/holistic.html#desktop" target="_blank" rel="noopener">Holistic - mediapipe</a><br /><pre class="prettyprint" style="font-size:12px">bazel build -c opt --define MEDIAPIPE_DISABLE_GPU=1 --action_env PYTHON_BIN_PATH="C://Python39//python.exe" mediapipe/examples/desktop/holistic_tracking:holistic_tracking_cpu</pre><br /><pre class="prettyprint" style="font-size:12px">bazel-bin\mediapipe\examples\desktop\holistic_tracking\holistic_tracking_cpu.exe<br /> --calculator_graph_config_file=mediapipe/graphs/holistic_tracking/holistic_tracking_cpu.pbtxt</pre><br /></span><br /><br /><h3 id="fin">最後に</h3><br />あまり深い意図もなく、なんとなくmediapipeのサンプルを動かしてみただけなんですが、思っていた以上に軽くて、精度もいい感じに動きました。<br />ここからさらにAPIを使って何かやるかどうかは、まだ考えていません。<br /><br />以上<br />

]]><![CDATA[
]]></content:encoded>
</item>
</rdf:RDF>

