<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Uranos8685のおもちゃ箱</title>
	<atom:link href="https://toybox.uranos8685.mydns.jp/feed/" rel="self" type="application/rss+xml" />
	<link>https://toybox.uranos8685.mydns.jp</link>
	<description>個人的な備忘録やゲームレビュー等のブログです</description>
	<lastBuildDate>Wed, 04 Nov 2026 14:21:53 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://toybox.uranos8685.mydns.jp/wp-content/uploads/2025/04/cropped-AE86-2-32x32.png</url>
	<title>Uranos8685のおもちゃ箱</title>
	<link>https://toybox.uranos8685.mydns.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<atom:link rel='hub' href='https://toybox.uranos8685.mydns.jp/?pushpress=hub'/>
<site xmlns="com-wordpress:feed-additions:1">252152419</site>	<item>
		<title>「夜明け前より瑠璃色な」がエラーも出ずに終了するのをレジストリで直す（英語でインストールされたWindows）</title>
		<link>https://toybox.uranos8685.mydns.jp/870/%e3%80%8c%e5%a4%9c%e6%98%8e%e3%81%91%e5%89%8d%e3%82%88%e3%82%8a%e7%91%a0%e7%92%83%e8%89%b2%e3%81%aa%e3%80%8d%e3%81%8c%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e5%87%ba%e3%81%9a%e3%81%ab%e7%b5%82%e4%ba%86/</link>
					<comments>https://toybox.uranos8685.mydns.jp/870/%e3%80%8c%e5%a4%9c%e6%98%8e%e3%81%91%e5%89%8d%e3%82%88%e3%82%8a%e7%91%a0%e7%92%83%e8%89%b2%e3%81%aa%e3%80%8d%e3%81%8c%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e5%87%ba%e3%81%9a%e3%81%ab%e7%b5%82%e4%ba%86/#respond</comments>
		
		<dc:creator><![CDATA[Uranos8685]]></dc:creator>
		<pubDate>Wed, 04 Nov 2026 14:20:23 +0000</pubDate>
				<category><![CDATA[ゲーム]]></category>
		<guid isPermaLink="false">https://toybox.uranos8685.mydns.jp/?p=870</guid>

					<description><![CDATA[<p>はじめに 　「夜明け前より瑠璃色な -Brighter than dawning blue-」と「夜明け前より瑠璃色な -Moonlight Cradle-」をWindows 11にインストールしたところ、どちらもエラー [&#8230;]</p>
<p>The post <a href="https://toybox.uranos8685.mydns.jp/870/%e3%80%8c%e5%a4%9c%e6%98%8e%e3%81%91%e5%89%8d%e3%82%88%e3%82%8a%e7%91%a0%e7%92%83%e8%89%b2%e3%81%aa%e3%80%8d%e3%81%8c%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e5%87%ba%e3%81%9a%e3%81%ab%e7%b5%82%e4%ba%86/">「夜明け前より瑠璃色な」がエラーも出ずに終了するのをレジストリで直す（英語でインストールされたWindows）</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">　「夜明け前より瑠璃色な -Brighter than dawning blue-」と「夜明け前より瑠璃色な -Moonlight Cradle-」をWindows 11にインストールしたところ、どちらもエラー表示もなく終了してしまった。</p>



<p class="wp-block-paragraph">　メインの自作PCのWindows11では普通に動くのに、GMKtecのミニPCでは起動しなかった。orz</p>



<p class="wp-block-paragraph">　原因は、Windowsのインストール言語が英語だったことだった。表示は日本語（GMKtecは初期セットアップの画面上は日本語で表示されていたが、OS自体は英語でインスコされていたらしい。罠過ぎるよﾏﾏﾝ…）にしていても、ゲームはそこを見ていたらしい。Windows11のインストール言語をレジストリを書き換えて日本語にしたら動くようになったので、手順をメモしておく。正式な手順ではないので、試す場合は自己責任で。<br>　一番いいのは日本語のWindows11インストールメディアを作ってクリーンインストールすること。ただ、こっちはボンディングやらKonomiTVやらセットアップ済みでそんなことはやってられないので、無理やりレジストリ書き換えで対応した。</p>



<h2 class="wp-block-heading">環境</h2>



<ul class="wp-block-list">
<li>Windows 11 Pro（Build 26300）</li>



<li>英語でインストールしたWindowsに日本語を追加して使用（表示言語、システムロケールともに日本語）</li>
</ul>



<h2 class="wp-block-heading">症状</h2>



<p class="wp-block-paragraph">　<code>BGI.exe</code> を起動しても、約1秒後にウィンドウも出ないまま終了する。終了コードは0で、イベントビューアーにもエラーは記録されない。何も手がかりがない。</p>



<h2 class="wp-block-heading">原因</h2>



<p class="wp-block-paragraph">　Claudeに起動時の動きを追わせたところ、ゲームは起動直後にWindowsの言語を次の3項目で調べていて、1つでも日本語でなければ、メッセージも出さずに終了していた。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>確認している項目</th><th>この環境の値</th></tr></thead><tbody><tr><td><code>GetUserDefaultLCID</code>（ユーザーのロケール）</td><td>日本語</td></tr><tr><td><code>GetSystemDefaultLangID</code>（システムのロケール）</td><td>日本語</td></tr><tr><td><code>GetSystemDefaultUILanguage</code>（システムの既定の表示言語）</td><td><strong>英語</strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">　ややこしいのは3つ目で、システム表示言語の設定はすでに <code>ja-JP</code> だったのに、この値は英語のままだった。レジストリの <code>InstallLanguage</code> が <code>0409</code>（英語）で、インストール言語と同じ値が返っていたようだ。で、ゲーム側はこれが日本語以外だと問答無用で落ちる仕様でハマっていた。</p>



<h2 class="wp-block-heading">対処：InstallLanguageを日本語に書き換える</h2>



<p class="wp-block-paragraph">　管理者のPowerShellで操作する。念のため、先に復元ポイントを作っておく。</p>



<ol class="wp-block-list">
<li>今の設定をデスクトップに保存する</li>



<li><code>InstallLanguage</code> を <code>0411</code>（日本語）に書き換える</li>



<li>Windowsを再起動する</li>



<li><code>BGI.exe</code> を直接起動する</li>
</ol>



<pre class="wp-block-code"><code>reg export "HKLM\SYSTEM\CurrentControlSet\Control\Nls\Language" "$env:USERPROFILE\Desktop\Nls_Language_backup.reg"</code></pre>



<pre class="wp-block-code"><code>reg add "HKLM\SYSTEM\CurrentControlSet\Control\Nls\Language" /v InstallLanguage /t REG_SZ /d 0411 /f</code></pre>



<p class="wp-block-paragraph">　再起動後は <code>GetSystemDefaultUILanguage</code> の値が日本語に変わり、起動ツールなどを使わなくてもMoonlight Cradleが <code>BGI.exe</code> から直接起動した。</p>



<p class="wp-block-paragraph">　元に戻すときは、値を <code>0409</code> にして再起動する。</p>



<pre class="wp-block-code"><code>reg add "HKLM\SYSTEM\CurrentControlSet\Control\Nls\Language" /v InstallLanguage /t REG_SZ /d 0409 /f</code></pre>



<h2 class="wp-block-heading">注意点</h2>



<p class="wp-block-paragraph">　書き換わるのはレジストリの値だけで、Windowsの中身は英語ベースのままである。レジストリの値とシステムの不一致で、大型アップデートや修復で不具合が出たり、レジストリの値が英語に戻ったりする可能性がある。（記事を一通り書き終わって読み直してたら怖くなってきた。早めにOS入れ直そうかな…）</p>



<p class="wp-block-paragraph">　日本語版のISOで上書きインストールする方法も調べたが、言語が違うと「アプリも保持」を選べないという報告が多く、実質的に入れ直しになりそうなのでやめた。</p>



<p class="wp-block-paragraph">　Windowsの設定を変えたくない場合は、ゲームのプロセスにだけ「日本語」と返す小さな起動パッチツールをClaudeに作らせる手もある。実際にBrighter than dawning blueはこの方法でも起動した。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">　エラーも出さずに終了するゲームは、壊れているとは限らず自分で判断して終了していることがある。特にAugust製のゲームが無言で落ちるときは、<code>InstallLanguage</code> を確認してみると良さげ。</p><p>The post <a href="https://toybox.uranos8685.mydns.jp/870/%e3%80%8c%e5%a4%9c%e6%98%8e%e3%81%91%e5%89%8d%e3%82%88%e3%82%8a%e7%91%a0%e7%92%83%e8%89%b2%e3%81%aa%e3%80%8d%e3%81%8c%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e5%87%ba%e3%81%9a%e3%81%ab%e7%b5%82%e4%ba%86/">「夜明け前より瑠璃色な」がエラーも出ずに終了するのをレジストリで直す（英語でインストールされたWindows）</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://toybox.uranos8685.mydns.jp/870/%e3%80%8c%e5%a4%9c%e6%98%8e%e3%81%91%e5%89%8d%e3%82%88%e3%82%8a%e7%91%a0%e7%92%83%e8%89%b2%e3%81%aa%e3%80%8d%e3%81%8c%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e5%87%ba%e3%81%9a%e3%81%ab%e7%b5%82%e4%ba%86/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">870</post-id>	</item>
		<item>
		<title>「Never7」がエラーも出ずに落ちるのをdgVoodoo2で直す（リモートデスクトップ環境）</title>
		<link>https://toybox.uranos8685.mydns.jp/866/%e3%80%8cnever7%e3%80%8d%e3%81%8c%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e5%87%ba%e3%81%9a%e3%81%ab%e8%90%bd%e3%81%a1%e3%82%8b%e3%81%ae%e3%82%92dgvoodoo2%e3%81%a7%e7%9b%b4%e3%81%99%ef%bc%88%e3%83%aa/</link>
					<comments>https://toybox.uranos8685.mydns.jp/866/%e3%80%8cnever7%e3%80%8d%e3%81%8c%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e5%87%ba%e3%81%9a%e3%81%ab%e8%90%bd%e3%81%a1%e3%82%8b%e3%81%ae%e3%82%92dgvoodoo2%e3%81%a7%e7%9b%b4%e3%81%99%ef%bc%88%e3%83%aa/#respond</comments>
		
		<dc:creator><![CDATA[Uranos8685]]></dc:creator>
		<pubDate>Wed, 04 Nov 2026 11:39:06 +0000</pubDate>
				<category><![CDATA[ゲーム]]></category>
		<guid isPermaLink="false">https://toybox.uranos8685.mydns.jp/?p=866</guid>

					<description><![CDATA[<p>はじめに 　サイバーフロント版の「Never7 -the end of infinity-」（Infinity Plus）をWindows 11で起動しようとしたところ、エラー表示もなく落ちてしまった。（アフィリエイトリ [&#8230;]</p>
<p>The post <a href="https://toybox.uranos8685.mydns.jp/866/%e3%80%8cnever7%e3%80%8d%e3%81%8c%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e5%87%ba%e3%81%9a%e3%81%ab%e8%90%bd%e3%81%a1%e3%82%8b%e3%81%ae%e3%82%92dgvoodoo2%e3%81%a7%e7%9b%b4%e3%81%99%ef%bc%88%e3%83%aa/">「Never7」がエラーも出ずに落ちるのをdgVoodoo2で直す（リモートデスクトップ環境）</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">　サイバーフロント版の「Never7 -the end of infinity-」（Infinity Plus）をWindows 11で起動しようとしたところ、エラー表示もなく落ちてしまった。（アフィリエイトリンクじゃないヨ）</p>


<a rel="noopener" href="https://www.amazon.co.jp/%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88-%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A3%E3%83%8B%E3%83%86%E3%82%A3-Plus/dp/B00155WX0O" title="Amazon.co.jp: &#12452;&#12531;&#12501;&#12451;&#12491;&#12486;&#12451; Plus : PC&#12477;&#12501;&#12488;" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img fetchpriority="high" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/ab95577b60be35223ccf83459575ad48.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Amazon.co.jp: &#12452;&#12531;&#12501;&#12451;&#12491;&#12486;&#12451; Plus : PC&#12477;&#12501;&#12488;</div><div class="blogcard-snippet external-blogcard-snippet">Amazon.co.jp: インフィニティ Plus : PCソフト</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.amazon.co.jp/%E3%82%B5%E3%82%A4%E3%83%90%E3%83%BC%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88-%E3%82%A4%E3%83%B3%E3%83%95%E3%82%A3%E3%83%8B%E3%83%86%E3%82%A3-Plus/dp/B00155WX0O" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">www.amazon.co.jp</div></div></div></div></a>


<p class="wp-block-paragraph">　結果としてdgVoodoo2の導入とXP互換モードの設定で動くようになったので、手順をメモしておく。</p>



<h2 class="wp-block-heading">環境</h2>



<ul class="wp-block-list">
<li>Windows 11 Pro（Build 26300）のミニPC（Intel UHD Graphics）</li>



<li>別のPCからリモートデスクトップ（RDP）で接続して操作</li>



<li>ゲームの実行ファイルは <code>Never7win_3d.exe</code>（2001年ビルド）</li>
</ul>



<h2 class="wp-block-heading">症状</h2>



<p class="wp-block-paragraph">　起動メニューで「開始」を押すと、ゲーム画面が出ないまま落ちる。エラーメッセージは出ないが、イベントビューアーのアプリケーションログには毎回同じ内容が記録されていた。</p>



<ul class="wp-block-list">
<li>例外コード：<code>0xc0000005</code>（アクセス違反）</li>



<li>エラーの発生場所：<code>Never7win_3d.exe</code> のオフセット <code>0x0000594b</code></li>
</ul>



<h2 class="wp-block-heading">原因</h2>



<p class="wp-block-paragraph">　該当箇所をClaudeに分析させたところ、グローバル変数に入っているCOMオブジェクトのポインタを、NULLのまま参照して落ちていたとのこと。呼び出しの形から、<code>IDirect3DDevice7::Clear</code> と見られる。つまり3Dデバイスの作成に失敗しているのに、そのまま描画しようとしているようだった。</p>



<p class="wp-block-paragraph">　そこで、RDP接続中に <code>dxdiag</code> で確認すると次のようになっていた。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>アダプター</th><th>DirectDraw</th><th>Direct3D</th></tr></thead><tbody><tr><td>Microsoft Remote Display Adapter（RDPの画面）</td><td>使用不可</td><td>有効</td></tr><tr><td>Intel UHD Graphics</td><td>有効</td><td>使用不可</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">　このゲームが使うDirectDrawとDirect3Dの両方が使えるアダプターがないことが原因で落ちていたと考えられる。RDPを使わなければ動くが、RDP経由で外からスマホでプレイしたいので対処する。</p>



<h2 class="wp-block-heading">対処1：dgVoodoo2を導入する</h2>



<p class="wp-block-paragraph">　dgVoodoo2は、古いDirectDrawやDirect3Dの命令を新しいDirect3Dに変換するツールだ。インストールは不要で、ファイルをゲームフォルダーにコピーするだけで使える。今回は2.87.6を使った。</p>



<p class="wp-block-paragraph"><a href="https://github.com/dege-diosg/dgVoodoo2/releases">dgVoodoo2のリリースページ（GitHub）</a></p>



<ol class="wp-block-list">
<li><code>dgVoodoo2_87_6.zip</code> をダウンロードして展開する</li>



<li><code>MS\x86\DDraw.dll</code>、<code>MS\x86\D3DImm.dll</code>、<code>dgVoodoo.conf</code> を、<code>Never7win_3d.exe</code> と同じフォルダーにコピーする</li>



<li>ゲームを起動し、起動メニューで「窓モード」を選んで「開始」を押す。確認のメッセージが出たら「OK」を押す</li>
</ol>



<p class="wp-block-paragraph">　ゲームが32ビットなので、64ビット用ではなく <code>x86</code> のDLLを使う。元に戻すときは、コピーした3つのファイルを消すだけでよい。</p>



<p class="wp-block-paragraph">　これでタイトル画面まで表示された。ただ、右下に「dgVoodoo」のロゴが出る。消すには <code>dgVoodoo.conf</code> の次の行を <code>false</code> に変更して、ゲームを起動し直せばおｋ。</p>



<pre class="wp-block-code"><code>dgVoodooWatermark                   = false</code></pre>



<h2 class="wp-block-heading">対処2：XP互換モードを設定する（音が出ないとき）</h2>



<p class="wp-block-paragraph">　exeのXP互換モードが外れた状態で起動すると、音が出なかった。Windowsの音量やミュートに問題はなく、ゲームの音声出力がゼロになっていた。互換モードを戻すと音が出るようになった。</p>



<ol class="wp-block-list">
<li><code>Never7win_3d.exe</code> を右クリックして「プロパティ」を開く</li>



<li>「互換性」タブで「互換モードでこのプログラムを実行する」にチェックを入れる</li>



<li>「Windows XP (Service Pack 2)」を選んで「OK」を押す</li>
</ol>



<p class="wp-block-paragraph">　互換モードで音が直る理由は不明。動けばよかろうなのだ。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">　エラーなしで落ちる古いゲームでも、イベントログと <code>dxdiag</code> を見れば原因の見当がつくことがある。RDP環境で古いDirectX 7のゲームが動かないときは、dgVoodoo2を試す価値がありそうだ。<br>　ちなみに、Ever17、Remember11、12Rivenは同じ環境で互換モード無しでも普通に起動した。な～ぜ～。</p>



<p class="wp-block-paragraph">　まあ、Never7とEver17に関してはSteamで販売されているので、こっちを買った方が手っ取り早い。SteamLinkで遊べるし。</p>


<a rel="noopener" href="https://store.steampowered.com/app/2184620/Never_7_The_End_of_Infinity" title="Never 7 - The End of Infinity on Steam" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/aa22dc129eb924ff0c7e4ef275f97528.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Never 7 &#8211; The End of Infinity on Steam</div><div class="blogcard-snippet external-blogcard-snippet">Save me from this cage of infinity</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://store.steampowered.com/app/2184620/Never_7_The_End_of_Infinity/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">store.steampowered.com</div></div></div></div></a>

<a rel="noopener" href="https://store.steampowered.com/app/2392500/Ever_17_The_Out_of_Infinity" title="Ever 17 - The Out of Infinity on Steam" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/85e5867747e208b9dd65776f29f5412f.jpg" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Ever 17 &#8211; The Out of Infinity on Steam</div><div class="blogcard-snippet external-blogcard-snippet">To the promise we once made and the place we must return</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://store.steampowered.com/app/2392500/Ever_17_The_Out_of_Infinity/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">store.steampowered.com</div></div></div></div></a>


<p class="wp-block-paragraph">　おしり。</p><p>The post <a href="https://toybox.uranos8685.mydns.jp/866/%e3%80%8cnever7%e3%80%8d%e3%81%8c%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e5%87%ba%e3%81%9a%e3%81%ab%e8%90%bd%e3%81%a1%e3%82%8b%e3%81%ae%e3%82%92dgvoodoo2%e3%81%a7%e7%9b%b4%e3%81%99%ef%bc%88%e3%83%aa/">「Never7」がエラーも出ずに落ちるのをdgVoodoo2で直す（リモートデスクトップ環境）</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://toybox.uranos8685.mydns.jp/866/%e3%80%8cnever7%e3%80%8d%e3%81%8c%e3%82%a8%e3%83%a9%e3%83%bc%e3%82%82%e5%87%ba%e3%81%9a%e3%81%ab%e8%90%bd%e3%81%a1%e3%82%8b%e3%81%ae%e3%82%92dgvoodoo2%e3%81%a7%e7%9b%b4%e3%81%99%ef%bc%88%e3%83%aa/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">866</post-id>	</item>
		<item>
		<title>光回線とWiMAXを「1本の太い回線」に束ねる ― OpenMPTCProuterで自宅回線をボンディングする方法</title>
		<link>https://toybox.uranos8685.mydns.jp/858/%e5%85%89%e5%9b%9e%e7%b7%9a%e3%81%a8wimax%e3%82%92%e3%80%8c1%e6%9c%ac%e3%81%ae%e5%a4%aa%e3%81%84%e5%9b%9e%e7%b7%9a%e3%80%8d%e3%81%ab%e6%9d%9f%e3%81%ad%e3%82%8b-%e2%80%95-openmptcprouter%e3%81%a7/</link>
					<comments>https://toybox.uranos8685.mydns.jp/858/%e5%85%89%e5%9b%9e%e7%b7%9a%e3%81%a8wimax%e3%82%92%e3%80%8c1%e6%9c%ac%e3%81%ae%e5%a4%aa%e3%81%84%e5%9b%9e%e7%b7%9a%e3%80%8d%e3%81%ab%e6%9d%9f%e3%81%ad%e3%82%8b-%e2%80%95-openmptcprouter%e3%81%a7/#respond</comments>
		
		<dc:creator><![CDATA[Uranos8685]]></dc:creator>
		<pubDate>Sun, 01 Nov 2026 13:38:51 +0000</pubDate>
				<category><![CDATA[テクノロジー]]></category>
		<guid isPermaLink="false">https://toybox.uranos8685.mydns.jp/?p=858</guid>

					<description><![CDATA[<p>自宅に固定回線とWiMAXのホームルーターの2回線があるのに、実際に使っているのは片方だけ。そんな状態の人は意外と多いのではないでしょうか。 この記事では、2つの回線を束ねて「1本の太い回線」として使うボンディングという [&#8230;]</p>
<p>The post <a href="https://toybox.uranos8685.mydns.jp/858/%e5%85%89%e5%9b%9e%e7%b7%9a%e3%81%a8wimax%e3%82%92%e3%80%8c1%e6%9c%ac%e3%81%ae%e5%a4%aa%e3%81%84%e5%9b%9e%e7%b7%9a%e3%80%8d%e3%81%ab%e6%9d%9f%e3%81%ad%e3%82%8b-%e2%80%95-openmptcprouter%e3%81%a7/">光回線とWiMAXを「1本の太い回線」に束ねる ― OpenMPTCProuterで自宅回線をボンディングする方法</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">自宅に<strong>固定回線</strong>と<strong>WiMAXのホームルーター</strong>の2回線があるのに、実際に使っているのは片方だけ。そんな状態の人は意外と多いのではないでしょうか。</p>



<p class="wp-block-paragraph">この記事では、2つの回線を束ねて「1本の太い回線」として使う<strong>ボンディング</strong>という仕組みと、それを家庭で実現できる無料のソフト<strong>OpenMPTCProuter（OMR）</strong>について紹介します。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">そもそも「ボンディング」とは？</h2>



<p class="wp-block-paragraph">回線を2本使う方法には、大きく分けて2種類あります。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>方法</th><th>仕組み</th><th>1つのダウンロードは速くなる？</th></tr></thead><tbody><tr><td><strong>負荷分散</strong></td><td>通信ごとに「こっちの回線」「あっちの回線」と振り分ける</td><td>ならない（1つの通信は1本の回線しか通らない）</td></tr><tr><td><strong>ボンディング</strong></td><td>1つの通信をバラバラにして2本の回線に同時に流し、向こう側で元に戻す</td><td><strong>なる（理論上は2本分の速さ）</strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">家庭用ルーターでよく見かける「デュアルWAN」は、ほとんどが負荷分散です。家族がそれぞれ別のことをしているときは効果がありますが、<strong>大きなファイル1つのダウンロードは速くなりません</strong>。</p>



<p class="wp-block-paragraph">ボンディングなら、1つのダウンロードでも2本分の速さを狙えます。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">ボンディングの仕組み</h2>



<p class="wp-block-paragraph">ボンディングには、<strong>バラバラにした通信を元に戻す役のサーバー</strong>がインターネット上に必要です。<br>例として、固定回線とWiMAX回線をボンディングするとします。</p>



<pre class="wp-block-code"><code>自宅 ─┬─ 固定回線 ─┐
      └─ WiMAX ────┴→ 集約サーバー（VPS） → インターネット
</code></pre>



<ol class="wp-block-list">
<li>自宅のルーターが、通信を細かく分けて2本の回線に流す</li>



<li>インターネット上の集約サーバーが受け取り、1本にまとめ直す</li>



<li>集約サーバーからインターネットに出ていく</li>
</ol>



<p class="wp-block-paragraph">そのため、Webサイトから見ると、<strong>自宅の回線ではなく集約サーバーから接続しているように見えます</strong>。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">OpenMPTCProuterとは</h2>



<p class="wp-block-paragraph"><strong>OpenMPTCProuter（OMR）</strong>は、このボンディングを実現する無料のソフトです。</p>



<ul class="wp-block-list">
<li>自宅側：小型PCなどに<strong>OMR専用のOS</strong>を入れて、ルーターとして使う</li>



<li>サーバー側：レンタルサーバー（VPS）に<strong>OMRのサーバー用ソフト</strong>を入れる</li>
</ul>



<p class="wp-block-paragraph">複数の回線を同時に使う通信技術「MPTCP（マルチパスTCP）」を使っているのが名前の由来です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">効果が出やすいケース・出にくいケース</h2>



<p class="wp-block-paragraph">ボンディングは万能ではありません。<strong>2本の回線の速さが近いほど</strong>効果が出ます。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>組み合わせの例</th><th>期待できる効果</th></tr></thead><tbody><tr><td>固定回線 100Mbps ＋ WiMAX 100Mbps</td><td><strong>大きい</strong>（下りは150〜190Mbps程度が目安）</td></tr><tr><td>固定回線 1Gbps ＋ WiMAX 100Mbps</td><td><strong>小さい</strong>（1〜2割増し程度。かえって遅くなることも）</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">マンションの<strong>VDSL方式</strong>（電話線を使う方式）のように、固定回線が100Mbpsで頭打ちになっている環境は、ボンディングと相性が良い典型例です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">必要なもの</h2>



<h3 class="wp-block-heading">1. 自宅側のルーター（OMR機）</h3>



<p class="wp-block-paragraph">LANポートが3つ必要です（回線1・回線2・家の中）。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>選び方</th><th>目安の費用</th><th>特徴</th></tr></thead><tbody><tr><td>中古の法人向けミニPC ＋ USB LANアダプター×2</td><td>約2万円</td><td>一番手軽で安い</td></tr><tr><td>LANポート4つのファンレス小型PC（N100など）</td><td>約5〜7万円</td><td>専用機として安定</td></tr><tr><td>手持ちのWindows PCで仮想マシンとして動かす</td><td>USB LAN代のみ</td><td>安いが、PCの再起動中はネットが止まる</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">200Mbps程度なら、<strong>第6世代以降のCore i3/i5</strong>があれば性能は十分です。</p>



<p class="wp-block-paragraph">USB LANアダプターを使う場合、OMR（中身はLinux）に直接つなぐなら<strong>Realtek RTL8153チップ</strong>の製品が無難です。</p>



<h3 class="wp-block-heading">2. 集約サーバー（VPS）</h3>



<p class="wp-block-paragraph">ここが一番の落とし穴です。</p>



<ul class="wp-block-list">
<li><strong>回線帯域</strong>：国内の格安VPSは「1契約あたり最大100Mbps」などの制限があるものが多く、これではボンディングの意味がありません。<strong>帯域の上限が十分に高いもの</strong>を選びます。</li>



<li><strong>転送量</strong>：家のダウンロードがすべてVPSを経由するので、<strong>月の転送量の上限</strong>も重要です。</li>



<li><strong>東京リージョン</strong>：遅延を小さくするため。</li>
</ul>



<p class="wp-block-paragraph">海外のVPSサービスの東京リージョンなら、月1,000円前後で「帯域が十分＋月2TB程度の転送量」のプランがあります。家庭の通信量はルーターの統計で確認できるので、契約前に一度見ておくと安心です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">導入手順</h2>



<p class="wp-block-paragraph">ここからは、実際の導入手順を順番に説明します。OMRは更新が活発なソフトなので、<strong>メニュー名やコマンドはバージョンによって変わることがあります</strong>。作業するときは、公式サイトの説明もあわせて確認してください。</p>



<ul class="wp-block-list">
<li>公式サイト：https://www.openmptcprouter.com/</li>



<li>VPS用スクリプト（GitHub）：https://github.com/Ysurac/openmptcprouter-vps</li>
</ul>



<h3 class="wp-block-heading">完成形のイメージ</h3>



<pre class="wp-block-code"><code>&#91;固定回線のモデム/ONU] ─ WAN1 ┐
                              ├ &#91;OMR機] ─ LAN ─ &#91;今使っているルーター] ─ 家の機器
&#91;WiMAXのルーター]      ─ WAN2 ┘
                 ⇅ 暗号化されたトンネル
           &#91;VPS（東京）] → インターネット
</code></pre>



<p class="wp-block-paragraph">今使っているルーターから見ると、「上流のルーターがOMR機に変わるだけ」です。<strong>ケーブルを元に戻せば、すぐに今の状態に戻せる</strong>のも安心なところです。</p>



<h3 class="wp-block-heading">手順0：準備するもの</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>もの</th><th>ポイント</th></tr></thead><tbody><tr><td>OMR機にするPC</td><td>LANポートが3つ（足りない分はUSB LANアダプターで補う）</td></tr><tr><td>USBメモリ（8GB以上）</td><td>OMRのイメージを書き込むのに使う</td></tr><tr><td>VPSの契約</td><td>帯域の上限と転送量を確認。東京リージョン</td></tr><tr><td>作業用のPC</td><td>OMRの管理画面を開くのに使う</td></tr><tr><td>プロバイダーの接続ID・パスワード</td><td>固定回線がPPPoE接続の場合に必要</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>作業前に、今のルーターの設定をバックアップ</strong>しておきましょう。</p>



<h3 class="wp-block-heading">手順1：VPS側のセットアップ</h3>



<ol class="wp-block-list">
<li>VPSを <strong>Debian 12（64bit）</strong> で作成する。リージョンは東京を選ぶ。自動バックアップなどの有料オプションは不要。</li>



<li>作業用のPCから、rootでSSH接続する。</li>



<li>GitHubのREADMEに書かれている<strong>インストール用のコマンド</strong>を実行する。このとき、<strong>自宅側に入れるOMRと同じバージョン用のコマンド</strong>を選ぶのがポイントです。バージョンがずれると、つながらないことがあります。</li>



<li>完了すると、<strong>サーバーキー</strong>などの接続情報が表示されます。必ず控えておきましょう（サーバー上の設定ファイルにも保存されます）。</li>



<li>VPSを再起動する。再起動後は、<strong>SSHのポート番号が65222番に変わる</strong>ので注意してください。</li>
</ol>



<pre class="wp-block-code"><code>ssh -p 65222 root@VPSのIPアドレス
</code></pre>



<h3 class="wp-block-heading">手順2：OMR機の準備</h3>



<ol class="wp-block-list">
<li>公式サイトのダウンロードページから、<strong>x86_64用のイメージ</strong>をダウンロードする。
<ul class="wp-block-list">
<li>最近のPC（UEFI起動）なら、ファイル名に「<strong>ext4-combined-efi</strong>」と付いたもの</li>



<li>古いPC（BIOS起動）なら、「efi」が付いていない「<strong>ext4-combined</strong>」のもの</li>
</ul>
</li>



<li><strong>balenaEtcher</strong> や <strong>Rufus</strong> などのツールで、OMR機の内蔵SSD、またはUSBメモリに書き込む。
<ul class="wp-block-list">
<li><strong>注意</strong>：書き込んだドライブの中身はすべて消えます。</li>
</ul>
</li>



<li>OMR機のBIOS（UEFI）の設定を変える。
<ul class="wp-block-list">
<li><strong>Secure Boot</strong>：無効にする</li>



<li><strong>停電から復帰したときの動作（Restore on AC Power Loss など）</strong>：「電源オン」にする。停電のあとに自動で復帰させるためです。</li>
</ul>
</li>



<li>OMR機を起動する。</li>
</ol>



<h3 class="wp-block-heading">手順3：管理画面に入り、LAN側のアドレスを決める</h3>



<ol class="wp-block-list">
<li>作業用のPCを、OMR機の<strong>LAN用のポート</strong>に直接つなぐ。多くの場合、1番目のポート（eth0）がLANです。</li>



<li>ブラウザで <strong>http://192.168.100.1</strong> を開く。</li>



<li>最初にログインしたら、<strong>rootのパスワードを必ず設定</strong>する。</li>



<li>必要なら、<strong>LAN側のアドレスを変更</strong>する（Network → Interfaces → LAN）。</li>
</ol>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>よくある落とし穴</strong>：OMRの初期アドレス（192.168.100.1）は、一部の業務用ルーターの初期アドレスと同じです。家のルーターや、WiMAXのルーターのアドレスと<strong>範囲が重ならないように</strong>、たとえば192.168.50.1などに変えておきましょう。</p>
</blockquote>



<h3 class="wp-block-heading">手順4：回線とVPSの設定</h3>



<p class="wp-block-paragraph"><strong>System → OpenMPTCProuter</strong> のウィザードで設定します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>設定内容</th></tr></thead><tbody><tr><td>サーバーのIPアドレス</td><td>VPSのIPアドレス</td></tr><tr><td>サーバーキー</td><td>手順1で控えた値</td></tr><tr><td>WAN1（固定回線）</td><td>PPPoE（IDとパスワードを入力）、または自動取得（DHCP）。マルチパスは「<strong>Master</strong>」</td></tr><tr><td>WAN2（WiMAX）</td><td>自動取得（DHCP）。マルチパスは「<strong>Enabled</strong>」</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ケーブルをつないで、保存・適用（Save &amp; Apply）します。</p>



<ul class="wp-block-list">
<li>固定回線のモデム（ONU）→ OMR機のWAN1</li>



<li>WiMAXのルーターのLANポート → OMR機のWAN2</li>
</ul>



<p class="wp-block-paragraph"><strong>Status → OpenMPTCProuter</strong> の画面で、<strong>2つの回線とVPSが緑色</strong>になっていれば、接続できています。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>PPPoEの注意</strong>：プロバイダーによっては、PPPoEで同時に接続できるのが1本だけです。今のルーターがPPPoEで接続している場合は、<strong>そちらを切断してから</strong>OMR側で接続してください。</p>
</blockquote>



<h3 class="wp-block-heading">手順5：動作確認（家全体に入れる前に）</h3>



<p class="wp-block-paragraph">まずは作業用のPCだけで確認します。</p>



<ol class="wp-block-list">
<li>作業用のPCをOMR機のLANにつないだまま、https://ifconfig.me を開く。<strong>VPSのIPアドレスが表示されれば成功</strong>です。</li>



<li>速度測定サイト（fast.comなど）で速度を測る。片方の回線だけのときより速くなっていれば、ボンディングが効いています。</li>
</ol>



<p class="wp-block-paragraph">思ったほど速くならない場合は、<strong>System → OpenMPTCProuter</strong> で、通信方式（Proxy や VPN の種類）を切り替えて比べてみましょう。</p>



<h3 class="wp-block-heading">手順6：今のルーターをOMR機の下につなぐ</h3>



<ol class="wp-block-list">
<li>OMR機のLANポート → 今のルーターのWAN（インターネット）ポート、とつなぐ。</li>



<li>今のルーターの、インターネット側の設定を変える。
<ul class="wp-block-list">
<li><strong>接続方式</strong>：PPPoEをやめて、「自動取得（DHCP）」か「固定IPアドレス」にする</li>



<li><strong>ゲートウェイとDNS</strong>：OMR機のLAN側のアドレス（例：192.168.50.1）にする</li>
</ul>
</li>



<li>家の中のPCやスマホで、インターネットにつながること、ifconfig.me でVPSのIPアドレスが表示されることを確認する。</li>
</ol>



<h3 class="wp-block-heading">手順7：バイパスの設定（おすすめ）</h3>



<p class="wp-block-paragraph"><strong>Services → OMR-Bypass</strong> で、ボンディングを通さずに固定回線から直接出す通信を指定します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>対象</th><th>理由</th></tr></thead><tbody><tr><td>オンラインゲーム・ビデオ会議</td><td>遅延を小さくするため</td></tr><tr><td>動画配信サービス</td><td>データセンターのIPアドレスとしてブロックされるのを防ぐため。VPSの転送量の節約にもなる</td></tr><tr><td>銀行など</td><td>追加の認証やブロックを避けるため</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ドメイン名やサービス単位で指定できます。</p>



<h3 class="wp-block-heading">手順8：外から自宅にアクセスしている場合（必要な人だけ）</h3>



<p class="wp-block-paragraph">自宅でWebサイトなどを公開している場合は、<strong>Network → Firewall → Port Forwards</strong> で、VPSに届いた通信を自宅のサーバーに転送する設定を追加します。DDNSを使っている場合は、登録されるIPアドレスがVPSのものに変わることも確認しましょう。</p>



<h3 class="wp-block-heading">うまくいかないときのチェックポイント</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>症状</th><th>確認すること</th></tr></thead><tbody><tr><td>管理画面が開けない</td><td>作業用PCを、LAN用のポートにつないでいるか。アドレスの範囲が重なっていないか</td></tr><tr><td>VPSが緑にならない</td><td>サーバーキーが正しいか。VPSと自宅側のOMRのバージョンが合っているか</td></tr><tr><td>PPPoEがつながらない</td><td>今のルーター側のPPPoEを切断したか。IDとパスワードが正しいか</td></tr><tr><td>USB LANアダプターが認識されない</td><td>Linuxで動くチップ（Realtek RTL8153など）か。USBハブを使わず直接挿しているか</td></tr><tr><td>再起動したら回線が入れ替わった</td><td>USB LANは、再起動で認識の順番が変わることがある。MACアドレスでポートを固定する</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">注意点</h2>



<h3 class="wp-block-heading">1. 遅延（Ping）は悪化することがある</h3>



<p class="wp-block-paragraph">通信が集約サーバーを経由するうえ、例で使ったWiMAXはもともと遅延が大きめです。<strong>オンラインゲームやビデオ会議</strong>は、OMRの「バイパス」機能で固定回線に直接出すのがおすすめです。</p>



<h3 class="wp-block-heading">2. 外から自宅にアクセスする仕組みは要注意</h3>



<p class="wp-block-paragraph">自宅でサーバー（ブログ、NAS、VPNなど）を公開している場合、OMRを入れると<strong>外からの入口がVPSに変わります</strong>。</p>



<ul class="wp-block-list">
<li>Webサイトなどは、VPSから自宅へ転送する設定が必要</li>



<li><strong>L2TP/IPsecなどのVPN</strong>は、NATを何重にも越えることになり、うまく動かないことが多い</li>
</ul>



<p class="wp-block-paragraph">外から自宅のネットワークに入るだけなら、<strong>Tailscale</strong>のような「ポート開放が不要なVPN」に置き換えるのが簡単です。</p>



<h3 class="wp-block-heading">3. 一部のサービスで弾かれることがある</h3>



<p class="wp-block-paragraph">外への出口がデータセンターのIPアドレスになるため、<strong>動画配信サービスや銀行</strong>などで、ブロックされたり追加の認証を求められたりすることがあります。これらもバイパスに入れておくと安心です。動画は100Mbpsあれば十分なので、バイパスしても体感の損はほぼありません。</p>



<h3 class="wp-block-heading">4. IPv6は対象外になりやすい</h3>



<p class="wp-block-paragraph">IPv6で直接流れていく通信はボンディングされません。</p>



<h3 class="wp-block-heading">5. OMR機が止まると家のネットも止まる</h3>



<p class="wp-block-paragraph">OMR機が家の出入り口になるので、止まると家全体のインターネットが止まります。業務用ルーターをお持ちなら、<strong>OMR機を死活監視して、止まったら自動で通常の接続に切り替える</strong>設定にしておくと安心です。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">まとめ</h2>



<ul class="wp-block-list">
<li>2本の回線の速さが近いなら、ボンディングで<strong>下りの速さをほぼ倍</strong>にできる可能性がある</li>



<li>VPSは「帯域の上限」と「転送量」を必ず確認する</li>



<li>遅延の悪化、外からのアクセス、一部サービスでのブロックなど、<strong>副作用もある</strong></li>



<li>OMRは無料だが、<strong>VPS代（月1,000円前後）とルーター機</strong>が必要（オヌヌメはVultrのShared CPUのvhp-1C-1gb。月6$で無料枠2TB+2TBを日割りした分が割り当てられる。つまり、月初は2TB上限だが月末には4TBまで上限が増える。これを毎月繰り返す。一般の誤家庭にはこれで十分では？<br>ほかにもVPSサービスはさくらやXserverなどあるが、回線が100Mbpsが上限で、いくら束ねても100Mbpsで頭打ちになるので今回の用途には向かないよ～ん）</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="524" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/11/image-1024x524.png" alt="" class="wp-image-862" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/11/image-1024x524.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/11/image-767x393.png 767w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/11/image-1536x787.png 1536w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/11/image-300x154.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/11/image-2048x1049.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">「固定回線が100Mbpsで頭打ち、でもWiMAXも同じくらい出る」という環境なら、試してみる価値は十分あります。まずは手持ちのPCで、VPSも1か月だけ契約して効果を試してみるのがおすすめです。</p><p>The post <a href="https://toybox.uranos8685.mydns.jp/858/%e5%85%89%e5%9b%9e%e7%b7%9a%e3%81%a8wimax%e3%82%92%e3%80%8c1%e6%9c%ac%e3%81%ae%e5%a4%aa%e3%81%84%e5%9b%9e%e7%b7%9a%e3%80%8d%e3%81%ab%e6%9d%9f%e3%81%ad%e3%82%8b-%e2%80%95-openmptcprouter%e3%81%a7/">光回線とWiMAXを「1本の太い回線」に束ねる ― OpenMPTCProuterで自宅回線をボンディングする方法</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://toybox.uranos8685.mydns.jp/858/%e5%85%89%e5%9b%9e%e7%b7%9a%e3%81%a8wimax%e3%82%92%e3%80%8c1%e6%9c%ac%e3%81%ae%e5%a4%aa%e3%81%84%e5%9b%9e%e7%b7%9a%e3%80%8d%e3%81%ab%e6%9d%9f%e3%81%ad%e3%82%8b-%e2%80%95-openmptcprouter%e3%81%a7/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">858</post-id>	</item>
		<item>
		<title>SIE製nasneをDebian化して使い続ける</title>
		<link>https://toybox.uranos8685.mydns.jp/825/sie%e8%a3%bdnasne%e3%82%92debian%e5%8c%96%e3%81%97%e3%81%a6%e4%bd%bf%e3%81%84%e7%b6%9a%e3%81%91%e3%82%8b/</link>
					<comments>https://toybox.uranos8685.mydns.jp/825/sie%e8%a3%bdnasne%e3%82%92debian%e5%8c%96%e3%81%97%e3%81%a6%e4%bd%bf%e3%81%84%e7%b6%9a%e3%81%91%e3%82%8b/#respond</comments>
		
		<dc:creator><![CDATA[Uranos8685]]></dc:creator>
		<pubDate>Tue, 27 Oct 2026 20:16:23 +0000</pubDate>
				<category><![CDATA[テクノロジー]]></category>
		<guid isPermaLink="false">https://toybox.uranos8685.mydns.jp/?p=825</guid>

					<description><![CDATA[<p>はじめに 　ほとんど使っていないSIE製nasne（CECH-ZNR2J）ですが、2027年7月には使い物にならなくなってしまう。 　たまたま、Xで以下のリポジトリの情報が流れてきた。どうもnasneを普通のDebian [&#8230;]</p>
<p>The post <a href="https://toybox.uranos8685.mydns.jp/825/sie%e8%a3%bdnasne%e3%82%92debian%e5%8c%96%e3%81%97%e3%81%a6%e4%bd%bf%e3%81%84%e7%b6%9a%e3%81%91%e3%82%8b/">SIE製nasneをDebian化して使い続ける</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">　ほとんど使っていないSIE製nasne（CECH-ZNR2J）ですが、2027年7月には使い物にならなくなってしまう。</p>


<a rel="noopener" href="https://www.buffalo.jp/nasne/inheritance.html" title="株式会社ソニー・インタラクティブエンタテインメント（SIE）製nasne®をお使いの方へ | テレビや動画視聴を楽しめるネットワークレコーダー＆メディアストレージ nasne® | バッファロー" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/e271b8d772cd3bea38cb3655e85f4ef4.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">株式会社ソニー・インタラクティブエンタテインメント（SIE）製nasne®をお使いの方へ | テレビや動画視聴を楽しめるネットワークレコーダー＆メディアストレージ nasne® | バッファロー</div><div class="blogcard-snippet external-blogcard-snippet">自宅のネットワークにつなぐだけで、さまざまな機器と接続でき、いつでも、どこでもテレビや動画をフリースタイルで楽しめるバッファローSIE製nasneをお使いの⽅へをご紹介します。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://www.buffalo.jp/nasne/inheritance.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">www.buffalo.jp</div></div></div></div></a>


<p class="wp-block-paragraph">　たまたま、Xで以下のリポジトリの情報が流れてきた。どうもnasneを普通のDebian Linuxサーバーとして動かせるようにしたプロジェクトで、mirakurunも動かせるらしいので、これを使って延命チャレンジしてみる。</p>


<a rel="noopener" href="https://github.com/mar1mo-41414/SonyNasne-debian" title="GitHub - mar1mo-41414/SonyNasne-debian: Sony nasne (CECH-ZNR2J) の解析と Debian (mipsel) 直起動のためのツール・ドキュメント" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/443ff348781bd5b3f537e8f5140cc0f7.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub &#8211; mar1mo-41414/SonyNasne-debian: Sony nasne (CECH-ZNR2J) の解析と Debian (mipsel) 直起動のためのツール・ドキュメント</div><div class="blogcard-snippet external-blogcard-snippet">Sony nasne (CECH-ZNR2J) の解析と Debian (mipsel) 直起動のためのツール・ドキュメント &#8211; mar1mo-41414/SonyNasne-debian</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/mar1mo-41414/SonyNasne-debian" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>


<h2 class="wp-block-heading">環境</h2>



<p class="wp-block-paragraph">　改造にはLinuxPCが必要とのこと。ただ、報告を読むとWSL2からもイケるっぽい。以下の記事でWSL2はセットアップ済みなので、これをそのまま使う。</p>


<a href="https://toybox.uranos8685.mydns.jp/625/litert-lm%e7%94%a8%e3%81%absafetensors%e5%bd%a2%e5%bc%8f%e3%81%ae%e3%83%a2%e3%83%87%e3%83%ab%e3%82%92%e5%a4%89%e6%8f%9b%e3%81%99%e3%82%8b/" title="Safetensors形式のモデルをLiteRT-LM形式に変換してみる" class="blogcard-wrap internal-blogcard-wrap a-wrap cf"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/07/logo-litert-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/07/logo-litert-320x180.png 320w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/07/logo-litert-240x135.png 240w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/07/logo-litert-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Safetensors形式のモデルをLiteRT-LM形式に変換してみる</div><div class="blogcard-snippet internal-blogcard-snippet">WSL2のセットアップ　Windowsの機能の有効化または無効化で、「Linux用Windowsサブシステム」と「Windowsサンドボックス」を有効化し、再起動する。　管理者権限でPowerShellを立ち上げ、以下のコマンドを実行する。&#8230;</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://toybox.uranos8685.mydns.jp" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">toybox.uranos8685.mydns.jp</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2026.07.19</div></div></div></div></a>


<h2 class="wp-block-heading"></h2>



<h3 class="wp-block-heading">ビルド環境の作成</h3>



<p class="wp-block-paragraph">　まずは、WSL2を起動してGitリポジトリをクローンして、不足資源を確認するチェックプログラムを実行する。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>git clone https://github.com/mar1mo-41414/SonyNasne-debian.git
cd SonyNasne-debian
python3 scripts/nasne_setup.py check</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>  [OK] python3                    このツール、.dlm の作成
  [OK] curl                       GPLソース・公式ファームの取得
  [OK] bzip2                      カーネルソースの展開
  [OK] tar
  [OK] file                       ツリー作成時のバイナリ検査
  [NG] docker                   ← apt: docker.io  カーネルのビルド(古いgcc 4.3.2のコンテナ)
  [NG] debootstrap              ← apt: debootstrap  Debian wheezy (mipsel) の作成
  [NG] qemu-mipsel-static       ← apt: qemu-user-static  mipselのDebianをPC上で実行(debootstrapの第2段階)
  [--] mipsel-linux-gnu-gcc     ← apt: gcc-mipsel-linux-gnu  MIPS用ツールのビルド(無ければDockerのgccで代用)
  [NG] binfmt の qemu-mipsel が未登録 ← apt: binfmt-support(登録されない場合は update-binfmts --enable qemu-mipsel)

足りないもの(Debian/Ubuntu): sudo apt install binfmt-support debootstrap docker.io qemu-user-static</code></pre></div>



<p class="wp-block-paragraph">　足りないモノがあったので、追加でインストール必要があるとのこと。まずは、aptパッケージ一覧を更新した上で、不足する資源をインスコする。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sudo apt update
sudo apt install binfmt-support debootstrap docker.io qemu-user-binfmt</code></pre></div>



<p class="wp-block-paragraph">　終わったら、もう一度チェックする。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>python3 scripts/nasne_setup.py check</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>-rwxr-xr-x 1 root root 4211448 Sep  2 18:18 /usr/bin/qemu-mipsel
/usr/bin/qemu-mipsel-static: cannot open `/usr/bin/qemu-mipsel-static&#39; (No such file or directory)
enabled
interpreter /usr/bin/qemu-mipsel
flags: POF
offset 0
magic 7f454c46010101000000000000000000020008000100000000000000000000000000000000000000
mask ffffffffffffff0000fffffffffffffffeffffffffffffff00000000000000000000000020000000
  [OK] python3                    このツール、.dlm の作成
  [OK] curl                       GPLソース・公式ファームの取得
  [OK] bzip2                      カーネルソースの展開
  [OK] tar
  [OK] file                       ツリー作成時のバイナリ検査
  [OK] docker                     カーネルのビルド(古いgcc 4.3.2のコンテナ)
  [OK] debootstrap                Debian wheezy (mipsel) の作成
  [NG] qemu-mipsel-static       ← apt: qemu-user-static  mipselのDebianをPC上で実行(debootstrapの第2段階)
  [--] mipsel-linux-gnu-gcc     ← apt: gcc-mipsel-linux-gnu  MIPS用ツールのビルド(無ければDockerのgccで代用)
  [NG] docker を実行できない(権限またはデーモン): permission denied while trying to connect to the docker API at unix:///var/run/docker.sock

足りないもの(Debian/Ubuntu): sudo apt install qemu-user-static
  (dockerの権限: sudo usermod -aG docker $USER など)</code></pre></div>



<p class="wp-block-paragraph">　qemu-mipsel-staticがないと言われているが、新しいUbuntuだとファイル名が変わって/usr/bin/qemu-mipselにあるが、ツール側は古いファイルを探そうとして失敗しているらしい。<br>　以下のコマンドを実行して/usr/local/binにコピーする。</p>



<p class="wp-block-paragraph">【実行するコマンド】　</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sudo ln -s /usr/bin/qemu-mipsel /usr/local/bin/qemu-mipsel-static</code></pre></div>



<p class="wp-block-paragraph">　あと、dockerの権限がないといわれているので、dockerグループに権限を付ける。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sudo usermod -aG docker $USER</code></pre></div>



<p class="wp-block-paragraph">　ここまで来たら、WSL2を再起動する。WSL2をシャットダウンするには、管理者権限で起動したPowerShellでコマンドを叩く。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>wsl --shutdown</code></pre></div>



<p class="wp-block-paragraph">　立ち上げ直したら、チェックプログラムを実行する。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>cd ~/SonyNasne-debian
python3 scripts/nasne_setup.py check</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>docker OK
  [OK] python3                    このツール、.dlm の作成
  [OK] curl                       GPLソース・公式ファームの取得
  [OK] bzip2                      カーネルソースの展開
  [OK] tar
  [OK] file                       ツリー作成時のバイナリ検査
  [OK] docker                     カーネルのビルド(古いgcc 4.3.2のコンテナ)
  [OK] debootstrap                Debian wheezy (mipsel) の作成
  [OK] qemu-mipsel-static         mipselのDebianをPC上で実行(debootstrapの第2段階)
  [--] mipsel-linux-gnu-gcc     ← apt: gcc-mipsel-linux-gnu  MIPS用ツールのビルド(無ければDockerのgccで代用)

必要なものはそろっています。</code></pre></div>



<h3 class="wp-block-heading">ビルド</h3>



<p class="wp-block-paragraph">　nasne用のRSA鍵を作る。途中でパスフレーズを求められるが、設定しても空欄のままでもどっちでもOK。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>ssh-keygen -t rsa -b 4096 -f ~/.ssh/nasne_rsa</code></pre></div>



<p class="wp-block-paragraph">　作成したRSA鍵を使ってビルドを実行する。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>cd ~/SonyNasne-debian
python3 scripts/nasne_setup.py build --download-official \
  --ssh-pubkey ~/.ssh/nasne_rsa.pub --work build_nasne 2&gt;&1 | tee build.log</code></pre></div>



<p class="wp-block-paragraph">　滝のようなログが流れた後、私の環境では以下の内容が出力されてビルドが止まってしまった。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Get:20 http://archive.debian.org/debian/ wheezy/main openssh-client mipsel 1:6.0p1-4+deb7u4 [979 kB]
Get:21 http://archive.debian.org/debian/ wheezy/main openssh-server mipsel 1:6.0p1-4+deb7u4 [318 kB]
Get:22 http://archive.debian.org/debian/ wheezy/main tcpd mipsel 7.6.q-24 [26.3 kB]
Get:23 http://archive.debian.org/debian/ wheezy/main xauth mipsel 1:1.0.7-1 [35.6 kB]
Preconfiguring packages ...
Fetched 9230 kB in 1s (7718 kB/s)
Can not write log, openpty() failed (/dev/pts not mounted?)</code></pre></div>



<p class="wp-block-paragraph">　Claudeにログを解析させたら、chroot内の<code>apt-get</code>がqemu経由で端末（今開いているWSLのウィンドウ）の設定を変えようとして、Linuxの端末制御によって一時停止させられたとのこと。ビルドは続きから出来るようなので、一度WSL2を立ち上げ直して、前回のビルドツリーを吹っ飛ばして、再ビルドさせる。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>cd ~/SonyNasne-debian
sudo rm -rf build_nasne/tree
python3 scripts/nasne_setup.py build --download-official \
  --ssh-pubkey ~/.ssh/nasne_rsa.pub --work build_nasne &lt; /dev/null 2&gt;&1 | tee build.log</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>== ステップ 1: 公式ファームパッケージ
  /home/xxx/SonyNasne-debian/build_nasne/KRST3101_0260_SECURE.dlm (36119466 バイト)

== ステップ 2: カーネルのGPLソース(Sony公開)
  展開済み

== ステップ 3: カーネル用ツールチェーン(Dockerイメージ nasne-kcc:gcc432。gcc 4.3.2 + binutils 2.19.1 をビルド。30分〜1時間)
  イメージあり

== ステップ 4: 自作カーネルのビルド(直起動用の内蔵initramfs入り)
  /home/xxx/SonyNasne-debian/gpl_src/build/out/vmlinux_new.bin あり

== ステップ 5: KNLセグメント(公式のKNLを雛形に、自作カーネルを包む)
  $ /usr/bin/python3 /home/xxx/SonyNasne-debian/scripts/build_knl.py verify /home/xxx/SonyNasne-debian/build_nasne/knl_new.bin

== ステップ 6: Debian wheezy (mipsel) のツリー(debootstrap。数分)
  $ sudo /home/xxx/SonyNasne-debian/scripts/stage1/prepare_tree.sh --out /home/xxx/SonyNasne-debian/build_nasne/tree --knl /home/xxx/SonyNasne-debian/build_nasne/knl_new.bin --official /home/xxx/SonyNasne-debian/build_nasne/KRST3101_0260_SECURE.dlm --ssh-pubkey /home/xxx/.ssh/nasne_rsa.pub
  $ sudo tar --numeric-owner -cpf /home/xxx/SonyNasne-debian/build_nasne/debian_tree.tar -C /home/xxx/SonyNasne-debian/build_nasne/tree .
  $ sudo chown 1000:1000 /home/xxx/SonyNasne-debian/build_nasne/debian_tree.tar

== ステップ 7: 00550066.dlm の作成
  --hdd-dlm が無いので、ここで止めます。ビルドは完了しています。HDDの00550066.dlmを用意して、もう一度 build を実行してください(以前のステップは飛ばされます)。</code></pre></div>



<p class="wp-block-paragraph">　ビルドかんりょ～</p>



<h3 class="wp-block-heading">SPIのバックアップ</h3>



<p class="wp-block-paragraph">　nasneをバラして、HDDをPCに接続する。<br>　もし、フォーマット確認が出ても、絶対絶対ぜ～ったいにキャンセルする。</p>



<p class="wp-block-paragraph">　PowerShellを管理者権限で立ち上げて、以下のコマンドを実行してHDDの制御をWSL2に渡す。</p>



<p class="wp-block-paragraph">【実行するコマンド】<br>　PCにつながっているストレージ一覧が出る。モデル名やサイズからnasneのHDDのDeviceIDを調べる。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Get-CimInstance -Query &quot;SELECT * from Win32_DiskDrive&quot; | Select-Object DeviceID, Model, Size</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>DeviceID           Model                                      Size
--------           -----                                      ----
\\.\PHYSICALDRIVE5 HGST HTS 541010A9E680 USB Device  1000202273280</code></pre></div>



<p class="wp-block-paragraph">　続けて、PowerShellで以下のコマンドを入力して、実際に制御をWSL2に渡す。今回はDeviceIDが5なので以下のコマンドになっているが、環境によって数字は異なるので読み替えること。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>wsl --mount \\.\PHYSICALDRIVE5 --bare</code></pre></div>



<p class="wp-block-paragraph">　この操作を正しく終了しました、と表示されればOK</p>



<p class="wp-block-paragraph">　ここからは、WSL2に戻ってHDDが認識されているか確認する。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>lsblk -o NAME,SIZE,FSTYPE,LABEL</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>NAME     SIZE FSTYPE LABEL
sda    356.9M ext4
sdb    159.4M ext4
sdc     48.8G swap
sdd        1T ext4
sde    931.5G
├─sde1   256M ext3   sys1
├─sde2     1G ext3   sys2
└─sde3 930.3G xfs    user</code></pre></div>



<p class="wp-block-paragraph">　sdeで認識された（ここも環境によって何番で出るかは変わる）。<br>　sys1をマウントして、中身を確認する。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>cd ~/SonyNasne-debian
sudo mkdir -p /mnt/nasne_sys1
sudo mount /dev/sde1 /mnt/nasne_sys1
findmnt /mnt/nasne_sys1
ls -la /mnt/nasne_sys1
df -h /mnt/nasne_sys1</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>TARGET          SOURCE    FSTYPE OPTIONS
/mnt/nasne_sys1 /dev/sde1 ext3   rw,relatime,stripe=4
total 31047
drwxr-xr-x  5 root root     1024 Jan  1  1970 .
drwxr-xr-x 10 root root     4096 Oct 28 03:17 ..
-rw-r--r--  1 root root      148 Apr 28  2018 00110022.dlm
-rwxr-xr-x  1 root root 31646110 Apr 28  2018 00550066.dlm
drwx------  2 root root     1024 Apr 28  2018 11002200
drwx------  2 root root     1024 May 20  2017 33004400
drwx------  2 root root    12288 Jul 26  2013 lost+found
Filesystem      Size  Used Avail Use% Mounted on
/dev/sde1       238M  100M  126M  45% /mnt/nasne_sys1</code></pre></div>



<p class="wp-block-paragraph">　オリジナルの00550066.dlmをバックアップしておく。念のため、WindowsのCドライブにもC:\nasne_backupにコピーしておく。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>mkdir -p backup
cp /mnt/nasne_sys1/00550066.dlm backup/00550066.dlm.orig
sha256sum /mnt/nasne_sys1/00550066.dlm backup/00550066.dlm.orig
mkdir -p /mnt/c/nasne_backup
cp backup/00550066.dlm.orig /mnt/c/nasne_backup/</code></pre></div>



<p class="wp-block-paragraph">【実行結果】<br>　オリジナルとバックアップのsha256が一致していることを確認する</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>39a3a436bace9c3fa4a252a9272cf5715afb6e0b3af695c76d73050aa22014c8  /mnt/nasne_sys1/00550066.dlm
39a3a436bace9c3fa4a252a9272cf5715afb6e0b3af695c76d73050aa22014c8  backup/00550066.dlm.orig</code></pre></div>



<p class="wp-block-paragraph">　SPIバックアップ版の<code>.dlm</code>を作る</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>python3 scripts/stage1/make_stage1_dlm.py build --official backup/00550066.dlm.orig \
  --out spi_backup.dlm --mode backup</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>公式rootfs: tar 86026240 bytes、ヘッダ date=&#39;Tue Oct 24 11:13:25 2017\x00\x00\x00\x00\x00\x00\x00\x00&#39; +8(major)=2
rcS のエントリ: 2個(最後の #474 を差し替える)
新しいボディ: 31605881 bytes (31.6MB)  公式のエントリ数 1289
spi_backup.dlm: 31605945 bytes  自己検証=OK flag=0 crc=True
読み戻し検証OK: エントリ 1289(元 1289)、rcS 差し替え済み、mode=backup</code></pre></div>



<p class="wp-block-paragraph">　sys1へ差し替えを行う。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sudo bash scripts/stage1/install_dlm.sh /mnt/nasne_sys1 spi_backup.dlm --backup-dir ./backup_sys1
ls -la /mnt/nasne_sys1
sync
sudo umount /mnt/nasne_sys1</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>検査OK: hwtype・日付が一致、CRC OK
退避: ./backup_sys1/00550066.dlm.orig
書き込み完了: /mnt/nasne_sys1/00550066.dlm
/dev/sde1       238M  100M  126M  45% /mnt/nasne_sys1
total 31008
drwxr-xr-x  5 root root     1024 Oct 28 03:24 .
drwxr-xr-x 10 root root     4096 Oct 28 03:17 ..
-rw-r--r--  1 root root      148 Apr 28  2018 00110022.dlm
-rw-r--r--  1 root root 31605945 Oct 28 03:24 00550066.dlm
drwx------  2 root root     1024 Apr 28  2018 11002200
drwx------  2 root root     1024 May 20  2017 33004400
drwx------  2 root root    12288 Jul 26  2013 lost+found</code></pre></div>



<p class="wp-block-paragraph">　管理者権限のPowerShellからHDD取り出しコマンドを叩く。<u>ID</u>は読み替えること。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>wsl --unmount \\.\PHYSICALDRIVE5</code></pre></div>



<p class="wp-block-paragraph">　ここまで来たら、nasneの基板にHDDをつないで起動するか確認する。nasneが起動すれば差し替えた.dlmによって、nasne自身がSPIの中身をHDDのsys1/spi_backupに書き出しているはず。<br>　問題なければまたPCにHDDをつなぎ直す。</p>



<p class="wp-block-paragraph">　管理者権限のPowerShellで以下のコマンドを叩いてHDDのDeviceIDを調べる。</p>



<p class="wp-block-paragraph">　【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Get-CimInstance -Query &quot;SELECT * from Win32_DiskDrive&quot; | Select-Object DeviceID, Model, Size</code></pre></div>



<p class="wp-block-paragraph">　続けて、またWSL2にHDDを渡す。DriveIDは読み替えること。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>wsl --mount \\.\PHYSICALDRIVE5 --bare</code></pre></div>



<p class="wp-block-paragraph">　WSL2に戻って、以下のコマンドを叩いてドライブ構成を確認する。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>cd ~/SonyNasne-debian
lsblk -o NAME,SIZE,FSTYPE,LABEL</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>NAME     SIZE FSTYPE LABEL
sda    356.9M ext4
sdb    159.4M ext4
sdc     48.8G swap
sdd        1T ext4
sde    931.5G
├─sde1   256M ext3   sys1
├─sde2     1G ext3   sys2
└─sde3 930.3G xfs    user</code></pre></div>



<p class="wp-block-paragraph">　バックアップをPCにコピーする。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>mkdir -p backup/spi_backup
cp -a /mnt/nasne_sys1/spi_backup/. backup/spi_backup/
cp -r backup/spi_backup /mnt/c/nasne_backup/
sha256sum backup/spi_backup/spi_mtd0.bin /mnt/c/nasne_backup/spi_backup/spi_mtd0.bin</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>total 16392
drwxr-xr-x 2 root root     1024 Jan  1  1970 .
drwxr-xr-x 6 root root     1024 Jan  1  1970 ..
-rw-r--r-- 1 root root       97 Jan  1  1970 MD5SUMS
-rw-r--r-- 1 root root      440 Jan  1  1970 README.txt
-rw-r--r-- 1 root root      113 Jan  1  1970 SHA1SUMS
-rw-r--r-- 1 root root      500 Jan  1  1970 backup.log
-rw-r--r-- 1 root root 13631488 Jan  1  1970 spi_mtd0.bin
-rw-r--r-- 1 root root  3080192 Jan  1  1970 spi_mtd1_nv.bin
1970-01-01 09:00:27 SPIバックアップ開始 (保存先: sys1)
1970-01-01 09:00:27 mtd0=13631488 mtd1=3080192 (/proc/mtd)
1970-01-01 09:00:27 sys1 をマウント: /dev/sda1 -&gt; /mnt/bk_sys1
1970-01-01 09:00:27 mtd0 を読み出す(2回読んで比較)
208+0 records in
208+0 records out
1970-01-01 09:01:35 mtd0 結果 rc=0
1970-01-01 09:01:35 mtd1(NV領域)を読み出す(稼働中のjffs2なので2回目の比較は参考)
47+0 records in
47+0 records out
1970-01-01 09:01:50 mtd1 結果 rc=0
spi_mtd0.bin: OK
spi_mtd1_nv.bin: OK
spi_mtd0.bin: OK
spi_mtd1_nv.bin: OK</code></pre></div>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>mkdir -p backup/spi_backup
cp -a /mnt/nasne_sys1/spi_backup/. backup/spi_backup/
cp -r backup/spi_backup /mnt/c/nasne_backup/
sha256sum backup/spi_backup/spi_mtd0.bin /mnt/c/nasne_backup/spi_backup/spi_mtd0.bin</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>6e4f32ddd01dc5019fcca017d2d8cf4eb966fb424121fc792b6b132d9bf180ca  backup/spi_backup/spi_mtd0.bin
6e4f32ddd01dc5019fcca017d2d8cf4eb966fb424121fc792b6b132d9bf180ca  /mnt/c/nasne_backup/spi_backup/spi_mtd0.bin</code></pre></div>



<p class="wp-block-paragraph">　sha256が一致していればOK。</p>



<p class="wp-block-paragraph">　録画を残す方式では、XFSの中に8GBのイメージファイルを作るとのことで空き容量を確認する。<br>　ただ、nasneのフォーマット形式（Deprecated V4 format）から読み取るためにxfsprogsをWSL2にインスコ・容量を抽出する。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sudo apt install xfsprogs
sudo xfs_db -r -c &quot;sb 0&quot; -c &quot;print blocksize fdblocks&quot; /dev/sde3</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>blocksize = 4096
fdblocks = 71878052</code></pre></div>



<p class="wp-block-paragraph">　空き容量は以下のコマンドでGB単位に換算できる。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sudo xfs_db -r -c &quot;sb 0&quot; -c &quot;print blocksize fdblocks&quot; /dev/sde3 \
  | awk -F&#39; = &#39; &#39;{v[$1]=$2} END {printf &quot;空き: %.1f GB\n&quot;, v[&quot;blocksize&quot;]*v[&quot;fdblocks&quot;]/1e9}&#39;</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>空き: 294.4 GB</code></pre></div>



<h3 class="wp-block-heading">Debian版の<code>.dlm</code>を作る</h3>



<p class="wp-block-paragraph">　ここから本格的に改造していく。まずはDebian版の<code>.dlm</code>を作る。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>python3 scripts/nasne_setup.py build --download-official \
  --hdd-dlm backup/00550066.dlm.orig --ssh-pubkey ~/.ssh/nasne_rsa.pub \
  --work build_nasne --telnet fail &lt; /dev/null 2&gt;&1 | tee build2.log</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>公式rootfs: tar 86026240 bytes、ヘッダ date=&#39;Tue Oct 24 11:13:25 2017\x00\x00\x00\x00\x00\x00\x00\x00&#39; +8(major)=2
rcS のエントリ: 2個(最後の #474 を差し替える)
同梱したDebianのエントリ数: 9388
新しいボディ: 93938124 bytes (93.9MB)  公式のエントリ数 1289
/home/xxx/SonyNasne-debian/build_nasne/custom_00550066.dlm: 93938188 bytes  自己検証=OK flag=0 crc=True
読み戻し検証OK: エントリ 10678(元 1289)、rcS 差し替え済み、mode=embed

== ステップ 1: 公式ファームパッケージ
  /home/xxx/SonyNasne-debian/build_nasne/KRST3101_0260_SECURE.dlm (36119466 バイト)

== ステップ 2: カーネルのGPLソース(Sony公開)
  展開済み

== ステップ 3: カーネル用ツールチェーン(Dockerイメージ nasne-kcc:gcc432。gcc 4.3.2 + binutils 2.19.1 をビルド。30分〜1時間)
  イメージあり

== ステップ 4: 自作カーネルのビルド(直起動用の内蔵initramfs入り)
  /home/xxx/SonyNasne-debian/gpl_src/build/out/vmlinux_new.bin あり

== ステップ 5: KNLセグメント(公式のKNLを雛形に、自作カーネルを包む)
  $ /usr/bin/python3 /home/xxx/SonyNasne-debian/scripts/build_knl.py verify /home/xxx/SonyNasne-debian/build_nasne/knl_new.bin

== ステップ 6: Debian wheezy (mipsel) のツリー(debootstrap。数分)
  /home/xxx/SonyNasne-debian/build_nasne/debian_tree.tar あり

== ステップ 7: 00550066.dlm の作成
  $ /usr/bin/python3 /home/xxx/SonyNasne-debian/scripts/stage1/make_stage1_dlm.py build --official /home/xxx/SonyNasne-debian/backup/00550066.dlm.orig --out /home/xxx/SonyNasne-debian/build_nasne/custom_00550066.dlm --mode embed --image-size 8G --telnet fail --debian-tree-tar /home/xxx/SonyNasne-debian/build_nasne/debian_tree.tar

完了: /home/xxx/SonyNasne-debian/build_nasne/custom_00550066.dlm

次はHDDに入れます(HDDをPCにつなぐ。sdX は lsblk で必ず確認):
  sudo mkdir -p /mnt/nasne_sys1 && sudo mount /dev/sdX1 /mnt/nasne_sys1
  mkdir -p backup && cp /mnt/nasne_sys1/00550066.dlm backup/00550066.dlm.orig        # 元に戻す手段
  sudo bash /home/xxx/SonyNasne-debian/scripts/stage1/install_dlm.sh /mnt/nasne_sys1 /home/xxx/SonyNasne-debian/build_nasne/custom_00550066.dlm --backup-dir backup
  sudo umount /mnt/nasne_sys1
その後、HDDを nasne に挿して電源を入れ、約5分待ちます(docs/13)。事前に SPI のバックアップ(docs/16)を取っておくことを強くお勧めします。</code></pre></div>



<p class="wp-block-paragraph">　改造した.dlmをsys1に入れる前に空き容量を確認する。新しい.dlmは約94MBなので、それ以上の空きがあるか確認。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>df -h /mnt/nasne_sys1</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Filesystem      Size  Used Avail Use% Mounted on
/dev/sde1       238M  116M  110M  52% /mnt/nasne_sys1</code></pre></div>



<p class="wp-block-paragraph">　110MB空いていたのでOK。</p>



<p class="wp-block-paragraph">　実際に.dlmを差し替えてアンマウントする。</p>



<p class="wp-block-paragraph">【コマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>sudo bash scripts/stage1/install_dlm.sh /mnt/nasne_sys1 build_nasne/custom_00550066.dlm --backup-dir ./backup_sys1_stage2
ls -la /mnt/nasne_sys1
sync
sudo umount /mnt/nasne_sys1</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>検査OK: hwtype・日付が一致、CRC OK
退避: ./backup_sys1_stage2/00550066.dlm.orig
書き込み完了: /mnt/nasne_sys1/00550066.dlm
/dev/sde1       238M  175M   51M  78% /mnt/nasne_sys1
total 92120
drwxr-xr-x  6 root root     1024 Oct 28 04:05 .
drwxr-xr-x 11 root root     4096 Oct 28 03:57 ..
-rw-r--r--  1 root root      148 Apr 28  2018 00110022.dlm
-rw-r--r--  1 root root 93938188 Oct 28 04:05 00550066.dlm
drwx------  2 root root     1024 Apr 28  2018 11002200
drwx------  2 root root     1024 May 20  2017 33004400
drwx------  2 root root    12288 Jul 26  2013 lost+found
drwxr-xr-x  2 root root     1024 Jan  1  1970 spi_backup</code></pre></div>



<p class="wp-block-paragraph">　管理者権限のPowerShellでHDDをアンマウントする。DriveIDは(ry</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>wsl --unmount \\.\PHYSICALDRIVE5</code></pre></div>



<p class="wp-block-paragraph">　nasneにHDDをつないで起動する。この時、SPIカーネル領域の書き換えが行われるので絶対に電源を切らないこと。大体、書き換えは５分程度かかる。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>時間</th><th>処理</th></tr></thead><tbody><tr><td>～１分</td><td>公式カーネルで起動</td></tr><tr><td>～３分</td><td>p3にDebianのイメージを作成・展開</td></tr><tr><td>～４分</td><td>SPIの全体をバックアップし、カーネル領域を書き換えて再起動</td></tr><tr><td>～５分</td><td>改造したカーネルでDebianが起動し、SSHが拓く</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">改造に成功したか確認</h3>



<p class="wp-block-paragraph">　WSL2からSSHを叩いて、起動したか確認する。<br>　IPアドレスは読み替えること。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>ssh -i ~/.ssh/nasne_rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostKeyAlgorithms=+ssh-rsa root@192.168.100.xx</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>The authenticity of host &#39;192.168.100.xx (192.168.100.xx)&#39; can&#39;t be established.
ECDSA key fingerprint is: SHA256:v/3+0ie5b0sISn8uV93ZfEmWYAbSZB6TIj6pdWDU26Y
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? </code></pre></div>



<p class="wp-block-paragraph">　こんな感じになればsshdが応答しているので、Debianは起動している。初回接続時に必ず出る確認が末尾にあり、ここはyesと入力してEnterを押す。<br>　もう一度同じコマンドを叩いて、nasneのSSHに接続する。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>ssh -i ~/.ssh/nasne_rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa -o HostKeyAlgorithms=+ssh-rsa root@192.168.100.xx</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to &quot;store now, decrypt later&quot; attacks.
** The server may need to be upgraded. See https://openssh.com/pq.html
Linux nasne-debian 2.6.29-ts-mipsisa32r2el #1 Tue Oct 27 17:32:03 UTC 2026 mips

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
root@nasne-debian:~#</code></pre></div>



<p class="wp-block-paragraph">　続けて以下のコマンドを１行ずつ入力する。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>uname -a
tail -5 /var/log/nasne-stage1.log
cat /var/log/nasne-mcu-wd.log</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>root@nasne-debian:~# uname -a
Linux nasne-debian 2.6.29-ts-mipsisa32r2el #1 Tue Oct 27 17:32:03 UTC 2026 mips GNU/Linux

root@nasne-debian:~# tail -5 /var/log/nasne-stage1.log
erased 00100000+00210000
wrote 00207368 bytes at 00100000
verify OK 00207368 bytes at 00100000
1970-01-01 00:03:22 flash + verify OK
1970-01-01 00:03:22 rebooting into the new kernel

root@nasne-debian:~# cat /var/log/nasne-mcu-wd.log
== Thu Jan  1 00:02:09 UTC 1970 start
mcui2c write addr8=20 n=02 ioctl=01 return_value=01 (COMPLETE)
MCU watchdog disabled
mcui2c write addr8=20 n=02 ioctl=01 return_value=01 (COMPLETE)
PWR LED on (code 0x32)
== Thu Jan  1 00:00:19 UTC 1970 start
Found module file xcode4drv.ko
Loaded xcode4 driver module xcode4drv
Created directory /dev/vixs
Created device node /dev/vixs/xcodedrv
Done! Enjoy!
mcui2c write addr8=20 n=02 ioctl=01 return_value=01 (COMPLETE)
MCU watchdog disabled
mcui2c write addr8=20 n=02 ioctl=01 return_value=01 (COMPLETE)
PWR LED on (code 0x32)
root@nasne-debian:~#</code></pre></div>



<h3 class="wp-block-heading">テレビを試す</h3>



<h4 class="wp-block-heading">テレビ局スキャン</h4>



<p class="wp-block-paragraph">　ブラウザで以下のURLを入力する。IPアドレスは読み替え。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>http://192.168.100.xx:8301/scan</code></pre></div>



<p class="wp-block-paragraph">　以下のような感じで、チャンネルがスキャンされる。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>ch=27 freq=557142kHz sid=0x400(tv) name=&quot;NHK総合1・東京&quot; sid=0x401(tv) name=&quot;NHK総合2・東京&quot; sid=0x580(1seg) name=&quot;NHK携帯G・東京&quot; sid=0xfff0(data)</code></pre></div>



<h4 class="wp-block-heading">テレビを見る（VLC）</h4>



<p class="wp-block-paragraph">　ネットワークストリームに以下を入力する。IPアドレスは読み替え。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>http://192.168.100.xx:8301/playlist.m3u8</code></pre></div>



<h3 class="wp-block-heading">純正アプリを使う場合</h3>



<p class="wp-block-paragraph">　SSHで以下のコマンドを叩いて再起動すると、次回だけ公式アプリで起動する。電源を入れ直すとDebianで起動する。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>nasne-boot-switch official-once</code></pre></div>



<h2 class="wp-block-heading">おまけ mirakurun＋KonomiTVの視聴環境を構築する</h2>



<h3 class="wp-block-heading">mirakurun</h3>



<h4 class="wp-block-heading">nasne側でチャンネル設定を作る</h4>



<p class="wp-block-paragraph">　WSL2で以下のコマンドを実行して、チャンネル設定を作る。BS/CSもスキャンするなら、&#8211;scanの前に&#8211;satを追加する。</p>



<p class="wp-block-paragraph">【実行するコマンド】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>cd ~/SonyNasne-debian
mkdir -p mirakurun-conf
python3 scripts/nasne_mirakurun_conf.py 192.168.100.xx --scan -o mirakurun-conf
cat mirakurun-conf/channels.yml | head -30</code></pre></div>



<p class="wp-block-paragraph">【実行結果】</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>スキャン中(約80秒)...
mirakurun-conf/tuners.yml と channels.yml を書きました(サービス 36 件: GR 36 件, BS 0 件, CS 0 件)</code></pre></div>



<h4 class="wp-block-heading">Synology NASにmirakurunをインストールする</h4>



<p class="wp-block-paragraph">　dockerフォルダ内にmirakurunフォルダを作成する。さらにその中にconfとdataフォルダを作る。</p>



<p class="wp-block-paragraph">　mirakurun\confの中に、WSL2の\wsl$\Ubuntu\home\UserName\SonyNasne-debian\mirakurun-conf内のデータをコピーする。</p>



<p class="wp-block-paragraph">　Container Managerでプロジェクトを作成する。<br>　　プロジェクト名：mirakurun<br>　　パス：\docker\mirakurun<br>　　ソース：docker-compose.ymlを作成で、以下のコードを貼り付ける。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>services:
  mirakurun:
    image: chinachu/mirakurun:latest
    container_name: mirakurun
    cap_add:
      - SYS_ADMIN
      - SYS_NICE
    ports:
      - &quot;40772:40772&quot;
    volumes:
      - ./conf:/app-config
      - ./data:/app-data
    environment:
      TZ: Asia/Tokyo
    restart: unless-stopped</code></pre></div>



<p class="wp-block-paragraph">　confフォルダには、前段のWSL2で作成した「channels.yml」と「tuners.yml」を格納する。</p>



<p class="wp-block-paragraph"> 　Synologyでmirakurunコンテナを起動し、ブラウザで、http://&lt;NASのIP>:40772/ を開くと、MirakurunのWeb画面が表示される。</p>



<p class="wp-block-paragraph">　ここからめっちゃハマったが、ジョブを確認すると「Service Add Check GR/xxx」が失敗しまくって、チューナー側のドライバがフリーズする。１個も成功しない。<br>　nasneのログを見ると、Mirakurunからの要求は届いていて、約1秒で映像も流れ始め、<strong>20秒後にMirakurun側から切断</strong>されていた。<br>Mirakurunのソースを確認したところ、20秒以内に次の3つがそろわないとエラーになるようだった。<br>　①PAT（番組の一覧）に、NIT（ネットワーク情報）の場所が書かれていること<br>　②NITが届くこと<br>　③SDT（局名などの情報）が届き、その中の TSID（放送波の番号）がPATのTSIDと一致すること</p>



<p class="wp-block-paragraph">　nasneのストリームは、局を指定（?sid=）されると、チップが作り直した簡易版のPATを送っている。このPATのTSIDがSDTと食い違っており、MirakurunはSDTを無視するために、上の③が永久に合致しないため、全局の情報取得に延々と失敗していた。</p>



<p class="wp-block-paragraph">　以下の、PATを修正するパッチを作成して、confフォルダに入れてあげる。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="nasne-fix.js"><code>// nasne の TS を受け取り、PAT の NIT の PID を 0x10 に直して標準出力へ流す(Mirakurun の tuners.yml から呼ぶ)
// 使い方: node /app-config/nasne-fix.js http://&lt;nasne&gt;:8301/tuner/&lt;channel&gt;&lt;sid_query&gt;
// 動作の記録: /app-config/nasne-fix.log(1MBを超えたら作り直す)
const http = require(&#39;http&#39;);
const fs = require(&#39;fs&#39;);
const LOG = &#39;/app-config/nasne-fix.log&#39;;
const url = process.argv[2];
const t0 = Date.now();
let bytes = 0, pats = 0, fixed = 0, status = &#39;-&#39;;
function log(msg) {
  try {
    if (fs.existsSync(LOG) && fs.statSync(LOG).size &gt; 1048576) fs.truncateSync(LOG, 0);
    fs.appendFileSync(LOG, new Date().toISOString() + &#39; pid=&#39; + process.pid + &#39; &#39; + msg + &#39;\n&#39;);
  } catch (e) { /* 記録できなくても配信は続ける */ }
}
function finish(code, why) {
  log(&#39;exit=&#39; + code + &#39; reason=&#39; + why + &#39; status=&#39; + status + &#39; bytes=&#39; + bytes + &#39; pats=&#39; + pats + &#39; fixed=&#39; + fixed + &#39; ms=&#39; + (Date.now() - t0) + &#39; url=&#39; + url);
  process.exit(code);
}
const T = new Uint32Array(256);
for (let i = 0; i &lt; 256; i++) { let c = i &lt;&lt; 24; for (let k = 0; k &lt; 8; k++) c = (c & 0x80000000) ? ((c &lt;&lt; 1) ^ 0x04C11DB7) : (c &lt;&lt; 1); T[i] = c &gt;&gt;&gt; 0; }
function crc32(b, s, e) { let c = 0xFFFFFFFF; for (let i = s; i &lt; e; i++) c = ((c &lt;&lt; 8) ^ T[((c &gt;&gt;&gt; 24) ^ b[i]) & 0xff]) &gt;&gt;&gt; 0; return c &gt;&gt;&gt; 0; }
function fix(p) {
  if (p[0] !== 0x47 || (p[1] & 0x1f) !== 0 || p[2] !== 0 || !(p[1] & 0x40) || !(p[3] & 0x10)) return;
  let off = 4; if (p[3] & 0x20) off += 1 + p[4];
  off += 1 + p[off];
  if (off + 8 &gt; 188 || p[off] !== 0x00) return;
  const end = off + 3 + (((p[off + 1] & 0x0f) &lt;&lt; 8) | p[off + 2]);
  if (end &gt; 188) return;
  pats++;
  let changed = false;
  for (let j = off + 8; j + 4 &lt;= end - 4; j += 4) {
    if (p[j] === 0 && p[j + 1] === 0 && (((p[j + 2] & 0x1f) &lt;&lt; 8) | p[j + 3]) !== 0x10) {
      p[j + 2] = 0xe0; p[j + 3] = 0x10; changed = true;
    }
  }
  if (changed) { p.writeUInt32BE(crc32(p, off, end - 4), end - 4); fixed++; }
}
module.exports = { fix, crc32 };
if (require.main === module) {
  process.on(&#39;SIGTERM&#39;, () =&gt; finish(0, &#39;SIGTERM(Mirakurunが終了を指示)&#39;));
  process.on(&#39;uncaughtException&#39;, e =&gt; finish(1, &#39;exception:&#39; + (e && e.stack || e)));
  process.stdout.on(&#39;error&#39;, e =&gt; finish(0, &#39;stdout-error:&#39; + e.code));
  let rest = Buffer.alloc(0);
  log(&#39;start url=&#39; + url);
  const req = http.get(url, res =&gt; {
    status = String(res.statusCode);
    if (res.statusCode !== 200) {
      let body = &#39;&#39;;
      res.on(&#39;data&#39;, d =&gt; { if (body.length &lt; 200) body += d.toString(); });
      res.on(&#39;end&#39;, () =&gt; finish(1, &#39;http-status body=&#39; + JSON.stringify(body.trim())));
      return;
    }
    res.on(&#39;data&#39;, chunk =&gt; {
      bytes += chunk.length;
      const buf = rest.length ? Buffer.concat([rest, chunk]) : chunk;
      let i = 0; while (i &lt; buf.length && buf[i] !== 0x47) i++;
      const n = Math.floor((buf.length - i) / 188) * 188;
      for (let k = i; k &lt; i + n; k += 188) fix(buf.subarray(k, k + 188));
      if (n) process.stdout.write(buf.subarray(i, i + n));
      rest = Buffer.from(buf.subarray(i + n));
    });
    res.on(&#39;end&#39;, () =&gt; finish(0, &#39;stream-end&#39;));
    res.on(&#39;aborted&#39;, () =&gt; finish(1, &#39;stream-aborted&#39;));
  });
  req.on(&#39;error&#39;, e =&gt; finish(1, &#39;request-error:&#39; + e.code + &#39; &#39; + e.message));
}
</code></pre></div>



<p class="wp-block-paragraph">　また、tuners.ymlの内容を以下の内容に書き換える。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="tuners.yml"><code>- name: nasne
  types:
    - GR
  command: node /app-config/nasne-fix.js http://192.168.100.xxx:8301/tuner/&lt;channel&gt;&lt;sid_query&gt;
  isDisabled: false</code></pre></div>



<p class="wp-block-paragraph">　これでようやくmirakurunでEPGの取得ができるようになった。</p>



<h3 class="wp-block-heading">EPGStation</h3>



<p class="wp-block-paragraph">　録画できるように、EPGStationをインストールしていく。</p>



<h4 class="wp-block-heading">EPGStationの設定ファイルを作成</h4>



<p class="wp-block-paragraph">　WSL2で以下のコマンドをを実行する。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>mkdir -p ~/epgstation-config && cd ~/epgstation-config
docker create --name tmp-epg l3tnun/epgstation:master-debian
docker cp tmp-epg:/app/config/. . && docker rm tmp-epg
cp config.yml.template config.yml && cp enc.js.template enc.js
cp operatorLogConfig.sample.yml operatorLogConfig.yml
cp serviceLogConfig.sample.yml serviceLogConfig.yml
cp epgUpdaterLogConfig.sample.yml epgUpdaterLogConfig.yml
sed -i &#39;s#^mirakurunPath:.*#mirakurunPath: http://mirakurun:40772/#&#39; config.yml
grep mirakurunPath config.yml</code></pre></div>



<p class="wp-block-paragraph">　以下の内容が出力されればOK。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>mirakurunPath: http://mirakurun:40772/</code></pre></div>



<h4 class="wp-block-heading">Synology NASにEPGStationの設定ファイルを配置</h4>



<p class="wp-block-paragraph">　docker/mirakurunの中に「epgstation」と「epgstation-build」フォルダを作成する。epgstationの中に「config」「data」「recorded」「thumbnail」「logs」フォルダを作成する。</p>



<p class="wp-block-paragraph">　WSL2の「\wsl$\Ubuntu\home\USERNAME\epgstation-config」の中身を、すべてconfigフォルダにコピーする。<br>　epgstation-buildフォルダの中には、以下のファイルを作成する。拡張子は「なし」。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain" data-file="Dockerfile"><code>FROM l3tnun/epgstation:master-debian
RUN apt-get update \
 && apt-get install -y --no-install-recommends ffmpeg \
 && ln -sf /usr/bin/ffmpeg /usr/local/bin/ffmpeg \
 && ln -sf /usr/bin/ffprobe /usr/local/bin/ffprobe \
 && rm -rf /var/lib/apt/lists/*</code></pre></div>



<p class="wp-block-paragraph"> ContainerManagerのプロジェクト→mirakurunを開き、プロジェクトを停止する。そしてYAMLを以下の内容に編集する。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>services:
  mirakurun:
    image: chinachu/mirakurun:latest
    container_name: mirakurun
    cap_add:
      - SYS_ADMIN
      - SYS_NICE
    ports:
      - &quot;40772:40772&quot;
    volumes:
      - ./conf:/app-config
      - ./data:/app-data
    environment:
      TZ: Asia/Tokyo
    restart: unless-stopped

  epgstation:
    build: ./epgstation-build
    image: epgstation-ffmpeg:local
    container_name: epgstation
    ports:
      - &quot;8888:8888&quot;
    volumes:
      - ./epgstation/config:/app/config
      - ./epgstation/data:/app/data
      - ./epgstation/recorded:/app/recorded
      - ./epgstation/thumbnail:/app/thumbnail
      - ./epgstation/logs:/app/logs
    environment:
      TZ: Asia/Tokyo
    depends_on:
      - mirakurun
    restart: unless-stopped</code></pre></div>



<p class="wp-block-paragraph">　保存して、プロジェクトを再構築・起動する。</p>



<p class="wp-block-paragraph">　ブラウザから「http://NASのIPアドレス:8888」にアクセスすれば、EPGStationにアクセスでき、録画予約などできるようになる。</p>



<h3 class="wp-block-heading">KonomiTVのインストール</h3>


<a rel="noopener" href="https://github.com/tsukumijima/KonomiTV" title="GitHub - tsukumijima/KonomiTV: KonomiTV: Kept Organized, Notably Optimized, Modern Interface TV media server" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/049eb56ae947e4c2878161526c6c83f2.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub &#8211; tsukumijima/KonomiTV: KonomiTV: Kept Organized, Notably Optimized, Modern Interface TV media server</div><div class="blogcard-snippet external-blogcard-snippet">KonomiTV: Kept Organized, Notably Optimized, Modern Interface TV media server &#8211; tsukumijima/KonomiTV</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/tsukumijima/KonomiTV" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>


<p class="wp-block-paragraph">　Releaseページからインストーラを落として、指示通りに操作するだけ。</p><p>The post <a href="https://toybox.uranos8685.mydns.jp/825/sie%e8%a3%bdnasne%e3%82%92debian%e5%8c%96%e3%81%97%e3%81%a6%e4%bd%bf%e3%81%84%e7%b6%9a%e3%81%91%e3%82%8b/">SIE製nasneをDebian化して使い続ける</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://toybox.uranos8685.mydns.jp/825/sie%e8%a3%bdnasne%e3%82%92debian%e5%8c%96%e3%81%97%e3%81%a6%e4%bd%bf%e3%81%84%e7%b6%9a%e3%81%91%e3%82%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">825</post-id>	</item>
		<item>
		<title>ゲーミングPCでQwen3.8-Flash-Nextを動かす（Strata）</title>
		<link>https://toybox.uranos8685.mydns.jp/813/%e3%82%b2%e3%83%bc%e3%83%9f%e3%83%b3%e3%82%b0pc%e3%81%a7qwen3-8-flash-next%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99%ef%bc%88strata%ef%bc%89/</link>
					<comments>https://toybox.uranos8685.mydns.jp/813/%e3%82%b2%e3%83%bc%e3%83%9f%e3%83%b3%e3%82%b0pc%e3%81%a7qwen3-8-flash-next%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99%ef%bc%88strata%ef%bc%89/#respond</comments>
		
		<dc:creator><![CDATA[Uranos8685]]></dc:creator>
		<pubDate>Sat, 03 Oct 2026 09:44:06 +0000</pubDate>
				<category><![CDATA[テクノロジー]]></category>
		<guid isPermaLink="false">https://toybox.uranos8685.mydns.jp/?p=813</guid>

					<description><![CDATA[<p>はじめに 　最近はやりのMoEモデルでも重みをVRAMに乗せる必要があり、巨大なモデルは普通のグラボでは実行できませんでした。 　Strataというツールは、モデル全体をVRAMに読み込ませず、よく使うExpertやKV [&#8230;]</p>
<p>The post <a href="https://toybox.uranos8685.mydns.jp/813/%e3%82%b2%e3%83%bc%e3%83%9f%e3%83%b3%e3%82%b0pc%e3%81%a7qwen3-8-flash-next%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99%ef%bc%88strata%ef%bc%89/">ゲーミングPCでQwen3.8-Flash-Nextを動かす（Strata）</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">　最近はやりのMoEモデルでも重みをVRAMに乗せる必要があり、巨大なモデルは普通のグラボでは実行できませんでした。</p>



<p class="wp-block-paragraph">　Strataというツールは、モデル全体をVRAMに読み込ませず、よく使うExpertやKV、AttentionはVRAM、それ以外のExpertはRAMに配置してCPUで演算するらしい。これにより、Qwen3.8-Flash-NextのようなモデルもゲーミングPCで実行可能とのことです。</p>



<h2 class="wp-block-heading">Strataのセットアップ</h2>



<p class="wp-block-paragraph">　Strataは以下で配布されている。Strata-main.zipをダウンロードし、解凍してSTART-HERE.batを実行してください。</p>


<a rel="noopener" href="https://github.com/Niko1221/Strata" title="GitHub - Niko1221/Strata: Qwen3.8-Flash-Next on any consumer hardware: one-click install for Windows / Linux. Strata inference engine, OpenAI/Anthropic API on localhost, optional image input." class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/312f2ccc77b7560403315284d97a82af.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub &#8211; Niko1221/Strata: Qwen3.8-Flash-Next on any consumer hardware: one-click install for Windows / Linux. Strata inference engine, OpenAI/Anthropic API on localhost, optional image input.</div><div class="blogcard-snippet external-blogcard-snippet">Qwen3.8-Flash-Next on any consumer hardware: one-click install for Windows / Linux. Strata inference engine, OpenAI/Anth&#8230;</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/Niko1221/Strata" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>


<p class="wp-block-paragraph">　すると、利用可能なグラボが表示されるので、どのグラボを使うか、どのモデルをダウンロードするかといった質問に対して回答していけばOK。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="942" height="1024" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/image-2-942x1024.png" alt="" class="wp-image-816" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/image-2-942x1024.png 942w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/image-2-276x300.png 276w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/image-2-768x835.png 768w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/image-2.png 1280w" sizes="(max-width: 942px) 100vw, 942px" /></figure>



<p class="wp-block-paragraph">　Q2のモデルでもRAMを34GB使うらしいので、最低でも48GBのRAMがないと厳しそう。今のご時世的に、なかなかハードルが高いかもしれない…。</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="821" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/image-3-1024x821.png" alt="" class="wp-image-819" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/image-3-1024x821.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/image-3-300x241.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/image-3-767x615.png 767w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/image-3.png 1115w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">デモ</h2>



<p class="wp-block-paragraph">　テスト環境は以下のとおり。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>内容</th></tr></thead><tbody><tr><td>CPU</td><td>Ryzen9 9950X3D</td></tr><tr><td>RAM</td><td>96GB(DDR5,3600MT/S) ※2種類のモジュールを入れてるキメラなので遅い…</td></tr><tr><td>GPU</td><td>5060tiと3080の2枚差し（5060tiのみを使用）</td></tr></tbody></table></figure>



<figure class="wp-block-video"><video height="1080" style="aspect-ratio: 1920 / 1080;" width="1920" controls src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/Strata_デモ.mp4"></video></figure>



<p class="wp-block-paragraph">　40～60token/s程度の速度が出ていていい感じ。ちなみに、3080と5060tiを使う設定でも試したが、3080が足を引っ張って5060ti単品よりも遅かった。</p>



<p class="wp-block-paragraph">　OpenAI,Anthropic互換API持っているそうで、Pythonから叩くこともできるんだって。いいですね～。<br>　MoEモデルが出てきたときに、使わない部分はRAMに逃がせないかなーと思っていましたが、ついにその夢を叶えてくれるアプリが出てきてうれしいです。</p>



<p class="wp-block-paragraph">　おわり。</p><p>The post <a href="https://toybox.uranos8685.mydns.jp/813/%e3%82%b2%e3%83%bc%e3%83%9f%e3%83%b3%e3%82%b0pc%e3%81%a7qwen3-8-flash-next%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99%ef%bc%88strata%ef%bc%89/">ゲーミングPCでQwen3.8-Flash-Nextを動かす（Strata）</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://toybox.uranos8685.mydns.jp/813/%e3%82%b2%e3%83%bc%e3%83%9f%e3%83%b3%e3%82%b0pc%e3%81%a7qwen3-8-flash-next%e3%82%92%e5%8b%95%e3%81%8b%e3%81%99%ef%bc%88strata%ef%bc%89/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/10/Strata_デモ.mp4" length="0" type="video/mp4" />

		<post-id xmlns="com-wordpress:feed-additions:1">813</post-id>	</item>
		<item>
		<title>Pythonプログラムの関数の関係性をLLMに説明させてみる</title>
		<link>https://toybox.uranos8685.mydns.jp/791/python%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%ae%e9%96%a2%e6%95%b0%e3%81%ae%e9%96%a2%e4%bf%82%e6%80%a7%e3%82%92llm%e3%81%ab%e8%aa%ac%e6%98%8e%e3%81%95%e3%81%9b%e3%81%a6%e3%81%bf%e3%82%8b/</link>
					<comments>https://toybox.uranos8685.mydns.jp/791/python%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%ae%e9%96%a2%e6%95%b0%e3%81%ae%e9%96%a2%e4%bf%82%e6%80%a7%e3%82%92llm%e3%81%ab%e8%aa%ac%e6%98%8e%e3%81%95%e3%81%9b%e3%81%a6%e3%81%bf%e3%82%8b/#respond</comments>
		
		<dc:creator><![CDATA[Uranos8685]]></dc:creator>
		<pubDate>Sat, 26 Sep 2026 21:08:37 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[生成AI]]></category>
		<guid isPermaLink="false">https://toybox.uranos8685.mydns.jp/?p=791</guid>

					<description><![CDATA[<p>はじめに 　Pythonで大規模なプログラム（複数のpyに分けるようなもの）を書いていると、全体像が分かりにくくなることがあり、LLMを使ってうまく説明させられないかと思ったのが始まり。 　ちなみに、開発を始める前にOl [&#8230;]</p>
<p>The post <a href="https://toybox.uranos8685.mydns.jp/791/python%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%ae%e9%96%a2%e6%95%b0%e3%81%ae%e9%96%a2%e4%bf%82%e6%80%a7%e3%82%92llm%e3%81%ab%e8%aa%ac%e6%98%8e%e3%81%95%e3%81%9b%e3%81%a6%e3%81%bf%e3%82%8b/">Pythonプログラムの関数の関係性をLLMに説明させてみる</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">　Pythonで大規模なプログラム（複数のpyに分けるようなもの）を書いていると、全体像が分かりにくくなることがあり、LLMを使ってうまく説明させられないかと思ったのが始まり。</p>



<p class="wp-block-paragraph">　ちなみに、開発を始める前にOllamaに単純にpyファイルを投げて試したが、当然失敗したorz</p>



<h2 class="wp-block-heading">仕組み（ざっくり）</h2>



<h3 class="wp-block-heading">下準備（静的解析）</h3>



<p class="wp-block-paragraph">　pyファイルをそのままLLMに投げてもいい解説が生成できないため、まずはじめにastモジュールを使ってソースを構造木に変換する。<br>　で、各pyファイルの中から関数、クラス、メソッドを抽出し、呼び出しを行っているコードをコレクトする。</p>



<p class="wp-block-paragraph">　呼び出し先の解決をするが、単純に名前で一致させようとすると、別ファイルや関数内にネストされた同名のものがあった場合、誤ったマッチングが発生する。そのため、呼び出している名前がどのファイルのどの関数のものかをPythonの探し方に近い方法で探す必要があり、これがなかなか難しい。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>呼び出しの形</th><th>特定の方法</th></tr></thead><tbody><tr><td>helper()</td><td>自分の中で定義された関数 → 同じモジュールの定義 → import した名前　の順に探す</td></tr><tr><td>self.method() / cls.method()</td><td>自分が属するクラスのメソッドを探す。なければ親クラスを遡る</td></tr><tr><td>super().method()</td><td>親クラス側から探す</td></tr><tr><td>mod.func() / pkg.mod.Class.method()</td><td>importの対応表で正式な名前に直し、プロジェクト内の定義と照らし合わせる</td></tr><tr><td>パッケージのinit.py 経由で公開された名前</td><td>init.pyのimportをたどって本来の定義まで行く</td></tr><tr><td>プロジェクト内で見つからなかったもの</td><td>print や pd.DataFrameなどは「外部の呼び出し」として分離する</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">関係性をグラフ化</h3>



<p class="wp-block-paragraph">　静的解析で取得した関数の一覧と、呼び出しの関係性を、そのままnetworkxの有向グラフに投入する。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>g = nx.DiGraph()
g.add_node(&quot;code_atlas.llm:LLMClient.chat&quot;)              # 点を追加
g.add_edge(&quot;code_atlas.llm:LLMClient.test_connection&quot;,   # 矢印を追加
           &quot;code_atlas.llm:LLMClient.chat&quot;)</code></pre></div>



<p class="wp-block-paragraph">　関数が数百個あると、全部を表示しても線が絡まって読めなくなるため、「指定した中心の関数から N 歩以内だけ」に絞り込む。<br>　幅優先探索という方法で、池に石を投げて波紋が広がるように、中心から近い関数等を順に調べていきます。</p>



<p class="wp-block-paragraph">　できあがったネットワーク図をpyvisを使ってHTML化し、st.iframeに突っ込んで描画させる。</p>



<h3 class="wp-block-heading">LLMに解説させる</h3>



<p class="wp-block-paragraph">　ソースコードと一緒に静的解析の結果を渡して、どの関数で何を呼び出しているかをLLMに分からせることで、推測で解説させない。<br>　また、チャットによる質問部分では、ソースコード全体をプロンプト内に埋め込むことは出来ないため、質問に関連するソースコードのみ（呼び出し元・先含む）を渡す。基本的にRAGは意味的類似度検索（ベクトル）を使うが、質問文に出てくる関数、ファイル名を正規表現で抽出することで、誤ったマッチングを減らしている。</p>



<h2 class="wp-block-heading">スクリーンショット</h2>



<p class="wp-block-paragraph">　テストで使ったLLMはQwen3.5-9B</p>



<h3 class="wp-block-heading">概要説明</h3>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-4.png"><img loading="lazy" decoding="async" width="2505" height="1219" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-4.png" alt="" class="wp-image-793" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-4.png 2505w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-4-300x146.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-4-767x373.png 767w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-4-1024x498.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-4-1536x747.png 1536w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-4-2048x997.png 2048w" sizes="(max-width: 2505px) 100vw, 2505px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-5.png"><img loading="lazy" decoding="async" width="2514" height="1219" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-5.png" alt="" class="wp-image-794" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-5.png 2514w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-5-300x145.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-5-767x372.png 767w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-5-1536x745.png 1536w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-5-1024x497.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-5-2048x993.png 2048w" sizes="(max-width: 2514px) 100vw, 2514px" /></a></figure>



<h3 class="wp-block-heading">関係図をネットワークマップで図示（pyvis）</h3>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-6.png"><img loading="lazy" decoding="async" width="2492" height="1179" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-6.png" alt="" class="wp-image-795" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-6.png 2492w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-6-300x142.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-6-767x363.png 767w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-6-1536x727.png 1536w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-6-1024x484.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-6-2048x969.png 2048w" sizes="(max-width: 2492px) 100vw, 2492px" /></a></figure>



<h3 class="wp-block-heading">各pyファイルの概要</h3>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-7.png"><img loading="lazy" decoding="async" width="2130" height="1156" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-7.png" alt="" class="wp-image-796" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-7.png 2130w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-7-300x163.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-7-767x416.png 767w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-7-1024x556.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-7-1536x834.png 1536w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-7-2048x1111.png 2048w" sizes="(max-width: 2130px) 100vw, 2130px" /></a></figure>



<h3 class="wp-block-heading">各関数の概要</h3>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-8.png"><img loading="lazy" decoding="async" width="2176" height="1195" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-8.png" alt="" class="wp-image-797" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-8.png 2176w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-8-300x165.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-8-767x421.png 767w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-8-1024x562.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-8-1536x844.png 1536w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-8-2048x1125.png 2048w" sizes="(max-width: 2176px) 100vw, 2176px" /></a></figure>



<h3 class="wp-block-heading">チャットでLLMに解説させる</h3>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-9.png"><img loading="lazy" decoding="async" width="2177" height="725" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-9.png" alt="" class="wp-image-799" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-9.png 2177w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-9-300x100.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-9-1024x341.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-9-766x255.png 766w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-9-1536x512.png 1536w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-9-2048x682.png 2048w" sizes="(max-width: 2177px) 100vw, 2177px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-10.png"><img loading="lazy" decoding="async" width="2176" height="717" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-10.png" alt="" class="wp-image-800" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-10.png 2176w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-10-300x99.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-10-1024x337.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-10-768x253.png 768w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-10-2048x675.png 2048w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-10-1536x506.png 1536w" sizes="(max-width: 2176px) 100vw, 2176px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-11.png"><img loading="lazy" decoding="async" width="2173" height="716" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-11.png" alt="" class="wp-image-801" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-11.png 2173w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-11-768x253.png 768w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-11-300x99.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-11-1024x337.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-11-1536x506.png 1536w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-11-2048x675.png 2048w" sizes="(max-width: 2173px) 100vw, 2173px" /></a></figure>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-12.png"><img loading="lazy" decoding="async" width="2190" height="735" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-12.png" alt="" class="wp-image-802" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-12.png 2190w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-12-766x257.png 766w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-12-300x101.png 300w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-12-1024x344.png 1024w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-12-2048x687.png 2048w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-12-1536x516.png 1536w" sizes="(max-width: 2190px) 100vw, 2190px" /></a></figure>



<h2 class="wp-block-heading">生成結果のサンプル</h2>



<p class="wp-block-paragraph">　別のページで公開している、タイムスタンプ付き歌詞データ作成ツールを読み込ませてみた結果。ソースコードはわざと消してます。<br>　肌感としては結構いい感じ。ただ、MTPデバイスのファイル読み取りについて、少し前にテストしてみたものの上手くいかず、MTP連携周りのボタンを消してアプリでは実行されないようにしていますが、使われていない機能であることを認識できていないようす。この辺りが限界かも🦆。<br>　まぁ、自分が使う分には充分かな。</p>



<div class="wp-block-file"><a id="wp-block-file--media-a265b8d9-f523-4ec1-bff4-d076004d04eb" href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/LRC_MAKER_Uranos8685_atlas.html">LRC_MAKER_Uranos8685_atlas.html</a><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/LRC_MAKER_Uranos8685_atlas.html" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-a265b8d9-f523-4ec1-bff4-d076004d04eb">ダウンロード</a></div>



<p class="wp-block-paragraph">　テストがパーペキじゃないのと、自分が欲しかったので作ったものなので、ソースコードはそのうち気が向いたら公開する…かも？</p><p>The post <a href="https://toybox.uranos8685.mydns.jp/791/python%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%ae%e9%96%a2%e6%95%b0%e3%81%ae%e9%96%a2%e4%bf%82%e6%80%a7%e3%82%92llm%e3%81%ab%e8%aa%ac%e6%98%8e%e3%81%95%e3%81%9b%e3%81%a6%e3%81%bf%e3%82%8b/">Pythonプログラムの関数の関係性をLLMに説明させてみる</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://toybox.uranos8685.mydns.jp/791/python%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%81%ae%e9%96%a2%e6%95%b0%e3%81%ae%e9%96%a2%e4%bf%82%e6%80%a7%e3%82%92llm%e3%81%ab%e8%aa%ac%e6%98%8e%e3%81%95%e3%81%9b%e3%81%a6%e3%81%bf%e3%82%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">791</post-id>	</item>
		<item>
		<title>VSCodeでGitコミットメッセージの生成をLLMにさせる拡張機能（Commit Maker）</title>
		<link>https://toybox.uranos8685.mydns.jp/784/vscode%e3%81%a7git%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%81%ae%e7%94%9f%e6%88%90%e3%82%92llm%e3%81%ab%e3%81%95%e3%81%9b%e3%82%8b%e6%8b%a1%e5%bc%b5/</link>
					<comments>https://toybox.uranos8685.mydns.jp/784/vscode%e3%81%a7git%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%81%ae%e7%94%9f%e6%88%90%e3%82%92llm%e3%81%ab%e3%81%95%e3%81%9b%e3%82%8b%e6%8b%a1%e5%bc%b5/#respond</comments>
		
		<dc:creator><![CDATA[Uranos8685]]></dc:creator>
		<pubDate>Sat, 26 Sep 2026 19:53:27 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[生成AI]]></category>
		<guid isPermaLink="false">https://toybox.uranos8685.mydns.jp/?p=784</guid>

					<description><![CDATA[<p>はじめに 　VSCodeのソース管理タブで、GitHubへコミットする際にGitHub Copilotを使ってコミットメッセージの生成が可能です。 　ただ、コミットメッセージの生成にもトークンコストが発生するため、無課金 [&#8230;]</p>
<p>The post <a href="https://toybox.uranos8685.mydns.jp/784/vscode%e3%81%a7git%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%81%ae%e7%94%9f%e6%88%90%e3%82%92llm%e3%81%ab%e3%81%95%e3%81%9b%e3%82%8b%e6%8b%a1%e5%bc%b5/">VSCodeでGitコミットメッセージの生成をLLMにさせる拡張機能（Commit Maker）</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">　VSCodeのソース管理タブで、GitHubへコミットする際にGitHub Copilotを使ってコミットメッセージの生成が可能です。<br></p>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image.png"><img loading="lazy" decoding="async" width="384" height="175" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image.png" alt="" class="wp-image-786" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image.png 384w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-300x137.png 300w" sizes="(max-width: 384px) 100vw, 384px" /></a></figure>



<p class="wp-block-paragraph">　ただ、コミットメッセージの生成にもトークンコストが発生するため、無課金だと使っているうちにリミットに達してしまうことがままあったため、ローカルLLMにコミットメッセージをさせる拡張機能がないか探していたところ、Commit Makerという拡張機能が良さげだったので紹介。</p>



<h2 class="wp-block-heading">Commit Makerについて</h2>


<a rel="noopener" href="https://marketplace.visualstudio.com/items?itemName=Hiromitsu.commit-maker" title="Commit Maker – コミットメーカー - Visual Studio Marketplace" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/94f149b6f3359182516b2809aa95a36d.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Commit Maker – コミットメーカー &#8211; Visual Studio Marketplace</div><div class="blogcard-snippet external-blogcard-snippet">Extension for Visual Studio Code &#8211; Git差分からコミットメッセージをAI生成。OpenAI GPT-6 Lunaを初期選択。BYOK、Codex、ローカルGGUFモデルに対応。</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://marketplace.visualstudio.com/items?itemName=Hiromitsu.commit-maker" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">marketplace.visualstudio.com</div></div></div></div></a>


<p class="wp-block-paragraph">　インストールはマケプレからVSCodeにインスコするだけ。<br>　サイドバーのタブに、Commit Makerのアイコンが追加されるので、ここから設定が可能。<br>　ClaudeやCodexなどのAPIキーを設定することも出来るが、ローカルLLMもここでGGUFファイルをダウンロードすることで利用可能（外部でDL済みの任意のGGUFを指定することは出来なさそう）。</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-large"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-1.png"><img loading="lazy" decoding="async" width="312" height="1024" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-1-312x1024.png" alt="" class="wp-image-787" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-1-312x1024.png 312w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-1-91x300.png 91w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-1.png 344w" sizes="(max-width: 312px) 100vw, 312px" /></a></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-2.png"><img loading="lazy" decoding="async" width="267" height="293" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-2.png" alt="" class="wp-image-788"/></a></figure>
</div>
</div>



<p class="wp-block-paragraph">　生成した結果。生成の精度は、まぁまぁといった感じ。小さいプロジェクトならいいが、複数のpyファイルをまたぐような大規模プロジェクトだと、変更箇所しか読まないのか的外れな生成をすることがある。<br>　あと、GGUF形式のLLMをGPU推論できる環境でも、CPU推論でのみ動作するよう。一応、公式のGitHubのReadmeではGPUも使えそうなことが書いてあるが、設定方法の記載は見つけられず、よく分からん。まあ、CPU推論でも20秒程度で生成できていたので、まあいいかな。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="346" height="308" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-3.png" alt="" class="wp-image-789" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-3.png 346w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/image-3-300x267.png 300w" sizes="(max-width: 346px) 100vw, 346px" /></figure>


<a rel="noopener" href="https://github.com/Hiromitsu-A-T/commit-maker/tree/main" title="GitHub - Hiromitsu-A-T/commit-maker: GUIでプロンプト設定可能、自分のAPIキーを使ってサブスク不要のAIコミット生成ツール / GUI-configurable, no-subscription AI commit generator using your own API key." class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/0ee9cb7fa83c77e5e768379c041b5a7e.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub &#8211; Hiromitsu-A-T/commit-maker: GUIでプロンプト設定可能、自分のAPIキーを使ってサブスク不要のAIコミット生成ツール / GUI-configurable, no-subscription AI commit generator using your own API key.</div><div class="blogcard-snippet external-blogcard-snippet">GUIでプロンプト設定可能、自分のAPIキーを使ってサブスク不要のAIコミット生成ツール / GUI-configurable, no-subscription AI commit generator using your own API &#8230;</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/Hiromitsu-A-T/commit-maker" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a><p>The post <a href="https://toybox.uranos8685.mydns.jp/784/vscode%e3%81%a7git%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%81%ae%e7%94%9f%e6%88%90%e3%82%92llm%e3%81%ab%e3%81%95%e3%81%9b%e3%82%8b%e6%8b%a1%e5%bc%b5/">VSCodeでGitコミットメッセージの生成をLLMにさせる拡張機能（Commit Maker）</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://toybox.uranos8685.mydns.jp/784/vscode%e3%81%a7git%e3%82%b3%e3%83%9f%e3%83%83%e3%83%88%e3%83%a1%e3%83%83%e3%82%bb%e3%83%bc%e3%82%b8%e3%81%ae%e7%94%9f%e6%88%90%e3%82%92llm%e3%81%ab%e3%81%95%e3%81%9b%e3%82%8b%e6%8b%a1%e5%bc%b5/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">784</post-id>	</item>
		<item>
		<title>DbD キラー抽選ルーレット</title>
		<link>https://toybox.uranos8685.mydns.jp/768/dbd-%e3%82%ad%e3%83%a9%e3%83%bc%e6%8a%bd%e9%81%b8%e3%83%ab%e3%83%bc%e3%83%ac%e3%83%83%e3%83%88/</link>
					<comments>https://toybox.uranos8685.mydns.jp/768/dbd-%e3%82%ad%e3%83%a9%e3%83%bc%e6%8a%bd%e9%81%b8%e3%83%ab%e3%83%bc%e3%83%ac%e3%83%83%e3%83%88/#respond</comments>
		
		<dc:creator><![CDATA[Uranos8685]]></dc:creator>
		<pubDate>Wed, 23 Sep 2026 15:22:28 +0000</pubDate>
				<category><![CDATA[ゲーム]]></category>
		<guid isPermaLink="false">https://toybox.uranos8685.mydns.jp/?p=768</guid>

					<description><![CDATA[<p>※個人的に欲しかったので作ったルーレットです。キラーの更新は気まぐれですorz</p>
<p>The post <a href="https://toybox.uranos8685.mydns.jp/768/dbd-%e3%82%ad%e3%83%a9%e3%83%bc%e6%8a%bd%e9%81%b8%e3%83%ab%e3%83%bc%e3%83%ac%e3%83%83%e3%83%88/">DbD キラー抽選ルーレット</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></description>
										<content:encoded><![CDATA[<iframe loading="lazy" src="/wp-content/uploads/html/dbd_killer_roulette/dbd_killer_roulette.html" width="100%" height="1700"></iframe>



<p class="wp-block-paragraph">※個人的に欲しかったので作ったルーレットです。キラーの更新は気まぐれですorz</p><p>The post <a href="https://toybox.uranos8685.mydns.jp/768/dbd-%e3%82%ad%e3%83%a9%e3%83%bc%e6%8a%bd%e9%81%b8%e3%83%ab%e3%83%bc%e3%83%ac%e3%83%83%e3%83%88/">DbD キラー抽選ルーレット</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://toybox.uranos8685.mydns.jp/768/dbd-%e3%82%ad%e3%83%a9%e3%83%bc%e6%8a%bd%e9%81%b8%e3%83%ab%e3%83%bc%e3%83%ac%e3%83%83%e3%83%88/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">768</post-id>	</item>
		<item>
		<title>OllamaにモデルファイルをGGUFでインストールためにOllama公式Modelfileを抽出する方法</title>
		<link>https://toybox.uranos8685.mydns.jp/756/%e3%82%aa%e3%83%95%e3%83%a9%e3%82%a4%e3%83%b3pc%e3%81%a7%e3%80%81ollama%e3%81%abgpt-oss20b%e3%82%92gguf%e3%81%a7%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%9f%e3%82%81%e3%81%aemodelf/</link>
					<comments>https://toybox.uranos8685.mydns.jp/756/%e3%82%aa%e3%83%95%e3%83%a9%e3%82%a4%e3%83%b3pc%e3%81%a7%e3%80%81ollama%e3%81%abgpt-oss20b%e3%82%92gguf%e3%81%a7%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%9f%e3%82%81%e3%81%aemodelf/#respond</comments>
		
		<dc:creator><![CDATA[Uranos8685]]></dc:creator>
		<pubDate>Sun, 13 Sep 2026 15:04:43 +0000</pubDate>
				<category><![CDATA[生成AI]]></category>
		<guid isPermaLink="false">https://toybox.uranos8685.mydns.jp/?p=756</guid>

					<description><![CDATA[<p>はじめに 　OllamaへのモデルファイルのインストールはネットにつながったPCならollama runで一発ですが、オフラインPCにインストールしたOllamaにモデルファイルをインストールする必要があり、公式Mode [&#8230;]</p>
<p>The post <a href="https://toybox.uranos8685.mydns.jp/756/%e3%82%aa%e3%83%95%e3%83%a9%e3%82%a4%e3%83%b3pc%e3%81%a7%e3%80%81ollama%e3%81%abgpt-oss20b%e3%82%92gguf%e3%81%a7%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%9f%e3%82%81%e3%81%aemodelf/">OllamaにモデルファイルをGGUFでインストールためにOllama公式Modelfileを抽出する方法</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">はじめに</h2>



<p class="wp-block-paragraph">　OllamaへのモデルファイルのインストールはネットにつながったPCならollama runで一発ですが、オフラインPCにインストールしたOllamaにモデルファイルをインストールする必要があり、公式Modelfileを使ってオフラインPCでもモデルをインストールするやり方を見つけたので備忘録として残しておきます。</p>



<h2 class="wp-block-heading">Ollama公式のModelfileの抽出方法（インターネットにつながったPCでやる）</h2>



<p class="wp-block-paragraph">　まずは、インターネットにつながったPCで、事前にollama runコマンドでモデルを取得しておく。<br>　それで、以下のコマンドをコマンドプロンプトなどで実行するとModelfileが現在のディレクトリに出力される。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>ollama show gpt-oss:20b --modelfile &gt; official-gpt-oss.Modelfile</code></pre></div>



<p class="wp-block-paragraph">　gpt-oss:20bのModelfileの中身。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code># Modelfile generated by &quot;ollama show&quot;
# To build a new Modelfile based on this, replace FROM with:
# FROM gpt-oss:20b

FROM G:\ollama\models\blobs\sha256-e7b273f9636059a689e3ddcab3716e4f65abe0143ac978e46673ad0e52d09efb
TEMPLATE &quot;&quot;&quot;&lt;|start|&gt;system&lt;|message|&gt;You are ChatGPT, a large language model trained by OpenAI.
Knowledge cutoff: 2024-06
Current date: {{ currentDate }}
{{- if and .IsThinkSet .Think (ne .ThinkLevel &quot;&quot;) }}

Reasoning: {{ .ThinkLevel }}
{{- else if or (not .IsThinkSet) (and .IsThinkSet .Think) }}

Reasoning: medium
{{- end }}

{{- $hasNonBuiltinTools := false }}
{{- if .Tools -}}
{{- $hasBrowserSearch := false }}
{{- $hasBrowserOpen := false }}
{{- $hasBrowserFind := false }}
{{- $hasPython := false }}
  {{- range .Tools }}
    {{- if eq .Function.Name &quot;browser.search&quot; -}}{{- $hasBrowserSearch = true -}}
    {{- else if eq .Function.Name &quot;browser.open&quot; -}}{{- $hasBrowserOpen = true -}}
    {{- else if eq .Function.Name &quot;browser.find&quot; -}}{{- $hasBrowserFind = true -}}
    {{- else if eq .Function.Name &quot;python&quot; -}}{{- $hasPython = true -}}
    {{- else }}{{ $hasNonBuiltinTools = true -}}
    {{- end }}
  {{- end }}
{{- if or $hasBrowserSearch $hasBrowserOpen $hasBrowserFind $hasPython }}

# Tools
{{- if or $hasBrowserSearch $hasBrowserOpen $hasBrowserFind }}

## browser

// Tool for browsing.
// The `cursor` appears in brackets before each browsing display: `[{cursor}]`.
// Cite information from the tool using the following format:
// `【{cursor}†L{line_start}(-L{line_end})?】`, for example: `【6†L9-L11】` or `【8†L3】`.
// Do not quote more than 10 words directly from the tool output.
// sources=web (default: web)
namespace browser {
{{- if $hasBrowserSearch }}

// Searches for information related to `query` and displays `topn` results.
type search = (_: {
query: string,
topn?: number, // default: 10
source?: string,
}) =&gt; any;
{{- end }}
{{- if $hasBrowserOpen }}

// Opens the link `id` from the page indicated by `cursor` starting at line number `loc`, showing `num_lines` lines.
// Valid link ids are displayed with the formatting: `【{id}†.*】`.
// If `cursor` is not provided, the most recent page is implied.
// If `id` is a string, it is treated as a fully qualified URL associated with `source`.
// If `loc` is not provided, the viewport will be positioned at the beginning of the document or centered on the most relevant passage, if available.
// Use this function without `id` to scroll to a new location of an opened page.
type open = (_: {
id?: number | string, // default: -1
cursor?: number, // default: -1
loc?: number, // default: -1
num_lines?: number, // default: -1
view_source?: boolean, // default: false
source?: string,
}) =&gt; any;
{{- end }}
{{- if $hasBrowserFind }}

// Finds exact matches of `pattern` in the current page, or the page given by `cursor`.
type find = (_: {
pattern: string,
cursor?: number, // default: -1
}) =&gt; any;
{{- end }}

} // namespace browser
{{- end }}{{/* end if has browser tools */}}
{{- if $hasPython }}

## python

Use this tool to execute Python code in your chain of thought. The code will not be shown to the user. This tool should be used for internal reasoning, but not for code that is intended to be visible to the user (e.g. when creating plots, tables, or files).

When you send a message containing Python code to python, it will be executed in a stateful Jupyter notebook environment. python will respond with the output of the execution or time out after 120.0 seconds. The drive at &#39;/mnt/data&#39; can be used to save and persist user files. Internet access for this session is UNKNOWN. Depends on the cluster.
{{- end }}{{/* end if hasPython */}}
{{- end }}{{/* end if has any built-in tools */}}
{{- end }}{{/* end if .Tools */}}

# Valid channels: analysis, commentary, final. Channel must be included for every message.{{ if $hasNonBuiltinTools }}
Calls to these tools must go to the commentary channel: &#39;functions&#39;.
{{- end -}}&lt;|end|&gt;{{/* end of system */ -}}
{{- if or $hasNonBuiltinTools .System -}}
&lt;|start|&gt;developer&lt;|message|&gt;{{- if $hasNonBuiltinTools }}# Tools

## functions

namespace functions {
{{- range .Tools }}
{{- if not (or (eq .Function.Name &quot;browser.search&quot;) (eq .Function.Name &quot;browser.open&quot;) (eq .Function.Name &quot;browser.find&quot;) (eq .Function.Name &quot;python&quot;)) }}
{{if .Function.Description }}
// {{ .Function.Description }}
{{- end }}
{{- if and .Function.Parameters.Properties (gt (len .Function.Parameters.Properties) 0) }}
type {{ .Function.Name }} = (_: {
{{- range $name, $prop := .Function.Parameters.Properties }}
{{- if $prop.Description }}
  // {{ $prop.Description }}
{{- end }}
  {{ $name }}: {{ $prop | toTypeScriptType }},
{{- end }}
}) =&gt; any;
{{- else }}
type {{ .Function.Name }} = () =&gt; any;
{{- end }}
{{- end }}{{/* end if not browser tool */}}
{{- end }}{{/* end of range .Tools */}}

} // namespace functions
{{- end }}{{/* end if hasNonBuiltinTools */}}
{{- if .System}}

# Instructions

{{ .System }}
{{- end -}}
&lt;|end|&gt;
{{- end -}}
{{- /* Find the index of the last user message */ -}}
{{- $lastUserIdx := -1 }}
{{- $prefillingContent := false }}
{{- $prefillingThinkingOnly := false }}
{{- range $i, $msg := .Messages }}
  {{- $last := eq (len (slice $.Messages $i)) 1 -}}
  {{- if eq $msg.Role &quot;user&quot; }}
    {{- $lastUserIdx = $i }}
  {{- end -}}
  {{- if and $last (eq $msg.Role &quot;assistant&quot;) (gt (len $msg.Content) 0) }}
    {{- $prefillingContent = true }}
  {{- else if and $last (eq $msg.Role &quot;assistant&quot;) (gt (len $msg.Thinking) 0) }}
    {{- $prefillingThinkingOnly = true }}
  {{- end }}
{{- end -}}
{{- /* Now render messages */ -}}
{{- range $i, $msg := .Messages }}
  {{- $last := eq (len (slice $.Messages $i)) 1 -}}
  {{- if (ne $msg.Role &quot;system&quot;) -}}
    {{- if eq $msg.Role &quot;tool&quot; -}}
      {{- if or (eq $msg.ToolName &quot;python&quot;) (eq $msg.ToolName &quot;browser.search&quot;) (eq $msg.ToolName &quot;browser.open&quot;) (eq $msg.ToolName &quot;browser.find&quot;) -}}
        &lt;|start|&gt;{{ $msg.ToolName }} to=assistant&lt;|message|&gt;{{ $msg.Content }}&lt;|end|&gt;
      {{- else -}}
        &lt;|start|&gt;functions.{{ $msg.ToolName }} to=assistant&lt;|message|&gt;{{ $msg.Content }}&lt;|end|&gt;
      {{- end -}}
    {{- else if eq $msg.Role &quot;assistant&quot; -}}
      {{- if and $msg.Thinking (gt $i $lastUserIdx) -}}{{- /* Show thinking only after last user message */ -}}
      &lt;|start|&gt;assistant&lt;|channel|&gt;analysis&lt;|message|&gt;{{ $msg.Thinking }}{{- if not $prefillingThinkingOnly -}}&lt;|end|&gt;{{- end -}}
      {{- end -}}
      {{- if gt (len $msg.Content) 0 -}}
        &lt;|start|&gt;assistant&lt;|channel|&gt;final&lt;|message|&gt;{{ $msg.Content }}{{- if not $prefillingContent -}}&lt;|end|&gt;{{- end -}}
      {{- end -}}
      {{- if gt (len $msg.ToolCalls) 0 -}}
        {{- range $j, $toolCall := $msg.ToolCalls -}}
          {{- $isBuiltin := or (eq $toolCall.Function.Name &quot;python&quot;) (eq $toolCall.Function.Name &quot;browser.search&quot;) (eq $toolCall.Function.Name &quot;browser.open&quot;) (eq $toolCall.Function.Name &quot;browser.find&quot;) -}}
          &lt;|start|&gt;assistant&lt;|channel|&gt;{{ if $isBuiltin }}analysis{{ else }}commentary{{ end }} to={{ if not $isBuiltin}}functions.{{end}}{{ $toolCall.Function.Name }} &lt;|constrain|&gt;json&lt;|message|&gt;{{ $toolCall.Function.Arguments }}&lt;|call|&gt;
        {{- end -}}
      {{- end -}}
    {{- else if eq $msg.Role &quot;user&quot; -}}
      &lt;|start|&gt;{{ $msg.Role }}&lt;|message|&gt;{{ $msg.Content }}&lt;|end|&gt;
    {{- end }}
  {{- else }}
  {{- end }}
{{- end -}}
{{- if not (or $prefillingContent $prefillingThinkingOnly) -}}
&lt;|start|&gt;assistant
{{- end -}}&quot;&quot;&quot;
PARAMETER temperature 1
LICENSE &quot;&quot;&quot;
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      &quot;License&quot; shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      &quot;Licensor&quot; shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      &quot;Legal Entity&quot; shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      &quot;control&quot; means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      &quot;You&quot; (or &quot;Your&quot;) shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      &quot;Source&quot; form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      &quot;Object&quot; form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      &quot;Work&quot; shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      &quot;Derivative Works&quot; shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      &quot;Contribution&quot; shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, &quot;submitted&quot;
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as &quot;Not a Contribution.&quot;

      &quot;Contributor&quot; shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a &quot;NOTICE&quot; text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an &quot;AS IS&quot; BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets &quot;[]&quot;
      replaced with your own identifying information. (Don&#39;t include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same &quot;printed page&quot; as the copyright notice for easier
      identification within third-party archives.
   Copyright [yyyy] [name of copyright owner]
   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at
       http://www.apache.org/licenses/LICENSE-2.0
   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.&quot;&quot;&quot;

</code></pre></div>



<div class="wp-block-file"><a id="wp-block-file--media-f657baf8-8d42-44d6-b409-280d8cfcd56e" href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/official-gpt-oss.modelfile">official-gpt-oss.Modelfile</a><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/09/official-gpt-oss.modelfile" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-f657baf8-8d42-44d6-b409-280d8cfcd56e">ダウンロード</a></div>



<h2 class="wp-block-heading">オフラインPCでモデルをインストールする</h2>



<p class="wp-block-paragraph">　上記Modelfileとgguf形式のモデルを使って、Ollamaにモデルをインストールする。<br>　ただ、Modelfileの先頭に、「FROM shaなんとか」は上記PCのモデルファイルのパスなので、オフラインPCに配置したGGUFのファイルパスに置換する必要がある。</p>



<p class="wp-block-paragraph">　おわり。</p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://toybox.uranos8685.mydns.jp/756/%e3%82%aa%e3%83%95%e3%83%a9%e3%82%a4%e3%83%b3pc%e3%81%a7%e3%80%81ollama%e3%81%abgpt-oss20b%e3%82%92gguf%e3%81%a7%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%9f%e3%82%81%e3%81%aemodelf/">OllamaにモデルファイルをGGUFでインストールためにOllama公式Modelfileを抽出する方法</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://toybox.uranos8685.mydns.jp/756/%e3%82%aa%e3%83%95%e3%83%a9%e3%82%a4%e3%83%b3pc%e3%81%a7%e3%80%81ollama%e3%81%abgpt-oss20b%e3%82%92gguf%e3%81%a7%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%9f%e3%82%81%e3%81%aemodelf/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">756</post-id>	</item>
		<item>
		<title>【PII】Presidioを使ってみる</title>
		<link>https://toybox.uranos8685.mydns.jp/726/%e3%80%90pii%e3%80%91presidio%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/</link>
					<comments>https://toybox.uranos8685.mydns.jp/726/%e3%80%90pii%e3%80%91presidio%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/#respond</comments>
		
		<dc:creator><![CDATA[Uranos8685]]></dc:creator>
		<pubDate>Mon, 31 Aug 2026 12:06:03 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://toybox.uranos8685.mydns.jp/?p=726</guid>

					<description><![CDATA[<p>仮想環境の作成 仮想環境作成 　公式サイトによると、対応しているPythonのバージョンは3.10～3.13とのこと。　Anacondaで以下のコマンドで仮想環境を新規作成した。 pip install presidio [&#8230;]</p>
<p>The post <a href="https://toybox.uranos8685.mydns.jp/726/%e3%80%90pii%e3%80%91presidio%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/">【PII】Presidioを使ってみる</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></description>
										<content:encoded><![CDATA[<a rel="noopener" href="https://github.com/data-privacy-stack/presidio" title="GitHub - data-privacy-stack/presidio: An open-source framework for detecting, redacting, masking, and anonymizing sensitive data (PII) across text, images, and structured data. Supports NLP, pattern matching, and customizable pipelines." class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/df0e511d74c3217ae168b2a2f2e4c811.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub &#8211; data-privacy-stack/presidio: An open-source framework for detecting, redacting, masking, and anonymizing sensitive data (PII) across text, images, and structured data. Supports NLP, pattern matching, and customizable pipelines.</div><div class="blogcard-snippet external-blogcard-snippet">An open-source framework for detecting, redacting, masking, and anonymizing sensitive data (PII) across text, images, an&#8230;</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/data-privacy-stack/presidio" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>

<a rel="noopener" href="https://presidio.dataprivacystack.org" title="Home - Presidio" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fpresidio.dataprivacystack.org?w=320&#038;h=180" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Home &#8211; Presidio</div><div class="blogcard-snippet external-blogcard-snippet">PII anonymization for text, images, and structured data.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://presidio.dataprivacystack.org" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">presidio.dataprivacystack.org</div></div></div></div></a>


<h2 class="wp-block-heading">仮想環境の作成</h2>



<h3 class="wp-block-heading">仮想環境作成</h3>


<a rel="noopener" href="https://presidio.dataprivacystack.org/installation/#__tabbed_1_2" title="Installation - Presidio" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://s.wordpress.com/mshots/v1/https%3A%2F%2Fpresidio.dataprivacystack.org%2Finstallation%2F%23__tabbed_1_2?w=320&#038;h=180" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Installation &#8211; Presidio</div><div class="blogcard-snippet external-blogcard-snippet">PII anonymization for text, images, and structured data.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://presidio.dataprivacystack.org/installation/#__tabbed_1_2" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">presidio.dataprivacystack.org</div></div></div></div></a>


<p class="wp-block-paragraph">　公式サイトによると、対応しているPythonのバージョンは3.10～3.13とのこと。<br>　Anacondaで以下のコマンドで仮想環境を新規作成した。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>conda create -n presidio_20260831 python==3.13</code></pre></div>



<h3 class="wp-block-heading">pip install presidio_analyzer[transformers]</h3>



<p class="wp-block-paragraph">　仮想環境をアクティベートして、以下のコマンドでPresidioをpip installする。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>pip install &quot;presidio_analyzer[transformers]&quot;</code></pre></div>



<p class="wp-block-paragraph">↓実行結果</p>



<div data-wp-context="{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }" data-wp-interactive="core/accordion" role="group" class="wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow">
<div data-wp-class--is-open="state.isOpen" data-wp-context="{ &quot;id&quot;: &quot;accordion-item-1&quot;, &quot;openByDefault&quot;: false }" data-wp-init="callbacks.initAccordionItems" data-wp-on-window--hashchange="callbacks.hashChange" class="wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow">
<h4 class="wp-block-accordion-heading has-icon has-icon-right"><button aria-expanded="false" aria-controls="accordion-item-1-panel" data-wp-bind--aria-expanded="state.isOpen" data-wp-on--click="actions.toggle" id="accordion-item-1" type="button" class="wp-block-accordion-heading__toggle"><span class="wp-block-accordion-heading__toggle-title">実行結果</span><span class="wp-block-accordion-heading__toggle-icon" aria-hidden="true">+</span></button></h4>



<div aria-labelledby="accordion-item-1" data-wp-bind--hidden="state.isHidden" data-wp-on--beforematch="actions.handleBeforeMatch" id="accordion-item-1-panel" role="region" class="wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow">
<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>Collecting presidio_analyzer[transformers]
  Downloading presidio_analyzer-2.2.364-py3-none-any.whl.metadata (6.7 kB)
Collecting accelerate&lt;2.0.0,&gt;=0.20.0 (from presidio_analyzer[transformers])
  Using cached accelerate-1.14.0-py3-none-any.whl.metadata (19 kB)
Collecting click&lt;9.0.0,&gt;=8.1.0 (from presidio_analyzer[transformers])
  Downloading click-8.5.0-py3-none-any.whl.metadata (2.6 kB)
Collecting huggingface_hub&lt;2.0.0,&gt;=0.20.0 (from presidio_analyzer[transformers])
  Downloading huggingface_hub-1.29.0-py3-none-any.whl.metadata (16 kB)
Collecting numpy&lt;2.5.0,&gt;=1.19.0 (from presidio_analyzer[transformers])
  Using cached numpy-2.4.6-cp313-cp313-win_amd64.whl.metadata (6.6 kB)
Collecting phonenumbers&lt;10.0.0,&gt;=9.0.28 (from presidio_analyzer[transformers])
  Downloading phonenumbers-9.0.38-py2.py3-none-any.whl.metadata (10 kB)
Collecting pydantic&lt;3.0.0,&gt;=2.12.5 (from presidio_analyzer[transformers])
  Downloading pydantic-2.13.5-py3-none-any.whl.metadata (110 kB)
Collecting pyyaml&lt;7.0.0,&gt;=6.0.3 (from presidio_analyzer[transformers])
  Using cached pyyaml-6.0.3-cp313-cp313-win_amd64.whl.metadata (2.4 kB)
Collecting regex&gt;=2023.0.0 (from presidio_analyzer[transformers])
  Downloading regex-2026.8.31-cp313-cp313-win_amd64.whl.metadata (41 kB)
Collecting spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4 (from presidio_analyzer[transformers])
  Downloading spacy-3.8.16-cp313-cp313-win_amd64.whl.metadata (28 kB)
Collecting spacy_huggingface_pipelines&lt;1.0.0,&gt;=0.0.4 (from presidio_analyzer[transformers])
  Downloading spacy_huggingface_pipelines-0.0.4-py2.py3-none-any.whl.metadata (10.0 kB)
Collecting tldextract&lt;6.0.0,&gt;=5.3.1 (from presidio_analyzer[transformers])
  Downloading tldextract-5.3.2-py3-none-any.whl.metadata (7.9 kB)
Collecting transformers&lt;6.0.0,&gt;=4.0.0 (from presidio_analyzer[transformers])
  Downloading transformers-5.16.1-py3-none-any.whl.metadata (32 kB)
Requirement already satisfied: packaging&gt;=20.0 in C:\ProgramData\anaconda3\envs\presidio_20260831\Lib\site-packages (from accelerate&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers]) (26.3)
Collecting psutil (from accelerate&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached psutil-7.2.2-cp37-abi3-win_amd64.whl.metadata (22 kB)
Collecting torch&gt;=2.0.0 (from accelerate&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Downloading torch-2.13.0-cp313-cp313-win_amd64.whl.metadata (39 kB)
Collecting safetensors&gt;=0.4.3 (from accelerate&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached safetensors-0.8.0-cp310-abi3-win_amd64.whl.metadata (4.2 kB)
Collecting filelock&gt;=3.10.0 (from huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Downloading filelock-3.32.4-py3-none-any.whl.metadata (2.0 kB)
Collecting fsspec&gt;=2023.5.0 (from huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Downloading fsspec-2026.7.0-py3-none-any.whl.metadata (10 kB)
Collecting hf-xet&lt;2.0.0,&gt;=1.5.2 (from huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Downloading hf_xet-1.6.0-cp38-abi3-win_amd64.whl.metadata (4.9 kB)
Collecting httpx&lt;1,&gt;=0.23.0 (from huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached httpx-0.28.1-py3-none-any.whl.metadata (7.1 kB)
Collecting tqdm&gt;=4.42.1 (from huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached tqdm-4.70.0-py3-none-any.whl.metadata (57 kB)
Collecting typing-extensions&gt;=4.1.0 (from huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached typing_extensions-4.16.0-py3-none-any.whl.metadata (3.3 kB)
Collecting anyio (from httpx&lt;1,&gt;=0.23.0-&gt;huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached anyio-4.14.2-py3-none-any.whl.metadata (4.6 kB)
Collecting certifi (from httpx&lt;1,&gt;=0.23.0-&gt;huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached certifi-2026.7.22-py3-none-any.whl.metadata (2.5 kB)
Collecting httpcore==1.* (from httpx&lt;1,&gt;=0.23.0-&gt;huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached httpcore-1.0.9-py3-none-any.whl.metadata (21 kB)
Collecting idna (from httpx&lt;1,&gt;=0.23.0-&gt;huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Downloading idna-3.19-py3-none-any.whl.metadata (9.2 kB)
Collecting h11&gt;=0.16 (from httpcore==1.*-&gt;httpx&lt;1,&gt;=0.23.0-&gt;huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached h11-0.16.0-py3-none-any.whl.metadata (8.3 kB)
Collecting annotated-types&gt;=0.6.0 (from pydantic&lt;3.0.0,&gt;=2.12.5-&gt;presidio_analyzer[transformers])
  Using cached annotated_types-0.8.0-py3-none-any.whl.metadata (15 kB)
Collecting pydantic-core==2.46.5 (from pydantic&lt;3.0.0,&gt;=2.12.5-&gt;presidio_analyzer[transformers])
  Downloading pydantic_core-2.46.5-cp313-cp313-win_amd64.whl.metadata (6.7 kB)
Collecting typing-inspection&gt;=0.4.2 (from pydantic&lt;3.0.0,&gt;=2.12.5-&gt;presidio_analyzer[transformers])
  Downloading typing_inspection-0.4.4-py3-none-any.whl.metadata (2.6 kB)
Collecting spacy-legacy&lt;3.1.0,&gt;=3.0.11 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading spacy_legacy-3.0.12-py2.py3-none-any.whl.metadata (2.8 kB)
Collecting spacy-loggers&lt;2.0.0,&gt;=1.0.0 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading spacy_loggers-1.0.5-py3-none-any.whl.metadata (23 kB)
Collecting murmurhash&lt;1.1.0,&gt;=0.28.0 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading murmurhash-1.0.15-cp313-cp313-win_amd64.whl.metadata (2.3 kB)
Collecting cymem&lt;2.1.0,&gt;=2.0.2 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading cymem-2.0.13-cp313-cp313-win_amd64.whl.metadata (9.9 kB)
Collecting preshed&lt;3.1.0,&gt;=3.0.2 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading preshed-3.0.13-cp313-cp313-win_amd64.whl.metadata (5.4 kB)
Collecting thinc&lt;8.4.0,&gt;=8.3.12 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading thinc-8.3.13-cp313-cp313-win_amd64.whl.metadata (15 kB)
Collecting wasabi&lt;1.2.0,&gt;=0.9.1 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading wasabi-1.1.3-py3-none-any.whl.metadata (28 kB)
Collecting srsly&lt;3.0.0,&gt;=2.5.3 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading srsly-2.5.3-cp313-cp313-win_amd64.whl.metadata (20 kB)
Collecting catalogue&lt;2.1.0,&gt;=2.0.6 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading catalogue-2.0.10-py3-none-any.whl.metadata (14 kB)
Collecting weasel&lt;2.0.0,&gt;=1.0.0 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading weasel-1.0.0-py3-none-any.whl.metadata (4.6 kB)
Collecting confection&lt;2.0.0,&gt;=1.3.2 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading confection-1.3.3-py3-none-any.whl.metadata (19 kB)
Collecting typer&lt;1.0.0,&gt;=0.3.0 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading typer-0.27.2-py3-none-any.whl.metadata (16 kB)
Collecting requests&lt;3.0.0,&gt;=2.13.0 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Using cached requests-2.34.2-py3-none-any.whl.metadata (4.8 kB)
Collecting jinja2 (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Using cached jinja2-3.1.6-py3-none-any.whl.metadata (2.9 kB)
Requirement already satisfied: setuptools in C:\ProgramData\anaconda3\envs\presidio_20260831\Lib\site-packages (from spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers]) (83.0.0)
Collecting charset_normalizer&lt;4,&gt;=2 (from requests&lt;3.0.0,&gt;=2.13.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl.metadata (46 kB)
Collecting urllib3&lt;3,&gt;=1.26 (from requests&lt;3.0.0,&gt;=2.13.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Using cached urllib3-2.7.0-py3-none-any.whl.metadata (6.9 kB)
Collecting transformers&lt;6.0.0,&gt;=4.0.0 (from presidio_analyzer[transformers])
  Using cached transformers-4.57.6-py3-none-any.whl.metadata (43 kB)
Collecting blis&lt;1.4.0,&gt;=1.3.0 (from thinc&lt;8.4.0,&gt;=8.3.12-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading blis-1.3.3-cp313-cp313-win_amd64.whl.metadata (7.7 kB)
Collecting requests-file&gt;=1.4 (from tldextract&lt;6.0.0,&gt;=5.3.1-&gt;presidio_analyzer[transformers])
  Downloading requests_file-3.0.1-py2.py3-none-any.whl.metadata (1.7 kB)
Collecting colorama (from tqdm&gt;=4.42.1-&gt;huggingface_hub&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached colorama-0.4.6-py2.py3-none-any.whl.metadata (17 kB)
Collecting huggingface_hub&lt;2.0.0,&gt;=0.20.0 (from presidio_analyzer[transformers])
  Using cached huggingface_hub-0.36.2-py3-none-any.whl.metadata (15 kB)
Collecting tokenizers&lt;=0.23.0,&gt;=0.22.0 (from transformers&lt;6.0.0,&gt;=4.0.0-&gt;presidio_analyzer[transformers])
  Using cached tokenizers-0.22.2-cp39-abi3-win_amd64.whl.metadata (7.4 kB)
Collecting shellingham&gt;=1.3.0 (from typer&lt;1.0.0,&gt;=0.3.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Using cached shellingham-1.5.4-py2.py3-none-any.whl.metadata (3.5 kB)
Collecting rich&gt;=13.8.0 (from typer&lt;1.0.0,&gt;=0.3.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Using cached rich-15.0.0-py3-none-any.whl.metadata (18 kB)
Collecting annotated-doc&gt;=0.0.2 (from typer&lt;1.0.0,&gt;=0.3.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading annotated_doc-0.0.5-py3-none-any.whl.metadata (6.5 kB)
Collecting cloudpathlib&gt;=0.7.0 (from weasel&lt;2.0.0,&gt;=1.0.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading cloudpathlib-0.25.0-py3-none-any.whl.metadata (16 kB)
Collecting smart-open&gt;=5.2.1 (from weasel&lt;2.0.0,&gt;=1.0.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading smart_open-8.0.1-py3-none-any.whl.metadata (24 kB)
Collecting markdown-it-py&gt;=2.2.0 (from rich&gt;=13.8.0-&gt;typer&lt;1.0.0,&gt;=0.3.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Using cached markdown_it_py-4.2.0-py3-none-any.whl.metadata (7.4 kB)
Collecting pygments&lt;3.0.0,&gt;=2.13.0 (from rich&gt;=13.8.0-&gt;typer&lt;1.0.0,&gt;=0.3.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading pygments-2.21.0-py3-none-any.whl.metadata (2.5 kB)
Collecting mdurl~=0.1 (from markdown-it-py&gt;=2.2.0-&gt;rich&gt;=13.8.0-&gt;typer&lt;1.0.0,&gt;=0.3.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Using cached mdurl-0.1.2-py3-none-any.whl.metadata (1.6 kB)
Collecting wrapt (from smart-open&gt;=5.2.1-&gt;weasel&lt;2.0.0,&gt;=1.0.0-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Downloading wrapt-2.4.0-cp313-cp313-win_amd64.whl.metadata (7.6 kB)
Collecting sympy&gt;=1.13.3 (from torch&gt;=2.0.0-&gt;accelerate&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached sympy-1.14.0-py3-none-any.whl.metadata (12 kB)
Collecting networkx&gt;=2.5.1 (from torch&gt;=2.0.0-&gt;accelerate&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached networkx-3.6.1-py3-none-any.whl.metadata (6.8 kB)
Collecting mpmath&lt;1.4,&gt;=1.1.0 (from sympy&gt;=1.13.3-&gt;torch&gt;=2.0.0-&gt;accelerate&lt;2.0.0,&gt;=0.20.0-&gt;presidio_analyzer[transformers])
  Using cached mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)
Collecting MarkupSafe&gt;=2.0 (from jinja2-&gt;spacy!=3.7.0,&lt;4.0.0,&gt;=3.4.4-&gt;presidio_analyzer[transformers])
  Using cached markupsafe-3.0.3-cp313-cp313-win_amd64.whl.metadata (2.8 kB)
Downloading presidio_analyzer-2.2.364-py3-none-any.whl (266 kB)
Using cached accelerate-1.14.0-py3-none-any.whl (389 kB)
Downloading click-8.5.0-py3-none-any.whl (125 kB)
Using cached httpx-0.28.1-py3-none-any.whl (73 kB)
Using cached httpcore-1.0.9-py3-none-any.whl (78 kB)
Using cached numpy-2.4.6-cp313-cp313-win_amd64.whl (12.3 MB)
Downloading phonenumbers-9.0.38-py2.py3-none-any.whl (2.6 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.6/2.6 MB 9.4 MB/s  0:00:00
Downloading pydantic-2.13.5-py3-none-any.whl (472 kB)
Downloading pydantic_core-2.46.5-cp313-cp313-win_amd64.whl (2.0 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.0/2.0 MB 9.9 MB/s  0:00:00
Using cached pyyaml-6.0.3-cp313-cp313-win_amd64.whl (154 kB)
Downloading spacy-3.8.16-cp313-cp313-win_amd64.whl (15.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 15.2/15.2 MB 10.2 MB/s  0:00:01
Downloading catalogue-2.0.10-py3-none-any.whl (17 kB)
Downloading confection-1.3.3-py3-none-any.whl (35 kB)
Downloading cymem-2.0.13-cp313-cp313-win_amd64.whl (40 kB)
Downloading murmurhash-1.0.15-cp313-cp313-win_amd64.whl (25 kB)
Downloading preshed-3.0.13-cp313-cp313-win_amd64.whl (122 kB)
Using cached requests-2.34.2-py3-none-any.whl (73 kB)
Downloading charset_normalizer-3.5.1-cp313-cp313-win_amd64.whl (199 kB)
Downloading idna-3.19-py3-none-any.whl (68 kB)
Downloading spacy_huggingface_pipelines-0.0.4-py2.py3-none-any.whl (11 kB)
Downloading spacy_legacy-3.0.12-py2.py3-none-any.whl (29 kB)
Downloading spacy_loggers-1.0.5-py3-none-any.whl (22 kB)
Downloading srsly-2.5.3-cp313-cp313-win_amd64.whl (650 kB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 650.8/650.8 kB 8.0 MB/s  0:00:00
Downloading thinc-8.3.13-cp313-cp313-win_amd64.whl (1.7 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.7/1.7 MB 9.7 MB/s  0:00:00
Downloading blis-1.3.3-cp313-cp313-win_amd64.whl (6.2 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 6.2/6.2 MB 10.0 MB/s  0:00:00
Downloading tldextract-5.3.2-py3-none-any.whl (106 kB)
Using cached tqdm-4.70.0-py3-none-any.whl (80 kB)
Using cached transformers-4.57.6-py3-none-any.whl (12.0 MB)
Using cached huggingface_hub-0.36.2-py3-none-any.whl (566 kB)
Using cached tokenizers-0.22.2-cp39-abi3-win_amd64.whl (2.7 MB)
Downloading typer-0.27.2-py3-none-any.whl (123 kB)
Using cached urllib3-2.7.0-py3-none-any.whl (131 kB)
Downloading wasabi-1.1.3-py3-none-any.whl (27 kB)
Downloading weasel-1.0.0-py3-none-any.whl (50 kB)
Downloading annotated_doc-0.0.5-py3-none-any.whl (5.3 kB)
Using cached annotated_types-0.8.0-py3-none-any.whl (13 kB)
Using cached certifi-2026.7.22-py3-none-any.whl (136 kB)
Downloading cloudpathlib-0.25.0-py3-none-any.whl (66 kB)
Using cached colorama-0.4.6-py2.py3-none-any.whl (25 kB)
Downloading filelock-3.32.4-py3-none-any.whl (99 kB)
Downloading fsspec-2026.7.0-py3-none-any.whl (206 kB)
Using cached h11-0.16.0-py3-none-any.whl (37 kB)
Downloading regex-2026.8.31-cp313-cp313-win_amd64.whl (277 kB)
Downloading requests_file-3.0.1-py2.py3-none-any.whl (4.5 kB)
Using cached rich-15.0.0-py3-none-any.whl (310 kB)
Downloading pygments-2.21.0-py3-none-any.whl (1.3 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.3/1.3 MB 9.7 MB/s  0:00:00
Using cached markdown_it_py-4.2.0-py3-none-any.whl (91 kB)
Using cached mdurl-0.1.2-py3-none-any.whl (10.0 kB)
Using cached safetensors-0.8.0-cp310-abi3-win_amd64.whl (355 kB)
Using cached shellingham-1.5.4-py2.py3-none-any.whl (9.8 kB)
Downloading smart_open-8.0.1-py3-none-any.whl (73 kB)
Downloading torch-2.13.0-cp313-cp313-win_amd64.whl (122.1 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 122.1/122.1 MB 10.2 MB/s  0:00:12
Using cached networkx-3.6.1-py3-none-any.whl (2.1 MB)
Using cached sympy-1.14.0-py3-none-any.whl (6.3 MB)
Using cached mpmath-1.3.0-py3-none-any.whl (536 kB)
Using cached typing_extensions-4.16.0-py3-none-any.whl (45 kB)
Downloading typing_inspection-0.4.4-py3-none-any.whl (14 kB)
Using cached anyio-4.14.2-py3-none-any.whl (125 kB)
Using cached jinja2-3.1.6-py3-none-any.whl (134 kB)
Using cached markupsafe-3.0.3-cp313-cp313-win_amd64.whl (15 kB)
Using cached psutil-7.2.2-cp37-abi3-win_amd64.whl (137 kB)
Downloading wrapt-2.4.0-cp313-cp313-win_amd64.whl (96 kB)
Installing collected packages: mpmath, wrapt, urllib3, typing-extensions, sympy, spacy-loggers, spacy-legacy, shellingham, safetensors, regex, pyyaml, pygments, psutil, phonenumbers, numpy, networkx, murmurhash, mdurl, MarkupSafe, idna, h11, fsspec, filelock, cymem, confection, colorama, cloudpathlib, click, charset_normalizer, certifi, catalogue, annotated-types, annotated-doc, wasabi, typing-inspection, tqdm, srsly, smart-open, requests, pydantic-core, preshed, markdown-it-py, jinja2, httpcore, blis, anyio, torch, rich, requests-file, pydantic, huggingface_hub, httpx, typer, tokenizers, tldextract, thinc, accelerate, weasel, transformers, spacy, spacy_huggingface_pipelines, presidio_analyzer
ERROR: pip&#39;s dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
cyclopts 4.16.1 requires attrs&gt;=23.1.0, which is not installed.
jsonschema-path 0.5.0 requires attrs&gt;=22.2.0, which is not installed.
jsonschema-path 0.5.0 requires referencing&lt;0.38.0, which is not installed.
langchain-core 1.6.1 requires jsonpatch&lt;2.0.0,&gt;=1.33.0, which is not installed.
langchain-core 1.6.1 requires tenacity!=8.4.0,&lt;10.0.0,&gt;=8.1.0, which is not installed.
langsmith 0.11.2 requires distro&gt;=1.7.0, which is not installed.
langsmith 0.11.2 requires requests-toolbelt&gt;=1.0.0, which is not installed.
langsmith 0.11.2 requires sniffio&gt;=1.1, which is not installed.
langsmith 0.11.2 requires zstandard&gt;=0.23.0, which is not installed.
typing-inspect 0.9.0 requires mypy-extensions&gt;=0.3.0, which is not installed.
Successfully installed MarkupSafe-3.0.3 accelerate-1.14.0 annotated-doc-0.0.5 annotated-types-0.8.0 anyio-4.14.2 blis-1.3.3 catalogue-2.0.10 certifi-2026.7.22 charset_normalizer-3.5.1 click-8.5.0 cloudpathlib-0.25.0 colorama-0.4.6 confection-1.3.3 cymem-2.0.13 filelock-3.32.4 fsspec-2026.7.0 h11-0.16.0 httpcore-1.0.9 httpx-0.28.1 huggingface_hub-0.36.2 idna-3.19 jinja2-3.1.6 markdown-it-py-4.2.0 mdurl-0.1.2 mpmath-1.3.0 murmurhash-1.0.15 networkx-3.6.1 numpy-2.4.6 phonenumbers-9.0.38 preshed-3.0.13 presidio_analyzer-2.2.364 psutil-7.2.2 pydantic-2.13.5 pydantic-core-2.46.5 pygments-2.21.0 pyyaml-6.0.3 regex-2026.8.31 requests-2.34.2 requests-file-3.0.1 rich-15.0.0 safetensors-0.8.0 shellingham-1.5.4 smart-open-8.0.1 spacy-3.8.16 spacy-legacy-3.0.12 spacy-loggers-1.0.5 spacy_huggingface_pipelines-0.0.4 srsly-2.5.3 sympy-1.14.0 thinc-8.3.13 tldextract-5.3.2 tokenizers-0.22.2 torch-2.13.0 tqdm-4.70.0 transformers-4.57.6 typer-0.27.2 typing-extensions-4.16.0 typing-inspection-0.4.4 urllib3-2.7.0 wasabi-1.1.3 weasel-1.0.0 wrapt-2.4.0</code></pre></div>
</div>
</div>
</div>



<p class="wp-block-paragraph">　エラーを見ると、パッケージ(<code>cyclopts</code>、<code>jsonschema-path</code>、<code>langchain-core</code>、<code>langsmith</code>、<code>typing-inspect</code>)が、それぞれ必要とする依存パッケージ(<code>attrs</code>、<code>tenacity</code>、<code>sniffio</code>など)を持っていないというエラーなので、追加でpip install。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>pip install attrs tenacity sniffio requests-toolbelt distro zstandard jsonpatch mypy-extensions --upgrade</code></pre></div>



<p class="wp-block-paragraph">↓実行結果</p>



<div data-wp-context="{ &quot;autoclose&quot;: false, &quot;accordionItems&quot;: [] }" data-wp-interactive="core/accordion" role="group" class="wp-block-accordion is-layout-flow wp-block-accordion-is-layout-flow">
<div data-wp-class--is-open="state.isOpen" data-wp-context="{ &quot;id&quot;: &quot;accordion-item-2&quot;, &quot;openByDefault&quot;: false }" data-wp-init="callbacks.initAccordionItems" data-wp-on-window--hashchange="callbacks.hashChange" class="wp-block-accordion-item is-layout-flow wp-block-accordion-item-is-layout-flow">
<h4 class="wp-block-accordion-heading has-icon has-icon-right"><button aria-expanded="false" aria-controls="accordion-item-2-panel" data-wp-bind--aria-expanded="state.isOpen" data-wp-on--click="actions.toggle" id="accordion-item-2" type="button" class="wp-block-accordion-heading__toggle"><span class="wp-block-accordion-heading__toggle-title">実行結果</span><span class="wp-block-accordion-heading__toggle-icon" aria-hidden="true">+</span></button></h4>



<div aria-labelledby="accordion-item-2" data-wp-bind--hidden="state.isHidden" data-wp-on--beforematch="actions.handleBeforeMatch" id="accordion-item-2-panel" role="region" class="wp-block-accordion-panel is-layout-flow wp-block-accordion-panel-is-layout-flow">
<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>Collecting attrs
  Using cached attrs-26.1.0-py3-none-any.whl.metadata (8.8 kB)
Collecting tenacity
  Using cached tenacity-9.1.4-py3-none-any.whl.metadata (1.2 kB)
Collecting sniffio
  Using cached sniffio-1.3.1-py3-none-any.whl.metadata (3.9 kB)
Collecting requests-toolbelt
  Using cached requests_toolbelt-1.0.0-py2.py3-none-any.whl.metadata (14 kB)
Collecting distro
  Using cached distro-1.9.0-py3-none-any.whl.metadata (6.8 kB)
Collecting zstandard
  Using cached zstandard-0.25.0-cp313-cp313-win_amd64.whl.metadata (3.3 kB)
Collecting jsonpatch
  Using cached jsonpatch-1.33-py2.py3-none-any.whl.metadata (3.0 kB)
Collecting mypy-extensions
  Using cached mypy_extensions-1.1.0-py3-none-any.whl.metadata (1.1 kB)
Requirement already satisfied: requests&lt;3.0.0,&gt;=2.0.1 in C:\ProgramData\anaconda3\envs\presidio_20260831\Lib\site-packages (from requests-toolbelt) (2.34.2)
Requirement already satisfied: charset_normalizer&lt;4,&gt;=2 in C:\ProgramData\anaconda3\envs\presidio_20260831\Lib\site-packages (from requests&lt;3.0.0,&gt;=2.0.1-&gt;requests-toolbelt) (3.5.1)
Requirement already satisfied: idna&lt;4,&gt;=2.5 in C:\ProgramData\anaconda3\envs\presidio_20260831\Lib\site-packages (from requests&lt;3.0.0,&gt;=2.0.1-&gt;requests-toolbelt) (3.19)
Requirement already satisfied: urllib3&lt;3,&gt;=1.26 in C:\ProgramData\anaconda3\envs\presidio_20260831\Lib\site-packages (from requests&lt;3.0.0,&gt;=2.0.1-&gt;requests-toolbelt) (2.7.0)
Requirement already satisfied: certifi&gt;=2023.5.7 in C:\ProgramData\anaconda3\envs\presidio_20260831\Lib\site-packages (from requests&lt;3.0.0,&gt;=2.0.1-&gt;requests-toolbelt) (2026.7.22)
Collecting jsonpointer&gt;=1.9 (from jsonpatch)
  Using cached jsonpointer-3.1.1-py3-none-any.whl.metadata (2.4 kB)
Using cached attrs-26.1.0-py3-none-any.whl (67 kB)
Using cached tenacity-9.1.4-py3-none-any.whl (28 kB)
Using cached sniffio-1.3.1-py3-none-any.whl (10 kB)
Using cached requests_toolbelt-1.0.0-py2.py3-none-any.whl (54 kB)
Using cached distro-1.9.0-py3-none-any.whl (20 kB)
Using cached zstandard-0.25.0-cp313-cp313-win_amd64.whl (506 kB)
Using cached jsonpatch-1.33-py2.py3-none-any.whl (12 kB)
Using cached mypy_extensions-1.1.0-py3-none-any.whl (5.0 kB)
Using cached jsonpointer-3.1.1-py3-none-any.whl (7.7 kB)
Installing collected packages: zstandard, tenacity, sniffio, mypy-extensions, jsonpointer, distro, attrs, requests-toolbelt, jsonpatch
ERROR: pip&#39;s dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
jsonschema-path 0.5.0 requires referencing&lt;0.38.0, which is not installed.
Successfully installed attrs-26.1.0 distro-1.9.0 jsonpatch-1.33 jsonpointer-3.1.1 mypy-extensions-1.1.0 requests-toolbelt-1.0.0 sniffio-1.3.1 tenacity-9.1.4 zstandard-0.25.0</code></pre></div>
</div>
</div>
</div>



<p class="wp-block-paragraph">　まだエラーが出たので、更にpip install。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>pip install  cryptography  marshmallow==3.26.2 referencing</code></pre></div>



<p class="wp-block-paragraph">　これで、pip checkが通った。</p>



<h3 class="wp-block-heading">pip install presidio_anonymizer</h3>



<p class="wp-block-paragraph"> 次に、公式サイトの案内どおりにpresidio_anonymizerを入れる。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>pip install presidio_anonymizer</code></pre></div>



<p class="wp-block-paragraph">　これはそのままpip checkが通った。</p>



<h3 class="wp-block-heading">python -m spacy download en_core_web_sm</h3>



<p class="wp-block-paragraph">　spaCyの言語モデルをダウンロードする。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>python -m spacy download en_core_web_sm</code></pre></div>



<p class="wp-block-paragraph">　言語モデルは仮想環境のsite-packages内に配置される。</p>



<h3 class="wp-block-heading">（任意）pip install presidio_image_redactor</h3>



<p class="wp-block-paragraph">　画像から個人情報を削除する場合に必要となるパッケージをインストールする。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>pip install presidio_image_redactor</code></pre></div>



<p class="wp-block-paragraph">　tesseract OCRもインストールしておく。これがないと動かん。</p>


<a rel="noopener" href="https://github.com/tesseract-ocr/tesseract" title="GitHub - tesseract-ocr/tesseract: Tesseract Open Source OCR Engine (main repository)" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/85b82f4dcd7c60dfbc7ba136093a09dc.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">GitHub &#8211; tesseract-ocr/tesseract: Tesseract Open Source OCR Engine (main repository)</div><div class="blogcard-snippet external-blogcard-snippet">Tesseract Open Source OCR Engine (main repository) &#8211; tesseract-ocr/tesseract</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/tesseract-ocr/tesseract" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>


<p class="wp-block-paragraph">↓インストーラーはここ</p>


<a rel="noopener" href="https://github.com/UB-Mannheim/tesseract/wiki" title="Home" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/5ecc705cf5be00d449e5a40e0fcccfdb.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">Home</div><div class="blogcard-snippet external-blogcard-snippet">Tesseract Open Source OCR Engine (main repository) &#8211; UB-Mannheim/tesseract</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://github.com/UB-Mannheim/tesseract/wiki/Home" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">github.com</div></div></div></div></a>


<p class="wp-block-paragraph">　インストール途中に追加スクリプトを選べる。日本語を追加しておくと吉。</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-7387b849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-3.png"><img loading="lazy" decoding="async" width="499" height="388" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-3.png" alt="" class="wp-image-737" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-3.png 499w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-3-300x233.png 300w" sizes="(max-width: 499px) 100vw, 499px" /></a></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-4.png"><img loading="lazy" decoding="async" width="499" height="388" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-4.png" alt="" class="wp-image-738" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-4.png 499w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-4-300x233.png 300w" sizes="(max-width: 499px) 100vw, 499px" /></a></figure>
</div>
</div>



<p class="wp-block-paragraph">　インストールされたフォルダ（デフォはC:\Program Files\Tesseract-OCR）をPATHを通しておくといい。<br>　ただし、下のほうの実行コードのようにインストールパスを指定してあげれば、PATHを通さなくても問題なく動く。</p>



<h3 class="wp-block-heading">（任意）JupterLabなどのインストール</h3>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>pip install jupyterlab ipywidgets</code></pre></div>



<h3 class="wp-block-heading">requirements.txt</h3>



<p class="wp-block-paragraph">　仮想環境のrequirements.txt</p>



<div class="wp-block-file"><a id="wp-block-file--media-9dd8af17-afaa-4630-99bf-c3fbb2181c71" href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/requirements_presidio_20260831.txt">requirements_presidio_20260831.txt</a><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/requirements_presidio_20260831.txt" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-9dd8af17-afaa-4630-99bf-c3fbb2181c71">ダウンロード</a></div>



<h2 class="wp-block-heading">使ってみる</h2>



<h3 class="wp-block-heading">テキスト</h3>



<p class="wp-block-paragraph">　実行方法はspaCyモデルを使う方法と、Transformersを使う方法がある。前者だと、ユーザーフォルダ\.cache\huggingface\hub\models&#8211;dslim&#8211;bert-base-NERにモデルをダウンロードされる。</p>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-1.png"><img loading="lazy" decoding="async" width="616" height="118" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-1.png" alt="" class="wp-image-730" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-1.png 616w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-1-300x57.png 300w" sizes="(max-width: 616px) 100vw, 616px" /></a></figure>



<p class="wp-block-paragraph">　cacheフォルダにダウンロードされるとCドライブを圧迫されるので、今回は別ドライブに事前にダウンロードしたモデルをTransformersで動かす方法を使う。</p>



<p class="wp-block-paragraph">　テスト用の文章として、では夢の国在住の田中君を使う。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>text = &quot;私は田中太郎。住所は279-0031 千葉県浦安市舞浜１−１。電話番号は03-999-9999。マイナンバーは123456789012。&quot;</code></pre></div>



<h4 class="wp-block-heading">公式ドキュメントどおりに動かす</h4>



<p class="wp-block-paragraph">　必要に応じて、以下のモデルを任意の場所にダウンロードしておく。</p>


<a rel="noopener" href="https://huggingface.co/dslim/bert-base-NER/tree/main" title="dslim/bert-base-NER at main" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/d8bbc8d752e0454977585073ab17110e.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">dslim/bert-base-NER at main</div><div class="blogcard-snippet external-blogcard-snippet">We???re on a journey to advance and democratize artificial intelligence through open source and open science.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://huggingface.co/dslim/bert-base-NER/tree/main" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">huggingface.co</div></div></div></div></a>


<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>from presidio_analyzer import AnalyzerEngine
from presidio_analyzer.nlp_engine import TransformersNlpEngine
from presidio_anonymizer import AnonymizerEngine

model_config = [{&quot;lang_code&quot;: &quot;en&quot;, &quot;model_name&quot;: {
    &quot;spacy&quot;: &quot;en_core_web_sm&quot;,  # use a small spaCy model for lemmas, tokens etc.
    &quot;transformers&quot;: r&quot;H:\BERT_Models\dslim\bert-base-NER&quot;
    }
}]

nlp_engine = TransformersNlpEngine(models=model_config)
analyzer = AnalyzerEngine(nlp_engine=nlp_engine)

results = analyzer.analyze(text=text, language=&#39;en&#39;)
print(results)

anonymizer = AnonymizerEngine()
anonymized_text = anonymizer.anonymize(text=text, analyzer_results=results)

print(anonymized_text)</code></pre></div>



<p class="wp-block-paragraph">↓実行結果</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>Some weights of the model checkpoint at H:\BERT_Models\dslim\bert-base-NER were not used when initializing BertForTokenClassification: [&#39;bert.pooler.dense.bias&#39;, &#39;bert.pooler.dense.weight&#39;]
- This IS expected if you are initializing BertForTokenClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
- This IS NOT expected if you are initializing BertForTokenClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).
Device set to use cpu
[type: PHONE_NUMBER, start: 36, end: 47, score: 0.4]
text: 私は田中太郎。住所は279-0031 千葉県浦安市舞浜１−１。電話番号は&lt;PHONE_NUMBER&gt;。マイナンバーは123456789012。
items:
[
    {&#39;start&#39;: 36, &#39;end&#39;: 50, &#39;entity_type&#39;: &#39;PHONE_NUMBER&#39;, &#39;text&#39;: &#39;&lt;PHONE_NUMBER&gt;&#39;, &#39;operator&#39;: &#39;replace&#39;}
]</code></pre></div>



<p class="wp-block-paragraph">　電話番号はマスクされたが、他はダメ。</p>



<h4 class="wp-block-heading">NERモデルを日本語対応のものに変更してみる</h4>


<a rel="noopener" href="https://huggingface.co/tsmatz/xlm-roberta-ner-japanese/tree/main" title="tsmatz/xlm-roberta-ner-japanese at main" class="blogcard-wrap external-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard external-blogcard eb-left cf"><div class="blogcard-label external-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail external-blogcard-thumbnail"><img loading="lazy" decoding="async" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/cocoon-resources/blog-card-cache/21d5a97e3e1c79b7b2a07c6dc97096ba.png" alt="" class="blogcard-thumb-image external-blogcard-thumb-image" width="320" height="180" /></figure><div class="blogcard-content external-blogcard-content"><div class="blogcard-title external-blogcard-title">tsmatz/xlm-roberta-ner-japanese at main</div><div class="blogcard-snippet external-blogcard-snippet">We’re on a journey to advance and democratize artificial intelligence through open source and open science.</div></div><div class="blogcard-footer external-blogcard-footer cf"><div class="blogcard-site external-blogcard-site"><div class="blogcard-favicon external-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://huggingface.co/tsmatz/xlm-roberta-ner-japanese/tree/main" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">huggingface.co</div></div></div></div></a>


<p class="wp-block-paragraph">　日本語トークナイザをダウンロードしておく。</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>python -m spacy download ja_core_news_sm</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>model_config = [{&quot;lang_code&quot;: &quot;ja&quot;, &quot;model_name&quot;: {
    &quot;spacy&quot;: &quot;ja_core_news_sm&quot;,
    &quot;transformers&quot;: r&quot;H:\BERT_Models\tsmatz\xlm-roberta-ner-japanese&quot;
    }
}]

nlp_engine = TransformersNlpEngine(models=model_config)
analyzer = AnalyzerEngine(nlp_engine=nlp_engine)

results = analyzer.analyze(text=text, language=&#39;ja&#39;)
print(results)

anonymizer = AnonymizerEngine()
anonymized_text = anonymizer.anonymize(text=text, analyzer_results=results)

print(anonymized_text)</code></pre></div>



<p class="wp-block-paragraph">↓実行結果</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>Device set to use cpu
[type: LOCATION, start: 19, end: 21, score: 0.9985260963439941]
text: 私は田中太郎。住所は279-0031 &lt;LOCATION&gt;県浦安市舞浜１−１。電話番号は03-999-9999。マイナンバーは123456789012。
items:
[
    {&#39;start&#39;: 19, &#39;end&#39;: 29, &#39;entity_type&#39;: &#39;LOCATION&#39;, &#39;text&#39;: &#39;&lt;LOCATION&gt;&#39;, &#39;operator&#39;: &#39;replace&#39;}
]

c:\ProgramData\anaconda3\envs\presidio_20260831\Lib\site-packages\transformers\pipelines\token_classification.py:490: UserWarning: Tokenizer does not support real words, using fallback heuristic
  warnings.warn(</code></pre></div>



<p class="wp-block-paragraph">　千葉はマスクされたが、他がダメ。</p>



<h4 class="wp-block-heading">ginzaを使ってみる</h4>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>pip install -U ginza ja_ginza</code></pre></div>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import spacy
import ginza

# GiNZAのcompound_splitterはsplit_mode未指定だとエラーになるため、
# spacy.load を一時的にラップしてconfigを注入する
_original_spacy_load = spacy.load

def _patched_spacy_load(name, *args, **kwargs):
    if name == &quot;ja_ginza&quot; and &quot;config&quot; not in kwargs:
        kwargs[&quot;config&quot;] = {&quot;components&quot;: {&quot;compound_splitter&quot;: {&quot;split_mode&quot;: &quot;A&quot;}}}
    return _original_spacy_load(name, *args, **kwargs)

spacy.load = _patched_spacy_load


from presidio_analyzer import AnalyzerEngine
from presidio_analyzer.nlp_engine import TransformersNlpEngine
from presidio_anonymizer import AnonymizerEngine

model_config = [{&quot;lang_code&quot;: &quot;ja&quot;, &quot;model_name&quot;: {
    &quot;spacy&quot;: &quot;ja_ginza&quot;,  # ← ja_core_news_sm から変更
    &quot;transformers&quot;: r&quot;H:\BERT_Models\tsmatz\xlm-roberta-ner-japanese&quot;
    }
}]

nlp_engine = TransformersNlpEngine(models=model_config)
analyzer = AnalyzerEngine(nlp_engine=nlp_engine)

results = analyzer.analyze(text=text, language=&#39;ja&#39;)
print(results)

anonymizer = AnonymizerEngine()
anonymized_text = anonymizer.anonymize(text=text, analyzer_results=results)

print(anonymized_text)</code></pre></div>



<p class="wp-block-paragraph">↓実行結果</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>Device set to use cpu
[type: LOCATION, start: 19, end: 27, score: 0.9985260963439941]
text: 私は田中太郎。住所は279-0031 &lt;LOCATION&gt;１−１。電話番号は03-999-9999。マイナンバーは123456789012。
items:
[
    {&#39;start&#39;: 19, &#39;end&#39;: 29, &#39;entity_type&#39;: &#39;LOCATION&#39;, &#39;text&#39;: &#39;&lt;LOCATION&gt;&#39;, &#39;operator&#39;: &#39;replace&#39;}
]

c:\ProgramData\anaconda3\envs\presidio_20260831\Lib\site-packages\transformers\pipelines\token_classification.py:490: UserWarning: Tokenizer does not support real words, using fallback heuristic
  warnings.warn(</code></pre></div>



<h4 class="wp-block-heading">カスタムレコグナイザーでなんとかする</h4>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import spacy
import ginza

if not getattr(spacy.load, &quot;_ja_ginza_patched&quot;, False):
    _original_spacy_load = spacy.load

    def _make_patched_load(original_load):
        def _patched(name, *args, **kwargs):
            if name == &quot;ja_ginza&quot;:
                # &quot;disable&quot; は生成はするが実行しないだけなので、
                # compound_splitter の split_mode 検証エラーを避けられない。
                # &quot;exclude&quot; ならコンポーネント自体を生成しないため、この問題を回避できる。
                exclude = list(kwargs.get(&quot;exclude&quot;, []))
                for comp in (&quot;compound_splitter&quot;, &quot;bunsetu_recognizer&quot;):
                    if comp not in exclude:
                        exclude.append(comp)
                kwargs[&quot;exclude&quot;] = exclude
                kwargs.pop(&quot;config&quot;, None)
            return original_load(name, *args, **kwargs)
        _patched._ja_ginza_patched = True
        return _patched

    spacy.load = _make_patched_load(_original_spacy_load)

from presidio_analyzer import AnalyzerEngine, Pattern, PatternRecognizer, RecognizerRegistry
from presidio_analyzer.nlp_engine import TransformersNlpEngine, NerModelConfiguration
from presidio_anonymizer import AnonymizerEngine


# ============================================================
# NLPエンジン設定(GiNZA + xlm-roberta-ner-japanese)
# ============================================================
model_config = [{&quot;lang_code&quot;: &quot;ja&quot;, &quot;model_name&quot;: {
    &quot;spacy&quot;: &quot;ja_ginza&quot;,
    &quot;transformers&quot;: r&quot;H:\BERT_Models\tsmatz\xlm-roberta-ner-japanese&quot;
    }
}]

ner_model_configuration = NerModelConfiguration(
    model_to_presidio_entity_mapping={
        &quot;PER&quot;: &quot;PERSON&quot;,
        &quot;PERSON&quot;: &quot;PERSON&quot;,
        &quot;LOC&quot;: &quot;LOCATION&quot;,
        &quot;GPE&quot;: &quot;LOCATION&quot;,
        &quot;ORG&quot;: &quot;ORGANIZATION&quot;,
        &quot;DAT&quot;: &quot;DATE_TIME&quot;,
        &quot;DATE&quot;: &quot;DATE_TIME&quot;,
        &quot;TIM&quot;: &quot;DATE_TIME&quot;,
        &quot;TIME&quot;: &quot;DATE_TIME&quot;,
        &quot;MONEY&quot;: &quot;MONEY&quot;,
        &quot;PERCENT&quot;: &quot;PERCENT&quot;,
    },
    low_confidence_score_multiplier=0.4,
    low_score_entity_names=[&quot;ORGANIZATION&quot;],
    alignment_mode=&quot;expand&quot;,
    aggregation_strategy=&quot;simple&quot;,  # 日本語(スペース無し)では&quot;average&quot;等だと、空白ベースのフォールバック判定が誤動作するため&quot;simple&quot;を使う
)

nlp_engine = TransformersNlpEngine(
    models=model_config,
    ner_model_configuration=ner_model_configuration,
)
nlp_engine.load()


# ============================================================
# カスタムレコグナイザー: 郵便番号・マイナンバー
# ============================================================
postal_recognizer = PatternRecognizer(
    supported_entity=&quot;JP_POSTAL_CODE&quot;,
    patterns=[Pattern(name=&quot;jp_postal_code&quot;, regex=r&quot;\b\d{3}-\d{4}\b&quot;, score=0.85)],
    context=[&quot;郵便番号&quot;, &quot;〒&quot;],
    supported_language=&quot;ja&quot;,
)

my_number_recognizer = PatternRecognizer(
    supported_entity=&quot;JP_MY_NUMBER&quot;,
    patterns=[Pattern(name=&quot;jp_my_number&quot;, regex=r&quot;(?&lt;!\d)\d{12}(?!\d)&quot;, score=0.3)],
    context=[&quot;マイナンバー&quot;, &quot;個人番号&quot;],
    supported_language=&quot;ja&quot;,
)


# ============================================================
# レジストリ構築(既定 + カスタムを統合)
# ============================================================
registry = RecognizerRegistry(supported_languages=[&quot;ja&quot;])
registry.load_predefined_recognizers(nlp_engine=nlp_engine, languages=[&quot;ja&quot;])
registry.add_recognizer(postal_recognizer)
registry.add_recognizer(my_number_recognizer)

analyzer = AnalyzerEngine(
    nlp_engine=nlp_engine,
    registry=registry,
    supported_languages=[&quot;ja&quot;],
)


# ============================================================
# 実行
# ============================================================
results = analyzer.analyze(text=text, language=&#39;ja&#39;)
print(results)

anonymizer = AnonymizerEngine()
anonymized_text = anonymizer.anonymize(text=text, analyzer_results=results)

print(anonymized_text)</code></pre></div>



<p class="wp-block-paragraph">↓実行結果</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>Device set to use cpu
[type: PERSON, start: 2, end: 6, score: 0.999563992023468, type: LOCATION, start: 10, end: 30, score: 0.998464047908783, type: JP_POSTAL_CODE, start: 39, end: 47, score: 0.85, type: JP_MY_NUMBER, start: 55, end: 67, score: 0.6499999999999999, type: PHONE_NUMBER, start: 36, end: 47, score: 0.4]
text: 私は&lt;PERSON&gt;。住所は&lt;LOCATION&gt;。電話番号は&lt;PHONE_NUMBER&gt;。マイナンバーは&lt;JP_MY_NUMBER&gt;。
items:
[
    {&#39;start&#39;: 52, &#39;end&#39;: 66, &#39;entity_type&#39;: &#39;JP_MY_NUMBER&#39;, &#39;text&#39;: &#39;&lt;JP_MY_NUMBER&gt;&#39;, &#39;operator&#39;: &#39;replace&#39;},
    {&#39;start&#39;: 30, &#39;end&#39;: 44, &#39;entity_type&#39;: &#39;PHONE_NUMBER&#39;, &#39;text&#39;: &#39;&lt;PHONE_NUMBER&gt;&#39;, &#39;operator&#39;: &#39;replace&#39;},
    {&#39;start&#39;: 14, &#39;end&#39;: 24, &#39;entity_type&#39;: &#39;LOCATION&#39;, &#39;text&#39;: &#39;&lt;LOCATION&gt;&#39;, &#39;operator&#39;: &#39;replace&#39;},
    {&#39;start&#39;: 2, &#39;end&#39;: 10, &#39;entity_type&#39;: &#39;PERSON&#39;, &#39;text&#39;: &#39;&lt;PERSON&gt;&#39;, &#39;operator&#39;: &#39;replace&#39;}
]</code></pre></div>



<h3 class="wp-block-heading">画像</h3>



<p class="wp-block-paragraph">　テストに使った画像。</p>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/pii_test_document.png"><img loading="lazy" decoding="async" width="607" height="380" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/pii_test_document.png" alt="" class="wp-image-739" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/pii_test_document.png 607w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/pii_test_document-300x188.png 300w" sizes="(max-width: 607px) 100vw, 607px" /></a></figure>



<h4 class="wp-block-heading">サンプルコードのまま</h4>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>import pytesseract
from presidio_image_redactor import ImageRedactorEngine
from PIL import Image

pytesseract.pytesseract.tesseract_cmd = r&quot;C:\Program Files\Tesseract-OCR\tesseract.exe&quot;

image = Image.open(r&quot;D:\Workspace\Python\Presidio\pii_test_document.png&quot;)

redactor = ImageRedactorEngine()
redacted_image = redactor.redact(image=image, ocr_kwargs={&quot;lang&quot;: &quot;jpn&quot;})

# オリジナル表示
display(image)
display(redacted_image)</code></pre></div>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-5.png"><img loading="lazy" decoding="async" width="603" height="373" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-5.png" alt="" class="wp-image-740" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-5.png 603w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-5-300x186.png 300w" sizes="(max-width: 603px) 100vw, 603px" /></a></figure>



<h4 class="wp-block-heading">カスタムレコグナイザーあり</h4>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import spacy
import ginza

if not getattr(spacy.load, &quot;_ja_ginza_patched&quot;, False):
    _original_spacy_load = spacy.load

    def _make_patched_load(original_load):
        def _patched(name, *args, **kwargs):
            if name == &quot;ja_ginza&quot;:
                exclude = list(kwargs.get(&quot;exclude&quot;, []))
                for comp in (&quot;compound_splitter&quot;, &quot;bunsetu_recognizer&quot;):
                    if comp not in exclude:
                        exclude.append(comp)
                kwargs[&quot;exclude&quot;] = exclude
                kwargs.pop(&quot;config&quot;, None)
            return original_load(name, *args, **kwargs)
        _patched._ja_ginza_patched = True
        return _patched

    spacy.load = _make_patched_load(_original_spacy_load)


from presidio_analyzer import AnalyzerEngine, Pattern, PatternRecognizer, RecognizerRegistry
from presidio_analyzer.nlp_engine import TransformersNlpEngine, NerModelConfiguration
from presidio_image_redactor import ImageRedactorEngine, ImageAnalyzerEngine
import pytesseract
from PIL import Image

pytesseract.pytesseract.tesseract_cmd = r&quot;C:\Program Files\Tesseract-OCR\tesseract.exe&quot;


# ============================================================
# 日本語NLPエンジン(GiNZA + xlm-roberta-ner-japanese)
# ============================================================
model_config = [{&quot;lang_code&quot;: &quot;ja&quot;, &quot;model_name&quot;: {
    &quot;spacy&quot;: &quot;ja_ginza&quot;,
    &quot;transformers&quot;: r&quot;H:\BERT_Models\tsmatz\xlm-roberta-ner-japanese&quot;
    }
}]

ner_model_configuration = NerModelConfiguration(
    model_to_presidio_entity_mapping={
        &quot;PER&quot;: &quot;PERSON&quot;, &quot;PERSON&quot;: &quot;PERSON&quot;,
        &quot;LOC&quot;: &quot;LOCATION&quot;, &quot;GPE&quot;: &quot;LOCATION&quot;,
        &quot;ORG&quot;: &quot;ORGANIZATION&quot;,
        &quot;DAT&quot;: &quot;DATE_TIME&quot;, &quot;DATE&quot;: &quot;DATE_TIME&quot;,
        &quot;TIM&quot;: &quot;DATE_TIME&quot;, &quot;TIME&quot;: &quot;DATE_TIME&quot;,
        &quot;MONEY&quot;: &quot;MONEY&quot;, &quot;PERCENT&quot;: &quot;PERCENT&quot;,
    },
    low_confidence_score_multiplier=0.4,
    low_score_entity_names=[&quot;ORGANIZATION&quot;],
    alignment_mode=&quot;expand&quot;,
    aggregation_strategy=&quot;simple&quot;,
)

nlp_engine = TransformersNlpEngine(models=model_config, ner_model_configuration=ner_model_configuration)
nlp_engine.load()


# ============================================================
# カスタムレコグナイザー(郵便番号・マイナンバー)
# ============================================================
postal_recognizer = PatternRecognizer(
    supported_entity=&quot;JP_POSTAL_CODE&quot;,
    patterns=[Pattern(name=&quot;jp_postal_code&quot;, regex=r&quot;\b\d{3}-\d{4}\b&quot;, score=0.85)],
    context=[&quot;郵便番号&quot;, &quot;〒&quot;],
    supported_language=&quot;ja&quot;,
)
my_number_recognizer = PatternRecognizer(
    supported_entity=&quot;JP_MY_NUMBER&quot;,
    patterns=[Pattern(name=&quot;jp_my_number&quot;, regex=r&quot;(?&lt;!\d)\d{12}(?!\d)&quot;, score=0.3)],
    context=[&quot;マイナンバー&quot;, &quot;個人番号&quot;],
    supported_language=&quot;ja&quot;,
)

registry = RecognizerRegistry(supported_languages=[&quot;ja&quot;])
registry.load_predefined_recognizers(nlp_engine=nlp_engine, languages=[&quot;ja&quot;])
registry.add_recognizer(postal_recognizer)
registry.add_recognizer(my_number_recognizer)

analyzer = AnalyzerEngine(nlp_engine=nlp_engine, registry=registry, supported_languages=[&quot;ja&quot;])


# ============================================================
# 画像レダクター: 日本語analyzerを明示的に組み込む
# ============================================================
image_analyzer_engine = ImageAnalyzerEngine(analyzer_engine=analyzer)
redactor = ImageRedactorEngine(image_analyzer_engine=image_analyzer_engine)

image = Image.open(r&quot;D:\Workspace\Python\Presidio\pii_test_document.png&quot;)

redacted_image = redactor.redact(
    image=image,
    ocr_kwargs={&quot;lang&quot;: &quot;jpn&quot;},
    language=&quot;ja&quot;,
)

redacted_image</code></pre></div>



<figure class="wp-block-image size-full"><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-6.png"><img loading="lazy" decoding="async" width="602" height="376" src="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-6.png" alt="" class="wp-image-741" srcset="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-6.png 602w, https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/image-6-300x187.png 300w" sizes="(max-width: 602px) 100vw, 602px" /></a></figure>



<p class="wp-block-paragraph">　「田」が貫通しているが、これが限界かなぁ。<br>　以上！</p>



<h2 class="wp-block-heading">実行したipynb</h2>



<div class="wp-block-file"><a id="wp-block-file--media-f411ee17-6899-42bc-98d3-207f89dde37c" href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/Presidio_検証.ipynb">Presidio_検証.ipynb</a><a href="https://toybox.uranos8685.mydns.jp/wp-content/uploads/2026/08/Presidio_検証.ipynb" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-f411ee17-6899-42bc-98d3-207f89dde37c">ダウンロード</a></div>



<p class="wp-block-paragraph"></p><p>The post <a href="https://toybox.uranos8685.mydns.jp/726/%e3%80%90pii%e3%80%91presidio%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/">【PII】Presidioを使ってみる</a> first appeared on <a href="https://toybox.uranos8685.mydns.jp">Uranos8685のおもちゃ箱</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://toybox.uranos8685.mydns.jp/726/%e3%80%90pii%e3%80%91presidio%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%82%8b/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">726</post-id>	</item>
	</channel>
</rss>
