Latest

外字と訓点を compile-time hash で解く

aozora は青空文庫の外字参照 (※[#「魚+師」、第3水準1-94-37] のような形) を約 14,000 件のテーブルで解決する。このテーブルを runtime の HashMap ではなく phf (perfect hash function) で持ち、コンパイル時に static 配列に焼き込んでいる。この記事はその選択の根拠と、JIS X 0213 → Unicode フォールバックの設計をまとめたもの。 handbook の対応章: Shift_JIS + 外字 resolver。 外字テーブルの形 外字エントリには 3 種類の解決結果があり、それぞれに対応する variant を GaijiEntry に持たせている。 static GAIJI_TABLE: phf::Map<

By Sakashita Yasunobu

青空文庫の .txt を HTML に変換する最短手順

青空文庫 で配布されている .txt ファイルを HTML に変換したい、という用途向けの手順。Rust の知識は要らない。コマンド 1 行で済む。 1. CLI バイナリを取ってくる aozora の Releases ページ から自分の OS 向けのアーカイブを落とす。 OS アーカイブ名 Linux x86_64 aozora-vX.Y.Z-x86_64-unknown-linux-gnu.tar.gz macOS arm64 aozora-vX.Y.Z-aarch64-apple-darwin.tar.gz Windows x86_64 aozora-vX.Y.Z-x86_64-pc-windows-msvc.zip SHA256SUMS も同梱されているので、

By Sakashita Yasunobu

50,000 ノードの AST を 16 回のアロケーションで: bumpalo 借用アリーナの実例

aozora の AST は bumpalo 単一アリーナの上に構築されている。Box<Node> を素直に並べた版に比べてパースが 6.4 倍速、ピーク RSS が 30% 減という結果が出ている。この記事は、その設計判断と Rust ライフタイムの取り回しを実装の視点から整理したもの。 handbook の対応章: Borrowed-arena AST。 問題設定 青空文庫の典型的な作品は約 500KiB のソースで、aozora がパースすると約 50,000 ノードの木に展開される。素直に Rust らしく書けば次のような形になる。 enum Node { Plain(String), Ruby { target: String, gloss: String }, Container { kind:

By Sakashita Yasunobu

7 個のトリガーバイトを 12 GB/s で探す: Teddy を選んだ理由

aozora は青空文庫記法の Rust パーサで、字句解析の最初のフェーズが「ソース全体から 7 種類のトリガーバイトを探す」というマルチパターンスキャンになっている。この記事は、その 1 フェーズに Intel Hyperscan 由来の Teddy アルゴリズムを採用した経緯と、対立候補に勝った算術的な根拠を整理したもの。 handbook の対応章: SIMD scanner backends。 問題設定 aozora-pipeline の Phase 1 (字句解析の最初のフェーズ) は、ソース文字列の中から次の 7 文字の出現位置を全て列挙する。 | 《 》 ※ [ ] 全角空白 これらは青空文庫記法の構文トリガー (ルビ・注釈・字下げの開始/終了マーカ) で、出現する位置だけが分かれば後段のフェーズで「これは何の構文か」を解釈できる。 UTF-8 で見ると 7 文字 × 3 バイト

By Sakashita Yasunobu

青空文庫記法を解析する Rust パーサ aozora

aozora は青空文庫記法のパーサ。CommonMark や Markdown は扱わず、青空文庫が配布している .txt ファイルに現れる注釈記法だけを対象にする。実装は Rust で、CLI バイナリ・Rust ライブラリ・WASM・C ABI・Python バインディングの 5 種類で配布する。 use aozora::Document; let source = "|青梅《おうめ》".to_owned(); let doc = Document::new(source); let tree = doc.parse(); let html: String = tree.to_html(); let

By Sakashita Yasunobu

Capture Oneに待望のネガフィルム変換機能が来た

2026年4月3日、Capture One 16.7.4 がリリースされた。目玉はなんといっても Negative Film Conversion(ネガフィルム変換) の搭載だ。これまで Cultural Heritage エディション限定だったネガ反転処理が、ついに通常の Capture One Pro / Studio でも使えるようになった。 何が変わったのか 従来、Capture One でネガフィルムをポジに変換するには、Cultural Heritage(CH)エディションを使う必要があった。CH は文化財デジタル化向けの専用製品で、Base Characteristics ツールに Film Negative / Film Positive モードが用意されていた。しかし一般の写真愛好家がフィルムスキャンのためだけに CH を導入するのは現実的ではなく、多くのユーザーは Lightroom とそのプラグイン(Negative Lab

By Sakashita Yasunobu

雨の中、歩くべきか走るべきか

傘を忘れた日の永遠の問い、歩くか、走るか、いやいっそ雨宿りをするのか。物理で決着をつける。 モデル 人体を直方体で近似。上面積 $A_{\text{top}}$(頭・肩)、前面積 $A_{\text{front}}$(胸・顔)。雨は鉛直一様(落下速度 $v_r$、数密度 $n$)、距離 $d$ を速度 $v$ で直線移動する。 人体の直方体モデルは、上から見た水平断面が $A_{\text{top}}$、正面から見た鉛直断面が $A_{\text{front}}$ の二面で構成される。移動方向は水平、雨は鉛直に降る。 受ける雨滴数は、上面が $n v_r A_{\text{top}

By Sakashita Yasunobu

T-GRAIN・Core-Shell・旧式乳剤の定量比較

Kodak T-GRAIN、Ilford Core-Shell、旧式立方晶乳剤。写真フィルムの性能を左右する三つの乳剤技術を、特許文献と数式に基づいて比較する。 1. 出発点: 旧式乳剤の構造と限界 T-MAXやDeltaが何を改良したのかを理解するには、まず従来の乳剤がどのようなものだったかを押さえておく必要がある。 1980年代以前、標準的なハロゲン化銀乳剤はAgBrやAgBr(I)の結晶が立方体(cubic)か不定形(irregular)の形をしていた。Tri-XやHP5の祖先にあたるこれらの乳剤では、結晶のアスペクト比(直径対厚さの比)はおおむね1:1から2:1。三次元的にほぼ等方的な粒子が乳剤層にランダムに散らばっていた。 この形態が感度と粒状性のトレードオフに直結する。立方晶粒子を一辺 $a$ の立方体として近似すると、表面積と体積、そしてその比は次のとおりである。 $$ S_{\text{cubic}} = 6a^2, \quad V_{\text{cubic}} = a^3, \quad \frac{S}{V} = \frac{6}

By Sakashita Yasunobu

クジラはなぜがんにならないのか

体が大きい動物ほど細胞の数が多い。細胞が多ければ、そのうちどれかががん化する確率も高くなるはずだ。ところが現実には、クジラやゾウのがん発生率はヒトよりも低い。1977年、疫学者リチャード・ピートがこの矛盾を指摘した。以来この問いは「ピートのパラドックス」と呼ばれ、比較腫瘍学における最大の謎のひとつであり続けている。 種の中では予測通り、種の間では崩れる 同じ種の中では、直感どおりの傾向が確認されている。身長の高いヒトはそうでないヒトよりがんの発生率がやや高く、年齢を重ねるほどがんは増える。細胞の数が多いほど、細胞分裂の回数が多いほど、がん化の確率は上がる。 しかし種を超えて比較すると、この関係が崩壊する。シロナガスクジラの細胞数はヒトの約1000倍にのぼるが、がんの発生率がヒトの1000倍になるわけではない。哺乳類全体を見渡しても、体サイズとがんリスクの間に明確な正の相関は長い間見つかっていなかった。がんの発生率は種が異なっても約2倍の範囲にしか収まらないとされてきた。体サイズの差は100万倍を超えるにもかかわらず。 ゾウが持つ余分ながん抑制遺伝子 最もよく知られた説明は

By Sakashita Yasunobu

電脳空間のハエ

ショウジョウバエの脳がコンピュータの上で再現され、仮想の体に接続されたら、歩き始めた。強化学習で訓練されたわけでも、行動規則をプログラムされたわけでもない。ニューロンの接続パターンをコピーしただけで、ハエは動いた。 何が起きたのか 2026年3月7日、サンフランシスコに拠点を置くEon Systems PBCが、デモンストレーション映像を公開した。同社の共同創設者であるAlex Wissner-Grossによれば、世界初の「身体を持つ全脳エミュレーション(embodied whole-brain emulation)」だという。 「全脳エミュレーション」とは、生物の脳の神経回路をニューロン単位、シナプス単位でコンピュータ上に再現し、動作させることを指す。「身体を持つ」とは、その脳のシミュレーションが物理法則に従う仮想の体に接続され、感覚入力を受け取り、運動出力を返す閉じたループを構成していることを意味する。 これまでにも脳のシミュレーションや体のシミュレーションは個別に存在した。線虫(C. elegans)の神経系を再現するOpenWormプロジェクトは約302個のニューロン

By Sakashita Yasunobu

写真のしくみ ④ 虫めがねが紙を燃やす「焦点」のひみつ

💡シリーズ「写真のしくみ」について 光はまっすぐ進み、レンズは世界をひっくり返す。写真と映像にひそむ小さな「なぜ?」を、数式なしで解き明かす全40回。 晴れた日に虫めがねを持って外へ出てみましょう。地面に黒い紙を置いて、虫めがねを太陽にかざします。レンズと紙のあいだの距離をゆっくり変えていくと、紙の上の光がだんだん小さくなって、あるところでぎゅっと小さな点になります。 その点をじっと動かさずにいると、白い煙がすうっと立ちのぼって、やがて紙がこげはじめます。 小学校の理科の実験で経験した人も多いのではないでしょうか。でも、あらためて考えてみると不思議です。虫めがねはただの透明なガラス。火をつける道具なんかではありません。それなのに、なぜ紙が燃えるほど熱くなるのでしょうか。 この「なぜ?」の先に、レンズの本質が隠れています。 太陽の光は「平行」にやってくる まず、太陽の光について考えてみましょう。 太陽は地球からおよそ1億5000万キロメートルも離れています。あまりにも遠いので、太陽から届く光は、地球に届くころにはほぼ完全にそろって「平行」に進んでいます。つまり、どの光も

By Sakashita Yasunobu