<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>skmtkytr blog</title><description>技術ブログ</description><link>https://skmtkytr.github.io</link><item><title>KDE Plasma から Sway・COSMIC を試して戻ってきた話</title><link>https://skmtkytr.github.io/posts/wm-exploration-2026-04</link><guid isPermaLink="true">https://skmtkytr.github.io/posts/wm-exploration-2026-04</guid><description>CachyOS + RTX 4090 環境で KDE Plasma からタイリング WM を求めて Sway、COSMIC DE を試した記録。Nvidia 特有のハマりポイントと各 DE の使い心地をまとめる。</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;きっかけ&lt;/h2&gt;
&lt;p&gt;KDE Plasma を使っていて、タイリングと軽量化をしたくなった。KDE のウィンドウマネージャー KWin にも KDE 6 からネイティブタイリングが入ったが、Quick Tile ショートカット（&lt;code&gt;Meta+←→&lt;/code&gt;）とタイルエディタが別システムで連携しないという問題があった。「どうせならちゃんとしたタイリング WM を試してみるか」というのが出発点だ。&lt;/p&gt;
&lt;h2&gt;環境&lt;/h2&gt;
&lt;p&gt;| 項目 | 値 |
|------|----|
| OS | CachyOS |
| GPU | NVIDIA RTX 4090 + AMD Raphael iGPU |
| DM | plasmalogin |
| Kernel | linux-cachyos 7.0.1 |&lt;/p&gt;
&lt;h2&gt;Sway を試す&lt;/h2&gt;
&lt;h3&gt;インストール&lt;/h3&gt;
&lt;p&gt;まず Sway + 周辺ツールを入れた。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-fish&quot;&gt;sudo pacman -S sway waybar wofi mako swaylock swayidle grim slurp
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CachyOS の &lt;code&gt;cachyos-sway-settings&lt;/code&gt; 相当のパッケージは存在しないので、設定は全部自前で書く必要がある。chezmoi で管理する形にした。&lt;/p&gt;
&lt;h3&gt;Nvidia で真っ暗になる問題&lt;/h3&gt;
&lt;p&gt;ログインすると真っ暗になって何も操作できない状態に。原因は2つあった。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;① &lt;code&gt;nvidia-drm.modeset=1&lt;/code&gt; が未設定&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Limine ブートローダーを使っているので &lt;code&gt;/boot/limine.conf&lt;/code&gt; の &lt;code&gt;cmdline&lt;/code&gt; に追記した。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cmdline: quiet nowatchdog splash rw rootflags=subvol=/@ root=UUID=... nvidia-drm.modeset=1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;② &lt;code&gt;--unsupported-gpu&lt;/code&gt; フラグが渡っていない&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sway は Nvidia proprietary ドライバーを公式サポートしておらず、&lt;code&gt;--unsupported-gpu&lt;/code&gt; フラグなしでは起動を拒否する。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;plasmalogin&lt;/code&gt; は &lt;code&gt;~/.local/share/wayland-sessions/&lt;/code&gt; を読まずシステムの &lt;code&gt;/usr/share/wayland-sessions/&lt;/code&gt; しか参照しない。シンボリックリンクも pacman 更新時に上書きされる。&lt;/p&gt;
&lt;p&gt;最終的に採用した解決策は&lt;strong&gt;ラッパースクリプト + 別名 &lt;code&gt;.desktop&lt;/code&gt; ファイル&lt;/strong&gt;だ。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;# /usr/local/bin/sway-nvidia
#!/bin/sh
exec sway --unsupported-gpu &quot;$@&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;# /usr/share/wayland-sessions/sway-nvidia.desktop
[Desktop Entry]
Name=Sway (Nvidia)
Exec=sway-nvidia
Type=Application
DesktopNames=sway;wlroots
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;sway&lt;/code&gt; パッケージとは別ファイルなので更新で上書きされない。&lt;code&gt;/usr/local/bin/&lt;/code&gt; も pacman の管理外なので永続する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;③ Nvidia 環境変数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~/.config/environment.d/20-sway-nvidia.conf&lt;/code&gt; に以下を追加した。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-ini&quot;&gt;LIBVA_DRIVER_NAME=nvidia
GBM_BACKEND=nvidia-drm
__GLX_VENDOR_LIBRARY_NAME=nvidia
WLR_NO_HARDWARE_CURSORS=1
WLR_RENDERER=vulkan
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;使い心地&lt;/h3&gt;
&lt;p&gt;起動自体は成功し、タイリングも動いた。ただし KDE で当たり前に使えていた機能を一つずつ手動で揃える必要があった。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;KWallet&lt;/strong&gt;: &lt;code&gt;kwalletd6&lt;/code&gt; を autostart に追加しないと Chrome・Dolphin の認証情報が使えない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;クリップボード履歴&lt;/strong&gt;: &lt;code&gt;cliphist&lt;/code&gt; + &lt;code&gt;wl-clipboard&lt;/code&gt; を別途セットアップ必要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ダークモード&lt;/strong&gt;: GTK・Qt それぞれに個別設定が必要&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;スクリーンショット&lt;/strong&gt;: &lt;code&gt;grim&lt;/code&gt; + &lt;code&gt;slurp&lt;/code&gt;（Spectacle は xdg-desktop-portal 設定が必要）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;「WM は軽量だが、DE として動かすための周辺整備コストが高い」という結論になった。&lt;/p&gt;
&lt;h2&gt;COSMIC DE を試す&lt;/h2&gt;
&lt;h3&gt;インストール&lt;/h3&gt;
&lt;p&gt;CachyOS のリポジトリに v1.0.11 が入っていた。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-fish&quot;&gt;sudo pacman -S cosmic
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;cosmic.desktop&lt;/code&gt; がセッション一覧に追加されてすぐ使えた。Sway のような &lt;code&gt;--unsupported-gpu&lt;/code&gt; 問題は発生せず、Nvidia でもそのまま起動した。&lt;/p&gt;
&lt;h3&gt;良かった点&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;タイリングがファーストクラス機能&lt;/strong&gt;として設計されている点が最大の利点だった。&lt;/p&gt;
&lt;p&gt;| キー | 動作 |
|------|------|
| &lt;code&gt;Super+←→↑↓&lt;/code&gt; | フォーカス移動 |
| &lt;code&gt;Super+Shift+←→↑↓&lt;/code&gt; | ウィンドウ移動 |
| &lt;code&gt;Super+G&lt;/code&gt; | タイル/フローティング切り替え |
| &lt;code&gt;Super+S&lt;/code&gt; | ウィンドウスタック（タブ化） |
| &lt;code&gt;hjkl&lt;/code&gt; | Vim ナビゲーション対応 |&lt;/p&gt;
&lt;p&gt;KWin のように「タイルエディタと Quick Tile が別システム」という問題がない。ワークスペース単位でタイリングの ON/OFF も切り替えられる。&lt;/p&gt;
&lt;h3&gt;厳しかった点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GTK/Qt テーマ統合が未熟&lt;/strong&gt;: ダークモードを設定しても Chrome のブックマークバー等に適用されない。KDE は &lt;code&gt;kde-gtk-config&lt;/code&gt; が自動同期してくれるが COSMIC にはまだない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;クリップボード履歴なし&lt;/strong&gt;: KDE の Klipper 相当の機能がビルトインでない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;カスタマイズ性&lt;/strong&gt;: KDE に比べると設定項目が少ない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;まとめ&lt;/h2&gt;
&lt;p&gt;| | KDE Plasma | Sway | COSMIC |
|--|-----------|------|--------|
| タイリング | △ Quick Tile とエディタが別 | ◎ ネイティブ | ◎ ファーストクラス |
| Nvidia 対応 | ◎ | △ 要設定 | ○ |
| 周辺統合 | ◎ KWallet・クリップボード等完備 | △ 全部手動 | ○ 標準で揃ってる |
| テーマ統合 | ◎ | △ | △ GTK/Qt が課題 |
| 成熟度 | ◎ | ◎ | △ v1.0 リリース直後 |&lt;/p&gt;
&lt;p&gt;結論として今回は KDE Plasma に戻ることにした。タイリングの体験は COSMIC が一番良かったが、GTK テーマ統合・クリップボード履歴など日常使いに必要な機能の完成度がまだ KDE に及ばない。&lt;/p&gt;
&lt;p&gt;COSMIC は成熟するのを待ってまた試したい。&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Ryzen 7 7800X3D + CachyOS のパフォーマンスベースラインを記録する</title><link>https://skmtkytr.github.io/posts/zen4-cachyos-baseline-2026-04</link><guid isPermaLink="true">https://skmtkytr.github.io/posts/zen4-cachyos-baseline-2026-04</guid><description>EXPO有効化とBIOS更新を終えた Zen4 + CachyOS 環境のメモリ帯域・レイテンシ・CPUベンチを STREAM と pointer-chase で測定し、将来の性能劣化検知のための基準値として残す</description><pubDate>Fri, 17 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;なぜベースラインを取るのか&lt;/h2&gt;
&lt;p&gt;デスクトップ環境を一通り整え終えたタイミングで、「今のこのマシンがどれくらいの性能で動いているか」を数値で残しておきたくなった。理由は単純で、&lt;strong&gt;将来「なんか遅くなった？」と感じたときに比較する基準がないと、気のせいか本当に劣化しているかを判断できない&lt;/strong&gt;からだ。&lt;/p&gt;
&lt;p&gt;カーネル更新、BIOS アップデート、新しいメモリへの換装、Curve Optimizer の適用——どれも体感では数%の差しかわからない。ベンチマーク値があれば、あとから「この変更でどれだけ変わったか」を客観的に見返せる。&lt;/p&gt;
&lt;p&gt;この記事は、そのための記録だ。&lt;/p&gt;
&lt;h2&gt;環境&lt;/h2&gt;
&lt;p&gt;| 項目   | 値                                                          |
| ------ | ----------------------------------------------------------- |
| CPU    | AMD Ryzen 7 7800X3D (8C/16T, Zen4 X3D, 96MB L3)             |
| Board  | MSI MAG X670E TOMAHAWK WIFI (MS-7E12)                       |
| BIOS   | 1.KB (2026-03-17)                                           |
| RAM    | Corsair CMK32GX5M2B5200C40 (DDR5-5200 CL40, 2×16GB)         |
| GPU    | NVIDIA RTX 4090 + AMD Raphael iGPU                          |
| OS     | CachyOS (Arch 系)                                           |
| Kernel | linux-cachyos 7.0.0-1 (znver4 build, EEVDF + LTO + AutoFDO) |&lt;/p&gt;
&lt;p&gt;BIOS 側は以下を有効化済み。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EXPO (DDR5-5200 CL40 プロファイル) → &lt;code&gt;5200 MT/s&lt;/code&gt; で動作確認&lt;/li&gt;
&lt;li&gt;Re-Size BAR (RTX 4090 の BAR1 が 32GB で認識)&lt;/li&gt;
&lt;li&gt;IOMMU (AMD-Vi)&lt;/li&gt;
&lt;li&gt;SVM / Virtualization&lt;/li&gt;
&lt;li&gt;Curve Optimizer: &lt;strong&gt;未適用&lt;/strong&gt; (Auto)&lt;/li&gt;
&lt;li&gt;PBO Limits: Auto / Scalar: 1X&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Curve Optimizer はあえて入れていない。理由は後述。&lt;/p&gt;
&lt;h2&gt;測定するもの&lt;/h2&gt;
&lt;p&gt;ベースラインとして残す価値があるのは、&lt;strong&gt;時間経過や設定変更で変わりうる値&lt;/strong&gt;で、かつ&lt;strong&gt;単発の測定で再現性のある値&lt;/strong&gt;だ。以下の3つに絞った。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;メモリ帯域&lt;/strong&gt; — EXPO 設定と FCLK の効きを見る (STREAM)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;メモリレイテンシ&lt;/strong&gt; — キャッシュ階層と DRAM のレイテンシを見る (pointer-chase)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPU スループット&lt;/strong&gt; — メモリと CPU の複合負荷を見る (7z benchmark)&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;STREAM: メモリ帯域&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cs.virginia.edu/stream/&quot;&gt;STREAM&lt;/a&gt; は John McCalpin による定番のメモリ帯域ベンチマーク。Copy / Scale / Add / Triad の 4 種類の単純なループで、持続的なメモリ帯域を測る。&lt;/p&gt;
&lt;p&gt;Arch のリポジトリに &lt;code&gt;stream&lt;/code&gt; パッケージはあるが、名前が ImageMagick の &lt;code&gt;stream&lt;/code&gt; コマンドと衝突するので、ソースから小さく書き起こした。&lt;code&gt;-march=znver4&lt;/code&gt; で AVX-512 まで使わせて、OpenMP で 16 スレッド並列化している。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 抜粋。完全版は記事末尾の再現コマンド参照
#pragma omp parallel for
for (long i=0; i&amp;#x3C;N; i++) a[i] = b[i] + scalar * c[i];  // Triad
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;結果&lt;/h3&gt;
&lt;p&gt;| Kernel    | MB/s       |
| --------- | ---------- |
| Copy      | 35,071     |
| Scale     | 35,150     |
| Add       | 38,304     |
| &lt;strong&gt;Triad&lt;/strong&gt; | &lt;strong&gt;38,800&lt;/strong&gt; |&lt;/p&gt;
&lt;p&gt;DDR5-5200 デュアルチャネルの理論ピークは &lt;code&gt;5200 × 8 × 2 = 83.2 GB/s&lt;/code&gt;。実測 Triad はその &lt;strong&gt;46.6%&lt;/strong&gt; にあたる。STREAM は書き込みを伴うのでピークの 40〜50% が典型値、今回の数字はスペック相応だ。&lt;/p&gt;
&lt;p&gt;もし DDR5-6000 CL30 に換装すれば、経験的に Triad は 55〜60 GB/s 付近まで伸びる。5200 CL40 構成の実力はこのあたりが天井。&lt;/p&gt;
&lt;h2&gt;Pointer-chase: メモリレイテンシ&lt;/h2&gt;
&lt;p&gt;帯域と並んでメモリ性能を決めるもう一つの軸がレイテンシ。ベンチマークとしてはリンクリストを辿るだけの単純なループで、各アクセスが前のアクセスの結果に依存するため &lt;strong&gt;キャッシュやメモリコントローラのレイテンシが直接そのまま見える&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;配列サイズを L1 / L2 / L3 / DRAM それぞれに収まる大きさに変えながら測定することで、キャッシュ階層ごとのアクセスコストがわかる。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-c&quot;&gt;// 単一コアで、ランダムな順序に繋がったチェーンを辿る
for (size_t i=0; i&amp;#x3C;iters; i++) p = chain[p];
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;結果&lt;/h3&gt;
&lt;p&gt;| Region | Latency | 階層               |
| ------ | ------- | ------------------ |
| 32 KB  | 1.0 ns  | L1D (各コア 32KB)  |
| 256 KB | 3.1 ns  | L2 境界            |
| 1 MB   | 5.8 ns  | L2 (1MB/core)      |
| 8 MB   | 10.9 ns | L3 (V-cache内)     |
| 32 MB  | 11.7 ns | &lt;strong&gt;L3 (V-cache内)&lt;/strong&gt; |
| 96 MB  | 32.1 ns | L3 境界            |
| 256 MB | 70.9 ns | DRAM               |
| 1 GB   | 87.1 ns | DRAM + TLB miss    |&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;32MB アクセス時のレイテンシが 11.7 ns で粘っている&lt;/strong&gt;のが 7800X3D の最大の特徴だ。通常の Zen4 (例: 7700X) だと L3 は 32MB で、32MB アクセス時にはすでに DRAM に近い 30 ns 超まで伸びてしまう。&lt;/p&gt;
&lt;p&gt;7800X3D は 3D V-Cache によって &lt;strong&gt;96MB の L3&lt;/strong&gt; を持っており、今回のベンチでもそれが忠実に可視化された。96MB を超えたところで急に 32 ns → 71 ns にジャンプするのが L3 → DRAM の境界だ。&lt;/p&gt;
&lt;p&gt;DRAM レイテンシ 71 ns は DDR5-5200 としては標準的な値。EXPO が効いていないと JEDEC 4800 MT/s で動作し、レイテンシは 80 ns 近くまで悪化する。&lt;/p&gt;
&lt;h2&gt;7z benchmark: CPU + メモリ複合&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;7z b&lt;/code&gt; は CPU とメモリの両方を使う LZMA 圧縮ベンチで、Linux 環境で手軽に実行できる複合指標として便利だ。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-fish&quot;&gt;7z b -mmt16 | tail -5
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;結果&lt;/h3&gt;
&lt;p&gt;| 項目          | 値               |
| ------------- | ---------------- |
| Compression   | 112,687 MIPS     |
| Decompression | 129,503 MIPS     |
| &lt;strong&gt;Total&lt;/strong&gt;     | &lt;strong&gt;121,095 MIPS&lt;/strong&gt; |
| 1T Freq       | 4,795〜5,036 MHz |
| 16T Freq      | 4,395〜4,555 MHz |&lt;/p&gt;
&lt;p&gt;7800X3D ストック設定の典型値。Curve Optimizer &lt;code&gt;-20&lt;/code&gt; を全コアに入れると、この値は +5〜8% 程度伸びる余地がある (16T 実効クロックが 4,700 MHz 付近まで上がるため)。&lt;/p&gt;
&lt;h2&gt;温度と Preferred Core&lt;/h2&gt;
&lt;p&gt;あわせて記録しておいた。&lt;/p&gt;
&lt;h3&gt;Idle 温度&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;Tctl:   47.5°C
Tccd1:  35.8°C
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CCD 温度 35°C は 7800X3D としては相当涼しい部類。負荷時も 80°C に届かない構成になっている。&lt;/p&gt;
&lt;h3&gt;Preferred Core ランキング&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;amd-pstate&lt;/code&gt; は &lt;code&gt;acpi_cppc/highest_perf&lt;/code&gt; の値を見て、&lt;strong&gt;シリコン品質が良いコアにシングルスレッド負荷を寄せる&lt;/strong&gt;。値を見ればチップの個体差がわかる。&lt;/p&gt;
&lt;p&gt;| Core | highest_perf |
| ---- | ------------ |
| cpu1 | 196          |
| cpu5 | 196          |
| cpu0 | 191          |
| cpu3 | 186          |
| cpu2 | 181          |
| cpu4 | 176          |
| cpu7 | 171          |
| cpu6 | 166          |&lt;/p&gt;
&lt;p&gt;最大値と最小値の差が 30 (= 5.05 GHz 換算で約 150 MHz) 程度。平均的な個体で、特に「ハズレ」でも「当たり」でもない。シングルスレッドは cpu1 / cpu5 に寄るのでここが一番伸びるコアだ。&lt;/p&gt;
&lt;h2&gt;なぜ Curve Optimizer を入れないか&lt;/h2&gt;
&lt;p&gt;Zen4 + X3D の定番チューニングとして Curve Optimizer (CO) がある。各コアの電圧曲線を負方向にオフセットすることで、同クロックで温度が下がり、結果的にブースト時間が伸びる——という仕組みで、上手くいけば 5〜8% 伸びる。&lt;/p&gt;
&lt;p&gt;今回入れなかったのは以下の理由。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;温度に余裕がありすぎる&lt;/strong&gt;: Tctl 47°C は熱で全く律速されていない状態。CO の主目的 (温度↓ → クロック↑) の効果が薄い&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;X3D の不安定性は検出が厄介&lt;/strong&gt;: 非X3D と違って、X3D の CO 失敗は「数週間に一度クラッシュ」という形で出やすく、&lt;strong&gt;CO のせいかどうか永遠に疑い続ける&lt;/strong&gt;ことになる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;体感差が小さい&lt;/strong&gt;: devcontainer ビルドやコンパイルで +5% は人間には感じ取れない領域&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;「ベンチマーク趣味」としてやる価値はあるが、&lt;strong&gt;道具としてのマシンの安定性&lt;/strong&gt;を優先するなら今回はスキップが正解と判断した。&lt;/p&gt;
&lt;p&gt;将来メモリ換装 (DDR5-6000 CL30) と同時に CO もテストしたくなるかもしれない。そのときにこのベースラインが比較対象として効いてくる。&lt;/p&gt;
&lt;h2&gt;再現コマンド&lt;/h2&gt;
&lt;p&gt;以降、同じ条件で測定するための最小コマンド。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-fish&quot;&gt;# === STREAM ===
cat &gt; /tmp/stream_bench.c &amp;#x3C;&amp;#x3C;&apos;EOF&apos;
#include &amp;#x3C;stdio.h&gt;
#include &amp;#x3C;stdlib.h&gt;
#include &amp;#x3C;time.h&gt;
#include &amp;#x3C;omp.h&gt;

#define N (100L * 1024 * 1024)
#define NTIMES 10
static double a[N], b[N], c[N];

double wtime(void) {
    struct timespec t;
    clock_gettime(CLOCK_MONOTONIC, &amp;#x26;t);
    return t.tv_sec + t.tv_nsec * 1e-9;
}

int main() {
    #pragma omp parallel for
    for (long i = 0; i &amp;#x3C; N; i++) { a[i] = 1.0; b[i] = 2.0; c[i] = 0.0; }
    double scalar = 3.0;
    double best_copy=1e30, best_scale=1e30, best_add=1e30, best_triad=1e30;
    for (int k = 0; k &amp;#x3C; NTIMES; k++) {
        double t;
        t = wtime(); _Pragma(&quot;omp parallel for&quot;) for (long i=0; i&amp;#x3C;N; i++) c[i] = a[i];
        t = wtime()-t; if (t&amp;#x3C;best_copy) best_copy=t;
        t = wtime(); _Pragma(&quot;omp parallel for&quot;) for (long i=0; i&amp;#x3C;N; i++) b[i] = scalar*c[i];
        t = wtime()-t; if (t&amp;#x3C;best_scale) best_scale=t;
        t = wtime(); _Pragma(&quot;omp parallel for&quot;) for (long i=0; i&amp;#x3C;N; i++) c[i] = a[i]+b[i];
        t = wtime()-t; if (t&amp;#x3C;best_add) best_add=t;
        t = wtime(); _Pragma(&quot;omp parallel for&quot;) for (long i=0; i&amp;#x3C;N; i++) a[i] = b[i]+scalar*c[i];
        t = wtime()-t; if (t&amp;#x3C;best_triad) best_triad=t;
    }
    double bytes = 2.0 * sizeof(double) * N;
    printf(&quot;Copy:  %8.1f MB/s\n&quot;, bytes/best_copy/1e6);
    printf(&quot;Scale: %8.1f MB/s\n&quot;, bytes/best_scale/1e6);
    printf(&quot;Add:   %8.1f MB/s\n&quot;, 3.0*sizeof(double)*N/best_add/1e6);
    printf(&quot;Triad: %8.1f MB/s\n&quot;, 3.0*sizeof(double)*N/best_triad/1e6);
    return 0;
}
EOF
gcc -O3 -march=znver4 -fopenmp /tmp/stream_bench.c -o /tmp/stream_bench
OMP_NUM_THREADS=16 /tmp/stream_bench

# === 7z ===
7z b -mmt16 | tail -10

# === 温度 ===
sensors | grep -E &quot;Tctl|Tccd&quot;

# === Prefcore ===
for c in (seq 0 7)
    echo &quot;cpu$c: &quot;(cat /sys/devices/system/cpu/cpu$c/acpi_cppc/highest_perf)
end
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;ベンチマークは「マシンを褒める道具」として使うより、「&lt;strong&gt;将来の自分への差分情報&lt;/strong&gt;」として残すほうが実用価値が高い。&lt;/p&gt;
&lt;p&gt;CO を入れるかどうか、メモリを換装するかどうか、カーネルを更新するかどうか——どの判断も、この数字と比較できることで「本当に効いたのか」がはっきりする。&lt;/p&gt;
&lt;p&gt;次に同じコマンドを叩くのは、たぶん DDR5-6000 CL30 に換装したときか、CachyOS のカーネルが 7.x 後半に上がったときだろう。そのときこの記事を開き直して、どれだけ変わったかを確認する予定だ。&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>BitTorrentクライアントをAIエージェントだけで作った話</title><link>https://skmtkytr.github.io/posts/building-bittorrent-client-with-ai-agent</link><guid isPermaLink="true">https://skmtkytr.github.io/posts/building-bittorrent-client-with-ai-agent</guid><description>Claude Codeを使って3.5日・129コミットでBitTorrentクライアントをフルスクラッチ実装した記録</description><pubDate>Mon, 13 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめに&lt;/h2&gt;
&lt;p&gt;「BitTorrent クライアントを Go でゼロから書きたい」——そう思い立ってから完成まで、かかった時間は約 3.5 日だった。&lt;/p&gt;
&lt;p&gt;成果物は &lt;a href=&quot;https://github.com/skmtkytr/stor&quot;&gt;stor&lt;/a&gt;。外部の torrent ライブラリに一切依存せず、bencode パーサーから DHT、uTP、暗号化まで全てスクラッチで実装した BitTorrent クライアントだ。Web UI、Chrome 拡張、Docker イメージまで含めて、129 コミット。&lt;/p&gt;
&lt;p&gt;そしてこのプロジェクトは、コードの実装をほぼ全て &lt;strong&gt;Claude Code&lt;/strong&gt;（AI エージェント）に任せて完成させた。&lt;/p&gt;
&lt;h2&gt;何を作ったか&lt;/h2&gt;
&lt;p&gt;stor が実装している主な仕様は以下の通り。&lt;/p&gt;
&lt;p&gt;| カテゴリ | 内容 |
|---------|------|
| プロトコル | BEP 3 (BitTorrent Protocol), BEP 5 (DHT), BEP 29 (uTP/LEDBAT) |
| 拡張 | BEP 6 (Fast Extension), BEP 9 (Metadata Exchange), BEP 10 (Extension Protocol), BEP 11 (PEX) |
| トラッカー | BEP 12 (Multitracker), BEP 15 (UDP Tracker), BEP 23 (Compact Peers) |
| その他 | BEP 19 (WebSeed), BEP 27 (Private Torrents), BEP 52 (v2 Hybrid) |
| セキュリティ | MSE/PE (768-bit DH + RC4), DNS Rebinding 対策, Path Traversal 防止 |&lt;/p&gt;
&lt;p&gt;14 の BEP をカバーし、ダウンロードからシーディング、暗号化、DHT によるトラッカーレス通信まで一通り動く。Web UI は SvelteKit で Deluge 風のレイアウトを作り、Go バイナリに embed して単一バイナリで配布できるようにした。Docker イメージは distroless ベースで約 9 MB。&lt;/p&gt;
&lt;h2&gt;人間がやったこと&lt;/h2&gt;
&lt;p&gt;コードを書いたのはほぼ全て Claude Code だが、人間（自分）の役割がなかったわけではない。自分がやったのは以下のようなことだ。&lt;/p&gt;
&lt;h3&gt;アーキテクチャの方向づけ&lt;/h3&gt;
&lt;p&gt;最初のプロンプトでプロジェクトの大枠を伝えた。「Go でゼロ依存の BitTorrent クライアントを作る」「デーモンモードで動かして JSON-RPC で操作する」「Web UI は SvelteKit で embed する」といった設計判断は人間が行った。&lt;/p&gt;
&lt;h3&gt;レビューと品質管理&lt;/h3&gt;
&lt;p&gt;実装がある程度進んだ段階で、こんなプロンプトを投げた。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;goにおけるアンチパターンがないかコードを全部レビューして
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Claude Code がコード全体を走査して問題点をリストアップしてくる。ただし AI のレビュー結果を鵜呑みにはしない。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;HIGHのものが本当に起きているか詳細に確認して、パット見だけで言ってないか
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;「本当に起きるのか？」と突き返すと、誤検知が削ぎ落とされて本当の問題だけが残る。確認が取れたら修正を指示する。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;対応して, TDD準拠 RED first
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;テスト駆動で直させる。この一連の流れ——レビュー → 精査 → TDD で修正——がセキュリティ強化のフェーズでは特に効いた。4/12 だけで 20 件以上のセキュリティ修正コミットが入っているが、SSRF、Path Traversal、DNS Rebinding、Integer Overflow、Race Condition といった脆弱性を体系的に潰せたのはこのプロセスのおかげだ。&lt;/p&gt;
&lt;h3&gt;デバッグの方向づけ&lt;/h3&gt;
&lt;p&gt;実際に動かしてみると当然バグは出る。例えば DHT 周りではこんなやり取りがあった。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DHTノードがずっと0なんだけどそんなことある？
delugeのときは300くらいずっとあったんだけど
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;既存クライアント（Deluge）との比較で「何かがおかしい」と気づくのは人間の仕事だ。Claude Code は原因を調査して修正するが、「おかしい」と感じるセンサーは人間にしかない。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DHTノードの情報は再起動すると揮発する？
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;必須だなそれは
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;DHT ルーティングテーブルの永続化が必要だと判断したのも人間。「それは必要だ」という一言で実装が走る。&lt;/p&gt;
&lt;h3&gt;リリース管理&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;意図ごとにcommit push
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;tag bumpして
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;docker image build push, ciに組み込みたいなこれ
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;コミットの粒度、バージョニング、CI/CD の構成も人間が指示した。&lt;/p&gt;
&lt;h2&gt;3.5 日の流れ&lt;/h2&gt;
&lt;p&gt;振り返ると、開発は大まかに 4 つのフェーズに分かれていた。&lt;/p&gt;
&lt;h3&gt;Day 1（4/10）: コア実装&lt;/h3&gt;
&lt;p&gt;bencode パーサー、ピアプロトコル、トラッカー通信、DHT の基本実装。同時に Web UI の骨格と Chrome 拡張も作った。この日だけで 50 コミット以上。デーモンモード、Docker 対応、日本語 README まで含めて一気に形にした。&lt;/p&gt;
&lt;h3&gt;Day 2（4/11）: 機能拡充&lt;/h3&gt;
&lt;p&gt;BEP 6 (Fast Extension)、BEP 19 (WebSeed)、BEP 27 (Private Torrents)、BEP 52 (v2 Hybrid) を追加。uTP の統合、アップロード機能の実装もこの日。「動くもの」から「ちゃんと動くもの」への移行期間。&lt;/p&gt;
&lt;h3&gt;Day 3（4/12）: セキュリティ強化とリリース&lt;/h3&gt;
&lt;p&gt;コード全体のレビューを実施。bencode の DoS 対策、トラッカーレスポンスのサイズ制限、SSRF 防止、Race Condition の修正など、セキュリティを体系的に強化した。goreleaser による自動リリース、Homebrew tap の設定もこの日。&lt;/p&gt;
&lt;h3&gt;Day 4（4/13）: 安定化&lt;/h3&gt;
&lt;p&gt;DHT ルーティングテーブルの永続化、PEX の panic 修正、goroutine リークの修正、データ競合の解消。最後の磨き込み。&lt;/p&gt;
&lt;h2&gt;エージェント駆動開発で見えたこと&lt;/h2&gt;
&lt;h3&gt;プロンプトは短いほどいい&lt;/h3&gt;
&lt;p&gt;振り返ると、効果的だったプロンプトはどれも短い。「対応して, TDD準拠 RED first」「必須だなそれは」「commit push tag bump」。コンテキストが共有されている状態では、長い説明は不要だった。&lt;/p&gt;
&lt;h3&gt;人間の仕事は「判断」と「検証」&lt;/h3&gt;
&lt;p&gt;コードを書く速度では AI に勝てない。でも「何を作るか」「この品質で十分か」「これはおかしい」という判断は人間にしかできない。DHT ノードが 0 のままだと気づいたのは、Deluge での運用経験があったからだ。&lt;/p&gt;
&lt;h3&gt;レビューは二段階で&lt;/h3&gt;
&lt;p&gt;AI にレビューさせると、実際には起きない問題も指摘してくる。「本当に起きるか確認して」と一度突き返すだけで精度が大幅に上がる。このフィルタリングは今後も使えるパターンだと思う。&lt;/p&gt;
&lt;h3&gt;セキュリティは AI の得意分野&lt;/h3&gt;
&lt;p&gt;SSRF、Path Traversal、DNS Rebinding、Integer Overflow——こうした教科書的な脆弱性を網羅的にチェックするのは AI が圧倒的に得意だ。人間がひとつひとつ確認するのに比べて、漏れが少なく速い。&lt;/p&gt;
&lt;h2&gt;数字で見る stor&lt;/h2&gt;
&lt;p&gt;| 指標 | 値 |
|------|------|
| 開発期間 | 約 3.5 日 |
| コミット数 | 129 |
| 実装した BEP | 14 |
| Go コード | 約 18,000 行 |
| 外部依存 | 0（標準ライブラリのみ） |
| Docker イメージ | ~9 MB |
| Web UI | SvelteKit SPA（バイナリ埋め込み） |&lt;/p&gt;
&lt;h2&gt;おわりに&lt;/h2&gt;
&lt;p&gt;3.5 日で BitTorrent クライアントが作れたのは、AI エージェントのおかげだ。ただし「AI が全部やってくれた」わけではない。アーキテクチャの設計、品質の判断、バグに気づくセンサー、リリースの意思決定——これらは全て人間の仕事だった。&lt;/p&gt;
&lt;p&gt;AI エージェント駆動の開発は、人間の役割を「コードを書く人」から「プロダクトの方向を決める人」に変える。それは制約ではなく、レバレッジだと思う。&lt;/p&gt;
&lt;p&gt;リポジトリ: &lt;a href=&quot;https://github.com/skmtkytr/stor&quot;&gt;skmtkytr/stor&lt;/a&gt;&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Hello World</title><link>https://skmtkytr.github.io/posts/hello-world-blog</link><guid isPermaLink="true">https://skmtkytr.github.io/posts/hello-world-blog</guid><description>ブログを開設しました</description><pubDate>Sun, 12 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;はじめまして&lt;/h2&gt;
&lt;p&gt;技術ブログを開設しました。日々の開発で学んだことを記録していきます。&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item></channel></rss>