<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on 大体動かない</title><link>https://daitai.dev/posts/</link><description>Recent content in Posts on 大体動かない</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Mon, 06 Apr 2026 19:12:00 +0900</lastBuildDate><atom:link href="https://daitai.dev/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Code の git push が壊れた日：バイナリ解析よりリリースノートを先に読め</title><link>https://daitai.dev/posts/git-push-debug/</link><pubDate>Mon, 06 Apr 2026 19:12:00 +0900</pubDate><guid>https://daitai.dev/posts/git-push-debug/</guid><description>&lt;p&gt;Claude Code で &lt;code&gt;git push&lt;/code&gt; できなくなった。原因調査の過程を Claude とのやりとりで再現する。結論を先に言うと、&lt;strong&gt;リリースノートを最初に見ていれば 5 分で終わった話だった。&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;根本原因：&lt;/strong&gt; v2.1.91 で &lt;code&gt;excludedCommands&lt;/code&gt; のマッチング挙動が修正された&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;バージョン&lt;/th&gt;
 &lt;th&gt;&lt;code&gt;excludedCommands: [&amp;quot;git&amp;quot;]&lt;/code&gt; の動作&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;v2.1.90 以前&lt;/td&gt;
 &lt;td&gt;バグで &lt;code&gt;git push origin main&lt;/code&gt; にもマッチ → sandbox 完全 bypass&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;v2.1.91 以降&lt;/td&gt;
 &lt;td&gt;仕様通りに修正。&lt;code&gt;&amp;quot;git&amp;quot;&lt;/code&gt; は bare &lt;code&gt;git&lt;/code&gt; のみにマッチ → sandbox 適用 → 認証情報へのアクセスがブロックされ失敗&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;修正した設定：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// Before
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;excludedCommands&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;git&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// After
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;excludedCommands&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;git *&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;今回は俺と Claude さんの会話を再現してます。一部省略。&lt;/p&gt;
&lt;h2 id="scene-1動くはずのものが動かない"&gt;Scene 1：動くはずのものが動かない&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;俺：この環境で git push できる？ターミナル(CLI)だと
　　サンドボックスで阻まれてプッシュできないって言われたんだけど。
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Claude はまず調査に入った。リモートを確認し、dry-run を試みる。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;fatal: could not read Username for &amp;#39;https://github.com&amp;#39;: No such device or address
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;失敗。&lt;/p&gt;</description></item><item><title>Anthropic の OAuth 禁止で NanoClaw 大丈夫？→大丈夫(?)だと思うけど別の問題があった</title><link>https://daitai.dev/posts/nanoclaw-docker-startup/</link><pubDate>Mon, 06 Apr 2026 01:38:34 +0900</pubDate><guid>https://daitai.dev/posts/nanoclaw-docker-startup/</guid><description>&lt;p&gt;Anthropic がサードパーティツールでの OAuth トークン利用を禁止したというニュースを見て、自分の &lt;a href="https://github.com/nanoclaw/nanoclaw"&gt;NanoClaw&lt;/a&gt; は大丈夫かと確認しに行ったら、OAuth とは別のところに問題があった。&lt;/p&gt;
&lt;h2 id="anthropic-の-oauth-禁止とは"&gt;Anthropic の OAuth 禁止とは&lt;/h2&gt;
&lt;p&gt;Anthropic が Claude Pro/Max のサブスクリプション認証トークンをサードパーティツール経由で使う行為を禁止した。&lt;/p&gt;
&lt;p&gt;要するに「月 20 ドルの Claude Pro に加入して、API キーの代わりにそのセッショントークンを使えば月 200〜500 ドル相当の API をほぼタダで使える」という抜け道を塞いだ話。&lt;/p&gt;
&lt;p&gt;昨今の Claude への流入増大も影響あったんだろうね。&lt;/p&gt;
&lt;h2 id="nanoclaw-への影響は"&gt;NanoClaw への影響は？&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;(おそらく)なし。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;公式が&lt;a href="https://nanoclaws.io/blog/anthropic-oauth-ban-why-api-keys-win"&gt;そう言ってる&lt;/a&gt;、けどまあどうなるか分かんないけどね。&lt;br&gt;
NanoClaw は、Anthropic の正規 API キーを使う構成で、OAuth には一切依存していない。認証まわりは OneCLI という credential proxy が担っていて、コンテナ起動時に &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; 経由でキーを注入する仕組みになっている。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Credentials are injected by the host&amp;rsquo;s credential proxy via ANTHROPIC_BASE_URL.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;直接 &lt;code&gt;.env&lt;/code&gt; に API キーを書くわけでもなく、OAuth トークンを流用するわけでもないので、今回の禁止措置とは完全に無関係って言ってる。まあ若干不安だけど。&lt;br&gt;
ということで確かめてみることにしました。&lt;/p&gt;
&lt;h2 id="onecli-の設定確認しておくか"&gt;OneCLI の設定確認しておくか&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;onecli&lt;/code&gt; コマンドで実際の状態を確認しようとしたら…&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ onecli auth status

{
 &amp;#34;error&amp;#34;: &amp;#34;getting user: executing request: Get \&amp;#34;http://127.0.0.1:10254/api/user\&amp;#34;: dial tcp 127.0.0.1:10254: connect: connection refused&amp;#34;,
 &amp;#34;code&amp;#34;: &amp;#34;ERROR&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;OneCLI のサーバーが落ちてる…&lt;br&gt;
いやいや、最初から躓くの？&lt;br&gt;
NanoClaw 自体は動いてるんだっけ？&lt;/p&gt;</description></item><item><title>Ubuntu + fcitx5 で IME モードをトップバーの色で示す GNOME 拡張を作った(作ってもらった)</title><link>https://daitai.dev/posts/gnome-ime-indicator/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0900</pubDate><guid>https://daitai.dev/posts/gnome-ime-indicator/</guid><description>&lt;p&gt;Ubuntu デスクトップで日本語入力してると、いま英語モードなのか日本語モードなのかわからなくなることがよくある。トップバーの右端に「あ」とか「A」は出てるんだけど、作業中は目線が画面中央にあるので全然気づかない。&lt;/p&gt;
&lt;p&gt;何回も Ghostty の tmux でプレフィックス打って効かないことが続くの嫌になった。心底嫌になった。&lt;/p&gt;
&lt;p&gt;macOS だと入力モード切り替え時に画面上に色付きのバーで今のモードを表示してくれるやつがあったのに…&lt;/p&gt;
&lt;h2 id="既製品を探した"&gt;既製品を探した&lt;/h2&gt;
&lt;p&gt;Claude さんに相談してみて、GNOME Extensions も漁ったけど、ぴったりのものがない。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Kimpanel&lt;/strong&gt;（extension/261）: fcitx5 と連携してトップバーにモード表示できる。でも文字表示なので見づらさは変わらない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Input-Method Status Indicator&lt;/strong&gt;（extension/68）: IBus 向けなので fcitx5 環境では微妙&lt;/li&gt;
&lt;li&gt;カーソル近くに表示するやつ: Linux/GNOME には存在しなかった&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そんなとき&lt;/p&gt;
&lt;p&gt;「無ければ作ればいいじゃんｗ」&lt;/p&gt;
&lt;p&gt;みたいなノリで Claude 様がおっしゃられたので&lt;/p&gt;
&lt;p&gt;「まじっすか、それでお願いします！」&lt;/p&gt;
&lt;p&gt;って言ったら10分もかからずにできた。すげーなおい。&lt;/p&gt;
&lt;p&gt;俺指示したの「色の指定は外出しファイルにしてリアルタイムに反映できるようにしといて」の雑な1行だけ。&lt;/p&gt;
&lt;p&gt;そんな雑な指示によって作られたものが以下です。&lt;/p&gt;
&lt;h2 id="作ったもの作ってもらったもの"&gt;作ったもの(作ってもらったもの)&lt;/h2&gt;
&lt;p&gt;fcitx5 が提供している &lt;code&gt;fcitx5-remote&lt;/code&gt; コマンドをポーリングして、返り値に応じてトップバーの色を切り替える GNOME Shell 拡張。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;~/.local/share/gnome-shell/extensions/ime-indicator@local/
├── extension.js
├── colors.json
└── metadata.json
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="metadatajson"&gt;metadata.json&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;IME Indicator&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;fcitx5 の入力モードに応じてトップバーの背景色を切り替える&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;uuid&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;ime-indicator@local&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;shell-version&amp;#34;&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;&amp;#34;46&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;version&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="colorsjson"&gt;colors.json&lt;/h3&gt;
&lt;p&gt;色の設定だけを切り出したファイル。ここを編集すると即時反映される。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;jp&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;#641414&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;en&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;#000000&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="extensionjs"&gt;extension.js&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Extension&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;resource:///org/gnome/shell/extensions/extension.js&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;resource:///org/gnome/shell/ui/main.js&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GLib&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;gi://GLib&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Gio&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;gi://Gio&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;IMEIndicatorExtension&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;extends&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Extension&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;enable&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_colors&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;jp&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#641414&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;en&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#000000&amp;#34;&lt;/span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_isJp&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_loadColors&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_watchColors&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_updateState&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_timeout&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GLib&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;timeout_add&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;GLib&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;PRIORITY_DEFAULT&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;400&lt;/span&gt;, () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_updateState&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GLib&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;SOURCE_CONTINUE&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;disable&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_timeout&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;GLib&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;source_remove&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_timeout&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_timeout&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_monitor&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_monitor&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;cancel&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_monitor&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;panel&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;set_style&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;_loadColors&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; [&lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;contents&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;GLib&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;file_get_contents&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/colors.json`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;ok&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_colors&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;parse&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TextDecoder&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;decode&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;contents&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_isJp&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_applyColor&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_isJp&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;) {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;_watchColors&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;file&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Gio&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;File&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;new_for_path&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/colors.json`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_monitor&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;file&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;monitor_file&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Gio&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;FileMonitorFlags&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NONE&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_monitor&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;connect&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;changed&amp;#34;&lt;/span&gt;, (&lt;span style="color:#a6e22e"&gt;_m&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;_f&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;_o&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;eventType&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;eventType&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Gio&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;FileMonitorEvent&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;CHANGES_DONE_HINT&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_loadColors&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;_updateState&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;proc&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Gio&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Subprocess&lt;/span&gt;.&lt;span style="color:#66d9ef"&gt;new&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#34;fcitx5-remote&amp;#34;&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Gio&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;SubprocessFlags&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;STDOUT_PIPE&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;proc&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;communicate_utf8_async&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;null&lt;/span&gt;, (&lt;span style="color:#a6e22e"&gt;proc&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;try&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; [, &lt;span style="color:#a6e22e"&gt;stdout&lt;/span&gt;] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;proc&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;communicate_utf8_finish&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; parseInt(&lt;span style="color:#a6e22e"&gt;stdout&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;trim&lt;/span&gt;());
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isJp&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;state&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;isJp&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_isJp&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_isJp&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isJp&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_applyColor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;isJp&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;) {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;catch&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;) {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;_applyColor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;isJp&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;color&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;isJp&lt;/span&gt; &lt;span style="color:#f92672"&gt;?&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_colors&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;jp&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;this&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;_colors&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;en&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Main&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;panel&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;set_style&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;`background-color: &lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;color&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;;`&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ポイント"&gt;ポイント&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;fcitx5-remote&lt;/code&gt; の返り値&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>VSCode Copilot Chat と Claude Code、bash の扱いが違う</title><link>https://daitai.dev/posts/copilotchat-claudecode-bash/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0900</pubDate><guid>https://daitai.dev/posts/copilotchat-claudecode-bash/</guid><description>&lt;p&gt;午前中、Copilot Chat のエージェントモードでコマンド実行したら止まるという事象が頻発した。.bashrc に仕掛け作って凌いだ。定時過ぎに Claude Code の仕組みを調べたらなんか知らんけど上手く動いてた、という一日の話。&lt;/p&gt;
&lt;h2 id="午前copilot-chat-のエージェントモードでコマンド実行すると以後進まない"&gt;午前：Copilot Chat のエージェントモードでコマンド実行すると以後進まない&lt;/h2&gt;
&lt;p&gt;VSCode の Copilot Chat をエージェントモードで使っていたら、コマンドを実行させるとそこで「Preparing」が点滅し続けてそこから進まなくなった。&lt;/p&gt;
&lt;p&gt;なんだよこれと思って調べてみると、oh-my-posh が原因。oh-my-posh v28.1.1 以降で VSCode Shell Integration と競合するようになったらしく、エージェントが叩いた bash がそのまま固まる。&lt;/p&gt;
&lt;p&gt;解決策として &lt;code&gt;.bashrc&lt;/code&gt; に VSCode 向けの早期リターンを仕込んだ。&lt;code&gt;$TERM_PROGRAM&lt;/code&gt; は VSCode が統合ターミナルを開くときにセットする変数で、WSL・ネイティブ Ubuntu どちらでも &lt;code&gt;vscode&lt;/code&gt; になる。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# mise shims（全環境で必要）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;mise activate bash --shims&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# VSCode 統合ターミナルはここで早期リターン&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$TERM_PROGRAM&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;vscode&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;]]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 以降はインタラクティブ専用（Tabby / GNOME Terminal など）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eval &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;oh-my-posh init bash ...&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ghq, fzf など...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これで Copilot Chat のエージェントモードは直った。さくさく進むようになった。でも午前の業務は溶けた。う○こですよ。&lt;/p&gt;</description></item><item><title>余ったMacBook Pro 2015でUbuntuを動かすまでの地獄</title><link>https://daitai.dev/posts/macbook-ubuntu/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0900</pubDate><guid>https://daitai.dev/posts/macbook-ubuntu/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;先日 Windows 11 のノートPCを手に入れた。会社でも WSL で Ubuntu 使ってるので喜び勇んで WSL をセットアップして満足。うちでも開発できる環境ができた。&lt;br&gt;
それはそれでいいんだけど、それまでメインで使っていた MacBook Pro 2015 は完全に引退となった。&lt;/p&gt;
&lt;p&gt;macOS はとっくに更新できなくなっているし、このまま眠らせておくのも勿体ない。&lt;/p&gt;
&lt;h2 id="openclaw"&gt;OpenClaw&lt;/h2&gt;
&lt;p&gt;最近、猫も杓子も &lt;strong&gt;&lt;a href="https://openclaw.ai/"&gt;OpenClaw&lt;/a&gt;&lt;/strong&gt; という世の中の流れになっているらしい。中国ではセットアップするサービスに行列が出来たとか何とか。&lt;br&gt;
自宅サーバーに置いてローカルで動き、WhatsApp や Telegram など使い慣れたチャットアプリから操作できる。メール管理やカレンダー操作、ファイル操作まで自動化できるというやつですね。
面白そうだし、試してみようかなーと思ったけど、いざ調べてみたら結構セキュリティやばそう。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;RCE 脆弱性（CVE-2026-25253、CVSS 8.8）が報告されており、認証なしで公開されているインスタンスが世界に 42,000 件以上&lt;/li&gt;
&lt;li&gt;プラグインマーケットプレイス（ClawHub）の約 12% が悪意あるスキル&lt;/li&gt;
&lt;li&gt;メール・カレンダー・購入・ファイルと権限が広すぎるので、侵害されたときの被害が大きい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;いや、これ普通にやったらやばいだろ。&lt;/p&gt;
&lt;h2 id="nanoclaw"&gt;nanoclaw&lt;/h2&gt;
&lt;p&gt;で、他のないかなと探していたら、&lt;strong&gt;&lt;a href="https://nanoclaw.dev/"&gt;nanoclaw&lt;/a&gt;&lt;/strong&gt; を見つけた。コンテナで隔離して動かせる設計になっているし、これならホストへの影響も最小限になりそう。&lt;/p&gt;
&lt;p&gt;ということで、MacBook Pro 2015 に Ubuntu を入れて、その上で nanoclaw をコンテナで動かすことにしたんだけど、そこからはまりまくった。&lt;/p&gt;
&lt;p&gt;Claude の Pro プラン入ってなかったら確実に諦めてたわ。それが以下の話。&lt;/p&gt;
&lt;h2 id="ubuntu-インストール"&gt;Ubuntu インストール&lt;/h2&gt;
&lt;p&gt;Ubuntu のインストール自体は公式のやり方にしたがって、Amazon ブランドの USB (なかなか評判いいんですね)にインストールイメージを焼いて起動、手順通りに進めるだけでOK。&lt;/p&gt;
&lt;p&gt;apt update / upgrade も通る。linuxbrew, gh, fzf, ghq, oh-my-posh, google-chrome, claudecode などなどを入れ始めて、さあ nanoclaw いったるかーというところで様子がおかしくなった。&lt;/p&gt;</description></item><item><title>このブログについて</title><link>https://daitai.dev/posts/hello-devlog/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0900</pubDate><guid>https://daitai.dev/posts/hello-devlog/</guid><description>&lt;p&gt;システムエンジニアやってます。&lt;/p&gt;
&lt;p&gt;GitHubCopilot や ClaudeCode をいじって遊んでて、「AI すげーな」みたいな小並感を日々感じてます。&lt;/p&gt;
&lt;p&gt;このブログのサブタイトルが &lt;strong&gt;〜大体動かない〜&lt;/strong&gt; なのは、新しいツール使ってみたりすると大体動かないから。最近では AI があるので本当に助かってます。嘘をつかれないようにインストラクションをいじいじして試行錯誤したりしてます。そんなメモ書きのブログです。&lt;/p&gt;</description></item></channel></rss>