16bit

1993年のDOSから ping 1.1.1.1 — ISAバスのNE2000をRustで実装する【rustx86 ネットワーク編 #2】

連載「rustx86 ネットワーク編」: Rust + WebAssemblyのx86エミュレータをインターネットに繋ぐまでの開発記。#1はSLiRP backendとなるユーザーモードNATデーモン「wsslirp」(Go + gViso...
Go

Go + gVisor netstackでユーザーモードNAT「wsslirp」を書く【rustx86 ネットワーク編 #1】

連載「rustx86 ネットワーク編」: Rust + WebAssemblyのx86エミュレータをインターネットに繋ぐまでの開発記。#1はSLiRP backendとなるユーザーモードNATデーモン(Go)、#2はゲスト側の仮想NIC(R...
AI

JITを削除したら1日で64→98 MIPSになった — Rust製x86エミュレータ、Linuxブート9秒台へ

前回の記事「Rust製x86エミュレータ高速化の全戦績 (13→79 MIPS)」の結論はこうだった — 仕事を減らす手は勝ち、仕事を並べ替える手は負ける。この記事はその続編である。数ヶ月かけて作ったJITコンパイラを丸ごと削除するという決...
AI

Rust製x86エミュレータ高速化の全戦績 — なぜ効いたか、なぜ効かなかったか (13→79 MIPS)

ブラウザで32bit Linuxを起動するx86エミュレータ rustx86 (Rust + WebAssembly) を、13 MIPSから79 MIPSまで約5倍にした。この記事はその全戦績 — 効いた手・効かなかった手・効いたのに採用...
DevOps

GitHubのChecksタブを合否掲示板にする ― GitHub App × Actions × Checks の棲み分け

PRのChecksタブが6行のリンク集になった。ジョブを削ると今度は結果が読めない。原因はGitHub App・Actions・Checksの棲み分けの誤解 ― 3者の関係をRustの構造体で整理し、自前AppでChecksタブを合否掲示板にするまでの記録。
Rust

469行に膨らんだ台帳をDiátaxisで3冊に割った — Markdownだけのドキュメント管理

開発が進むとドキュメントは必ずだれる。rustx86 では性能台帳の perf.md が469行に膨らみ、開いても目当ての数字にたどり着けなくなった。ツールを導入せず、分類の型 (Diátaxis) と運用規約6条だけで立て直した記録である...
Rust

ブラウザだけ1.5倍遅い — WebWorkerの setTimeout(0) が4msずつ止まっていた (JavaScript/WebAssembly)

自作x86エミュレータ rustx86 には、ずっと説明のつかない数字があった。同じwasmバイナリなのに、Node.js (headless) では14秒で終わるLinuxブートが、ブラウザだと21秒かかる。約×1.5。タブの描画やpos...
Rust

LLVMのPGOでRust製x86エミュレータが25%速くなった。それでも採用を見送った理由

自作x86エミュレータ rustx86 で、LLVMのPGO (Profile-Guided Optimization) を試したらネイティブ実行が約25%速くなった。交互A/B 5周全勝、意味論の後退なし。そして、採用を見送った。「効いた...
Rust

Rust+WebAssemblyのx86エミュレータにJITを育てる — 「1bitも変わらない」証明がバグを2匹仕留めた

ブラウザで32bit Linuxを起動する自作x86エミュレータ rustx86 に、テンプレートJITを育てている。前回はレジスタ間演算だけの骨格 (F1a) を通し、「JITを有効にしても命令数もシリアル出力もビット同一」を3つのISA...
AI

Claude Codeの権限設定でハマらないために — settings.jsonの適用範囲と、クレデンシャル漏洩をDenyで止める多層防御

Claude Code(AIコーディングエージェント)を実運用していると、必ず権限プロンプトにぶつかる。git status を打つたび、cargo build を走らせるたびに「実行していいですか?」と聞かれる。最初は安心だが、一日に何十...