<?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>CGBeginner | CGBeginner たてはま</title>
	<atom:link href="https://cgbeginner.net/author/cgbeginner/feed/" rel="self" type="application/rss+xml" />
	<link>https://cgbeginner.net</link>
	<description>個人CGクリエイターの雑記帳</description>
	<lastBuildDate>Sat, 13 Jun 2026 11:39:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://cgbeginner.net/wp-content/uploads/2016/09/cropped-favicon_512-32x32.png</url>
	<title>CGBeginner | CGBeginner たてはま</title>
	<link>https://cgbeginner.net</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">152190934</site>	<item>
		<title>Xiaomi Smart Band 7をGadgetbridgeに移行してInfluxDB/Grafanaで可視化</title>
		<link>https://cgbeginner.net/xiaomi-smart-band-7-gadgetbridge-influxdb-grafana/</link>
					<comments>https://cgbeginner.net/xiaomi-smart-band-7-gadgetbridge-influxdb-grafana/#respond</comments>
		
		<dc:creator><![CDATA[CGBeginner]]></dc:creator>
		<pubDate>Sat, 13 Jun 2026 11:39:45 +0000</pubDate>
				<category><![CDATA[コンピュータ]]></category>
		<guid isPermaLink="false">https://cgbeginner.net/?p=2616</guid>

					<description><![CDATA[これは、Xiaomi Smart Band 7 のデータを Gadgetbridge 経由で取り出し、InfluxDB に保存して Grafana で可視化するまでの個人的な作業メモです。 作業自体は、デバッグモードにし [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">これは、Xiaomi Smart Band 7 のデータを Gadgetbridge 経由で取り出し、InfluxDB に保存して Grafana で可視化するまでの個人的な作業メモです。 </p>



<p class="wp-block-paragraph">作業自体は、デバッグモードにしたスマホをUSBでつなぎ、Codex GPT-5.5 xhighに自由にadbコマンドをたたいてもらって95%くらい自律的にやってもらいました。</p>



<p class="wp-block-paragraph">もし役立てばということで記録します。</p>


</blockquote>


<h2 class="wp-block-heading"><span id="toc1">やりたかったこと</span></h2>



<p class="wp-block-paragraph">Xiaomi Smart Band 7
は小さくて軽く、電池持ちもよく、日常的に着けっぱなしにしやすいスマートバンドです。</p>



<p class="wp-block-paragraph">ただ、歩数、心拍、睡眠、SpO2 などのデータは基本的に Zepp Life や Mi
Fitness
のアプリ内で見る前提になっています。自分の用途では、これを外へ出して、InfluxDB
に蓄積し、Grafana で長期的に見たいという目的がありました。</p>



<p class="wp-block-paragraph">今回の方針はこうです。</p>



<ol class="wp-block-list">
<li>Xiaomi Smart Band 7 を Zepp Life から Gadgetbridge 運用へ移す</li>



<li>Gadgetbridge でアクティビティデータを同期する</li>



<li>Gadgetbridge の SQLite DB を Android スマホ内に自動エクスポートする</li>



<li>Syncthing-Fork でその DB をサーバーへ同期する</li>



<li>サーバー側で SQLite を読んで InfluxDB に投入する</li>



<li>Grafana でダッシュボード化する</li>
</ol>



<p class="wp-block-paragraph">全体像はこうなりました。</p>



<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">flowchart LR
    band["Xiaomi Smart Band 7"] -->|Bluetooth| phone["Galaxy S24 Ultra&lt;br/>Gadgetbridge"]
    phone -->|Auto fetch activity data| gbdb["Gadgetbridge internal DB"]
    gbdb -->|Auto export database| exportdb["/sdcard/Documents/Gadgetbridge/Gadgetbridge.db"]
    exportdb -->|Syncthing-Fork| server["Orion&lt;br/>Syncthing receive-only folder"]
    server --> importer["gb2influx&lt;br/>Docker container"]
    importer --> influx["InfluxDB"]
    influx --> grafana["Grafana dashboard"]</pre></div>



<p class="wp-block-paragraph">スマホは Bluetooth 同期と DB エクスポートだけを担当し、InfluxDB token
を持たせない構成にしました。Python で DB を読んで InfluxDB
に書き込む処理は、Android ではなく Linux サーバー側で動かします。</p>



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



<p class="wp-block-paragraph">今回確認した環境です。</p>



<pre class="wp-block-code"><code>Phone: Galaxy S24 Ultra
Android: 16
Model: SM-S928Q
Band: Xiaomi Smart Band 7
Gadgetbridge: nodomain.freeyourgadget.gadgetbridge 0.91.1
Zepp Life: com.xiaomi.hm.health 6.16.0
ADB: Windows platform-tools from WSL</code></pre>



<p class="wp-block-paragraph">ADB は WSL から Windows 側の platform-tools を呼び出しました。</p>



<pre class="wp-block-code"><code>/mnt/c/Software/platform-tools/adb.exe</code></pre>



<h2 class="wp-block-heading"><span id="toc3">重要な注意点</span></h2>



<p class="wp-block-paragraph">Smart Band 7 を Gadgetbridge で使うには、Huami/Xiaomi の auth key
が必要です。</p>



<p class="wp-block-paragraph">この auth key を取得する前に Zepp Life
アプリ側でバンドを解除すると、キーが無効になり、やり直しになります。Android
の Bluetooth 設定からペアリング情報を消すことと、Zepp Life
アプリ内でデバイス解除することは別物です。</p>



<p class="wp-block-paragraph">今回やったこと、やらなかったことはこうです。</p>



<pre class="wp-block-code"><code>OK:
  - Zepp Life を強制停止する
  - Zepp Life を disable-user で無効化する
  - Gadgetbridge 接続成功後に Zepp Life を止める
  - Android OS 側の Bluetooth ペアリング情報を必要に応じて整理する

NG:
  - auth key 取得前に Zepp Life アプリ内でバンドを解除する
  - バンド本体を初期化する</code></pre>



<p class="wp-block-paragraph">Auth key 自体はこの記事には載せません。</p>



<h2 class="wp-block-heading"><span id="toc4">Zepp Life を止める</span></h2>



<p class="wp-block-paragraph">auth key を取得し、Gadgetbridge 側へ移行する準備ができたので、Zepp Life
を強制停止して無効化しました。</p>



<pre class="wp-block-code"><code>/mnt/c/Software/platform-tools/adb.exe shell am force-stop com.xiaomi.hm.health
/mnt/c/Software/platform-tools/adb.exe shell pm disable-user --user 0 com.xiaomi.hm.health</code></pre>



<p class="wp-block-paragraph">無効化されていることを確認します。</p>



<pre class="wp-block-code"><code>/mnt/c/Software/platform-tools/adb.exe shell cmd package list packages -d</code></pre>



<p class="wp-block-paragraph">実行結果です。</p>



<pre class="wp-block-code"><code>package:com.xiaomi.hm.health</code></pre>



<p class="wp-block-paragraph">戻す場合は以下です。</p>



<pre class="wp-block-code"><code>/mnt/c/Software/platform-tools/adb.exe shell pm enable com.xiaomi.hm.health</code></pre>



<h2 class="wp-block-heading"><span id="toc5">Gadgetbridge にペアリングする</span></h2>



<p class="wp-block-paragraph">Gadgetbridge 側では、次の流れで Smart Band 7 を追加しました。</p>



<ol class="wp-block-list">
<li>Gadgetbridge を開く</li>



<li>Device discovery を開く</li>



<li>Start discovery を押す</li>



<li>Smart Band 7 が見つかる</li>



<li>デバイス行を長押しする</li>



<li>Authentication settings を開く</li>



<li>auth key を入力する</li>



<li>Submit する</li>



<li>デバイス行を選択する</li>



<li>Android の Bluetooth ペアリング確認を許可する</li>



<li>Companion device permission を許可する</li>



<li>バンド側に確認が出たら承認する</li>
</ol>



<p class="wp-block-paragraph">接続後、Gadgetbridge のメイン画面に Smart Band 7
が表示され、歩数、距離、睡眠などの値が出るようになりました。</p>



<p class="wp-block-paragraph">この時点で、Zepp Life は「アプリ内で解除した」のではなく、Android
側で止めただけです。</p>



<h2 class="wp-block-heading"><span id="toc6">Gadgetbridge の自動同期設定</span></h2>



<p class="wp-block-paragraph">Gadgetbridge では、まずアクティビティデータの自動取得を有効化しました。</p>



<pre class="wp-block-code"><code>Settings -&gt; Automations -&gt; Auto fetch activity data</code></pre>



<p class="wp-block-paragraph">これは、バンドからスマホ上の Gadgetbridge
へデータを取り込む設定です。サーバーへの送信ではありません。</p>



<p class="wp-block-paragraph">次に DB の自動エクスポートを有効化しました。</p>



<pre class="wp-block-code"><code>Settings -&gt; Automations -&gt; Auto export database</code></pre>



<p class="wp-block-paragraph">エクスポート先は以下にしました。</p>



<pre class="wp-block-code"><code>/sdcard/Documents/Gadgetbridge/Gadgetbridge.db</code></pre>



<p class="wp-block-paragraph">Android のパスとしては、こちらと同じ場所です。</p>



<pre class="wp-block-code"><code>/storage/emulated/0/Documents/Gadgetbridge/Gadgetbridge.db</code></pre>



<p class="wp-block-paragraph">ここで重要なのは、Auto export database
はあくまで「スマホ内の通常ストレージへ SQLite DB
を書き出す」だけということです。サーバーへ自動で送るには、Syncthing
などの別アプリが必要です。</p>



<p class="wp-block-paragraph">エクスポート間隔は最終的に 3
時間にしました。健康データの可視化であればリアルタイム性はそこまで必要ないので、まずはこのくらいで十分と判断しました。反映遅延は、ざっくり「Gadgetbridge
のエクスポート間隔 + Syncthing 同期 + importer の実行間隔」です。</p>



<h2 class="wp-block-heading"><span id="toc7">スマホ内の DB を確認する</span></h2>



<p class="wp-block-paragraph">ADB で、スマホ内に DB が出ているか確認しました。</p>



<pre class="wp-block-code"><code>/mnt/c/Software/platform-tools/adb.exe shell '
for d in /sdcard/Documents/Gadgetbridge /storage/emulated/0/Documents/Gadgetbridge; do
  echo DIR:$d
  ls -la "$d" 2&gt;&amp;1
done
' | tr -d '\r'</code></pre>



<p class="wp-block-paragraph">実行結果です。</p>



<pre class="wp-block-code"><code>DIR:/sdcard/Documents/Gadgetbridge
total 2740
-rw-rw---- 1 u0_a293 media_rw 2805760 2026-06-13 18:40 Gadgetbridge.db

DIR:/storage/emulated/0/Documents/Gadgetbridge
total 2740
-rw-rw---- 1 u0_a293 media_rw 2805760 2026-06-13 18:40 Gadgetbridge.db</code></pre>



<p class="wp-block-paragraph">DB ファイルを探す場合は、こうしました。</p>



<pre class="wp-block-code"><code>/mnt/c/Software/platform-tools/adb.exe shell '
find /sdcard/Documents -maxdepth 4 \( -iname "*gadget*" -o -iname "*.zip" -o -iname "*.db" \) -print 2&gt;/dev/null
' | tr -d '\r'</code></pre>



<p class="wp-block-paragraph">実行結果です。</p>



<pre class="wp-block-code"><code>/sdcard/Documents/Gadgetbridge
/sdcard/Documents/Gadgetbridge/Gadgetbridge.db</code></pre>



<h2 class="wp-block-heading"><span id="toc8">SQLite DB を WSL にコピーして中身を見る</span></h2>



<p class="wp-block-paragraph">初回確認では、Syncthing ではなく ADB で直接 DB を取り出しました。</p>



<p class="wp-block-paragraph"><code>adb pull</code> で WSL
側のパスにうまく書けないことがあったので、今回は
<code>exec-out cat</code> を使いました。</p>



<pre class="wp-block-code"><code>rm -rf /tmp/gadgetbridge-check
mkdir -p /tmp/gadgetbridge-check

/mnt/c/Software/platform-tools/adb.exe exec-out \
  cat /sdcard/Documents/Gadgetbridge/Gadgetbridge.db \
  &gt; /tmp/gadgetbridge-check/Gadgetbridge.db

ls -lh /tmp/gadgetbridge-check/Gadgetbridge.db
sqlite3 /tmp/gadgetbridge-check/Gadgetbridge.db 'PRAGMA integrity_check;'
sqlite3 /tmp/gadgetbridge-check/Gadgetbridge.db '.tables'</code></pre>



<p class="wp-block-paragraph">実行結果です。</p>



<pre class="wp-block-code"><code>-rw-r--r-- 1 ctrluser ctrluser 2.7M Jun 13 18:41 /tmp/gadgetbridge-check/Gadgetbridge.db
ok</code></pre>



<h2 class="wp-block-heading"><span id="toc9">実際に入っていたテーブル</span></h2>



<p class="wp-block-paragraph">Smart Band 7 のデータは、今回の DB では <code>XIAOMI_*</code>
系ではなく、主に <code>HUAMI_*</code> 系のテーブルに入っていました。</p>



<p class="wp-block-paragraph">件数はこうでした。</p>



<pre class="wp-block-code"><code>65172 HUAMI_EXTENDED_ACTIVITY_SAMPLE
 1599 HUAMI_SPO2_SAMPLE
  993 HUAMI_STRESS_SAMPLE
   40 HUAMI_PAI_SAMPLE
   26 BATTERY_LEVEL
    6 HUAMI_HEART_RATE_RESTING_SAMPLE</code></pre>



<p class="wp-block-paragraph">一方で、以下のテーブルは空でした。</p>



<pre class="wp-block-code"><code>XIAOMI_ACTIVITY_SAMPLE
XIAOMI_SLEEP_STAGE_SAMPLE
XIAOMI_SLEEP_TIME_SAMPLE
XIAOMI_DAILY_SUMMARY_SAMPLE
XIAOMI_MANUAL_SAMPLE
MI_BAND_ACTIVITY_SAMPLE</code></pre>



<p class="wp-block-paragraph">ここは Gadgetbridge
のバージョン、デバイス、移行経路によって変わる可能性があるので、最初に
<code>.tables</code> と <code>PRAGMA table_info(...)</code>
を見るのが安全です。</p>



<h2 class="wp-block-heading"><span id="toc10">歩数・心拍のテーブル</span></h2>



<p class="wp-block-paragraph">メインの活動データは <code>HUAMI_EXTENDED_ACTIVITY_SAMPLE</code>
に入っていました。</p>



<pre class="wp-block-code"><code>sqlite3 /tmp/gadgetbridge-check/Gadgetbridge.db \
  'PRAGMA table_info(HUAMI_EXTENDED_ACTIVITY_SAMPLE);'</code></pre>



<p class="wp-block-paragraph">カラムは以下です。</p>



<pre class="wp-block-code"><code>TIMESTAMP
DEVICE_ID
USER_ID
RAW_INTENSITY
STEPS
RAW_KIND
HEART_RATE
UNKNOWN1
SLEEP
DEEP_SLEEP
REM_SLEEP</code></pre>



<p class="wp-block-paragraph">データ範囲と件数を確認しました。</p>



<pre class="wp-block-code"><code>sqlite3 -header -column /tmp/gadgetbridge-check/Gadgetbridge.db "
SELECT
  datetime(MIN(TIMESTAMP),'unixepoch','localtime') AS first_time,
  datetime(MAX(TIMESTAMP),'unixepoch','localtime') AS last_time,
  COUNT(*) AS rows,
  SUM(STEPS) AS total_steps,
  SUM(CASE WHEN HEART_RATE &gt; 0 AND HEART_RATE != 255 THEN 1 ELSE 0 END) AS valid_hr_rows
FROM HUAMI_EXTENDED_ACTIVITY_SAMPLE;
"</code></pre>



<p class="wp-block-paragraph">実行結果です。</p>



<pre class="wp-block-code"><code>first_time           last_time            rows   total_steps  valid_hr_rows
2026-04-29 11:58:00  2026-06-13 18:10:00  65172  98252        14867</code></pre>



<p class="wp-block-paragraph">日別に見るとこうです。</p>



<pre class="wp-block-code"><code>sqlite3 -header -column /tmp/gadgetbridge-check/Gadgetbridge.db "
SELECT
  date(TIMESTAMP,'unixepoch','localtime') AS day,
  SUM(STEPS) AS steps,
  COUNT(*) AS rows,
  SUM(CASE WHEN HEART_RATE &gt; 0 AND HEART_RATE != 255 THEN 1 ELSE 0 END) AS valid_hr_rows,
  MIN(NULLIF(HEART_RATE,255)) AS min_hr,
  MAX(CASE WHEN HEART_RATE != 255 THEN HEART_RATE END) AS max_hr
FROM HUAMI_EXTENDED_ACTIVITY_SAMPLE
GROUP BY day
ORDER BY day DESC
LIMIT 10;
"</code></pre>



<p class="wp-block-paragraph">実行結果の一部です。</p>



<pre class="wp-block-code"><code>day         steps  rows  valid_hr_rows  min_hr  max_hr
2026-06-13  2283   1091  609            55      141
2026-06-12  9      1440  348            56      111
2026-06-11  9      1440  324            56      113
2026-06-10  30     1440  341            54      102
2026-06-09  25     1440  388            53      106
2026-06-08  3459   1440  607            51      134</code></pre>



<p class="wp-block-paragraph">直近の有効な心拍行も見ました。</p>



<pre class="wp-block-code"><code>sqlite3 -header -column /tmp/gadgetbridge-check/Gadgetbridge.db "
SELECT
  datetime(TIMESTAMP,'unixepoch','localtime') AS local_time,
  STEPS,
  HEART_RATE,
  RAW_KIND,
  RAW_INTENSITY
FROM HUAMI_EXTENDED_ACTIVITY_SAMPLE
WHERE HEART_RATE &gt; 0 AND HEART_RATE != 255
ORDER BY TIMESTAMP DESC
LIMIT 20;
"</code></pre>



<p class="wp-block-paragraph">実行結果の一部です。</p>



<pre class="wp-block-code"><code>local_time           STEPS  HEART_RATE  RAW_KIND  RAW_INTENSITY
2026-06-13 17:44:00  0      141         67        52
2026-06-13 17:43:00  31     140         64        63
2026-06-13 17:42:00  102    125         64        94</code></pre>



<p class="wp-block-paragraph"><code>HEART_RATE = 255</code> は心拍なしとして扱い、InfluxDB
へは入れないようにしました。</p>



<h2 class="wp-block-heading"><span id="toc11">SpO2・ストレス・安静時心拍・バッテリー</span></h2>



<p class="wp-block-paragraph">SpO2 は <code>HUAMI_SPO2_SAMPLE</code> に入っていました。</p>



<pre class="wp-block-code"><code>sqlite3 /tmp/gadgetbridge-check/Gadgetbridge.db \
  'PRAGMA table_info(HUAMI_SPO2_SAMPLE);'</code></pre>



<pre class="wp-block-code"><code>TIMESTAMP
DEVICE_ID
USER_ID
TYPE_NUM
SPO2</code></pre>



<p class="wp-block-paragraph">ここで注意が必要なのは、<code>TIMESTAMP</code>
が13桁のミリ秒タイムスタンプだったことです。Unix 秒にするには
<code>/1000</code> します。</p>



<pre class="wp-block-code"><code>sqlite3 -header -column /tmp/gadgetbridge-check/Gadgetbridge.db "
SELECT
  datetime(TIMESTAMP/1000,'unixepoch','localtime') AS local_time,
  TYPE_NUM,
  SPO2
FROM HUAMI_SPO2_SAMPLE
ORDER BY TIMESTAMP DESC
LIMIT 10;
"</code></pre>



<p class="wp-block-paragraph">実行結果の一部です。</p>



<pre class="wp-block-code"><code>local_time           TYPE_NUM  SPO2
2026-06-13 12:55:30  0         97
2026-06-13 12:50:30  0         98
2026-06-13 12:45:30  0         97
2026-06-13 12:40:30  0         94</code></pre>



<p class="wp-block-paragraph">ストレスは <code>HUAMI_STRESS_SAMPLE</code>
です。これもミリ秒タイムスタンプでした。</p>



<pre class="wp-block-code"><code>sqlite3 -header -column /tmp/gadgetbridge-check/Gadgetbridge.db "
SELECT
  datetime(TIMESTAMP/1000,'unixepoch','localtime') AS local_time,
  TYPE_NUM,
  STRESS
FROM HUAMI_STRESS_SAMPLE
ORDER BY TIMESTAMP DESC
LIMIT 10;
"</code></pre>



<pre class="wp-block-code"><code>local_time           TYPE_NUM  STRESS
2026-06-13 13:06:00  1         10
2026-06-13 12:56:00  1         29
2026-06-13 12:51:00  1         20</code></pre>



<p class="wp-block-paragraph">安静時心拍は <code>HUAMI_HEART_RATE_RESTING_SAMPLE</code> です。</p>



<pre class="wp-block-code"><code>sqlite3 -header -column /tmp/gadgetbridge-check/Gadgetbridge.db "
SELECT
  datetime(TIMESTAMP/1000,'unixepoch','localtime') AS local_time,
  UTC_OFFSET,
  HEART_RATE
FROM HUAMI_HEART_RATE_RESTING_SAMPLE
ORDER BY TIMESTAMP DESC
LIMIT 10;
"</code></pre>



<pre class="wp-block-code"><code>local_time           UTC_OFFSET  HEART_RATE
2026-06-13 12:56:00  32400000    61
2026-06-12 23:59:00  32400000    61
2026-06-11 23:59:00  32400000    60</code></pre>



<p class="wp-block-paragraph">バッテリーは <code>BATTERY_LEVEL</code> に入っていました。こちらは Unix
秒でした。</p>



<pre class="wp-block-code"><code>sqlite3 -header -column /tmp/gadgetbridge-check/Gadgetbridge.db "
SELECT
  datetime(TIMESTAMP,'unixepoch','localtime') AS local_time,
  LEVEL,
  BATTERY_INDEX
FROM BATTERY_LEVEL
ORDER BY TIMESTAMP DESC
LIMIT 10;
"</code></pre>



<pre class="wp-block-code"><code>local_time           LEVEL  BATTERY_INDEX
2026-06-13 18:38:42  84     0
2026-06-13 18:37:42  83     0
2026-06-13 18:36:42  81     0</code></pre>



<h2 class="wp-block-heading"><span id="toc12">Syncthing-Fork でスマホからサーバーへ送る</span></h2>



<p class="wp-block-paragraph">Gadgetbridge の DB エクスポートはスマホ内で完結します。そこで、Android
側に Syncthing-Fork を入れ、サーバー側の Syncthing と同期させました。</p>



<p class="wp-block-paragraph">Android 側は以下です。</p>



<pre class="wp-block-code"><code>package: com.github.catfriend1.syncthingfork
version: 2.1.1.0</code></pre>



<p class="wp-block-paragraph">このときは F-Droid の APK を ADB で入れました。</p>



<pre class="wp-block-code"><code>wget -O /tmp/syncthingfork.apk \
  https:&#47;&#47;f-droid.org/repo/com.github.catfriend1.syncthingfork_2010100.apk

/mnt/c/Software/platform-tools/adb.exe install "$(wslpath -w /tmp/syncthingfork.apk)"</code></pre>



<p class="wp-block-paragraph">通知権限やバックグラウンド動作まわりも ADB から設定しました。</p>



<pre class="wp-block-code"><code>/mnt/c/Software/platform-tools/adb.exe shell pm grant \
  com.github.catfriend1.syncthingfork android.permission.POST_NOTIFICATIONS
/mnt/c/Software/platform-tools/adb.exe shell pm grant \
  com.github.catfriend1.syncthingfork android.permission.ACCESS_FINE_LOCATION
/mnt/c/Software/platform-tools/adb.exe shell appops set \
  com.github.catfriend1.syncthingfork MANAGE_EXTERNAL_STORAGE allow
/mnt/c/Software/platform-tools/adb.exe shell dumpsys deviceidle whitelist \
  +com.github.catfriend1.syncthingfork</code></pre>



<p class="wp-block-paragraph">Android 側の Syncthing-Fork では、次のフォルダを共有しました。</p>



<pre class="wp-block-code"><code>label: Gadgetbridge
id: gadgetbridge
directory: /storage/emulated/0/Documents/Gadgetbridge</code></pre>



<p class="wp-block-paragraph">サーバー側は、Syncthing の <code>gadgetbridge</code> フォルダを
receive-only にしました。</p>



<pre class="wp-block-code"><code>id: gadgetbridge
label: Gadgetbridge
path inside container: /var/syncthing/Gadgetbridge
host path: /home/ctrluser/docker/gb2influx/data
type: receiveonly</code></pre>



<p class="wp-block-paragraph">receive-only にした理由は、Android/Gadgetbridge
側を正とし、サーバー側の古い DB をスマホへ押し戻さないためです。</p>



<p class="wp-block-paragraph">同期後、サーバー側には以下のように DB が届きました。</p>



<pre class="wp-block-code"><code>ssh orion '
ls -la ~/docker/gb2influx/data
find ~/docker/gb2influx/data -maxdepth 1 -type f \
  -printf "%f %s bytes %TY-%Tm-%Td %TH:%TM:%TS\n"
'</code></pre>



<p class="wp-block-paragraph">実行結果です。</p>



<pre class="wp-block-code"><code>Gadgetbridge.db 2805760 bytes 2026-06-13 09:40:15...</code></pre>



<p class="wp-block-paragraph">Linux 側の <code>find</code> では UTC 表示なので、これは Android 側の
2026-06-13 18:40 JST のエクスポートに対応します。</p>



<p class="wp-block-paragraph">Syncthing のフォルダ状態も正常でした。</p>



<pre class="wp-block-code"><code>state: idle
globalFiles: 1
globalBytes: 2805760
localFiles: 1
localBytes: 2805760
needFiles: 0
needBytes: 0</code></pre>



<h2 class="wp-block-heading"><span id="toc13">InfluxDB に入れるデータ構造</span></h2>



<p class="wp-block-paragraph">InfluxDB 側は、最初から細かくやりすぎず、測定値ごとに measurement
を分けました。</p>



<pre class="wp-block-code"><code>wearable_activity
  tags:
    source=gadgetbridge
    device=xiaomi_smart_band_7
  fields:
    steps
    heart_rate_bpm
    raw_intensity
    raw_kind
    sleep
    deep_sleep
    rem_sleep

wearable_spo2
  tags:
    source=gadgetbridge
    device=xiaomi_smart_band_7
    type_num=&lt;TYPE_NUM&gt;
  fields:
    spo2_percent

wearable_stress
  tags:
    source=gadgetbridge
    device=xiaomi_smart_band_7
    type_num=&lt;TYPE_NUM&gt;
  fields:
    stress

wearable_resting_heart_rate
  tags:
    source=gadgetbridge
    device=xiaomi_smart_band_7
  fields:
    heart_rate_bpm

wearable_battery
  tags:
    source=gadgetbridge
    device=xiaomi_smart_band_7
    battery_index=&lt;BATTERY_INDEX&gt;
  fields:
    level_percent</code></pre>



<p class="wp-block-paragraph">タイムスタンプの扱いは以下です。</p>



<pre class="wp-block-code"><code>HUAMI_EXTENDED_ACTIVITY_SAMPLE.TIMESTAMP: Unix seconds
BATTERY_LEVEL.TIMESTAMP: Unix seconds
HUAMI_SPO2_SAMPLE.TIMESTAMP: Unix milliseconds
HUAMI_STRESS_SAMPLE.TIMESTAMP: Unix milliseconds
HUAMI_HEART_RATE_RESTING_SAMPLE.TIMESTAMP: Unix milliseconds</code></pre>



<p class="wp-block-paragraph">Importer では、毎回直近 72 時間を再処理するようにしました。Gadgetbridge
側の同期遅延や睡眠データの後補正を拾うためです。</p>



<h2 class="wp-block-heading"><span id="toc14">importer の配置</span></h2>



<p class="wp-block-paragraph">importer はスマホではなく、サーバー側で Docker
コンテナとして動かしました。</p>



<p class="wp-block-paragraph">配置はこうです。</p>



<pre class="wp-block-code"><code>Galaxy S24 Ultra
  /sdcard/Documents/Gadgetbridge/Gadgetbridge.db
  -&gt; Syncthing-Fork

Orion
  /home/ctrluser/docker/gb2influx/data/Gadgetbridge.db
  /home/ctrluser/docker/gb2influx/app/gb2influx.py
  /home/ctrluser/docker/gb2influx/state/state.json
  -&gt; writes to InfluxDB

InfluxDB / Grafana
  wearable_* measurements</code></pre>



<p class="wp-block-paragraph">手動実行は以下です。</p>



<pre class="wp-block-code"><code>ssh orion 'cd ~/docker/gb2influx &amp;&amp; docker compose run --rm -e RUN_ONCE=1 gb2influx'</code></pre>



<p class="wp-block-paragraph">常駐実行は以下です。</p>



<pre class="wp-block-code"><code>ssh orion 'cd ~/docker/gb2influx &amp;&amp; docker compose up -d'</code></pre>



<p class="wp-block-paragraph">初回の historical import では、以下の結果になりました。</p>



<pre class="wp-block-code"><code>written_points=67796 db=/data/Gadgetbridge.db</code></pre>



<p class="wp-block-paragraph">Syncthing で DB が届いたあとの再実行では、以下です。</p>



<pre class="wp-block-code"><code>written_points=4685 db=/data/Gadgetbridge.db</code></pre>



<p class="wp-block-paragraph">2回目の件数が少ないのは、state file
を持っていて、初回の全量投入後は直近ウィンドウだけを再処理しているためです。</p>



<p class="wp-block-paragraph">InfluxDB 側では、以下の measurement が確認できました。</p>



<pre class="wp-block-code"><code>wearable_activity
wearable_battery
wearable_resting_heart_rate
wearable_spo2
wearable_stress</code></pre>



<p class="wp-block-paragraph">件数確認では、以下のようになりました。</p>



<pre class="wp-block-code"><code>wearable_activity             405899 field values
wearable_battery                  26 field values
wearable_resting_heart_rate        6 field values
wearable_spo2                   1599 field values
wearable_stress                  993 field values</code></pre>



<p class="wp-block-paragraph"><code>wearable_activity</code> が SQLite
の行数より多く見えるのは、InfluxDB 側では field value
単位で数えているためです。1行の SQLite レコードから複数 field
が入るので、元の行数とは一致しません。</p>



<h2 class="wp-block-heading"><span id="toc15">Grafana ダッシュボード</span></h2>



<p class="wp-block-paragraph">Grafana では、最初のダッシュボードとして以下を作りました。</p>



<pre class="wp-block-code"><code>uid: wearable-health-smart-band-7
title: Wearable Health - Smart Band 7
folder: Studio-managed
panels: 11</code></pre>



<p class="wp-block-paragraph">最初に見るパネルは、次のあたりで十分だと思います。</p>



<ol class="wp-block-list">
<li>日次歩数</li>



<li>心拍の時系列</li>



<li>SpO2 の時系列</li>



<li>ストレスの時系列</li>



<li>バッテリー残量</li>



<li>各 measurement の最新 timestamp</li>
</ol>



<p class="wp-block-paragraph">睡眠については、<code>HUAMI_EXTENDED_ACTIVITY_SAMPLE</code> に
<code>SLEEP</code>, <code>DEEP_SLEEP</code>, <code>REM_SLEEP</code>
のカラムがあります。ただ、これらの値の意味は Gadgetbridge の UI
表示と照合してから使った方がよさそうです。少なくとも最初のダッシュボードでは、睡眠ステージをきれいに解釈するより、就寝中の心拍、心拍の低下、起床前の上昇、データ欠損を見る方が安全だと思います。</p>



<h2 class="wp-block-heading"><span id="toc16">現時点の状態</span></h2>



<p class="wp-block-paragraph">2026-06-13 時点で、状態はこうです。</p>



<pre class="wp-block-code"><code>Gadgetbridge pairing: OK
Zepp Life: disabled, not unpaired
Auto fetch activity data: enabled
Auto export database: enabled
Exported DB: /sdcard/Documents/Gadgetbridge/Gadgetbridge.db
DB integrity_check: ok
Syncthing-Fork: Android -&gt; Orion sync OK
Orion Syncthing folder: idle / in-sync
Importer: Docker container running
InfluxDB measurements: wearable_activity, wearable_battery, wearable_resting_heart_rate, wearable_spo2, wearable_stress
Grafana dashboard: deployed</code></pre>



<p class="wp-block-paragraph">残っている作業は、数日から1週間ほど運用して、同期抜け、エクスポート間隔、バッテリー消費、睡眠データの解釈を確認することです。</p>



<h2 class="wp-block-heading"><span id="toc17">感想</span></h2>



<p class="wp-block-paragraph">今回の構成で分かったのは、Xiaomi Smart Band 7 は Gadgetbridge
との相性がかなりよく、買い替え前に試す価値が高いということです。</p>



<p class="wp-block-paragraph">一方で、Gadgetbridge へつながっただけで自動的に InfluxDB
まで流れるわけではありません。実際のワークフローは、バンド、Android、Gadgetbridge、DB
export、Syncthing、importer、InfluxDB、Grafana の複数段に分かれます。</p>



<p class="wp-block-paragraph">ただ、一度流れを作ってしまえば、各段階はかなり素直です。</p>



<p class="wp-block-paragraph">特に重要なのは、最初に以下を切り分けて考えることでした。</p>



<pre class="wp-block-code"><code>Band -&gt; Gadgetbridge:
  Bluetooth pairing, auth key, activity sync

Gadgetbridge -&gt; Android storage:
  Auto export database

Android storage -&gt; Server:
  Syncthing-Fork

Server -&gt; InfluxDB:
  SQLite importer

InfluxDB -&gt; Grafana:
  Dashboard</code></pre>



<p class="wp-block-paragraph">ここを混ぜて考えると、「Gadgetbridge に入れたのに Grafana
に出ない」のように見えますが、実際には途中にいくつも確認ポイントがあります。</p>



<p class="wp-block-paragraph">Smart Band 7 をすでに持っていて、Zepp Life
のアプリ内だけでデータが閉じるのが不満な場合は、まずこの Gadgetbridge
ルートを試すのがよさそうです。</p>



<p class="wp-block-paragraph"></p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgbeginner.net/xiaomi-smart-band-7-gadgetbridge-influxdb-grafana/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2616</post-id>	</item>
		<item>
		<title>Windowsのネットワークドライブ「ローカル デバイス名は既に使用されています」の直し方</title>
		<link>https://cgbeginner.net/windows-local-device-name-already-in-use-net-use/</link>
					<comments>https://cgbeginner.net/windows-local-device-name-already-in-use-net-use/#respond</comments>
		
		<dc:creator><![CDATA[CGBeginner]]></dc:creator>
		<pubDate>Sat, 30 May 2026 18:48:18 +0000</pubDate>
				<category><![CDATA[コンピュータ]]></category>
		<guid isPermaLink="false">https://cgbeginner.net/?p=2415</guid>

					<description><![CDATA[WindowsでNASやSamba共有をネットワークドライブに割り当てていると、「Microsoft Windows Network: ローカル デバイス名は既に使用されています」と出て、ドライブに入れなくなることがあり [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">WindowsでNASやSamba共有をネットワークドライブに割り当てていると、「Microsoft
Windows Network: ローカル
デバイス名は既に使用されています」と出て、ドライブに入れなくなることがあります。</p>


<p class="wp-block-paragraph">原因は、古いSMB接続、ドライブ文字の競合、保存済み資格情報の不整合であることが多いです。PC再起動の前に、まずは問題のドライブ文字だけを切り直します。</p>


<h2 class="wp-block-heading"><span id="toc1">まずこれを試す：対象ドライブだけ切って再接続</span></h2>


<p class="wp-block-paragraph">コピペ用です。実行前に、先頭3行の
<code>DRIVE</code>、<code>SHARE</code>、<code>USER</code>
だけ自分の環境に合わせて書き換えてください。パスワードは画面に出る入力プロンプトで入れます。</p>


<p class="wp-block-paragraph">CMD版です。コマンドプロンプトを開いて実行します。失敗する場合は管理者として開き直してください。</p>


<pre class="wp-block-code"><code>set DRIVE=Z:
set SHARE=\\NAS\share
set USER=NASユーザー名

net use %DRIVE% /delete /y
net use %DRIVE% "%SHARE%" /user:%USER% * /persistent:yes</code></pre>


<p class="wp-block-paragraph">PowerShell版です。資格情報ダイアログにNASのパスワードを入力します。</p>


<pre class="wp-block-code"><code>$drive = "Z:"
$share = "\\NAS\share"
$user = "NASユーザー名"
$cred = Get-Credential -UserName $user -Message "NASの資格情報"
Remove-SmbMapping -LocalPath $drive -UpdateProfile -Force -ErrorAction SilentlyContinue
New-SmbMapping -LocalPath $drive -RemotePath $share -Credential $cred -Persistent $true</code></pre>


<p class="wp-block-paragraph">最初から <code>net use * /delete</code>
を打たないのがポイントです。<code>* /delete</code>
は全ネットワーク接続を切断します。別NASや開いているファイルも巻き込むので、まずは問題のドライブだけを狙います。</p>


<h2 class="wp-block-heading"><span id="toc2">エラーの正体</span></h2>


<p class="wp-block-paragraph">Microsoftの資料では、このエラーはシステムエラー85、つまり「ローカルデバイス名がすでに使われている」状態です。ここでいうローカルデバイス名は、たいてい
<code>Z:</code> や <code>X:</code> などのドライブ文字です。</p>


<p class="wp-block-paragraph">見た目どおりに「別のドライブが見えている」とは限りません。エクスプローラー上では切断済みに見えても、SMBクライアント側には古い接続が残ることがあります。逆に、USBメモリ、カードリーダー、仮想ドライブなどが同じ文字を使っていることもあります。</p>


<p class="wp-block-paragraph">「NASが壊れた」というより、Windowsがそのドライブ文字を再利用できない状態、と考えると切り分けしやすくなります。</p>


<h2 class="wp-block-heading"><span id="toc3">まだ直らないときの順番</span></h2>


<p class="wp-block-paragraph">現在の接続を確認します。</p>


<pre class="wp-block-code"><code>net use</code></pre>


<p class="wp-block-paragraph">PowerShellなら次のように確認できます。</p>


<pre class="wp-block-code"><code>Get-SmbMapping</code></pre>


<p class="wp-block-paragraph">それでも「使用中」と言われる場合は、エクスプローラーやアプリがそのドライブを開いていないか確認してください。Microsoftの
<code>net use</code>
資料でも、現在のドライブとして使っていたり、プロセスが使用中だったりする共有は切断できないと説明されています。Excel、バックアップソフト、同期ツール、ターミナルのカレントディレクトリが原因になることがあります。</p>


<h2 class="wp-block-heading"><span id="toc4">Workstationサービスを再起動する場面</span></h2>


<p class="wp-block-paragraph">対象ドライブを削除しても残り続ける、<code>net use</code>
では見えないのに同じ文字で再接続できない、ログオフや再起動なら直る、という場合は、Workstation
サービス、つまり <code>LanmanWorkstation</code> を再起動します。</p>


<pre class="wp-block-code"><code>net stop workstation /y
net start workstation</code></pre>


<p class="wp-block-paragraph">注意点があります。この操作はSMBクライアント機能を一時停止するので、接続中のネットワークドライブや共有フォルダは切れます。共有上のファイルを閉じ、ほかの共有ドライブを使っていないタイミングで実行してください。</p>


<h2 class="wp-block-heading"><span id="toc5">資格情報をリセットする場面</span></h2>


<p class="wp-block-paragraph">同じNASに入れるPCと入れないPCがある、パスワード変更後からおかしい、サーバー名とIPで挙動が違う、という場合は、古い資格情報を疑います。</p>


<p class="wp-block-paragraph">GUIなら「資格情報マネージャー」から「Windows資格情報」を開き、対象のサーバー名やIPアドレスの資格情報を削除します。その後、正しいユーザー名とパスワードで再接続します。</p>


<p class="wp-block-paragraph">コマンドで確認するなら、次のように保存済み資格情報を一覧できます。</p>


<pre class="wp-block-code"><code>cmdkey /list</code></pre>


<p class="wp-block-paragraph">削除は対象名を確認してから行います。別サービスの認証情報を消さないように注意してください。</p>


<pre class="wp-block-code"><code>cmdkey /delete:NAS名またはIPアドレス</code></pre>


<h2 class="wp-block-heading"><span id="toc6">ドライブ文字の競合を確認する</span></h2>


<p class="wp-block-paragraph"><code>net use</code> や <code>Get-SmbMapping</code> に出てこないのに
<code>Z:</code> が使えない場合は、<code>diskmgmt.msc</code>
で「ディスクの管理」を開き、USBドライブ、カードリーダー、仮想ディスクなどに同じ文字がないか確認します。</p>


<p class="wp-block-paragraph">競合しているローカルディスクがある場合は、そのローカルデバイス側のドライブ文字を変更するのが基本です。ネットワークドライブには、普段ローカル機器に使われにくい
<code>X:</code>、<code>Y:</code>、<code>Z:</code>
などを使うと衝突しにくくなります。</p>


<h2 class="wp-block-heading"><span id="toc7">Samba/NAS側も見るべきケース</span></h2>


<p class="wp-block-paragraph">Windows側を直しても再接続できないなら、NASやSamba側を確認します。特に見るべきなのは次の点です。</p>


<ul class="wp-block-list">
<li>共有パス <code>\\NAS\share</code> が正しいか</li>
<li>NASがスリープしていないか</li>
<li>Sambaサービスが起動しているか</li>
<li>サーバーのディスク空き容量が不足していないか</li>
<li>そのユーザーに共有とフォルダの権限があるか</li>
<li>Windowsから名前解決できているか</li>
</ul>


<p class="wp-block-paragraph">名前解決が怪しいときは、サーバー名ではなくIPアドレスで
<code>\\192.168.1.10\share</code>
のように試すと切り分けできます。ただし、同じサーバーへ別名・別ユーザーで同時接続すると別の認証エラーを招くことがあるので、先に既存接続を削除しておきます。</p>


<h2 class="wp-block-heading"><span id="toc8">最終手段に近い操作</span></h2>


<p class="wp-block-paragraph"><code>net use * /delete /y</code>
は、全ネットワーク接続をまとめて切る強い操作です。どうしても対象ドライブだけでは解消しない場合に限り、開いている共有ファイルを閉じてから実行します。</p>


<pre class="wp-block-code"><code>net use * /delete /y</code></pre>


<p class="wp-block-paragraph">レジストリ変更はさらに慎重に扱うべきです。Microsoftのシステムエラー85の記事には
<code>ProtectionMode</code>
というレジストリ値に触れた回避策がありますが、古いWindows/Terminal
Server文脈を含む限定的な説明です。Windows
10/11の一般的な復旧手順として最初に触る場所ではありません。</p>


<p class="wp-block-paragraph">レジストリを変更する場合は、必ずバックアップを取り、変更対象と理由を記録してから行ってください。原因が単なる残留接続や資格情報なら、レジストリ編集まで進む必要はありません。</p>


<h2 class="wp-block-heading"><span id="toc9">サービスやタスクから使うならドライブ文字を避ける</span></h2>


<p class="wp-block-paragraph">バックアップソフトやWindowsサービスからNASにアクセスする場合は、<code>Z:\backup</code>
のような割り当て済みドライブではなく、<code>\\NAS\share\backup</code>
のUNCパスを使うのが基本です。</p>


<p class="wp-block-paragraph">Microsoftは、サービスが実行時に <code>net use</code>
でドライブ文字を割り当てる方法を推奨していません。ドライブマッピングはログオンセッションごとに管理されるため、ユーザーが見ている
<code>Z:</code> とサービスが見ている <code>Z:</code>
が一致しないことがあります。</p>


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


<p class="wp-block-paragraph">このエラーは、まず「問題のドライブ文字だけを消して、同じパスへ作り直す」のが最短です。それで直らない場合は、Workstationサービス、資格情報、ディスク管理のドライブ文字、NAS/Samba側の順に切り分けます。</p>


<p class="wp-block-paragraph">再起動は確かに効くことがありますが、原因を残したままだとまた起きます。<code>net use * /delete</code>
やレジストリ編集のような広い操作は最後に回し、対象を絞って直すのが安全です。</p>


<h2 class="wp-block-heading"><span id="toc11">参考資料</span></h2>


<ul class="wp-block-list">
<li>Microsoft Learn: System error 85 with the NET USE command<br />

<a rel="noopener" href="https://learn.microsoft.com/en-us/troubleshoot/windows-client/networking/system-error-85-net-use-command" title="System error 85 with NET USE command - Windows Client" 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://cgbeginner.net/wp-content/uploads/cocoon-resources/blog-card-cache/62becbf9e66edbd7a674a2191e28faef.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">System error 85 with NET USE command - Windows Client</div><div class="blogcard-snippet external-blogcard-snippet">This article helps fix the system error 85 that occurs when a non-administrative user attempts to reconnect to a shared ...</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://learn.microsoft.com/en-us/troubleshoot/windows-client/networking/system-error-85-net-use-command" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a></li>
<li>Microsoft Learn: Net use<br />
<a
href="https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/gg651155(v=ws.11)">https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/gg651155(v=ws.11)</a></li>
<li>Microsoft Learn: New-SmbMapping<br />

<a rel="noopener" href="https://learn.microsoft.com/en-us/powershell/module/smbshare/new-smbmapping?view=windowsserver2025-ps" title="New-SmbMapping (SmbShare)" 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://cgbeginner.net/wp-content/uploads/cocoon-resources/blog-card-cache/62becbf9e66edbd7a674a2191e28faef.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">New-SmbMapping (SmbShare)</div><div class="blogcard-snippet external-blogcard-snippet">Use this topic to help manage Windows and Windows Server technologies with Windows PowerShell.</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://learn.microsoft.com/en-us/powershell/module/smbshare/new-smbmapping?view=windowsserver2025-ps" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a></li>
<li>Microsoft Learn: Remove-SmbMapping<br />

<a rel="noopener" href="https://learn.microsoft.com/en-us/powershell/module/smbshare/remove-smbmapping?view=windowsserver2022-ps" title="Remove-SmbMapping (SmbShare)" 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://cgbeginner.net/wp-content/uploads/cocoon-resources/blog-card-cache/62becbf9e66edbd7a674a2191e28faef.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">Remove-SmbMapping (SmbShare)</div><div class="blogcard-snippet external-blogcard-snippet">Use this topic to help manage Windows and Windows Server technologies with Windows PowerShell.</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://learn.microsoft.com/en-us/powershell/module/smbshare/remove-smbmapping?view=windowsserver2025-ps" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a></li>
<li>Microsoft Learn: Services and Redirected Drives<br />

<a rel="noopener" href="https://learn.microsoft.com/en-us/windows/win32/services/services-and-redirected-drives" title="Services and Redirected Drives - Win32 apps" 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://cgbeginner.net/wp-content/uploads/cocoon-resources/blog-card-cache/62becbf9e66edbd7a674a2191e28faef.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">Services and Redirected Drives - Win32 apps</div><div class="blogcard-snippet external-blogcard-snippet">A service (or any process running in a different security context) that must access a remote resource should use the Uni...</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://learn.microsoft.com/en-us/windows/win32/services/services-and-redirected-drives" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">learn.microsoft.com</div></div></div></div></a></li>
</ul>

]]></content:encoded>
					
					<wfw:commentRss>https://cgbeginner.net/windows-local-device-name-already-in-use-net-use/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2415</post-id>	</item>
		<item>
		<title>Windows 11でCUDA使用中なのにタスクマネージャーのGPU使用率が0%になる問題をHAGS無効化で直した</title>
		<link>https://cgbeginner.net/windows11-hags-task-manager-gpu-utilization/</link>
					<comments>https://cgbeginner.net/windows11-hags-task-manager-gpu-utilization/#respond</comments>
		
		<dc:creator><![CDATA[CGBeginner]]></dc:creator>
		<pubDate>Sat, 30 May 2026 17:50:26 +0000</pubDate>
				<category><![CDATA[コンピュータ]]></category>
		<guid isPermaLink="false">https://cgbeginner.net/?p=2604</guid>

					<description><![CDATA[この記事は、筆者のWindowsマルチGPU環境で実際に起きた問題を、AIとの調査ログをもとに整理したものです 起きたこと Windows 11のマルチGPU環境で、ローカルLLMを実行しているときに奇妙な症状に遭遇しま [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">この記事は、筆者のWindowsマルチGPU環境で実際に起きた問題を、AIとの調査ログをもとに整理したものです</p>


</blockquote>


<h2 class="wp-block-heading"><span id="toc1">起きたこと</span></h2>



<p class="wp-block-paragraph">Windows
11のマルチGPU環境で、ローカルLLMを実行しているときに奇妙な症状に遭遇しました。</p>



<p class="wp-block-paragraph"><code>nvidia-smi</code>では2枚のGPUにしっかり負荷がかかっているのに、Windowsのタスクマネージャーでは片方のGPU使用率だけが0%のままになっていました。</p>



<p class="wp-block-paragraph">今回の構成は、ざっくり言うと次のようなものです。</p>



<ul class="wp-block-list">
<li>Windows 11 Pro</li>



<li>NVIDIA GeForce RTX 3090 + RTX 3080</li>



<li>NVIDIA Driver 576.80</li>



<li>ローカルLLM実行環境: LM Studio</li>



<li>片方のGPUは表示出力あり</li>



<li>もう片方のGPUはモニターなしのヘッドレス状態</li>



<li>マシンはサブ機で、普段はリモート操作</li>
</ul>



<p class="wp-block-paragraph">最終的には、<strong>HAGS（ハードウェア アクセラレータによる GPU
スケジューリング）を無効化して再起動したところ、タスクマネージャー側でもCUDA負荷が見えるようになりました。</strong></p>



<h2 class="wp-block-heading"><span id="toc2">最初に疑ったこと: phantom device</span></h2>



<p class="wp-block-paragraph">このPCは過去にGPU構成を何度か入れ替えていました。</p>



<p class="wp-block-paragraph">そのため、まず疑ったのはWindows上に残っている古いGPUの履歴です。Device
Managerで「非表示のデバイスを表示」したときに出てくる、いわゆる phantom
device / non-present device です。</p>



<p class="wp-block-paragraph">PowerShellでは次のように確認できます。</p>



<pre class="wp-block-code"><code>Get-PnpDevice -Class Display</code></pre>



<p class="wp-block-paragraph">実際、過去に使っていたGPUや、同じGPUを別スロットに挿していたときのデバイスインスタンスが
<code>CM_PROB_PHANTOM</code> として残っていました。</p>



<p class="wp-block-paragraph">不要なphantom deviceは、管理者権限のPowerShellなどから
<code>pnputil</code> で削除できます。</p>



<pre class="wp-block-code"><code>pnputil /remove-device "PCI\VEN_...."</code></pre>



<p class="wp-block-paragraph">この作業で、Device
Manager相当の表示は現在刺さっている2枚のGPUだけになりました。BlenderのCycles設定にも古いGPUが残っていたので、<code>userpref.blend</code>
のバックアップを取った上でデバイス一覧を再生成しました。</p>



<p class="wp-block-paragraph">その結果、BlenderやDevice Manager上のGPU一覧は正常になりました。</p>



<p class="wp-block-paragraph">しかし、タスクマネージャーで片方のGPU使用率が見えない問題はまだ残りました。</p>



<h2 class="wp-block-heading"><span id="toc3">nvidia-smiではGPUはちゃんと動いている</span></h2>



<p class="wp-block-paragraph">ローカルLLMで負荷をかけると、<code>nvidia-smi</code>では両方のGPUが使われていました。</p>



<p class="wp-block-paragraph">実測では、おおよそ次のような状態でした。</p>



<pre class="wp-block-code"><code>RTX 3080: GPU使用率 約40%, VRAM 約9.7GB, 消費電力 約150W
RTX 3090: GPU使用率 約60%, VRAM 約19GB, 消費電力 約340W</code></pre>



<p class="wp-block-paragraph">つまり、GPUが使われていないわけではありません。</p>



<p class="wp-block-paragraph">一方で、タスクマネージャーやWindowsのGPU Engine
counterでは、片方のGPUだけ使用率が0%に見えていました。</p>



<p class="wp-block-paragraph">Windows側のカウンタは次のように確認できます。</p>



<pre class="wp-block-code"><code>Get-Counter '\GPU Engine(*)\Utilization Percentage'</code></pre>



<p class="wp-block-paragraph">この時点では、GPUメモリ使用量は見えているのに、GPU Engine
utilizationだけが0%という状態でした。</p>



<h2 class="wp-block-heading"><span id="toc4">タスクマネージャーとnvidia-smiは同じものを見ていない</span></h2>



<p class="wp-block-paragraph">ここで重要なのは、Windowsのタスクマネージャーと <code>nvidia-smi</code>
は同じ計測経路を見ているわけではない、ということです。</p>



<p class="wp-block-paragraph">Microsoftの説明では、タスクマネージャーのGPU表示はWDDMのGPU
schedulerやvideo memory manager由来の情報を使っています。</p>



<p class="wp-block-paragraph">参考:</p>


<a rel="noopener" href="https://devblogs.microsoft.com/directx/gpus-in-the-task-manager/" title="GPUs in the task manager - DirectX Developer Blog" 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://cgbeginner.net/wp-content/uploads/cocoon-resources/blog-card-cache/478848f246ebdb586e8a99506d9322f0.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">GPUs in the task manager &#8211; DirectX Developer Blog</div><div class="blogcard-snippet external-blogcard-snippet">The below posting is from Steve Pronovost, our lead engineer responsible for the GPU scheduler and memory manager. GPUs &#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://devblogs.microsoft.com/directx/gpus-in-the-task-manager/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">devblogs.microsoft.com</div></div></div></div></a>


<p class="wp-block-paragraph">一方、<code>nvidia-smi</code>はNVIDIAのNVML側からGPU使用率を見ています。</p>



<p class="wp-block-paragraph">参考:</p>


<a rel="noopener" href="https://docs.nvidia.com/deploy/nvidia-smi/index.html" title="https://docs.nvidia.com/deploy/nvidia-smi/index.html" 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%2Fdocs.nvidia.com%2Fdeploy%2Fnvidia-smi%2Findex.html?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">https://docs.nvidia.com/deploy/nvidia-smi/index.html</div><div class="blogcard-snippet external-blogcard-snippet"></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://docs.nvidia.com/deploy/nvidia-smi/index.html" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">docs.nvidia.com</div></div></div></div></a>


<p class="wp-block-paragraph">そのため、CUDAやローカルLLMのようなcompute系の負荷では、<code>nvidia-smi</code>では見えているのにタスクマネージャーでは見えない、ということが起き得ます。</p>



<p class="wp-block-paragraph">特に今回のように、片方のGPUがヘッドレス、つまり表示出力を持っていない状態では、Windows側のWDDM
GPU Engine counterがうまく出ないことがあるようです。</p>



<h2 class="wp-block-heading"><span id="toc5">HAGSとは何か</span></h2>



<p class="wp-block-paragraph">HAGSは、Hardware-Accelerated GPU Schedulingの略です。</p>



<p class="wp-block-paragraph">日本語のWindows設定では「ハードウェア アクセラレータによる GPU
スケジューリング」と表示されます。</p>



<p class="wp-block-paragraph">設定場所は次のあたりです。</p>



<pre class="wp-block-code"><code>設定
→ システム
→ ディスプレイ
→ グラフィック
→ 既定のグラフィック設定
→ ハードウェア アクセラレータによる GPU スケジューリング</code></pre>



<p class="wp-block-paragraph">ざっくり言うと、GPUに投げる仕事の順番管理を、従来よりGPUやドライバ側に寄せる機能です。ゲームではレイテンシやCPU負荷が改善することがあります。</p>



<p class="wp-block-paragraph">一方で、CUDA、録画、リモート操作、マルチGPU監視などでは、環境によってGPU使用率表示や互換性に影響することがあります。</p>



<h2 class="wp-block-heading"><span id="toc6">HAGSを無効化したらCUDA engineが見えるようになった</span></h2>



<p class="wp-block-paragraph">今回の環境では、HAGSを無効化して再起動したところ、Windows側のGPU Engine
counterにCUDA負荷が出るようになりました。</p>



<p class="wp-block-paragraph">無効化後、同じローカルLLM負荷をかけると、<code>Get-Counter</code>で次のように
<code>engtype_cuda</code> が見えるようになりました。</p>



<pre class="wp-block-code"><code>GPU A: engtype_cuda 約40%
GPU B: engtype_cuda 約53%</code></pre>



<p class="wp-block-paragraph"><code>nvidia-smi</code>側でも両GPUに負荷が出ており、タスクマネージャー側の表示とも整合するようになりました。</p>



<p class="wp-block-paragraph">つまり今回の問題は、GPU本体の故障ではありませんでした。</p>



<p class="wp-block-paragraph">また、phantom deviceの残骸だけが原因でもありませんでした。</p>



<p class="wp-block-paragraph">最終的には、<strong>HAGS有効時に、ヘッドレス側GPUのCUDA
engine使用率がWindowsのタスクマネージャーに出ていなかった</strong>、という見立てです。</p>



<h2 class="wp-block-heading"><span id="toc7">HAGSを無効化する副作用</span></h2>



<p class="wp-block-paragraph">HAGSを無効化すると、GPUスケジューリングは従来方式に戻ります。</p>



<p class="wp-block-paragraph">あり得る影響としては、次のようなものがあります。</p>



<ul class="wp-block-list">
<li>一部ゲームでfpsやレイテンシが少し変わる</li>



<li>Frame Generationや低遅延系の機能に影響する可能性がある</li>



<li>逆に、CUDA、Blender、ローカルLLM、録画、リモート操作、マルチGPU監視では安定する場合がある</li>
</ul>



<p class="wp-block-paragraph">今回のPCはゲーム用メインマシンではなく、ローカルLLMやBlenderなどのGPU作業用サブ機です。そのため、HAGSは無効のまま運用することにしました。</p>



<h2 class="wp-block-heading"><span id="toc8">切り分け手順まとめ</span></h2>



<p class="wp-block-paragraph">同じように「GPUは動いているはずなのにタスクマネージャーで使用率が見えない」という場合、次の順番で確認するとよさそうです。</p>



<h3 class="wp-block-heading"><span id="toc9">1. nvidia-smiを見る</span></h3>



<p class="wp-block-paragraph">まずはタスクマネージャーではなく、<code>nvidia-smi</code>で確認します。</p>



<pre class="wp-block-code"><code>nvidia-smi</code></pre>



<p class="wp-block-paragraph">ここでGPU使用率、VRAM使用量、温度、消費電力が出ていれば、GPU自体は動いています。</p>



<h3 class="wp-block-heading"><span id="toc10">2. WindowsのDisplayデバイスを確認する</span></h3>



<p class="wp-block-paragraph">過去にGPUを差し替えている場合は、phantom
deviceが残っていることがあります。</p>



<pre class="wp-block-code"><code>Get-PnpDevice -Class Display</code></pre>



<p class="wp-block-paragraph"><code>CM_PROB_PHANTOM</code>
の古いGPUが大量に残っている場合は、不要なものを整理する価値があります。ただし、削除対象を間違えると面倒なので、実際に刺さっているGPUのInstance
IDと照合してから作業したほうが安全です。</p>



<h3 class="wp-block-heading"><span id="toc11">3. WindowsのGPU Engine counterを見る</span></h3>



<p class="wp-block-paragraph">タスクマネージャーの元になっているカウンタは、次のように見られます。</p>



<pre class="wp-block-code"><code>Get-Counter '\GPU Engine(*)\Utilization Percentage'</code></pre>



<p class="wp-block-paragraph">CUDA負荷なら <code>engtype_cuda</code> や <code>compute</code>
系のカウンタに値が出ることがあります。</p>



<h3 class="wp-block-heading"><span id="toc12">4. HAGSを無効化して再起動する</span></h3>



<p class="wp-block-paragraph">HAGSが有効で、特にマルチGPUやヘッドレスGPUで使用率が見えない場合は、HAGS無効化を試す価値があります。</p>



<p class="wp-block-paragraph">UIから変更するのが一番安全です。</p>



<pre class="wp-block-code"><code>設定
→ システム
→ ディスプレイ
→ グラフィック
→ 既定のグラフィック設定
→ ハードウェア アクセラレータによる GPU スケジューリング</code></pre>



<p class="wp-block-paragraph">変更後は再起動が必要です。</p>



<p class="wp-block-paragraph">レジストリで確認する場合は、次のキーを見ます。</p>



<pre class="wp-block-code"><code>Get-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\GraphicsDrivers' -Name HwSchMode</code></pre>



<p class="wp-block-paragraph">一般に <code>HwSchMode=1</code> はHAGS無効、<code>HwSchMode=2</code>
はHAGS有効、値がない場合はWindowsの既定設定に従います。</p>



<h3 class="wp-block-heading"><span id="toc13">5. それでもだめならドライバ更新やダミープラグを試す</span></h3>



<p class="wp-block-paragraph">片方のGPUが完全にヘッドレスの場合、HDMIやDisplayPortのダミープラグを挿すことで、Windows側の扱いが変わることがあります。</p>



<p class="wp-block-paragraph">ただし、これは原因切り分けとしては有用ですが、常用する必要があるかは環境次第です。</p>



<p class="wp-block-paragraph">また、NVIDIAドライバのバージョンによって挙動が変わる可能性もあります。古いドライバを使っている場合は、Studio
Driverなどの更新も試す価値があります。</p>



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



<p class="wp-block-paragraph">今回の結論はシンプルです。</p>



<p class="wp-block-paragraph"><strong>GPUはちゃんと動いていた。タスクマネージャーが見えていなかった。原因はHAGSだった。</strong></p>



<p class="wp-block-paragraph">Windowsのタスクマネージャーは便利ですが、CUDAやローカルLLMの監視では万能ではありません。</p>



<p class="wp-block-paragraph">特に、マルチGPU、ヘッドレスGPU、HAGS有効、CUDA/compute負荷の組み合わせでは、<code>nvidia-smi</code>やHWiNFO、MSI
Afterburnerなど、別系統の監視ツールも併用したほうがよさそうです。</p>



<p class="wp-block-paragraph">ローカルLLMやBlender用のWindowsマシンでGPU使用率が変に見える場合は、HAGSを一度疑ってみる価値があります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgbeginner.net/windows11-hags-task-manager-gpu-utilization/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2604</post-id>	</item>
		<item>
		<title>Gugugaga(ぐぐがが,古古嘎嘎)ペンギンまとめ</title>
		<link>https://cgbeginner.net/gugugaga/</link>
					<comments>https://cgbeginner.net/gugugaga/#respond</comments>
		
		<dc:creator><![CDATA[CGBeginner]]></dc:creator>
		<pubDate>Thu, 12 Mar 2026 11:51:10 +0000</pubDate>
				<category><![CDATA[AI]]></category>
		<category><![CDATA[コンピュータ]]></category>
		<guid isPermaLink="false">https://cgbeginner.net/?p=2572</guid>

					<description><![CDATA[最近、ショート動画のタイムラインに、妙にかわいい小さなペンギンが流れてきませんか。ぽてぽて歩いて、ちょっと拗ねて、甘えるように「Gugugaga」と鳴く。最近ものすごい勢いで増殖しているミームです。YouTube Sho [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">最近、ショート動画のタイムラインに、妙にかわいい小さなペンギンが流れてきませんか。ぽてぽて歩いて、ちょっと拗ねて、甘えるように「Gugugaga」と鳴く。最近ものすごい勢いで増殖しているミームです。YouTube ShortsやTikTok、抖音では、Gugugaga(古古嘎嘎)やEndministratorのタグがついた同系統の動画がすでにかなりの数出回っています。</p>



<p class="wp-block-paragraph">かわいいのでまとめました。</p>



<h2 class="wp-block-heading">Gugugagaペンギンとは何者なのか</h2>



<p class="wp-block-paragraph">「Gugugaga」は英語の &#8220;goo goo ga ga&#8221; から来ています。赤ちゃんのしゃべり方を表した言い方のようです。この音がミームとして爆発した経緯には諸説ありますが、中国語圏のゲームメディアでは、2025年にBilibiliで拡散した短いネタ動画『gugugaga』が転機として繰り返し言及されています。ここから「ペンギンっぽいものに咕咕嘎嘎の音を重ねる」という遊びが一気に広まったようです。</p>



<p class="wp-block-paragraph">で、この流れに、ゲーム『Arknights: Endfield』の管理人（Endministrator）というキャラがなぜか混ざりました。このキャラがなんかペンギンっぽくみえることが理由のようです。</p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="640" height="647" src="https://cgbeginner.net/wp-content/uploads/2026/03/gRckjnbttbEoqAf.webp" alt="" class="wp-image-2573" style="width:264px;height:auto" srcset="https://cgbeginner.net/wp-content/uploads/2026/03/gRckjnbttbEoqAf.webp 640w, https://cgbeginner.net/wp-content/uploads/2026/03/gRckjnbttbEoqAf-297x300.webp 297w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p class="wp-block-paragraph"><a href="https://i.17173cdn.com/2fhnvk/YWxqaGBf/cms3/gRckjnbttbEoqAf.jpg">https://i.17173cdn.com/2fhnvk/YWxqaGBf/cms3/gRckjnbttbEoqAf.jpg</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="576" src="https://cgbeginner.net/wp-content/uploads/2026/03/0bda81d2aca72a668b76c64847afa9c8-1024x576.jpg" alt="" class="wp-image-2584" srcset="https://cgbeginner.net/wp-content/uploads/2026/03/0bda81d2aca72a668b76c64847afa9c8-1024x576.jpg 1024w, https://cgbeginner.net/wp-content/uploads/2026/03/0bda81d2aca72a668b76c64847afa9c8-300x169.jpg 300w, https://cgbeginner.net/wp-content/uploads/2026/03/0bda81d2aca72a668b76c64847afa9c8-768x432.jpg 768w, https://cgbeginner.net/wp-content/uploads/2026/03/0bda81d2aca72a668b76c64847afa9c8-1536x864.jpg 1536w, https://cgbeginner.net/wp-content/uploads/2026/03/0bda81d2aca72a668b76c64847afa9c8-120x68.jpg 120w, https://cgbeginner.net/wp-content/uploads/2026/03/0bda81d2aca72a668b76c64847afa9c8-160x90.jpg 160w, https://cgbeginner.net/wp-content/uploads/2026/03/0bda81d2aca72a668b76c64847afa9c8-320x180.jpg 320w, https://cgbeginner.net/wp-content/uploads/2026/03/0bda81d2aca72a668b76c64847afa9c8.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">そしてAI動画ブームが到来し、このキャラクターをかわいくデフォルメしたキャラにGugugagaといわせるミームが発生しました。</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-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zxx" dir="ltr"><a href="https://t.co/kPUY3kAY8j">pic.twitter.com/kPUY3kAY8j</a></p>&mdash; Keitaro (@DqKeita) <a href="https://twitter.com/DqKeita/status/2030152497931620605?ref_src=twsrc%5Etfw">March 7, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">It&#39;s always good to sleep if you have a chance; sleeping in the Age of AI has become a luxury. <a href="https://t.co/OQPljfkZDy">pic.twitter.com/OQPljfkZDy</a></p>&mdash; Emily (@IamEmily2050) <a href="https://twitter.com/IamEmily2050/status/2030044925966905642?ref_src=twsrc%5Etfw">March 6, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="qme" dir="ltr">😱😱😱 <a href="https://t.co/V9SFw8Vg9W">pic.twitter.com/V9SFw8Vg9W</a></p>&mdash; Emily (@IamEmily2050) <a href="https://x.com/IamEmily2050/status/2031221849762279495?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zxx" dir="ltr"><a href="https://t.co/VB4Q14x2OW">pic.twitter.com/VB4Q14x2OW</a></p>&mdash; Gacha Zone (@Gacha_Zone) <a href="https://twitter.com/Gacha_Zone/status/2030764864717619498?ref_src=twsrc%5Etfw">March 8, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">gym day <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/kz5JvKes1U">pic.twitter.com/kz5JvKes1U</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031293229572784161?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">stop working&#8230; <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/9ROIG9SfIX">pic.twitter.com/9ROIG9SfIX</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031366210713968760?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">The rain is outside.<br>She&#39;s inside, milk-drunk and asleep in your hand.<br>This is what trust looks like.<br><br>雨の夜、温かいミルクを差し出したら——<br>全部飲み干して、そのまま手のひらに寄りかかって眠った。<br>これ、飼い主になっていい？👇<br><br> <a href="https://x.com/hashtag/endfield?src=hash&amp;ref_src=twsrc%5Etfw">#endfield</a> <a href="https://x.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://x.com/hashtag/aichibi?src=hash&amp;ref_src=twsrc%5Etfw">#aichibi</a>  <a href="https://x.com/hashtag/%E3%82%A2%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%83%84?src=hash&amp;ref_src=twsrc%5Etfw">#アークナイツ</a> <a href="https://x.com/hashtag/AI%E5%8B%95%E7%94%BB?src=hash&amp;ref_src=twsrc%5Etfw">#AI動画</a> <a href="https://t.co/IxbcEVfTlP">pic.twitter.com/IxbcEVfTlP</a></p>&mdash; 秦淮孤月 (@qhgy) <a href="https://x.com/qhgy/status/2032035307001131102?ref_src=twsrc%5Etfw">March 12, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">ググガガ 食べ物を盗んだところを捕まる <a href="https://x.com/hashtag/WutheringWaves?src=hash&amp;ref_src=twsrc%5Etfw">#WutheringWaves</a>                <a href="https://x.com/hashtag/%E6%B5%81%E8%90%A4?src=hash&amp;ref_src=twsrc%5Etfw">#流萤</a> <a href="https://x.com/hashtag/Firefly?src=hash&amp;ref_src=twsrc%5Etfw">#Firefly</a> <a href="https://x.com/hashtag/%E3%83%9B%E3%82%BF%E3%83%AB?src=hash&amp;ref_src=twsrc%5Etfw">#ホタル</a> <a href="https://x.com/hashtag/HonkaiStarRail?src=hash&amp;ref_src=twsrc%5Etfw">#HonkaiStarRail</a>📷 <a href="https://x.com/hashtag/%E5%B4%A9%E5%A3%8A%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%AB?src=hash&amp;ref_src=twsrc%5Etfw">#崩壊スターレイル</a> <a href="https://x.com/hashtag/AI%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88?src=hash&amp;ref_src=twsrc%5Etfw">#AIイラスト</a> <a href="https://x.com/hashtag/AIart%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F?src=hash&amp;ref_src=twsrc%5Etfw">#AIart️️️️️️️️️️️️️️️️️️️️️</a>  <a href="https://x.com/hashtag/ArknightsEndfield?src=hash&amp;ref_src=twsrc%5Etfw">#ArknightsEndfield</a>  <a href="https://x.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://x.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/iiH7dUgWhw">pic.twitter.com/iiH7dUgWhw</a></p>&mdash; Snowflake (@Snow_flake43) <a href="https://x.com/Snow_flake43/status/2032044868881760573?ref_src=twsrc%5Etfw">March 12, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">雨の夜、きみとわたし。<br><br>映写機がゆれてる。<br>みかん、くれた。🍊<br><br>……もう、どこにもいけないや。<br><br>Rainy night. Just you and me.<br>A projector. A mandarin.<br>I flopped.<br>I&#39;m not leaving.<br><br>AI chibi gugu gaga.<br>chibi ai gugu gaga.<br>AI ARK.<br>Arknights Endfield.<br>endmin gugugaga.<br>arknights… <a href="https://t.co/G5K1WRs5no">pic.twitter.com/G5K1WRs5no</a></p>&mdash; 秦淮孤月 (@qhgy) <a href="https://x.com/qhgy/status/2031986869882536433?ref_src=twsrc%5Etfw">March 12, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="tl" dir="ltr">Gugu Gaga lovers<a href="https://twitter.com/hashtag/ArknightsEndfield?src=hash&amp;ref_src=twsrc%5Etfw">#ArknightsEndfield</a> <a href="https://t.co/7E160iQYZg">pic.twitter.com/7E160iQYZg</a></p>&mdash; lyn (@lyn49556) <a href="https://twitter.com/lyn49556/status/2032010383553413224?ref_src=twsrc%5Etfw">March 12, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">get up my little penguin <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/NvefPpV1hX">pic.twitter.com/NvefPpV1hX</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031874308537040961?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="qme" dir="ltr"><a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/arknightsendfield?src=hash&amp;ref_src=twsrc%5Etfw">#arknightsendfield</a> <a href="https://t.co/7GPRN2ZZGF">pic.twitter.com/7GPRN2ZZGF</a></p>&mdash; G4M3V1L FSS (@G4M3V1L) <a href="https://twitter.com/G4M3V1L/status/2031670926841196949?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">

<a rel="noopener" href="https://twitter.com/erd_tyg20945/status/2031935987765715021" title="https://twitter.com/erd_tyg20945/status/2031935987765715021" 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%2Ftwitter.com%2Ferd_tyg20945%2Fstatus%2F2031935987765715021?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">https://twitter.com/erd_tyg20945/status/2031935987765715021</div><div class="blogcard-snippet external-blogcard-snippet"></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://twitter.com/erd_tyg20945/status/2031935987765715021" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">twitter.com</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">give me a hug <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/MjuemfqNMN">pic.twitter.com/MjuemfqNMN</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031653856015196199?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zh" dir="ltr">今天，古古嘎嘎 为了她的食物在城市里打扫卫生.<a href="https://x.com/hashtag/WutheringWaves?src=hash&amp;ref_src=twsrc%5Etfw">#WutheringWaves</a>    <a href="https://x.com/hashtag/%E6%B5%81%E8%90%A4?src=hash&amp;ref_src=twsrc%5Etfw">#流萤</a> <a href="https://x.com/hashtag/Firefly?src=hash&amp;ref_src=twsrc%5Etfw">#Firefly</a> <a href="https://x.com/hashtag/%E3%83%9B%E3%82%BF%E3%83%AB?src=hash&amp;ref_src=twsrc%5Etfw">#ホタル</a> <a href="https://x.com/hashtag/HonkaiStarRail?src=hash&amp;ref_src=twsrc%5Etfw">#HonkaiStarRail</a>📷 <a href="https://x.com/hashtag/%E5%B4%A9%E5%A3%8A%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%AB?src=hash&amp;ref_src=twsrc%5Etfw">#崩壊スターレイル</a> <a href="https://x.com/hashtag/AI%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88?src=hash&amp;ref_src=twsrc%5Etfw">#AIイラスト</a> <a href="https://x.com/hashtag/AIart%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F?src=hash&amp;ref_src=twsrc%5Etfw">#AIart️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️</a>  <a href="https://x.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://x.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/sp3qERNfM4">pic.twitter.com/sp3qERNfM4</a></p>&mdash; Snowflake (@Snow_flake43) <a href="https://x.com/Snow_flake43/status/2031676467558707328?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">give me the cake <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/JsMQGwvilj">pic.twitter.com/JsMQGwvilj</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031699909481804120?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">tickle <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/AW4WZ0X28i">pic.twitter.com/AW4WZ0X28i</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031761314507563288?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="eu" dir="ltr">GU GU GA GA GU GU GA<a href="https://twitter.com/hashtag/ArknightsEndfield?src=hash&amp;ref_src=twsrc%5Etfw">#ArknightsEndfield</a> <a href="https://twitter.com/hashtag/Endfield?src=hash&amp;ref_src=twsrc%5Etfw">#Endfield</a> <a href="https://twitter.com/hashtag/%E6%98%8E%E6%97%A5%E6%96%B9%E8%88%9F%E7%BB%88%E6%9C%AB%E5%9C%B0?src=hash&amp;ref_src=twsrc%5Etfw">#明日方舟终末地</a> <a href="https://twitter.com/hashtag/%E3%82%A2%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%83%84%E3%82%A8%E3%83%B3%E3%83%89%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89?src=hash&amp;ref_src=twsrc%5Etfw">#アークナイツエンドフィールド</a> <a href="https://twitter.com/hashtag/%EB%AA%85%EC%9D%BC%EB%B0%A9%EC%A3%BC%EC%97%94%EB%93%9C%ED%95%84%EB%93%9C?src=hash&amp;ref_src=twsrc%5Etfw">#명일방주엔드필드</a> <a href="https://t.co/pLOl6JzhBd">pic.twitter.com/pLOl6JzhBd</a></p>&mdash; Arknights: Endfield Update (@AK_Luna02) <a href="https://twitter.com/AK_Luna02/status/2031590403103920155?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="in" dir="ltr">dancing <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/bXXtzTnLFL">pic.twitter.com/bXXtzTnLFL</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031595978487456216?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">this game is not fair. <a href="https://t.co/4R0emaC3H1">pic.twitter.com/4R0emaC3H1</a></p>&mdash; ViralOps (@ViralOps_) <a href="https://twitter.com/ViralOps_/status/2031429125273989225?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="tr" dir="ltr">gulugulu <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/8whY3koL83">pic.twitter.com/8whY3koL83</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031425601957957918?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">私のものは全て取り返す。👑🐧<br>お前のものも、全て奪う。<br><br>どっちが本当の支配者？👇<br><br>Taking back what&#39;s mine. 👑🐧<br>And taking yours too.<br><br>Who&#39;s the real boss? 👇<a href="https://x.com/hashtag/AI%E5%8B%95%E7%94%BB?src=hash&amp;ref_src=twsrc%5Etfw">#AI動画</a> <a href="https://x.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://x.com/hashtag/aianime?src=hash&amp;ref_src=twsrc%5Etfw">#aianime</a> <a href="https://t.co/jZnysWDulY">pic.twitter.com/jZnysWDulY</a></p>&mdash; 秦淮孤月 (@qhgy) <a href="https://x.com/qhgy/status/2031415032517468249?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">tickle tickle <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/HkRK7zY4ob">pic.twitter.com/HkRK7zY4ob</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031543126549213493?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zxx" dir="ltr"><a href="https://t.co/GTgvBParXt">pic.twitter.com/GTgvBParXt</a></p>&mdash; Keitaro (@DqKeita) <a href="https://twitter.com/DqKeita/status/2031570031255949563?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zxx" dir="ltr"><a href="https://t.co/40SVAWc0z2">pic.twitter.com/40SVAWc0z2</a></p>&mdash; Gacha Zone (@Gacha_Zone) <a href="https://twitter.com/Gacha_Zone/status/2031089505751498903?ref_src=twsrc%5Etfw">March 9, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Knock knock.<br>Cuteness delivery. <a href="https://t.co/OPLDUiEfsN">https://t.co/OPLDUiEfsN</a> <a href="https://t.co/xhVz611auu">pic.twitter.com/xhVz611auu</a></p>&mdash; Marcio Lima 利真 マルシオ 💎 (@Preda2005) <a href="https://x.com/Preda2005/status/2030829916967887064?ref_src=twsrc%5Etfw">March 9, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">

<a rel="noopener" href="https://twitter.com/lihua415/status/2029789662580248841" title="https://twitter.com/lihua415/status/2029789662580248841" 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%2Ftwitter.com%2Flihua415%2Fstatus%2F2029789662580248841?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">https://twitter.com/lihua415/status/2029789662580248841</div><div class="blogcard-snippet external-blogcard-snippet"></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://twitter.com/lihua415/status/2029789662580248841" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">twitter.com</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="tl" dir="ltr">GuGuGaGa 😠<a href="https://x.com/hashtag/ArknightsEndfield?src=hash&amp;ref_src=twsrc%5Etfw">#ArknightsEndfield</a> <a href="https://t.co/niJcGFziSM">pic.twitter.com/niJcGFziSM</a></p>&mdash; Zymeth (@Ziymeth) <a href="https://x.com/Ziymeth/status/2028992686041239802?ref_src=twsrc%5Etfw">March 4, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Leave the little penguin alone 🤭 <a href="https://t.co/NOkdgFBVwS">pic.twitter.com/NOkdgFBVwS</a></p>&mdash; Emily (@IamEmily2050) <a href="https://x.com/IamEmily2050/status/2030442073292210395?ref_src=twsrc%5Etfw">March 8, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zxx" dir="ltr"><a href="https://t.co/J9MEqwdaBu">pic.twitter.com/J9MEqwdaBu</a></p>&mdash; Keitaro (@DqKeita) <a href="https://twitter.com/DqKeita/status/2029815398959321374?ref_src=twsrc%5Etfw">March 6, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Your daily dose of penguin cuteness has arrived. 🐧💛 <a href="https://t.co/uAYUzPKr1C">https://t.co/uAYUzPKr1C</a> <a href="https://t.co/jPCjz3Kpjw">pic.twitter.com/jPCjz3Kpjw</a></p>&mdash; Marcio Lima 利真 マルシオ 💎 (@Preda2005) <a href="https://x.com/Preda2005/status/2031158347182096775?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zxx" dir="ltr"><a href="https://t.co/A0UVSri2pu">pic.twitter.com/A0UVSri2pu</a></p>&mdash; Gacha Zone (@Gacha_Zone) <a href="https://twitter.com/Gacha_Zone/status/2031019053993599184?ref_src=twsrc%5Etfw">March 9, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">Absolute gugu gaga<br>古古嘎嘎<a href="https://twitter.com/hashtag/ArknightsEndfield?src=hash&amp;ref_src=twsrc%5Etfw">#ArknightsEndfield</a><a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://t.co/EMzqQPMfCR">pic.twitter.com/EMzqQPMfCR</a></p>&mdash; Snowflake (@Snow_flake43) <a href="https://twitter.com/Snow_flake43/status/2031282376014495905?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="tl" dir="ltr">gugugaga <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://t.co/tx7XJlltu9">pic.twitter.com/tx7XJlltu9</a></p>&mdash; DimenRift (@DimenRift) <a href="https://twitter.com/DimenRift/status/2030502982694097070?ref_src=twsrc%5Etfw">March 8, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">

<a rel="noopener" href="https://twitter.com/GlitterPixely/status/2031405688258277822" title="https://twitter.com/GlitterPixely/status/2031405688258277822" 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%2Ftwitter.com%2FGlitterPixely%2Fstatus%2F2031405688258277822?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">https://twitter.com/GlitterPixely/status/2031405688258277822</div><div class="blogcard-snippet external-blogcard-snippet"></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://twitter.com/GlitterPixely/status/2031405688258277822" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">twitter.com</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">一緒に食べよ？🐧🥩<br><br>Let&#39;s eat together! 🐧🥩<a href="https://x.com/hashtag/AI%E5%8B%95%E7%94%BB?src=hash&amp;ref_src=twsrc%5Etfw">#AI動画</a> <a href="https://x.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://t.co/BwkUMIIetB">pic.twitter.com/BwkUMIIetB</a></p>&mdash; 秦淮孤月 (@qhgy) <a href="https://x.com/qhgy/status/2031786405232546147?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="qme" dir="ltr"><a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/arknightsendfield?src=hash&amp;ref_src=twsrc%5Etfw">#arknightsendfield</a> <a href="https://t.co/dN5Hp1RxfC">pic.twitter.com/dN5Hp1RxfC</a></p>&mdash; G4M3V1L FSS (@G4M3V1L) <a href="https://twitter.com/G4M3V1L/status/2031980902025478644?ref_src=twsrc%5Etfw">March 12, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">take a selfie <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/T1uoLpWYX6">pic.twitter.com/T1uoLpWYX6</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031782201734676515?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">

<a rel="noopener" href="https://twitter.com/Snow_flake43/status/2032009883042955664" title="https://twitter.com/Snow_flake43/status/2032009883042955664" 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%2Ftwitter.com%2FSnow_flake43%2Fstatus%2F2032009883042955664?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">https://twitter.com/Snow_flake43/status/2032009883042955664</div><div class="blogcard-snippet external-blogcard-snippet"></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://twitter.com/Snow_flake43/status/2032009883042955664" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">twitter.com</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zxx" dir="ltr"><a href="https://t.co/Avx8tWHljj">pic.twitter.com/Avx8tWHljj</a></p>&mdash; Keitaro (@DqKeita) <a href="https://twitter.com/DqKeita/status/2032033074305790356?ref_src=twsrc%5Etfw">March 12, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">

<a rel="noopener" href="https://twitter.com/erd_tyg20945/status/2031846974639730814" title="https://twitter.com/erd_tyg20945/status/2031846974639730814" 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%2Ftwitter.com%2Ferd_tyg20945%2Fstatus%2F2031846974639730814?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">https://twitter.com/erd_tyg20945/status/2031846974639730814</div><div class="blogcard-snippet external-blogcard-snippet"></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://twitter.com/erd_tyg20945/status/2031846974639730814" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">twitter.com</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">咕咕嘎嘎 <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/anime?src=hash&amp;ref_src=twsrc%5Etfw">#anime</a> <a href="https://twitter.com/hashtag/arknightsendfield?src=hash&amp;ref_src=twsrc%5Etfw">#arknightsendfield</a> <a href="https://twitter.com/hashtag/ai?src=hash&amp;ref_src=twsrc%5Etfw">#ai</a> <a href="https://twitter.com/hashtag/aichibi?src=hash&amp;ref_src=twsrc%5Etfw">#aichibi</a> <a href="https://t.co/YJemnkMvUG">pic.twitter.com/YJemnkMvUG</a></p>&mdash; GAO! @AIart (@GAOAIArt) <a href="https://twitter.com/GAOAIArt/status/2031659854209880314?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="in" dir="ltr">dancing <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://t.co/s7SXPWGumv">pic.twitter.com/s7SXPWGumv</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031965660306461051?ref_src=twsrc%5Etfw">March 12, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zxx" dir="ltr"><a href="https://t.co/OXMKDLTYEs">pic.twitter.com/OXMKDLTYEs</a></p>&mdash; Keitaro (@DqKeita) <a href="https://twitter.com/DqKeita/status/2031691247765606908?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zxx" dir="ltr"><a href="https://t.co/UeRpFYPsgu">pic.twitter.com/UeRpFYPsgu</a></p>&mdash; Keitaro (@DqKeita) <a href="https://twitter.com/DqKeita/status/2031697718003765749?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zxx" dir="ltr"><a href="https://t.co/JsNgj8Vxja">pic.twitter.com/JsNgj8Vxja</a></p>&mdash; Keitaro (@DqKeita) <a href="https://twitter.com/DqKeita/status/2031734594379075866?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Some days feel heavy.<br>Sometimes all we need is a hug. 🫂🐧<br><br>Drop your country flag and a positive emoji below.<br><br>Let’s send a little light around the world. 🌎✨ <a href="https://t.co/uBO9X0rlYl">https://t.co/uBO9X0rlYl</a> <a href="https://t.co/Sy3QmbdHs7">pic.twitter.com/Sy3QmbdHs7</a></p>&mdash; Marcio Lima 利真 マルシオ 💎 (@Preda2005) <a href="https://x.com/Preda2005/status/2031819970045493676?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">I don’t know how…<br>but this penguin just fixed my entire mood. 🐧🍪 <a href="https://t.co/wuHr3J4CjL">https://t.co/wuHr3J4CjL</a> <a href="https://t.co/1gROrw05Rn">pic.twitter.com/1gROrw05Rn</a></p>&mdash; Marcio Lima 利真 マルシオ 💎 (@Preda2005) <a href="https://x.com/Preda2005/status/2031887388142944580?ref_src=twsrc%5Etfw">March 12, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="zh" dir="ltr"><a href="https://x.com/hashtag/%E6%B5%81%E8%90%A4?src=hash&amp;ref_src=twsrc%5Etfw">#流萤</a> <a href="https://x.com/hashtag/Firefly?src=hash&amp;ref_src=twsrc%5Etfw">#Firefly</a> <a href="https://x.com/hashtag/%E3%83%9B%E3%82%BF%E3%83%AB?src=hash&amp;ref_src=twsrc%5Etfw">#ホタル</a> <a href="https://x.com/hashtag/HonkaiStarRail?src=hash&amp;ref_src=twsrc%5Etfw">#HonkaiStarRail</a>📷 <a href="https://x.com/hashtag/%E5%B4%A9%E5%A3%8A%E3%82%B9%E3%82%BF%E3%83%BC%E3%83%AC%E3%82%A4%E3%83%AB?src=hash&amp;ref_src=twsrc%5Etfw">#崩壊スターレイル</a> <a href="https://x.com/hashtag/AI%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88?src=hash&amp;ref_src=twsrc%5Etfw">#AIイラスト</a> <a href="https://x.com/hashtag/AIart%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F%EF%B8%8F?src=hash&amp;ref_src=twsrc%5Etfw">#AIart️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️️</a> <a href="https://x.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://x.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <br><br>古古嘎嘎 旅行时 <a href="https://t.co/0h06Knp4tO">pic.twitter.com/0h06Knp4tO</a></p>&mdash; Snowflake (@Snow_flake43) <a href="https://x.com/Snow_flake43/status/2031317925660078451?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="qme" dir="ltr">😱😱😱 <a href="https://t.co/bOo9crIMdc">https://t.co/bOo9crIMdc</a> <a href="https://t.co/tQ7jRKNqkS">pic.twitter.com/tQ7jRKNqkS</a></p>&mdash; Marcio Lima 利真 マルシオ 💎 (@Preda2005) <a href="https://x.com/Preda2005/status/2031457037729804606?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">え？なんでお口拭いてくれるの？<br>もう赤ちゃんじゃないんだから！……でも、拭かせてあげる。💦<br><br>お口拭いてあげる人、他にいる？👇<br><br>&#8211;<br><br>Wait, why are you wiping my mouth?<br>I&#39;m not a baby! &#8230;But, I&#39;ll let you wipe it. 💦<br><br>Who else wants to wipe my face? 👇<a href="https://x.com/hashtag/arknightsendfield?src=hash&amp;ref_src=twsrc%5Etfw">#arknightsendfield</a> <a href="https://x.com/hashtag/endfield?src=hash&amp;ref_src=twsrc%5Etfw">#endfield</a>… <a href="https://t.co/LMv1FW7tXq">pic.twitter.com/LMv1FW7tXq</a></p>&mdash; 秦淮孤月 (@qhgy) <a href="https://x.com/qhgy/status/2031584234989826342?ref_src=twsrc%5Etfw">March 11, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">

<a rel="noopener" href="https://twitter.com/Notsu311406/status/2030942378144796767" title="https://twitter.com/Notsu311406/status/2030942378144796767" 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%2Ftwitter.com%2FNotsu311406%2Fstatus%2F2030942378144796767?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">https://twitter.com/Notsu311406/status/2030942378144796767</div><div class="blogcard-snippet external-blogcard-snippet"></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://twitter.com/Notsu311406/status/2030942378144796767" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">twitter.com</div></div></div></div></a>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Every woman deserves a thousand hearts today. 💗🐧 <a href="https://t.co/DjJPh65mlm">pic.twitter.com/DjJPh65mlm</a></p>&mdash; Marcio Lima 利真 マルシオ 💎 (@Preda2005) <a href="https://x.com/Preda2005/status/2030700924889600118?ref_src=twsrc%5Etfw">March 8, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">Our little penguin is so cute<a href="https://twitter.com/hashtag/ArknightsEndfield?src=hash&amp;ref_src=twsrc%5Etfw">#ArknightsEndfield</a> <a href="https://t.co/5LXQBDeE0j">pic.twitter.com/5LXQBDeE0j</a></p>&mdash; lyn (@lyn49556) <a href="https://twitter.com/lyn49556/status/2030976416775565615?ref_src=twsrc%5Etfw">March 9, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">That’s why bid <a href="https://x.com/search?q=%24Gugugaga&amp;src=ctag&amp;ref_src=twsrc%5Etfw">$Gugugaga</a>  100x better than what the dog doin <br><br>6ngSN9zA32mShK5itfNVPsJvwADfiSDxiDbTUpwzpump <a href="https://t.co/1NJysj71Z7">pic.twitter.com/1NJysj71Z7</a></p>&mdash; 𝕸. (@m06112_) <a href="https://x.com/m06112_/status/2029662067192648039?ref_src=twsrc%5Etfw">March 5, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-twitter"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">sleep&#8230;&#8230;<a href="https://twitter.com/hashtag/seedance2?src=hash&amp;ref_src=twsrc%5Etfw">#seedance2</a> <a href="https://twitter.com/hashtag/gugugaga?src=hash&amp;ref_src=twsrc%5Etfw">#gugugaga</a> <a href="https://t.co/H5HfPqXMfC">pic.twitter.com/H5HfPqXMfC</a></p>&mdash; Lucis (@ZocLucis) <a href="https://twitter.com/ZocLucis/status/2031002986332484069?ref_src=twsrc%5Etfw">March 9, 2026</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
</div></figure>
</div>
</div>



<p class="wp-block-paragraph">情報源まとめ</p>




<a rel="noopener" href="https://news.17173.com/content/03072026/000720657.shtml" title="&#19968;&#20010;&#20108;&#21019;&#26775;&#65292;&#23621;&#28982;&#21557;&#21040;&#35201;&#25910;&#29256;&#26435;&#36153;&#65311;&#12298;&#32456;&#26411;&#22320;&#12299;&#8220;&#20225;&#40517;&#31649;&#29702;&#21592;&#8221;&#20316;&#32773;&#21521;&#20854;&#20182;&#20154;&#32034;&#35201;&#25480;&#26435;&#36153;_&#32593;&#32476;&#28216;&#25103;&#26032;&#38395;_17173.com&#20013;&#22269;&#28216;&#25103;&#38376;&#25143;&#31449;" 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%2Fnews.17173.com%2Fcontent%2F03072026%2F000720657.shtml?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">&#19968;&#20010;&#20108;&#21019;&#26775;&#65292;&#23621;&#28982;&#21557;&#21040;&#35201;&#25910;&#29256;&#26435;&#36153;&#65311;&#12298;&#32456;&#26411;&#22320;&#12299;&#8220;&#20225;&#40517;&#31649;&#29702;&#21592;&#8221;&#20316;&#32773;&#21521;&#20854;&#20182;&#20154;&#32034;&#35201;&#25480;&#26435;&#36153;_&#32593;&#32476;&#28216;&#25103;&#26032;&#38395;_17173.com&#20013;&#22269;&#28216;&#25103;&#38376;&#25143;&#31449;</div><div class="blogcard-snippet external-blogcard-snippet">《终末地》二创梗&#039;企鹅管理员&#039;作者竟索要版权费！AI视频爆火后陷版权争议，网友炸锅。揭秘咕咕嘎嘎梗起源与商业纠纷内幕。</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://news.17173.com/content/03072026/000720657.shtml" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">news.17173.com</div></div></div></div></a>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">I have only now realized that Gugu Gaga cuteslop is a viral Arknights:Endfield promotion (had to play Endfield to notice)<br>That seems to be a problem with Chinese Soft Power, their memes evolve far away from the underlying IP. <a href="https://t.co/dm1eEWwOPl">https://t.co/dm1eEWwOPl</a> <a href="https://t.co/liFisk4D5s">pic.twitter.com/liFisk4D5s</a></p>&mdash; Teortaxes▶️ (DeepSeek 推特🐋铁粉 2023 – ∞) (@teortaxesTex) <a href="https://x.com/teortaxesTex/status/2031283640521412778?ref_src=twsrc%5Etfw">March 10, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">I went back in time for this gem of a prompt by Emily just so I could try it with Gugugaga. <br><br>Nano Banana 2🥰 <a href="https://t.co/Ir4BRvwvl4">https://t.co/Ir4BRvwvl4</a> <a href="https://t.co/WZPEOAjJPe">pic.twitter.com/WZPEOAjJPe</a></p>&mdash; Glitter Gal (@GlitterPixely) <a href="https://x.com/GlitterPixely/status/2031942788938362977?ref_src=twsrc%5Etfw">March 12, 2026</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://cgbeginner.net/gugugaga/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2572</post-id>	</item>
		<item>
		<title>別PCからWSL2にSSH接続する方法（mirrored mode）</title>
		<link>https://cgbeginner.net/wsl2-ssh/</link>
					<comments>https://cgbeginner.net/wsl2-ssh/#respond</comments>
		
		<dc:creator><![CDATA[CGBeginner]]></dc:creator>
		<pubDate>Wed, 04 Mar 2026 14:04:18 +0000</pubDate>
				<category><![CDATA[コンピュータ]]></category>
		<guid isPermaLink="false">https://cgbeginner.net/?p=2564</guid>

					<description><![CDATA[WSL2を使っていると、LAN内の別PCやタブレットからSSH接続したい場面があります。 WSL2はデフォルトでNAT構成になっており、同一PC内からはlocalhostで届くものの、LAN上の別PCからはそのままでは届 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">WSL2を使っていると、LAN内の別PCやタブレットからSSH接続したい場面があります。</p>



<p class="wp-block-paragraph">WSL2はデフォルトでNAT構成になっており、同一PC内からは<br><code>localhost</code><br>で届くものの、LAN上の別PCからはそのままでは届きません。</p>



<p class="wp-block-paragraph">対処方法はいくつかありますが、今回はWindows 11で使えるmirrored networking modeを使う方法を選びました。portproxyを使う方法と比べて、WSL2のIPアドレスが再起動のたびに変わる問題を気にしなくていいのがメリットです。</p>



<p class="wp-block-paragraph">ということで、手順をメモ。</p>



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



<h3 class="wp-block-heading" id="環境"><span id="toc1">環境</span></h3>



<ul class="wp-block-list">
<li>Windows 11</li>



<li>WSL2 Ubuntu 24.04</li>
</ul>



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



<h3 class="wp-block-heading" id="目次"><span id="toc2">目次</span></h3>



<ol class="wp-block-list">
<li>WSL2にSSHサーバをインストール</li>



<li>sshdのポートを変更</li>



<li>mirrored modeを有効化</li>



<li>ファイアウォールの設定</li>
</ol>



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



<h3 class="wp-block-heading" id="wsl2にsshサーバをインストール"><span id="toc3">1.WSL2にSSHサーバをインストール</span></h3>



<p class="wp-block-paragraph">WSLのターミナルで実行します。</p>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install -y openssh-server</code></pre>



<p class="wp-block-paragraph">インストールできたら、systemdでサービスとして登録・起動します。</p>



<pre class="wp-block-code"><code>sudo systemctl enable ssh
sudo systemctl start ssh</code></pre>



<p class="wp-block-paragraph">起動確認：</p>



<pre class="wp-block-code"><code>systemctl status ssh</code></pre>



<p class="wp-block-paragraph"><code>Active: active (running)</code> と表示されればOKです。</p>



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



<h3 class="wp-block-heading" id="sshdのポートを変更"><span id="toc4">2. sshdのポートを変更</span></h3>



<p class="wp-block-paragraph">デフォルトは22番ですが、将来的にWindows側にもsshd（22番）を入れることを想定して、WSL2側は2222番にしておきます。</p>



<p class="wp-block-paragraph"><code>/etc/ssh/sshd_config</code> の <code>#Port 22</code> を<br><code>Port 2222</code> に変更します。</p>



<pre class="wp-block-code"><code>sudo sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config</code></pre>



<p class="wp-block-paragraph">Ubuntu 24.04はsystemdのsocket<br>activationを使っているので、ポート変更後は以下の3コマンドが必要です。</p>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
sudo systemctl restart ssh</code></pre>



<p class="wp-block-paragraph">リッスンしているか確認：</p>



<pre class="wp-block-code"><code>ss -tlnp | grep 2222</code></pre>



<p class="wp-block-paragraph"><code>0.0.0.0:2222</code> が表示されればOKです。</p>



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



<h3 class="wp-block-heading" id="mirrored-modeを有効化"><span id="toc5">3. mirrored modeを有効化</span></h3>



<p class="wp-block-paragraph">Windows側の設定です。</p>



<p class="wp-block-paragraph"><code>%USERPROFILE%\.wslconfig</code><br>に以下を追記します（ファイルがなければ新規作成）。</p>



<pre class="wp-block-code"><code>&#91;wsl2]
networkingMode=mirrored</code></pre>



<p class="wp-block-paragraph">PowerShellから書き込む場合：</p>



<pre class="wp-block-code"><code>Add-Content "$env:USERPROFILE\.wslconfig" "`n&#91;wsl2]`nnetworkingMode=mirrored"</code></pre>



<p class="wp-block-paragraph">追記したらWSLを再起動します。</p>



<pre class="wp-block-code"><code>wsl --shutdown</code></pre>



<p class="wp-block-paragraph">WSLのターミナルを開き直して、WindowsのLAN<br>IPが含まれているか確認します。</p>



<pre class="wp-block-code"><code>hostname -I</code></pre>



<p class="wp-block-paragraph"><code>192.168.xxx.xxx</code> が含まれていればmirrored<br>modeが有効になっています。</p>



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



<h3 class="wp-block-heading" id="ファイアウォールの設定"><span id="toc6">4. ファイアウォールの設定</span></h3>



<p class="wp-block-paragraph">mirrored<br>modeではWindowsファイアウォールに加えて、<strong>Hyper-Vファイアウォールへの許可も必要</strong>です。これがないとLANからタイムアウトになります。</p>



<p class="wp-block-paragraph">管理者権限のPowerShellで以下の2つを実行します。</p>



<pre class="wp-block-code"><code># Hyper-Vファイアウォール
New-NetFirewallHyperVRule -Name "WSL2 SSH" -DisplayName "WSL2 SSH" -Direction Inbound -VMCreatorId "{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}" -Protocol TCP -LocalPorts 2222

# Windowsファイアウォール
New-NetFirewallRule -Name "WSL2 SSH" -DisplayName "WSL2 SSH" -Direction Inbound -Protocol TCP -LocalPort 2222 -Action Allow</code></pre>



<p class="wp-block-paragraph"><code>{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}</code><br>はWSL用に固定されているGUIDです。以下のコマンドで確認できます。</p>



<pre class="wp-block-code"><code>Get-NetFirewallHyperVVMCreator</code></pre>



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



<h3 class="wp-block-heading" id="接続確認"><span id="toc7">接続確認</span></h3>



<p class="wp-block-paragraph">別PCから以下で接続できます。</p>



<pre class="wp-block-code"><code>ssh -p 2222 &lt;ユーザー名>@&lt;WindowsのLAN IP></code></pre>



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



<h3 class="wp-block-heading" id="まとめ"><span id="toc8">まとめ</span></h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>項目</th><th>設定内容</th></tr></thead><tbody><tr><td>WSL2ネットワーク</td><td>mirrored mode</td></tr><tr><td>WSL2 sshd</td><td>ポート2222</td></tr><tr><td>Hyper-Vファイアウォール</td><td>TCP 2222 許可</td></tr><tr><td>Windowsファイアウォール</td><td>TCP 2222 許可</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">portproxyと異なり、すべての設定が永続します。WSL再起動後も追加の操作は不要です。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgbeginner.net/wsl2-ssh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2564</post-id>	</item>
		<item>
		<title>○時○分から△△を再生すると □□と同時に年を越せます ジェネレーター</title>
		<link>https://cgbeginner.net/countdown-generator/</link>
					<comments>https://cgbeginner.net/countdown-generator/#respond</comments>
		
		<dc:creator><![CDATA[CGBeginner]]></dc:creator>
		<pubDate>Sat, 27 Dec 2025 17:33:56 +0000</pubDate>
				<category><![CDATA[コンピュータ]]></category>
		<category><![CDATA[全般]]></category>
		<category><![CDATA[映画]]></category>
		<guid isPermaLink="false">https://cgbeginner.net/?p=2531</guid>

					<description><![CDATA[○時○分から△△を再生すると □□と同時に年を越せます というネタ、たまにXで見ますよね。 こういうネタを作るためには、「映画の何時間何分目に、このイベントが起こる」というタイムコードを確認して、そのうえで「元旦0時0分 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">○時○分から△△を再生すると □□と同時に年を越せます</p>



<p class="wp-block-paragraph">というネタ、たまにXで見ますよね。</p>



<figure class="wp-block-embed is-type-rich is-provider-x wp-block-embed-x"><div class="wp-block-embed__wrapper">
<div class="embed-x"><blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">12月31日 21時26分52秒から <a href="https://x.com/hashtag/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%82%B9%E3%83%86%E3%83%A9%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#インターステラー</a> を再生しはじめると、<br>「ユリイカ！」と同時に年を越せます。 <a href="https://t.co/lSNXcYrBpI">https://t.co/lSNXcYrBpI</a> <a href="https://t.co/xhluAAn3eD">pic.twitter.com/xhluAAn3eD</a></p>&mdash; たてはま / CGBeginner @趣味独学映像クリエイター (@cgbeginner) <a href="https://x.com/cgbeginner/status/2004922719603761247?ref_src=twsrc%5Etfw">December 27, 2025</a></blockquote><script async src="https://platform.x.com/widgets.js" charset="utf-8"></script></div>
</div></figure>



<p class="wp-block-paragraph">こういうネタを作るためには、「映画の何時間何分目に、このイベントが起こる」というタイムコードを確認して、そのうえで「元旦0時0分からの逆算を計算する」必要があるので結構めんどくさい。間違えると取り返しつかないですからね。</p>



<p class="wp-block-paragraph">なので計算機を作りました。</p>



<div class="nycalc" data-nycalc>
  <style>
    .nycalc { margin: 16px 0; }

    /* カードをページ（親要素）幅いっぱいに */
    .nycalc .nycalc-card{
      border: 1px solid rgba(127,127,127,.35);
      border-radius: 12px;
      padding: 14px;
      width: 100%;
      max-width: none;
    }

    .nycalc .nycalc-title{ font-size: 1.15rem; font-weight: 700; margin: 0 0 10px; }

    /* 補足は小さめに */
    .nycalc .nycalc-muted{ opacity: .85; font-size: .88rem; line-height: 1.6; }
    .nycalc .nycalc-small{ font-size: .82rem; opacity: .9; }

    .nycalc .nycalc-row{
      display: grid;
      grid-template-columns: 220px 1fr;
      gap: 10px;
      align-items: center;
      margin: 10px 0;
    }
    .nycalc .nycalc-row label{ font-weight: 600; }

    .nycalc input, .nycalc button{
      font: inherit;
      padding: 8px 10px;
      border-radius: 10px;
      border: 1px solid rgba(127,127,127,.35);
      box-sizing: border-box;
    }
    .nycalc input[type="number"]{ max-width: 220px; }
    .nycalc .nycalc-btns{ display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; align-items: center; }
    .nycalc button{ cursor: pointer; }

    .nycalc .nycalc-out{
      margin-top: 14px;
      padding: 12px;
      border-radius: 12px;
      background: rgba(127,127,127,.10);
      border: 1px solid rgba(127,127,127,.22);
    }

    .nycalc .nycalc-mono{
      font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
      font-variant-numeric: tabular-nums;
    }
    .nycalc .nycalc-warn{ color: #ff6b6b; }
    .nycalc .nycalc-twoCol{ display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }

    /* 追加：タイムコードの増減UI */
    .nycalc .nycalc-tcControls button{ padding: 6px 10px; }
    .nycalc .nycalc-tcStep{ width: 96px; }

    /* 開始日時の表示を大きく */
    .nycalc .nycalc-resultMain{
      padding: 12px;
      border-radius: 12px;
      background: rgba(127,127,127,.12);
      border: 1px solid rgba(127,127,127,.28);
      margin-bottom: 10px;
    }
    .nycalc .nycalc-resultLabel{
      font-size: .9rem;
      opacity: .85;
      font-weight: 700;
      margin-bottom: 6px;
    }
    .nycalc .nycalc-resultValue{
      font-size: 2.15rem;
      font-weight: 800;
      line-height: 1.12;
      letter-spacing: .01em;
      word-break: break-word;
    }

    /* 出力側の補足を小さく */
    .nycalc .nycalc-resultMeta{ margin-top: 6px; }
    .nycalc .nycalc-countdown{ margin-top: 6px; }

    @media (max-width: 720px){
      .nycalc .nycalc-row{ grid-template-columns: 1fr; }
      .nycalc .nycalc-twoCol{ grid-template-columns: 1fr; }
      .nycalc .nycalc-resultValue{ font-size: 1.65rem; }
    }
  </style>

  <div class="nycalc-card">
    <div class="nycalc-title">映画タイムコード逆算ツール</div>

    <div class="nycalc-muted">
      現実の「合わせたい日時」（例：元旦 00:00:00）と、映画の「合わせたい瞬間のタイムコード」を入力すると、
      その瞬間が現実時刻と一致するように「再生開始すべき日時」を逆算します。<br>
      タイムコードは <span class="nycalc-mono">HH:MM:SS</span> / <span class="nycalc-mono">HH:MM:SS.mmm</span> に対応。
      フレーム入力は <span class="nycalc-mono">HH:MM:SS:FF</span>（FPS指定）に対応します。
    </div>

    <div class="nycalc-row">
      <label>合わせたい現実の日時</label>
      <div>
        <input class="nycalc-target" type="datetime-local" step="1" />
        <div class="nycalc-btns">
          <button class="nycalc-btnNextNY" type="button">次の元旦をセット</button>
          <button class="nycalc-btnNow" type="button">現在時刻をセット</button>
        </div>
        
      </div>
    </div>

    <div class="nycalc-row">
      <label>映画のタイムコード</label>
      <div>
        <input class="nycalc-timecode" type="text" value="02:07:28" placeholder="例) 02:07:28 / 02:07:28.500 / 02:07:28:12" />

        <div class="nycalc-btns nycalc-tcControls" style="margin-top:10px;">
          <button class="nycalc-tcMinus" type="button" aria-label="タイムコードを減らす">−</button>
          <button class="nycalc-tcPlus" type="button" aria-label="タイムコードを増やす">＋</button>
          <span class="nycalc-muted nycalc-small">ステップ</span>
          <input class="nycalc-tcStep" type="number" step="0.001" value="1" />
          <span class="nycalc-muted nycalc-small">秒</span>
          <button class="nycalc-tcQuick" type="button" data-step="0.1">0.1</button>
          <button class="nycalc-tcQuick" type="button" data-step="1">1</button>
          <button class="nycalc-tcQuick" type="button" data-step="10">10</button>
          <button class="nycalc-tcReset" type="button">リセット</button>
        </div>

        <div class="nycalc-small nycalc-muted">
          <span class="nycalc-mono">SS</span> / <span class="nycalc-mono">MM:SS</span> / <span class="nycalc-mono">HH:MM:SS</span> も受け付けます。
          フレーム指定は <span class="nycalc-mono">HH:MM:SS:FF</span> または <span class="nycalc-mono">HH:MM:SS;FF</span> です。
        </div>
      </div>
    </div>

    <div class="nycalc-row">
      <label>FPS（フレーム指定時のみ）</label>
      <div class="nycalc-twoCol">
        <input class="nycalc-fps" type="number" min="1" step="0.001" value="24" />
        <div class="nycalc-muted nycalc-small">
          <span class="nycalc-mono">HH:MM:SS:FF</span> を使わないなら無視されます。<span class="nycalc-mono">23.976</span> を使う場合は <span class="nycalc-mono">23.976</span>。
        </div>
      </div>
    </div>

    <div class="nycalc-row">
      <label>補正（秒）</label>
      <div class="nycalc-twoCol">
        <input class="nycalc-adjust" type="number" step="0.001" value="0" />
        <div class="nycalc-muted nycalc-small">
          秒ズレを吸収するための微調整です（±秒）。
        </div>
      </div>
    </div>

    <div class="nycalc-btns">
      <button class="nycalc-btnCalc" type="button">計算する</button>
      <button class="nycalc-btnCopy" type="button">開始日時をコピー</button>
    </div>

    <div class="nycalc-out nycalc-output" aria-live="polite">
      <div class="nycalc-muted">まだ計算していません。</div>
    </div>
  </div>

  <script>
    (() => {
      "use strict";

      const widgets = document.querySelectorAll("[data-nycalc]");
      widgets.forEach((root) => {
        const elTarget   = root.querySelector(".nycalc-target");
        const elTimecode = root.querySelector(".nycalc-timecode");
        const elFps      = root.querySelector(".nycalc-fps");
        const elAdjust   = root.querySelector(".nycalc-adjust");
        const elOut      = root.querySelector(".nycalc-output");

        const btnCalc   = root.querySelector(".nycalc-btnCalc");
        const btnCopy   = root.querySelector(".nycalc-btnCopy");
        const btnNextNY = root.querySelector(".nycalc-btnNextNY");
        const btnNow    = root.querySelector(".nycalc-btnNow");

        const btnTcMinus = root.querySelector(".nycalc-tcMinus");
        const btnTcPlus  = root.querySelector(".nycalc-tcPlus");
        const btnTcReset = root.querySelector(".nycalc-tcReset");
        const elTcStep   = root.querySelector(".nycalc-tcStep");
        const tcQuickBtns = root.querySelectorAll(".nycalc-tcQuick");

        const DEFAULT_TIMECODE = (elTimecode.value || "02:07:28").trim();

        const state = { startDt: null, startText: null, targetDt: null, movieOffsetSec: null };

        const pad2 = (n) => String(n).padStart(2, "0");
        const pad3 = (n) => String(n).padStart(3, "0");
        const isFiniteNumber = (x) => typeof x === "number" && Number.isFinite(x);

        function parseLocalDateTime(value){
          if (!value) return null;
          const m = value.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2}))?$/);
          if (!m) return null;

          const y  = Number(m[1]);
          const mo = Number(m[2]) - 1;
          const d  = Number(m[3]);
          const hh = Number(m[4]);
          const mm = Number(m[5]);
          const ss = Number(m[6] ?? "0");

          const dt = new Date(y, mo, d, hh, mm, ss, 0);
          if (dt.getFullYear() !== y || dt.getMonth() !== mo || dt.getDate() !== d ||
              dt.getHours() !== hh || dt.getMinutes() !== mm || dt.getSeconds() !== ss) {
            return null;
          }
          return dt;
        }

        function formatLocalDateTime(dt){
          return `${dt.getFullYear()}/${pad2(dt.getMonth()+1)}/${pad2(dt.getDate())} ${pad2(dt.getHours())}:${pad2(dt.getMinutes())}:${pad2(dt.getSeconds())}`;
        }

        function toDateTimeLocalValue(dt){
          return `${dt.getFullYear()}-${pad2(dt.getMonth()+1)}-${pad2(dt.getDate())}T${pad2(dt.getHours())}:${pad2(dt.getMinutes())}:${pad2(dt.getSeconds())}`;
        }

        function parseTimecodeToSeconds(str, fps){
          if (!str) return NaN;
          const s = String(str).trim().replace(",", ".");
          if (!s) return NaN;

          let frames = null;
          let main = s;

          if (main.includes(";")) {
            const parts = main.split(";");
            if (parts.length !== 2) return NaN;
            main = parts[0].trim();
            frames = Number(parts[1].trim());
            if (!Number.isInteger(frames) || frames < 0) return NaN;
            if (!isFiniteNumber(fps) || fps <= 0) return NaN;
          } else {
            const seg = main.split(":").map(x => x.trim());
            if (seg.length === 4) {
              frames = Number(seg[3]);
              if (!Number.isInteger(frames) || frames < 0) return NaN;
              if (!isFiniteNumber(fps) || fps <= 0) return NaN;
              main = `${seg[0]}:${seg[1]}:${seg[2]}`;
            }
          }

          const parts = main.split(":").map(x => x.trim());
          if (parts.some(p => p === "")) return NaN;

          let hh = 0, mm = 0, ss = 0;

          if (parts.length === 1) {
            ss = Number(parts[0]);
          } else if (parts.length === 2) {
            mm = Number(parts[0]);
            ss = Number(parts[1]);
          } else if (parts.length === 3) {
            hh = Number(parts[0]);
            mm = Number(parts[1]);
            ss = Number(parts[2]);
          } else {
            return NaN;
          }

          if (![hh, mm, ss].every(isFiniteNumber)) return NaN;
          if (hh < 0 || mm < 0 || ss < 0) return NaN;

          let total = hh * 3600 + mm * 60 + ss;
          if (frames !== null) total += frames / fps;
          return total;
        }

        function formatSecondsToTimecode(seconds){
          if (!isFiniteNumber(seconds)) return "";
          let msTotal = Math.round(seconds * 1000);
          if (msTotal < 0) msTotal = 0;

          const wholeSec = Math.floor(msTotal / 1000);
          const ms = msTotal % 1000;

          const hh = Math.floor(wholeSec / 3600);
          const mm = Math.floor((wholeSec % 3600) / 60);
          const ss = wholeSec % 60;

          return (ms !== 0)
            ? `${hh}:${pad2(mm)}:${pad2(ss)}.${pad3(ms)}`
            : `${hh}:${pad2(mm)}:${pad2(ss)}`;
        }

        function msToHMS(ms){
          const sign = ms < 0 ? -1 : 1;
          const abs = Math.abs(ms);
          const totalSec = Math.floor(abs / 1000);
          const remMs = abs % 1000;
          const h = Math.floor(totalSec / 3600);
          const m = Math.floor((totalSec % 3600) / 60);
          const s = totalSec % 60;
          const prefix = sign < 0 ? "-" : "";
          return `${prefix}${h}:${pad2(m)}:${pad2(s)}.${pad3(remMs)}`;
        }

        function render(calcOnly = false){
          const targetDt = parseLocalDateTime(elTarget.value);
          const fps = Number(elFps.value);
          const adjustSec = Number(elAdjust.value);

          if (!targetDt) {
            state.startDt = null;
            elOut.innerHTML = `<div class="nycalc-warn">「合わせたい現実の日時」が不正です。</div>`;
            return null;
          }
          if (!isFiniteNumber(adjustSec)) {
            state.startDt = null;
            elOut.innerHTML = `<div class="nycalc-warn">「補正（秒）」が数値として解釈できません。</div>`;
            return null;
          }

          const tcSec = parseTimecodeToSeconds(elTimecode.value, fps);
          if (!isFiniteNumber(tcSec)) {
            state.startDt = null;
            elOut.innerHTML = `<div class="nycalc-warn">「映画のタイムコード」を解釈できません。例：02:07:28 / 02:07:28.500 / 02:07:28:12（FPS指定）</div>`;
            return null;
          }

          const movieOffsetSec = tcSec + adjustSec;
          const startMs = targetDt.getTime() - movieOffsetSec * 1000;
          const startDt = new Date(startMs);

          state.startDt = startDt;
          state.startText = formatLocalDateTime(startDt);
          state.targetDt = targetDt;
          state.movieOffsetSec = movieOffsetSec;

          if (!calcOnly) {
            elOut.innerHTML = `
              <div class="nycalc-resultMain">
                <div class="nycalc-resultLabel">再生開始すべき日時</div>
                <div class="nycalc-resultValue nycalc-mono">${state.startText}</div>
              </div>

              <div class="nycalc-resultMeta nycalc-small nycalc-muted">
                （合わせたい日時：<span class="nycalc-mono">${formatLocalDateTime(targetDt)}</span> ／ 映画オフセット：<span class="nycalc-mono">${movieOffsetSec.toFixed(3)} sec</span>）
              </div>

              <div class="nycalc-countdown nycalc-small"></div>

            `;
          }

          tickCountdown();
          return state;
        }

        function tickCountdown(){
          const countdownEl = elOut.querySelector(".nycalc-countdown");
          if (!countdownEl) return;
          if (!state.startDt) { countdownEl.textContent = ""; return; }

          const now = new Date();
          const delta = state.startDt.getTime() - now.getTime();
          if (delta >= 0) {
            countdownEl.innerHTML = `開始まであと <span class="nycalc-mono">${msToHMS(delta)}</span>（現在時刻基準）`;
            countdownEl.classList.remove("nycalc-warn");
          } else {
            countdownEl.innerHTML = `開始時刻はすでに <span class="nycalc-mono">${msToHMS(delta)}</span> 経過しています（現在時刻基準）`;
            countdownEl.classList.add("nycalc-warn");
          }
        }

        function setNextNewYear(){
          const now = new Date();
          const nextYear = now.getFullYear() + 1;
          const dt = new Date(nextYear, 0, 1, 0, 0, 0, 0);
          elTarget.value = toDateTimeLocalValue(dt);
          render(false);
        }

        function setNow(){
          const now = new Date();
          elTarget.value = toDateTimeLocalValue(now);
          render(false);
        }

        function getStepSeconds(){
          const v = Number(elTcStep.value);
          if (!isFiniteNumber(v) || v <= 0) return 1;
          return v;
        }

        function bumpTimecode(sign){
          const fps = Number(elFps.value);
          const curSec = parseTimecodeToSeconds(elTimecode.value, fps);
          if (!isFiniteNumber(curSec)) return;

          const step = getStepSeconds();
          const next = curSec + sign * step;

          elTimecode.value = formatSecondsToTimecode(next);
          render(false);
        }

        btnCalc.addEventListener("click", () => render(false));

        btnCopy.addEventListener("click", async () => {
          const res = render(false);
          if (!res || !res.startText) return;

          try {
            await navigator.clipboard.writeText(res.startText);
            elOut.insertAdjacentHTML("beforeend",
              `<div class="nycalc-small nycalc-muted" style="margin-top:6px;">コピーしました：<span class="nycalc-mono">${res.startText}</span></div>`
            );
          } catch {
            elOut.insertAdjacentHTML("beforeend",
              `<div class="nycalc-warn nycalc-small" style="margin-top:6px;">コピーできませんでした（ブラウザ権限等）。上の表示を手動でコピーしてください。</div>`
            );
          }
        });

        btnNextNY.addEventListener("click", setNextNewYear);
        btnNow.addEventListener("click", setNow);

        [elTarget, elTimecode, elFps, elAdjust].forEach(el => {
          el.addEventListener("input", () => render(false));
          el.addEventListener("change", () => render(false));
        });

        btnTcMinus.addEventListener("click", () => bumpTimecode(-1));
        btnTcPlus.addEventListener("click",  () => bumpTimecode(+1));
        btnTcReset.addEventListener("click", () => {
          elTimecode.value = DEFAULT_TIMECODE;
          render(false);
        });

        tcQuickBtns.forEach((b) => {
          b.addEventListener("click", () => {
            const s = Number(b.dataset.step);
            if (isFiniteNumber(s) && s > 0) {
              elTcStep.value = String(s);
              render(false);
            }
          });
        });

        setNextNewYear();
        setInterval(tickCountdown, 250);
      });
    })();
  </script>
</div>
]]></content:encoded>
					
					<wfw:commentRss>https://cgbeginner.net/countdown-generator/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2531</post-id>	</item>
		<item>
		<title>Blenderで「OpenGL 4.3 が必要」エラーでクラッシュする問題解決メモ</title>
		<link>https://cgbeginner.net/blender-opengl-error/</link>
					<comments>https://cgbeginner.net/blender-opengl-error/#respond</comments>
		
		<dc:creator><![CDATA[CGBeginner]]></dc:creator>
		<pubDate>Wed, 03 Dec 2025 19:01:29 +0000</pubDate>
				<category><![CDATA[Blender]]></category>
		<category><![CDATA[コンピュータ]]></category>
		<guid isPermaLink="false">https://cgbeginner.net/?p=2519</guid>

					<description><![CDATA[Windows 11 環境で RTX 5090 を 2 枚（デュアル構成）にしたところ、Blender でレンダリングを実行したタイミングで不定期にクラッシュしました。発生時には、 というメッセージが出て終了することがあ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Windows 11 環境で RTX 5090 を 2 枚（デュアル構成）にしたところ、Blender でレンダリングを実行したタイミングで不定期にクラッシュしました。発生時には、</p>



<ul class="wp-block-list">
<li>Blender &#8211; Unsupported Graphics Card Configuration</li>



<li><code>A graphics card and driver with support for OpenGL 4.3 or higher is required. Plugging all monitors into your primary graphics card might resolve this issue. Installing the latest driver for your graphics card could also help.</code></li>
</ul>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="419" height="206" src="https://cgbeginner.net/wp-content/uploads/2025/12/fde3bcb6a04b377d548c65b1b3bd4ea8.png" alt="" class="wp-image-2520" srcset="https://cgbeginner.net/wp-content/uploads/2025/12/fde3bcb6a04b377d548c65b1b3bd4ea8.png 419w, https://cgbeginner.net/wp-content/uploads/2025/12/fde3bcb6a04b377d548c65b1b3bd4ea8-300x147.png 300w" sizes="(max-width: 419px) 100vw, 419px" /></figure>



<p class="wp-block-paragraph">というメッセージが出て終了することがありました（GPU 自体は当然 OpenGL 4.3 以上対応のはずなのに、です）。</p>



<p class="wp-block-paragraph">イベントログ上では Blender 側が <code>ucrtbase.dll</code> で <code>0xc0000005</code>（アクセス違反）で落ちる記録（Application Error 1000 / WER 1001）が残ることがあり、また WER 側には <code>LiveKernelEvent</code>（WATCHDOG/141 など）が出ることもありました。一方で、典型的な TDR（Display 4101）や nvlddmkm 153 が常に出る、という形ではありませんでした。</p>



<p class="wp-block-paragraph">この問題が厄介だったのは、<strong>再現性が安定しない</strong>点です。ある時は同じシーンで通り、再起動を挟むと同じ操作で落ちる、という挙動になりました。</p>



<p class="wp-block-paragraph">以下、いろいろChatGPTと相談しながら試した記録を記事にしています。</p>



<h2 class="wp-block-heading"><span id="toc1">環境の特徴</span></h2>



<p class="wp-block-paragraph">今回のポイントは「デュアル GPU」だけではなく、<strong>モニタが複数枚で、両方の GPU に接続せざるを得ない構成</strong>だったことです。私の環境は6モニタなので、RTX 5090 は出力が 4 ポートのため物理的に全モニタを片方の GPU に集約することができません。</p>



<p class="wp-block-paragraph">この前提があると、Windows と NVIDIA ドライバが「どちらの GPU で OpenGL コンテキストを作るか」を自動判定する場面で、意図しない選択が起きる余地が増えます。</p>



<h2 class="wp-block-heading"><span id="toc2">切り分けで試したこと（うまくいかなかった／決定打にならなかったもの）</span></h2>



<p class="wp-block-paragraph">以下を試しました。</p>



<h3 class="wp-block-heading"><span id="toc3">1) 片方ずつの GPU でレンダリング</span></h3>



<p class="wp-block-paragraph">Blender 側でデバイスを片方だけ有効にしてレンダリングし、さらに両方を有効にしてレンダリングも実施しました。両方を有効にした場合は、レンダリング時間が約半分（例：1分20秒→40秒程度）まで短縮し、<strong>計算自体は 2 枚使えている</strong>ことが確認できました。ここから「2 枚構成そのものが常に破綻する」という状況ではないと判断しました。</p>



<h3 class="wp-block-heading"><span id="toc4">2) OCCT などで GPU 負荷テスト（PL 制限含む）</span></h3>



<p class="wp-block-paragraph">Afterburner で 2 枚とも Power Limit を 80% にした状態でも OCCT の 3D 負荷を継続でき、電力・温度・安定性の観点では致命的な兆候は見えませんでした。さらに、Blender のレンダリング時間が PL 80% と 100% で大差が出ないケースもあり、少なくとも「PL が原因で Blender が落ちる」という説明は成立しにくい状況でした。</p>



<h3 class="wp-block-heading"><span id="toc5">3) Blender の設定・インストールを疑う（ポータブル ZIP / config 削除）</span></h3>



<p class="wp-block-paragraph">ポータブル版を使い、<code>C:\Users\&lt;User&gt;\AppData\Roaming\Blender Foundation\Blender</code> の設定を削除し、起動直後のデフォルトシーンでも試しました。しかし、それでも落ちる時は落ちました。したがって、<strong>特定アドオンや設定の破損だけが原因</strong>とも言い切れませんでした。</p>



<h3 class="wp-block-heading"><span id="toc6">4) CPU レンダリングでも同様に落ちることがある</span></h3>



<p class="wp-block-paragraph">レンダリングを CPU に切り替えても落ちることがありました。ここが非常に重要で、これにより「CUDA/OptiX の計算部分だけの問題」ではなく、<strong>Blender が動作するための描画系（≒OpenGL 側）での問題</strong>を強く疑う方向に寄りました。</p>



<h3 class="wp-block-heading"><span id="toc7">5) DDU → 最新 Studio Driver をオフラインでクリーンインストール</span></h3>



<p class="wp-block-paragraph">セーフモードで DDU を使い、LAN ケーブルを抜いてオフラインで Studio Driver を入れ直しました。一時的に改善したように見えましたが、再起動後に再発しました。つまり、これは「やる価値はあるが、今回の決定打ではなかった」という位置づけでした。</p>



<h3 class="wp-block-heading"><span id="toc8">6) iGPU を無効化</span></h3>



<p class="wp-block-paragraph">iGPU（AMD Ryzen 内蔵 GPU）をデバイスマネージャで無効化し、再起動しましたが、問題は継続しました。よって今回の主因が iGPU の混在だと断定するのは難しい状態でした。</p>



<h2 class="wp-block-heading"><span id="toc9">最終的に効いた対策（解決策）</span></h2>



<p class="wp-block-paragraph">NVIDIA コントロールパネルで、グローバル設定の <strong>「OpenGL レンダリング GPU （OpenGL rendering GPU）」</strong> を</p>



<ul class="wp-block-list">
<li><strong>Auto（自動）→ 特定の RTX 5090（メイン側）に固定</strong></li>
</ul>



<p class="wp-block-paragraph">へ変更したところ、Blender のエラーが止まり、少なくとも同一条件での再現ができなくなりました。現状、これが最も説明力の高い「解決策」になりました。</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="960" height="711" src="https://cgbeginner.net/wp-content/uploads/2025/12/0fe838e818f3b2bca509941fda78a583.png" alt="" class="wp-image-2521" srcset="https://cgbeginner.net/wp-content/uploads/2025/12/0fe838e818f3b2bca509941fda78a583.png 960w, https://cgbeginner.net/wp-content/uploads/2025/12/0fe838e818f3b2bca509941fda78a583-300x222.png 300w, https://cgbeginner.net/wp-content/uploads/2025/12/0fe838e818f3b2bca509941fda78a583-768x569.png 768w" sizes="(max-width: 960px) 100vw, 960px" /></figure>



<h2 class="wp-block-heading"><span id="toc10">理屈</span></h2>



<h3 class="wp-block-heading"><span id="toc11">1) Blender は「UI/ビューポート＝OpenGL」で動いている</span></h3>



<p class="wp-block-paragraph">Blender は UI とビューポート描画を OpenGL で行います。したがって「レンダリングボタンを押した瞬間」に落ちたように見えても、その瞬間に OpenGL が関与する処理は十分にあり得ます。たとえば、レンダリング開始時には進捗 UI 更新、レンダー結果の表示領域の更新、描画コンテキストの再初期化、ウィンドウ移動・モニタ跨ぎに伴うコンテキスト再確立などが起こり得ます。</p>



<p class="wp-block-paragraph">また、CPU レンダリングでも落ちることがあった点は、「計算（CUDA/OptiX/CPU）ではなく、表示系（OpenGL）起点のクラッシュ」が混ざっている説明と整合します。</p>



<h3 class="wp-block-heading"><span id="toc12">2) デュアル GPU + 複数モニタでは「どの GPU が OpenGL を担当するか」が揺れます</span></h3>



<p class="wp-block-paragraph">モニタが複数で両方の GPU に接続されていると、アプリのウィンドウがどのモニタ上にあるか、OS がどのアダプタを優先として扱うか、ドライバの自動判定がどう働くか、という条件が絡みます。</p>



<p class="wp-block-paragraph">この自動判定が不安定だったり、特定条件で誤った GPU を選ぶ（あるいは OpenGL コンテキスト作成が失敗する）と、アプリ側は「OpenGL 4.3 以上が必要」という“能力不足に見えるエラー”として落ちることがあります。実際には GPU の能力不足ではなく、<strong>OpenGL コンテキストが期待どおりに作れなかった</strong>ことが本質です。</p>



<p class="wp-block-paragraph">そこで OpenGL rendering GPU を固定すると、OpenGL の担当 GPU がブレなくなり、コンテキスト作成・維持の条件が安定します。今回の改善はこの説明が最も自然です。</p>



<h3 class="wp-block-heading"><span id="toc13">3) 「固定していないほうの GPU 接続モニタでも落ちない」理由</span></h3>



<p class="wp-block-paragraph">この挙動も矛盾ではありません。OpenGL rendering GPU を固定した場合、ウィンドウがどの GPU に接続されたモニタ上にあっても、OpenGL の実処理は指定 GPU で行われる（または少なくとも指定 GPU を優先）という形になります。そのため「非指定側モニタで操作したら必ず落ちる」ということにはなりません。</p>



<h2 class="wp-block-heading"><span id="toc14">どちらの 5090 を指定するべきか</span></h2>



<p class="wp-block-paragraph">基本的には、次の方針が合理的です。</p>



<ul class="wp-block-list">
<li><strong>メインモニタが接続されている GPU（普段の UI を担当している側）を指定する</strong></li>



<li>もし OC 版と無印があり、さらに PCIe のリンク条件などが良い側が明確なら、その「条件が良い側」を指定する</li>
</ul>



<p class="wp-block-paragraph">OpenGL は UI/ビューポートの体感にも関わるため、普段使いの滑らかさや安定性の観点では「メイン側に寄せる」判断が筋が通ります。</p>



<h2 class="wp-block-heading"><span id="toc15">これで CUDA / OptiX のレンダリングは 2 枚使えるのか</span></h2>



<p class="wp-block-paragraph">使えます。OpenGL rendering GPU の設定は、主に <strong>OpenGL の描画担当</strong>を決める設定です。一方、Blender の CUDA / OptiX レンダリングは、Blender 側の「使用デバイス設定」で 2 枚とも有効にしていれば、基本的に両方を使います。</p>



<p class="wp-block-paragraph">実際にタスクマネージャー上で 2 枚とも使用率が上がっている観測があるなら、「計算に使われている」という理解で問題ありません。</p>



<h2 class="wp-block-heading"><span id="toc16">グローバル固定のデメリット（起こり得ること）</span></h2>



<p class="wp-block-paragraph">グローバル固定は運用が楽で、今回のように「Auto の揺れが原因」っぽいケースでは有効です。一方、理屈上のデメリットは次の通りです。</p>



<ul class="wp-block-list">
<li>OpenGL を使う他アプリでも、その指定 GPU に OpenGL が寄るため、用途によっては負荷が偏る可能性があります</li>



<li>ごく稀に、特定アプリが「表示している GPU と同じ GPU で OpenGL したい」前提で作られている場合、挙動が変わる可能性があります（この種の問題は一般には多くありませんが、可能性としては残ります）</li>
</ul>



<p class="wp-block-paragraph">ただし、挙げられている主要アプリ（Premiere Pro / After Effects / Photoshop / DaVinci Resolve）は、実務上は DirectX/CUDA 側が中心で、OpenGL rendering GPU の固定が直撃するケースは多くありません。したがって、「まずグローバルで固定して安定を取る」という判断は現実的です。</p>



<p class="wp-block-paragraph">もし将来、特定アプリだけ違和感が出た場合は、その時点で「グローバルは Auto に戻し、Blender（blender.exe）だけプログラム設定で固定する」という運用に切り替えると、影響範囲を最小化できます。</p>



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



<p class="wp-block-paragraph">今回の問題は、GPU 性能不足ではなく、<strong>デュアル GPU + 複数モニタ構成における OpenGL 担当 GPU の自動選択が不安定で、Blender の OpenGL コンテキストが破綻する瞬間があった</strong>、という整理が最も整合します。</p>



<p class="wp-block-paragraph">DDU やドライバクリーンインストール、iGPU 無効化は「やるべき切り分け」ではありますが、決定打は <strong>NVIDIA コントロールパネルで OpenGL rendering GPU を固定</strong>することでした。これにより、Blender の UI/ビューポート（OpenGL）経路が安定し、レンダリング開始時のクラッシュが止まりました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgbeginner.net/blender-opengl-error/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2519</post-id>	</item>
		<item>
		<title>UbuntuにCockpitをインストールしてVM環境構築</title>
		<link>https://cgbeginner.net/ubuntu-cockpit-vm/</link>
					<comments>https://cgbeginner.net/ubuntu-cockpit-vm/#respond</comments>
		
		<dc:creator><![CDATA[CGBeginner]]></dc:creator>
		<pubDate>Sun, 16 Nov 2025 15:23:36 +0000</pubDate>
				<category><![CDATA[コンピュータ]]></category>
		<guid isPermaLink="false">https://cgbeginner.net/?p=2510</guid>

					<description><![CDATA[はじめに 自宅サーバ（Ubuntu）上で、Proxmox のような「全部入りハイパーバイザ」を入れずに、できるだけミニマルな構成で という目的で環境を構築したときの手順メモ。 ポイントは次の 3 つ。 この記事は、試行錯 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading"><span id="toc1">はじめに</span></h2>



<p class="wp-block-paragraph">自宅サーバ（Ubuntu）上で、Proxmox のような「全部入りハイパーバイザ」を入れずに、できるだけミニマルな構成で</p>



<ul class="wp-block-list">
<li>Web UI から VM を操作したい</li>



<li>Windows 11 をデスクトップ用途で使える VM として常用したい</li>
</ul>



<p class="wp-block-paragraph">という目的で環境を構築したときの手順メモ。</p>



<p class="wp-block-paragraph">ポイントは次の 3 つ。</p>



<ul class="wp-block-list">
<li>Ubuntu そのままの上に <strong>KVM + libvirt</strong> を載せる</li>



<li>管理用 Web UI として <strong>Cockpit（cockpit-machines）</strong> を使う</li>



<li>Windows 11 の要件を満たすために <strong>UEFI + vTPM 2.0</strong> をきちんと用意する</li>
</ul>



<p class="wp-block-paragraph">この記事は、試行錯誤でハマった部分は省き、「未来の自分が見てすぐ再現できる」ことを狙って整理している。</p>



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



<h2 class="wp-block-heading"><span id="toc2">前提環境</span></h2>



<ul class="wp-block-list">
<li>ホスト OS：Ubuntu Server 24.04 LTS (noble)</li>



<li>仮想化支援：x86_64 CPU（KVM 対応 / VT-x / AMD-V 有効）</li>



<li>ネットワーク：<code>systemd-networkd</code> + netplan（NetworkManager には切り替えない前提）</li>



<li>目的の VM：
<ul class="wp-block-list">
<li>作業用 Windows 11（デスクトップ用途）</li>
</ul>
</li>
</ul>



<p class="wp-block-paragraph">ここでは、作業用 Windows 11 VM（以降 <code>columbia</code>）を作るところまでを対象とする。</p>



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



<h2 class="wp-block-heading"><span id="toc3">仮想化基盤（KVM / libvirt）と Cockpit の導入</span></h2>



<h3 class="wp-block-heading"><span id="toc4">1. 仮想化スタックのインストール</span></h3>



<p class="wp-block-paragraph">まずは KVM / libvirt / virt-install / OVMF / swtpm を入れる。</p>



<pre class="wp-block-code"><code>sudo apt update

# 仮想化基盤（KVM + libvirt）＋ UEFI(OVMF) ＋ vTPM（Windows 11 等向け）
sudo apt install -y \
  qemu-kvm libvirt-daemon-system libvirt-clients virtinst \
  ovmf swtpm swtpm-tools libtpms0
</code></pre>



<p class="wp-block-paragraph">ポイント：</p>



<ul class="wp-block-list">
<li><code>qemu-kvm</code> を指定しているが、Ubuntu 24.04 では裏で <code>qemu-system-x86</code> が選択される。</li>



<li><code>ovmf</code> は UEFI ファームウェア（OVMF）を提供するパッケージ。</li>



<li><code>swtpm</code> + <code>libtpms0</code> は vTPM 2.0 のエミュレータ。Windows 11 の TPM 要件を満たすために必須。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc5">2. Cockpit と主要アドオンのインストール</span></h3>



<p class="wp-block-paragraph">Cockpit 本体と、VM 管理に必要なアドオンを <strong>backports</strong> から入れる。</p>



<pre class="wp-block-code"><code>. /etc/os-release

sudo apt install -y -t ${VERSION_CODENAME}-backports \
  cockpit cockpit-machines cockpit-storaged cockpit-networkmanager
</code></pre>



<ul class="wp-block-list">
<li><code>cockpit-machines</code> … VM 管理 UI（libvirt のフロントエンド）</li>



<li><code>cockpit-storaged</code> … ストレージ状態の確認・操作</li>



<li><code>cockpit-networkmanager</code> … NetworkManager を使う場合のネットワーク管理 UI<br>（今回は <code>systemd-networkd</code> 続投なので、編集機能はあまり使わず、主に状態確認に留める）</li>
</ul>



<h3 class="wp-block-heading"><span id="toc6">3. サービスの有効化</span></h3>



<p class="wp-block-paragraph"><code>libvirtd</code> は常駐、Cockpit はソケット起動にする。</p>



<pre class="wp-block-code"><code>sudo systemctl enable --now libvirtd cockpit.socket
</code></pre>



<p class="wp-block-paragraph">ファイアウォールに UFW を使っている場合は 9090 番を開けておく。</p>



<pre class="wp-block-code"><code>sudo ufw allow 9090/tcp
</code></pre>



<h3 class="wp-block-heading"><span id="toc7">4. libvirt グループへの追加</span></h3>



<p class="wp-block-paragraph">非 root で VM を扱えるように、自分のユーザーを <code>libvirt</code> グループへ。</p>



<pre class="wp-block-code"><code>sudo usermod -aG libvirt $USER
</code></pre>



<p class="wp-block-paragraph">いったんログアウト／ログインし直し、<code>groups</code> で <code>libvirt</code> が含まれていることを確認する。</p>



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



<h2 class="wp-block-heading"><span id="toc8">Windows 11 ISO とストレージの整理</span></h2>



<h3 class="wp-block-heading"><span id="toc9">1. ISO 用ディレクトリを用意</span></h3>



<p class="wp-block-paragraph"><code>qemu:///system</code> の VM は <code>libvirt-qemu</code> ユーザーで動くため、通常ユーザーのホームディレクトリにある ISO はそのままでは読めない。<br>インストールメディアは libvirt 管理下のディレクトリに置くのが安全。</p>



<pre class="wp-block-code"><code>sudo mkdir -p /var/lib/libvirt/iso
</code></pre>



<p class="wp-block-paragraph">ここに Windows 11 の ISO を配置する。例：</p>



<pre class="wp-block-code"><code># 手元の PC からサーバへコピーする例（IP は適宜変更）
scp Win11_24H2_Japanese_x64.iso \
    ctrluser@192.168.100.31:/var/lib/libvirt/iso/
    
sudo chown root:root /var/lib/libvirt/iso/Win11_24H2_Japanese_x64.iso
sudo chmod 644       /var/lib/libvirt/iso/Win11_24H2_Japanese_x64.iso
</code></pre>



<p class="wp-block-paragraph">OS ディスク（qcow2）は、デフォルトの <code>/var/lib/libvirt/images</code> に作成する方針とする。</p>



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



<h2 class="wp-block-heading"><span id="toc10">Cockpit へのアクセス</span></h2>



<p class="wp-block-paragraph">ブラウザから以下にアクセス。</p>



<ul class="wp-block-list">
<li><code>https://&lt;サーバIP&gt;:9090/</code> （例：<code>https://192.168.100.31:9090/</code>）</li>
</ul>



<p class="wp-block-paragraph">自己署名証明書の警告は許可する。<br>Ubuntu のユーザー（例：<code>ctrluser</code>）でログインしておく。</p>



<p class="wp-block-paragraph">左側メニューの「Virtual Machines（仮想マシン）」を開くと、libvirt の System インスタンス（<code>qemu:///system</code>）が見えるようになる。</p>



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



<h2 class="wp-block-heading"><span id="toc11">Windows 11 VM（columbia）の作成</span></h2>



<h3 class="wp-block-heading"><span id="toc12">1. 新規作成ウィザード</span></h3>



<p class="wp-block-paragraph">Cockpit の「Virtual Machines」画面で「Create new virtual machine」をクリックし、以下のように設定する。</p>



<ul class="wp-block-list">
<li>Name：<code>columbia</code>（小文字で統一）</li>



<li>Connection：<strong>System</strong><br>（<code>qemu:///system</code>：サーバ側で常時管理される VM 群）</li>



<li>Installation source / Type：<br>→ <strong>Local install media (ISO image)</strong> のような「ローカルインストールメディア」系を選ぶ<br>（※「OS をダウンロード」は Windows が出てこないので使わない）</li>



<li>Operating system：
<ul class="wp-block-list">
<li><code>Windows 11</code> が候補に出ればそれを選択</li>



<li>出ない場合は <code>Windows 10</code> か <code>Generic Windows</code> など近いものを選んでおけばよい</li>
</ul>
</li>



<li>Disk：
<ul class="wp-block-list">
<li>Format：<code>qcow2</code>（デフォルト）</li>



<li>Size：<strong>128 GiB</strong>（論理サイズ。qcow2 なので実際には使用量に応じて増える）</li>
</ul>
</li>



<li>Memory：<strong>16 GiB</strong>（作業用の Windows として余裕を持たせる）</li>



<li>vCPU：詳細設定から <strong>4 vCPU</strong> にする</li>
</ul>



<p class="wp-block-paragraph">重要：<br>ウィザードの最後で <strong>「Create and edit」(作成して編集する)</strong> を選び、<br>作成直後に詳細画面へ入れるようにしておく。</p>



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



<h2 class="wp-block-heading"><span id="toc13">VM 設定のカスタマイズ（UEFI / TPM / デバイス）</span></h2>



<h3 class="wp-block-heading"><span id="toc14">2.1 ファームウェアを UEFI にする</span></h3>



<p class="wp-block-paragraph"><code>columbia</code> の概要タブで、「Firmware」が <code>UEFI</code> になっていることを確認する。<br>もし <code>BIOS</code> になっていれば <code>UEFI</code> に変更する。</p>



<p class="wp-block-paragraph">OVMF のエントリが複数ある場合は、可能なら Secure Boot 付きのものを選ぶ。</p>



<p class="wp-block-paragraph">例：</p>



<ul class="wp-block-list">
<li><code>UEFI x86_64: /usr/share/OVMF/OVMF_CODE.secboot.fd ...</code></li>
</ul>



<p class="wp-block-paragraph">が選べるならこれを使う。</p>



<h3 class="wp-block-heading"><span id="toc15">2.2 TPM 2.0（vTPM）の設定</span></h3>



<p class="wp-block-paragraph"><code>ovmf</code> + <code>swtpm</code> を入れておけば、libvirt は vTPM 2.0 を扱える。<br>Cockpit に TPM 追加 UI がない場合でも、libvirt の XML に直接書けばよい。</p>



<p class="wp-block-paragraph">定義を編集：</p>



<pre class="wp-block-code"><code>sudo virsh edit columbia
</code></pre>



<p class="wp-block-paragraph"><code>&lt;devices&gt; ... &lt;/devices&gt;</code> ブロック内に、以下のような <code>&lt;tpm&gt;</code> ブロックがあることを確認する。無ければ追加する。</p>



<pre class="wp-block-code"><code>&lt;tpm model='tpm-crb'&gt;
  &lt;backend type='emulator' version='2.0'/&gt;
&lt;/tpm&gt;
</code></pre>



<ul class="wp-block-list">
<li><code>model='tpm-crb'</code> は TPM 2.0 向けのインターフェース</li>



<li><code>backend type='emulator' version='2.0'</code> で <code>swtpm</code> を使う vTPM 2.0 になる</li>
</ul>



<p class="wp-block-paragraph">保存に成功すれば、その VM には TPM 2.0 デバイスが追加された状態になる。</p>



<h3 class="wp-block-heading"><span id="toc16">2.3 ディスクと NIC の設定方針</span></h3>



<p class="wp-block-paragraph">初回インストールをスムーズに行うことを優先し、</p>



<ul class="wp-block-list">
<li>システムディスク：バス <code>sata</code> のまま</li>



<li>NIC：モデル <code>e1000e</code> のまま</li>
</ul>



<p class="wp-block-paragraph">で進める。</p>



<p class="wp-block-paragraph">どちらも Windows 標準ドライバで認識されるので、追加ドライバなしでインストーラが動く。</p>



<p class="wp-block-paragraph">（後から virtio ドライバを入れてディスク/NIC を virtio 化することは可能。この記事ではそこまでは扱わない。）</p>



<h3 class="wp-block-heading"><span id="toc17">2.4 Windows 11 ISO を CD-ROM として割り当て</span></h3>



<p class="wp-block-paragraph">Cockpit の <code>columbia</code> 詳細画面で、「Disks」タブから CD-ROM デバイスを確認・設定する。</p>



<ol class="wp-block-list">
<li>既にインストール元として ISO が設定されていれば、そのままでもよい。</li>



<li>設定されていない／パスが古い場合は、一度削除し、改めて追加する：
<ul class="wp-block-list">
<li>「Add disk」→ <code>CD-ROM</code> を選び、</li>



<li>Source ファイルとして<br><code>/var/lib/libvirt/iso/Win11_24H2_Japanese_x64.iso</code><br>を指定する。</li>
</ul>
</li>
</ol>



<p class="wp-block-paragraph">これで、VM 起動時に DVD として Windows 11 インストーラがマウントされる。</p>



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



<h2 class="wp-block-heading"><span id="toc18">Windows 11 のインストール</span></h2>



<h3 class="wp-block-heading"><span id="toc19">3.1 起動と「Press any key…」への対応</span></h3>



<p class="wp-block-paragraph"><code>columbia</code> が <code>Shut off</code> 状態であることを確認し、Cockpit から「Install」または「Start」を押す。</p>



<ul class="wp-block-list">
<li>直後にコンソールタブ（グラフィカルコンソール）を開き、<br>コンソール内をクリックしてフォーカスを合わせておく。</li>



<li>起動直後、画面下部に <code>Press any key to boot from CD or DVD......</code> が一瞬表示されるので、<strong>すぐに Enter などを押す</strong>。</li>
</ul>



<p class="wp-block-paragraph">ここでキー入力が間に合わないと DVD ブートがスキップされ、</p>



<pre class="wp-block-code"><code>BdsDxe: No bootable option or device was found.
</code></pre>



<p class="wp-block-paragraph">等と表示されてしまう。<br>その場合は一度シャットダウンして再度起動し、今度はメッセージが出た瞬間に Enter を押す。</p>



<h3 class="wp-block-heading"><span id="toc20">3.2 インストーラの基本的な流れ</span></h3>



<p class="wp-block-paragraph">あとは物理マシンと同じ流れでインストールする。</p>



<ol class="wp-block-list">
<li>言語・キーボードを選択 → 「次へ」→「今すぐインストール」</li>



<li>プロダクトキー入力画面
<ul class="wp-block-list">
<li>ライセンスキーがあればここで入力</li>



<li>後で入れる場合は「プロダクトキーがありません」を選択</li>
</ul>
</li>



<li>エディション選択（Pro / Home などライセンスに合わせたもの）</li>



<li>ライセンス条項に同意</li>



<li>インストールの種類<br>→ <strong>「カスタム: Windows のみをインストール（詳細設定）」</strong> を選ぶ</li>
</ol>



<h3 class="wp-block-heading"><span id="toc21">3.3 パーティションの作成</span></h3>



<p class="wp-block-paragraph">「Windows をインストールする場所」画面では、ディスク 0 に「未割り当ての領域」として ~128GB が見えているはず。</p>



<ul class="wp-block-list">
<li>ここでは細かいことはせず、**未割り当ての領域を選択して「次へ」**でよい。<br>Windows が EFI システムパーティション・MSR・C: ドライブなどを自動で作ってくれる。</li>
</ul>



<p class="wp-block-paragraph">その後は通常どおり、コピー → 再起動 → 初期設定（地域 / アカウント / プライバシーなど）を進めればよい。</p>



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



<p class="wp-block-paragraph">余談として、最近のWindows11は、なにがなんでもMicrosoftアカウントとの紐づけをさせてくる仕様になってます。私はそれが好きではなく、ローカルアカウントでセットアップしたい。裏技的な作業になってしまうのですが、方法はあります。以下参考。</p>


<a rel="noopener" href="https://utelecon.adm.u-tokyo.ac.jp/microsoft/win-local" title="Windows 11 でのローカルアカウントを用いたセットアップ方法" 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://cgbeginner.net/wp-content/uploads/cocoon-resources/blog-card-cache/ee78b4de791435828d70927f85cde35a.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">Windows 11 でのローカルアカウントを用いたセットアップ方法</div><div class="blogcard-snippet external-blogcard-snippet">目次: 概要; ローカルアカウントでのセットアップ手順; FAQ&#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://utelecon.adm.u-tokyo.ac.jp/microsoft/win-local/" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">utelecon.adm.u-tokyo.ac.jp</div></div></div></div></a>


<h2 class="wp-block-heading"><span id="toc22">インストール後の確認と仕上げ</span></h2>



<h3 class="wp-block-heading"><span id="toc23">4.1 TPM 2.0 が認識されているか</span></h3>



<p class="wp-block-paragraph">Windows 起動後、<code>Win + R</code> から <code>tpm.msc</code> を実行し、TPM 管理画面を開く。</p>



<ul class="wp-block-list">
<li>TPM のバージョンが <strong>2.0</strong> と表示されていれば OK。</li>
</ul>



<p class="wp-block-paragraph">これで Windows 11 の TPM 要件は満たされている。</p>



<h3 class="wp-block-heading"><span id="toc24">4.2 ネットワーク</span></h3>



<ul class="wp-block-list">
<li>NIC を <code>e1000e</code> のままにしているので、特別なドライバを入れなくてもネットワークは動作しているはず。</li>



<li>ホスト側では libvirt の <code>default</code> ネットワーク（NAT）が使われる。<br>当面はこのままで問題ない。必要に応じて、後から Linux ブリッジを作り、VM を LAN 直結にする設計も検討できる。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc25">4.3 ゲストツール（virtio ドライバ）の導入（任意）</span></h3>



<p class="wp-block-paragraph">パフォーマンスを詰めたい場合は、別途 <code>virtio-win.iso</code> をダウンロードして</p>



<ul class="wp-block-list">
<li>2 枚目の CD-ROM として VM にマウント</li>



<li>ゲスト内で <code>virtio-win-guest-tools.exe</code> を実行</li>
</ul>



<p class="wp-block-paragraph">することで、virtio 系のドライバをまとめて導入できる。<br>その後、ディスクや NIC を virtio 化していく、という流れが一般的だが、本記事の範囲外とする。</p>



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



<h2 class="wp-block-heading"><span id="toc26">libvirt System と User session の使い分けメモ</span></h2>



<p class="wp-block-paragraph">Cockpit 上で VM を作る際、「Connection」として</p>



<ul class="wp-block-list">
<li>System（<code>qemu:///system</code>）</li>



<li>User session（<code>qemu:///session</code>）</li>
</ul>



<p class="wp-block-paragraph">が選べるが、本記事のような <strong>サーバ上で常用する VM</strong> はすべて <strong>System</strong> に置くのが基本方針。</p>



<p class="wp-block-paragraph">理由：</p>



<ul class="wp-block-list">
<li>サーバ再起動後に、System VM は簡単に自動起動・手動起動できる</li>



<li>CLI から <code>virsh start columbia</code> などで統一的に扱える</li>



<li>ブリッジや物理 NIC、vTPM などのリソース管理が System 側に集中する</li>
</ul>



<p class="wp-block-paragraph">User session は「そのユーザーがログインしている間だけ動いていればよい一時 VM」向けと考える。</p>



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



<h2 class="wp-block-heading"><span id="toc27">おまけ：systemd-networkd-wait-online のエラーについて</span></h2>



<p class="wp-block-paragraph">Cockpit の「Services」で</p>



<pre class="wp-block-code"><code>systemd-networkd-wait-online.service
Failed to start Wait for Network to be Configured.
Timeout occurred while waiting for network connectivity.
</code></pre>



<p class="wp-block-paragraph">といったエラーが出ることがある。</p>



<p class="wp-block-paragraph">これは</p>



<ul class="wp-block-list">
<li><code>systemd-networkd</code> が管理しているすべての NIC が「オンライン」になるまで待ったが、</li>



<li>ケーブルが抜けている NIC などがいて、いつまで経っても揃わないためタイムアウト</li>
</ul>



<p class="wp-block-paragraph">しただけで、実際に使っている NIC（例：<code>enp1s0f0np0</code>）が正常に上がっているなら実害はほぼない。</p>



<p class="wp-block-paragraph">気になる場合の対処案：</p>



<ol class="wp-block-list">
<li><strong>サービス自体を無効化してしまう</strong> <code>sudo systemctl disable --now systemd-networkd-wait-online.service</code> 多くの自宅サーバ用途では、これで問題になることは少ない。</li>



<li><strong>netplan で「必須ではない」NIC を optional にする</strong> netplan の YAML にて、使っていない NIC に <code>optional: true</code> を付ける。 <code>network: version: 2 renderer: networkd ethernets: enp4s0: dhcp4: true optional: true</code> その上で <code>sudo netplan generate sudo netplan apply</code> とすれば、その NIC が上がらなくても「オンライン」と判断される。</li>
</ol>



<p class="wp-block-paragraph">このエラー自体は Windows 11 VM とは無関係なので、優先度は低い。「気になったら片付ける」程度の認識でよい。</p>



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



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



<ul class="wp-block-list">
<li>Ubuntu 24.04 上に <strong>KVM + libvirt + Cockpit</strong> を載せるだけで、Proxmox 的な日常運用（起動・停止・コンソール・スナップショット）がかなり快適にこなせる。</li>



<li>Windows 11 VM を問題なく動かすためには、<br><strong>UEFI(OVMF) + vTPM 2.0（swtpm）</strong> をきちんと用意してからインストールするのがポイント。</li>



<li>ISO の置き場所は <code>/var/lib/libvirt/iso</code> など libvirt からアクセス可能なパスにまとめる。</li>



<li>VM 名は <code>columbia</code> のように小文字で統一し、System 接続（<code>qemu:///system</code>）側に揃えておくと、CLI や将来の DNS 管理などがやりやすい。</li>
</ul>



<p class="wp-block-paragraph">この状態までできていれば、あとは同じ要領で</p>



<ul class="wp-block-list">
<li>バックグラウンド処理用 Windows 11</li>



<li>ダウンロード専用 Ubuntu VM</li>
</ul>



<p class="wp-block-paragraph">なども追加し、用途ごとに VM を分離していくことができる。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgbeginner.net/ubuntu-cockpit-vm/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2510</post-id>	</item>
		<item>
		<title>USBのWebカメラの映像をRTSP配信する（Raspberry Pi）</title>
		<link>https://cgbeginner.net/usbcam-rtsp/</link>
					<comments>https://cgbeginner.net/usbcam-rtsp/#respond</comments>
		
		<dc:creator><![CDATA[CGBeginner]]></dc:creator>
		<pubDate>Thu, 30 Oct 2025 16:08:40 +0000</pubDate>
				<category><![CDATA[コンピュータ]]></category>
		<guid isPermaLink="false">https://cgbeginner.net/?p=2499</guid>

					<description><![CDATA[USB 接続の UVC カメラ（MJPEG を出力）を Raspberry Pi 4 で取り込み、V4L2 M2M ハードウェア H.264 でエンコードした映像を MediaMTX（旧 rtsp-simple-serv [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">USB 接続の UVC カメラ（MJPEG を出力）を Raspberry Pi 4 で取り込み、V4L2 M2M ハードウェア H.264 でエンコードした映像を MediaMTX（旧 rtsp-simple-server）で RTSP 配信する方法のメモ。</p>



<p class="wp-block-paragraph">※自分用メモなので非常に雑ですので役に立つ方のみ自身の責任の上で参考にしてください。</p>



<p class="wp-block-paragraph">使用するUSBカメラ</p>



<p class="wp-block-paragraph">バッファロー BSW505MBK</p>




<a rel="noopener" href="https://amzn.to/4nthCC8" title="&#12496;&#12483;&#12501;&#12449;&#12525;&#12540; BSW505MBK WEB&#12459;&#12513;&#12521; 1080P &#12501;&#12523;HD 200&#19975;&#30011;&#32032;" 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://cgbeginner.net/wp-content/uploads/cocoon-resources/blog-card-cache/b67a10856b1253b643966bbc3485bb9d.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">&#12496;&#12483;&#12501;&#12449;&#12525;&#12540; BSW505MBK WEB&#12459;&#12513;&#12521; 1080P &#12501;&#12523;HD 200&#19975;&#30011;&#32032;</div><div class="blogcard-snippet external-blogcard-snippet">Amazon.co.jp: バッファロー WEBカメラ 1080P フルHD 30fps 200万画素 広角約120° Zoom/Slack/Microsoft Teamsメーカー動作確認済 Windows/Mac対応 プライバシーシャッタ...</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://amzn.to/4nthCC8" alt="" class="blogcard-favicon-image external-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain external-blogcard-domain">amzn.to</div></div></div></div></a>



<p class="wp-block-paragraph">このカメラは、MotionJPEGで出力されるのですが、H264で配信したいので、エンコードもしつつ配信します。Raspberry Pi 4にはハードウェアエンコーダーがあるのでそれを使います。</p>



<pre class="wp-block-code"><code># カメラの確認
v4l2-ctl --list-devices
v4l2-ctl -d /dev/video0 --list-formats-ext</code></pre>



<p class="wp-block-paragraph">FFmpegインストール</p>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install -y ffmpeg v4l-utils</code></pre>



<p class="wp-block-paragraph">私の例</p>



<div class="wp-block-cocoon-blocks-toggle-box-1 toggle-wrap toggle-box block-box not-nested-style cocoon-block-toggle"><input id="toggle-checkbox-202510310109130" class="toggle-checkbox" type="checkbox"/><label class="toggle-button" for="toggle-checkbox-202510310109130">アコーディオン見出し</label><div class="toggle-content">
<pre class="wp-block-code"><code>ctrluser@metis:~ $ v4l2-ctl --list-devices
bcm2835-codec-decode (platform:bcm2835-codec):
        /dev/video10
        /dev/video11
        /dev/video12
        /dev/video18
        /dev/video31

bcm2835-isp (platform:bcm2835-isp):
        /dev/video13
        /dev/video14
        /dev/video15
        /dev/video16
        /dev/video20
        /dev/video21
        /dev/video22
        /dev/video23
        /dev/media0
        /dev/media2

rpi-hevc-dec (platform:rpi-hevc-dec):
        /dev/video19
        /dev/media1

USB 2.0 Camera: USB Camera (usb-0000:01:00.0-1.3):
        /dev/video0
        /dev/video1
        /dev/media4

bcm2835-codec (vchiq:bcm2835-codec):
        /dev/media3

ctrluser@metis:~ $ v4l2-ctl -d /dev/video0 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
        Type: Video Capture

        &#91;0]: 'MJPG' (Motion-JPEG, compressed)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x1024
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x960
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 1280x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 848x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 800x600
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x400
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 352x288
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 176x144
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 160x120
                        Interval: Discrete 0.033s (30.000 fps)
        &#91;1]: 'YUYV' (YUYV 4:2:2)
                Size: Discrete 1920x1080
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1280x1024
                        Interval: Discrete 0.200s (5.000 fps)
                Size: Discrete 1280x960
                        Interval: Discrete 0.100s (10.000 fps)
                Size: Discrete 1280x720
                        Interval: Discrete 0.100s (10.000 fps)
                Size: Discrete 1280x480
                        Interval: Discrete 0.067s (15.000 fps)
                Size: Discrete 848x480
                        Interval: Discrete 0.050s (20.000 fps)
                Size: Discrete 800x600
                        Interval: Discrete 0.050s (20.000 fps)
                Size: Discrete 640x480
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 640x400
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 352x288
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 320x240
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 176x144
                        Interval: Discrete 0.033s (30.000 fps)
                Size: Discrete 160x120
                        Interval: Discrete 0.033s (30.000 fps)
ctrluser@metis:~ $ ffmpeg -hide_banner -encoders | grep v4l2m2m
 V..... h263_v4l2m2m         V4L2 mem2mem H.263 encoder wrapper (codec h263)
 V..... h264_v4l2m2m         V4L2 mem2mem H.264 encoder wrapper (codec h264)
 V..... hevc_v4l2m2m         V4L2 mem2mem HEVC encoder wrapper (codec hevc)
 V..... mpeg4_v4l2m2m        V4L2 mem2mem MPEG4 encoder wrapper (codec mpeg4)
 V..... vp8_v4l2m2m          V4L2 mem2mem VP8 encoder wrapper (codec vp8)
ctrluser@metis:~ $</code></pre>
</div></div>



<p class="wp-block-paragraph">MediaMTXインストール</p>



<pre class="wp-block-code"><code>wget https://github.com/bluenviron/mediamtx/releases/download/v1.15.3/mediamtx_v1.15.3_linux_arm64.tar.gz
wget https://github.com/bluenviron/mediamtx/releases/download/v1.15.3/checksums.sha256

# チェックサム確認（行が 'OK' になればOK）
grep mediamtx_v1.15.3_linux_arm64.tar.gz checksums.sha256 | sha256sum --check -

tar xzf mediamtx_v1.15.3_linux_arm64.tar.gz
sudo mv mediamtx /usr/local/bin/</code></pre>



<p class="wp-block-paragraph">MediaMTXの設定</p>



<pre class="wp-block-code"><code>sudo vi /usr/local/bin/mediamtx.yml</code></pre>



<pre class="wp-block-code"><code>paths:
  cam:
    runOnInit: &gt;
      ffmpeg
      -f v4l2 -thread_queue_size 1024
      -input_format mjpeg -framerate 30 -video_size 1920x1080
      -fflags +discardcorrupt
      -i /dev/video0
      -f alsa -thread_queue_size 1024 -ar 48000 -ac 1
      -i plughw:3,0
      -filter:v "scale=in_range=pc:out_range=tv,format=yuv420p,drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf:text='%Y-%m-%d %H\:%M\:%S':expansion=strftime:x=10:y=10:fontsize=26:fontcolor=white:box=1:boxcolor=0x00000088:boxborderw=10"
      -c:v h264_v4l2m2m -b:v 4M -maxrate 4M -bufsize 8M -g 60
      -c:a aac -b:a 128k -ar 48000 -ac 1
      -map 0:v:0 -map 1:a:0
      -max_interleave_delta 0
      -f rtsp -rtsp_transport tcp
      rtsp://127.0.0.1:$RTSP_PORT/$MTX_PATH
    runOnInitRestart: yes</code></pre>



<h3 class="wp-block-heading">パイプラインの要点</h3>



<ul class="wp-block-list">
<li><strong>入力</strong>：<code>v4l2</code> で <code>/dev/video0</code> を <strong>MJPEG 1080p/30</strong> で取得。</li>



<li><strong>色・画素フォーマットの正規化</strong>：<code>scale=in_range=pc:out_range=tv,format=yuv420p</code>。
<ul class="wp-block-list">
<li>MJPEG はフルレンジ（PC レンジ, 4:2:2）になりがちなので、TV レンジの <code>yuv420p</code> に確実に整えます。</li>
</ul>
</li>



<li><strong>タイムスタンプ焼き込み</strong>：<code>drawtext</code> を <code>expansion=strftime</code> で使用。
<ul class="wp-block-list">
<li><code>text='%Y-%m-%d %H\:%M\:%S'</code> … ローカル時刻を <code>YYYY-MM-DD HH:MM:SS</code> で描画。</li>



<li><code>box=1:boxcolor=0x00000088:boxborderw=10</code> … 白文字に半透明黒ボックス＋<strong>10px の余白（padding）</strong>。</li>



<li>フォントは <code>DejaVuSansMono</code> を <code>fontfile=</code> で明示（<code>sudo apt install -y fonts-dejavu-core</code> で導入）。</li>
</ul>
</li>



<li><strong>エンコード</strong>：<code>h264_v4l2m2m</code>（HW H.264）。目安ビットレート 4 Mbps、GOP 60（30fps で約 2 秒）。</li>



<li><strong>発行</strong>：Pi 内の MediaMTX に <strong>RTSP/TCP でローカル発行</strong>。</li>



<li><strong>配信</strong>：クライアントは <code>rtsp://&lt;PiのIP>:8554/cam</code> へ接続。</li>
</ul>



<h3 class="wp-block-heading">systemd ユニット</h3>



<p class="wp-block-paragraph">MediaMTX 本体と設定ファイルは以下の配置を前提とします。</p>



<ul class="wp-block-list">
<li>バイナリ：<code>/usr/local/bin/mediamtx</code></li>



<li>設定：<code>/usr/local/bin/mediamtx.yml</code></li>
</ul>



<p class="wp-block-paragraph"><code>/etc/systemd/system/mediamtx.service</code>：</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=MediaMTX RTSP server
Wants=network.target


&#91;Service]
ExecStart=/usr/local/bin/mediamtx /usr/local/bin/mediamtx.yml
Restart=always
RestartSec=3


&#91;Install]
WantedBy=multi-user.target</code></pre>



<p class="wp-block-paragraph">有効化と起動：</p>



<pre class="wp-block-code"><code>sudo systemctl daemon-reload</code></pre>



<pre class="wp-block-code"><code>sudo systemctl enable --now mediamtx</code></pre>



<p class="wp-block-paragraph">ログ監視は</p>



<pre class="wp-block-code"><code>journalctl -u mediamtx -f</code></pre>
]]></content:encoded>
					
					<wfw:commentRss>https://cgbeginner.net/usbcam-rtsp/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2499</post-id>	</item>
		<item>
		<title>UbuntuにDockerをインストール</title>
		<link>https://cgbeginner.net/ubuntu-docker/</link>
					<comments>https://cgbeginner.net/ubuntu-docker/#respond</comments>
		
		<dc:creator><![CDATA[CGBeginner]]></dc:creator>
		<pubDate>Sat, 19 Jul 2025 05:52:06 +0000</pubDate>
				<category><![CDATA[コンピュータ]]></category>
		<guid isPermaLink="false">https://cgbeginner.net/?p=2474</guid>

					<description><![CDATA[Dockerのインストール方法のメモです。 ちなみに、合わせてDocker composeと、Docker buildxをインストールしてます。 Dockerクライアントがデーモンを操作するためには、sudoコマンドを使 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Dockerのインストール方法のメモです。</p>



<pre class="wp-block-code"><code>sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb &#91;arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null
cat /etc/apt/sources.list.d/docker.list
sudo apt-get update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</code></pre>



<p class="wp-block-paragraph">ちなみに、合わせてDocker composeと、Docker buildxをインストールしてます。</p>



<p class="wp-block-paragraph">Dockerクライアントがデーモンを操作するためには、sudoコマンドを使って管理者権限を取得するか、dockerグループに所属する必要があります。dockerグループに所属しておけば、sudoなしにコンテナの生成や操作ができますので何かと便利です。このdockerグループはdocker-engineインストール時に自動的に作成されていますので、あとはユーザーをグループに追加してログインしなおすだけです。</p>



<p class="wp-block-paragraph">今操作しているユーザをdockerグループに加えることで、dockerコマンドをsudoなしで実行できるように権限付与しておきます。</p>



<pre class="wp-block-code"><code>sudo usermod -aG docker $USER</code></pre>



<p class="wp-block-paragraph">次回ログインから有効になるので、適宜再ログインしましょう。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://cgbeginner.net/ubuntu-docker/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2474</post-id>	</item>
	</channel>
</rss>
