たより

Zennの「Rust」のフィード

Pure RustのPDF編集ライブラリ「harumi」を開発した。

kent-tokyo

Rustで既存のPDFファイルを読み込み、日本語などのCJKテキストを動的に追加する処理は、エコシステム上の制約から実装難易度が非常に高い領域です。JavaScript環境にはフォントのサブセット化やCMap生成を透過的に処理してくれるpdf-libが存在しますが、Rustではこれまで同様の要件を一枚で満たせる選択肢がありませんでした。 この課題を解決するため、Pure RustでCJKフォントの自動サブセット化、既存PDFへの追記(Append-only)、WASM環境に対応したライブラリ harumi を開発しました。本記事では、自前でPDFのフォント構造を組み立てる際の困難さや、開...

Zennの「Rust」のフィード

Rustのイテレータとクロージャを手を動かして理解する

taro

Rustのイテレータとクロージャを手を動かして理解する Rustのイテレータは非常に強力で、for ループよりも表現力が高く、かつパフォーマンスも同等かそれ以上です。クロージャと組み合わせることで、簡潔で読みやすいコードが書けます。 クロージャ — 変数に入れられる関数 クロージャは「その場で定義できる小さな関数」です。変数に代入したり、引数として渡したりできます: let add = |x, y| x + y; println!("{}", add(2, 3)); // 5 通常の関数との違いは周囲の変数を「キャプチャ」できる点です。 キャプチャとは、クロージャが自分の外にあ...

Zennの「Rust」のフィード

RustのスマートポインタBox/Rc/Arcを手を動かして理解する

taro

RustのスマートポインタBox/Rc/Arcを手を動かして理解する Rustには「スマートポインタ」と呼ばれる型が複数あります。& 参照と違い、所有権を持ちながら追加の機能を提供します。最初は「どれを使えばいいか分からない」状態になりますが、用途を整理すれば迷わなくなります。 Box<T> — ヒープに値を置く Box<T> は値をヒープ上に置くためのシンプルなポインタです。 let b = Box::new(5); // 5 をヒープに置く println!("{}", b); // 5(自動的に参照が外れる) いつ使うか ①コンパイ...

Zennの「Rust」のフィード

Rustのモジュールシステムとクレート管理を手を動かして理解する

taro

Rustのモジュールシステムとクレート管理を手を動かして理解する Rustでコードが大きくなってきたとき、ファイルを分けて整理したくなります。「モジュール」「クレート」「パス」という概念を正しく理解すれば、Rustの構造化は思ったよりシンプルです。 クレートとパッケージ まず用語を整理します: 用語 意味 クレート コンパイルの単位。バイナリクレート(実行可能ファイル)またはライブラリクレート パッケージ Cargo.toml を持つプロジェクト。1つ以上のクレートを含む my-project/ ← パッケージ Cargo.tom...

Zennの「Rust」のフィード

RustのエラーハンドリングをResult/Option/thiserrorで理解する

taro

RustのエラーハンドリングをResult/Option/thiserrorで理解する Rustには例外(Exception)がありません。その代わりに、エラーは戻り値として明示的に扱います。最初は「毎回エラーを処理するのが面倒」と感じますが、慣れると「エラーが起きうる箇所が一目で分かる」という安心感に変わります。 Option — 値がないかもしれない Option<T> は「値があるかもしれないし、ないかもしれない」を表します。他言語の null に相当しますが、型で管理するため ヌルポインタ例外が起きません。 enum Option<T> { ...

もっと見る

ソース