yoshiharu.ishii

DevOps

ghコマンドでGoリポジトリを固める通し手順 — GitHub Actions CI・mainブランチ保護・v*タグでバイナリ自動リリース

前回、AIエージェントとの開発でmainを守るで「なぜmainを保護するのか」を書いた。規約で守らせるのではなく、構造で不可能にする、という話だ。今回はその続きで、手順に徹する。概念は分かっても、いざ自分のリポジトリでやろうとすると手が止ま...
Claude Code

AIエージェントとの開発でmainを守る — gh apiでGitHubブランチ保護を掛ける手順と、paths-ignoreの罠

AIエージェント (Claude Code) と一緒に開発していて、こういうことが起きた。私のプロジェクトの規約には「変更はブランチ+PR単位で回す」と書いてある。エージェントはそれを読んでいる。それでも、ドキュメントだけを直したとき、こう...
Rust

wget https:// が通るまでの壁は6枚あった — MMX・SSE2の語彙・RTC・CA束【rustx86 ネットワーク編 #4】

連載「rustx86 ネットワーク編」: Rust + WebAssemblyのx86エミュレータをインターネットに繋ぐまでの開発記。#1はSLiRP backend「wsslirp」(Go + gVisor netstack)、#2はIS...
Rust

sleep 3 が20msで返る — PCIバスとRTL8029をRustで実装したら、真犯人はx87 FPUだった【rustx86 ネットワーク編 #3】

連載「rustx86 ネットワーク編」: Rust + WebAssemblyのx86エミュレータをインターネットに繋ぐまでの開発記。#1はSLiRP backendとなるユーザーモードNATデーモン「wsslirp」(Go + gViso...
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条だけで立て直した記録である...