日記

最近twitterのアカウントを消してしまって*1 アウトプットする場所が無くなったので、代わりに日記を書いていくことにします。できれば毎週~隔週くらいのペースで。

Rust Book (Second Edition) 読んでる

Introduction - The Rust Programming Language

Rust は身の周りやウェブ上で使っている人をちらほら見かけて気になっていたので、新しい言語で取り入れられている考え方をほんのちょっとだけでも理解できたらいいなぁと思い勉強し始めました。 実は Rust は半年くらい前に勉強しようと思いチュートリアル(Rust book)を読んでいたものの途中でよくわからなくなって挫折した経緯があるのですが、その後チュートリアルが全体的に刷新されていたようで、新しい気持ちで読み進めることができました。 全20章構成。

  • 1章(Introduction): セットアップとかそういうの。VSCodeプラグインの保管が神という話も聞きますが、前に試したときにうまく設定できなくてよく分からなくなったので vim に Rust.vim だけ入れて書くことにしてます。最初は多分何でもいいんだと思います。
  • 2章(Guessing Game Tutorial): 数当てゲームによるチュートリアル。cargo の使い方とか、パターンマッチ構文が他の言語に比べて独特な感じがするけどそれ以外は特に難なく読める。
  • 3章(Common Programming Concepts): mutabiilty, データ型、関数、制御フローについて。割と普通。
  • 4章(Understanding Ownership): Rust の大きな特徴である変数の所有権に関する話。メモリ上でデータがどのように格納されているのかについて詳細に述べられており、第一版に比べると格段に説明が詳細になっている印象を受けました。所有権に関するルールを羅列していただけという印象が強かった第一版に比べて、こちらは「なぜそのような制約を設けているのか」について見通しが良くなっているように感じます。
  • 5章(Using Structs to Structure Related Data): 構造体について。メンバ変数の定義とメソッドの定義を別のブロックで書くことになっているのが特徴的?内容自体は割と普通。
  • 6章(Enums and Pattern Matching): 列挙型(enum)について。列挙型がリッチなのも Rust の特徴の1つと言えそう。
  • 7章(Using Modules to Reuse and Organize Code): ファイル分割によるモジュール管理について。「サブモジュールを持つモジュールは、ディレクトリを新規に作ってそこで管理しなければいけない」という仕様を見て少しびっくりしたのだけどなんでそんなことにしてるのだろう?利点がいまいち見えないと思った。
  • 8章(Common Collections): C++だとコンテナとか呼ばれてる類のモジュールについて。String の項目は「UTF-8は大変」みたいなことばっかり書いていて具体的にどう使えばいいのかよく見えてこなくて不満でした。そもそもモジュールとしても使い勝手があまり良くなさそうで、例えば String の部分文字列を取る方法についてググるこういう Stackoverflow の回答が出てくるのですが、普通に面倒で分かりづらい。基本的に String は immutable で使うことが前提っぽいので、それぞれの文字に頻繁にアクセスするようなコードを書く(例えば Suffix Arrayアルゴリズムを書くといったような)用途では別のデータ構造に変換してから使った方がという意図は見えるのですが、チュートリアルでは明示的にはそう書いてないし、そもそも何に変換すると一番良いのかもよく分からない。
  • 9章(Error Handling): エラー処理。Rust では例外ではなく、戻り値を使ってエラー処理する。適当にコードを書きなぐりたい時には panic! を用いて、ちゃんとしたものを作りたいときは Result をちゃんと処理すると良い。Result をパターンマッチで毎回律儀にチェックするのは面倒極まりないけど、"?" 記号などを使えば楽に記述することができる。

第二版は第一版に比べると、構成の見通しが良くなっていたり章末に軽い練習問題が乗っていたりしてチュートリアルの質は上がっていたような気はします。 気になる点も多少ありましたが、まだドラフトということなので完成版に期待したいです。 チュートリアルのあと半分も1~2週間くらいあれば読めそうなので、読み終わったら何か小~中規模のものを作って感触を掴んでみたいところ。


そういえば、コードを書いて色々試していると自動デリファレンス周りで少しハマったことが。

fn main() {
    let mut x = 1;
    {
        let xref = &mut x;
        f(xref, 1);
    }
}

fn f(x: &mut i32, y: i32) {
}

このコードは mainf に渡している引数(xref)がインターフェースとマッチしていないが、自動デリファレンスが働くので正常にビルドできる。しかし、f(...); を代入演算子に替えた以下のコードだと、

fn main() {
    let mut x = 1;
    {
        let xref = &mut x;
        xref += 1;
    }
}

エラーで落ちてしまう。

error[E0368]: binary assignment operation `+=` cannot be applied to type `&mut {integer}`
 --> src\main.rs:5:9
  |
5 |         xref += 1;
  |         ^ cannot use `+=` on type `&mut {integer}`

error: aborting due to previous error

何のことかよく分からなかったので周りの詳しい人に聞いたところ、自動デリファレンスはメソッド呼び出しで使えることは第一版に書いているがそれ以外については何も言っていないこと、またかなり最近の pull request で演算子でも自動デリファレンスできるようにする提案がされていたものの色々理由があって却下されていたことがわかりました。 うーん、何だかなぁ…。

「情報幾何の基礎」読んでる

情報幾何というストイックそうな分野の輪読会に特に理由無くなんとなく参加してたらいつの間にか発表担当になっていたので、色々予習してました。 使用している教本は数理情報科学シリーズの「情報幾何学の基礎」です。

とりあえず復習/予習した内容:

  • 学部1年レベルの解析学の内容 (だいぶ忘れていたので10年前のノートを引っ張ってきて復習した)
  • 双対ベクトル空間、テンソル
  • 微分幾何の入門っぽい話(ゆるふわ)

まだ準備ばかりで情報要素が皆無ですが、今後話がどういう風に盛り上がるのか(そもそも、盛り上がるのか)に期待です。

*1:最近の凍結騒ぎを見てかなり萎えたのと、最近はそもそもほとんど使ってなかったので他の場所を探すことにしました。