USBメモリにISO焼いて起動しても途中でエラー。Windows10はDVD-DLに焼かないとダメなのね。多分USBのドライバが入ってないのだと思う。
普段はXubuntuなのでWindowsは別のドライブに導入してマザーのブートメニューで切り替え。しばらく大丈夫だったのが突然Xubuntu側が起動できずBusyboxが上がるだけに。GRUBかMBRが壊れたのかなとUbuntuのDVDで起動してfdisk -lするとNVMeドライブがいない! SSDが突然死かと思って外してUSBアダプタに付けて確認すると問題無し。まさかマザーのNVMeが死んだのかな、ちょっと考えにくいなとUEFIのメニューを確認したら、NVMeのストレージモードがAHCIからIntel Optaneに変更されていた。なんだこれと思ってAHCIに戻したら普及。
当然Windowsの方は起動しなくなってしまったので再インストール。マザーのチップセットドライバを入れ直していて気付いた。チップセットドライバの中にIntelのストレージドライバがあるのだけど、これが脳天気に「AHCIなんてやめてOptane入れちゃいなよ」とサジェストしてくるのだった。最初の時は何も考えずにそもまインストールしたので、Optaneモードに変更されてしまったのだな。
確かWindows8の時にキャンペーン的なのがあって、手持ちのXPのライセンスをWindows8に格安でアップグレードしたんだけど、当時はどうもライセンス回りの処理がいまいちだったようで、何度かライセンス・エラーになって面倒になって放置していた。今回は、そのライセンスとWindows10のISOで導入してみたのだけど、最初にMicrosoftアカウントでログインするだけで自動的にライセンスが有効になっていたので改善されたのだろう。
「プログラミング言語Rust公式ガイド」を大分前に送って戴いていたのを、ようやく読んだ。
Rustは、個人的にかなり気に入った言語で、早く組込み開発で普通に使えるようにならないかなと思っている。Rustの公式のガイドがとても良く出来ており、おそらく多くの人がここをとっかかりに始めているのではないかと思う。本書は、このガイドを読んだ人、読んでいない人のどちらにも勧められる良書だ。ただ中盤以降の翻訳は一部こなれていない箇所もあり、意味が良く分からない時のために原書もあると良いと思う。
2章 Shadowing。Rustでは同じ名前の変数を複数回宣言できて、それにより前の変数はShadowされる(見えなくなる)。他の言語では、ほとんどが二重宣言のエラーになるところだ。便利かもしれないが個人的にはRustの言語仕様の中で、ほぼ唯一疑問を感じるところ。まぁ関数のサイズが小さければ問題ないのかもしれない。
2章 Result型。他の多くの言語が例外を使うのに対し、Rustは正常時と異常時との2つの型を持てるいわゆるEither型を使用する。ユーザのコードがResult型の結果を受けて何もしていないとコンパイラが警告を出してエラー処理を忘れていないかと忠告してくれる。
3章 Rustのセミコロンの扱いは、他の言語(行末のセミコロンを省略しても良いという仕様)から来た人をとまどわせることが多いと思う。値を返したい場合にはセミコロンを書いてはいけないし、文の間は基本はセミコロンで区切らないといけない。
4章 Rustで特徴的なのが所有権の管理。
let s1 = String::from("Hello"); let s2 = s1;
最後の文でs1からs2に文字列の所有権が移転されて、この後はs1が使用できなくなってしまう。これにより二重解放のバグが回避される。
4章 そしてもう1つ象徴的なのが参照の管理。例えばJavaとかScalaでは型によりImmutableかどうかが決定される(Javaはまぁ、Collections.unmodifiableXXX()みたいな型だけじゃ判別できない辛いやつもあるけど)。String型ならImmutableだし、StringBuilderならMutableだ。Rustはここの考え方が根本的に異なり、最初に見た時は衝撃を受けた。コードのあらゆるポイントで以下が満たされていることをコンパイラがチェックしてくれる。
- Immutableな参照(&)だけであれば、同時に幾つでも生成できる。
- 1つでもMmutablな参照(&mut)があれば、これ以外に別のMutableな参照もImmutableな参照も同時に存在できない。
この条件を満たしさえすれば、何もImmutableなデータのみに拘泥してロジック組まなくてもいいよね、という考え方なのだ。そしてスレッド安全性もコンパイラがチェックできてしまう。
8章 Rustはデフォルトはmoveセマンティクスなので、コレクションにデータを格納すると、所有権が移転されてコレクション側に移る。このあたりも他の言語から来た人を、かなり驚かせる点だろうと思う。
10章 そしてライフタイム。Rustでは、ライフタイム(そのデータがどこまで有効であるか)を指定するのにジェネリクスの記法を用いる。おそらくRustで最初につまずくポイントがここだろう。
13章 Rustではクロージャを利用できる。ただクロージャは環境にアクセスできるので、その環境からキャプチャした変数の扱いにも所有権が絡んでくる。そのためクロージャにも3つの型があり、FnOnceは環境から所有権を奪い、FnMutは可変借用をし、Fnは不変借用をする。
17章 代表的なGoFデザインパターンをRustで実装してみる試みがおもしろい。
19章 関連型。Iteratorは要素の型を型パラメータではなく、関連型で指定する。
pub trait Iterator { type Item; }
Scalaでも抽象型宣言という同じ機能があるのだが、型パラメータを使うのと比べて何が違うのかが良く分からなかった。本書は関連型を使うと何が嬉しいのかが具体的に解説されている。本書の良い点は随所でこのように「なぜそうなっているのか、何が嬉しいのか」かがきちんと説明されている点だ。
以上、個人的に特に面白いなと感じた点を、つまみ食い的に紹介してきたが、本書の内容は網羅的であり、これ1冊理解すればRustの大部分を理解できると思う。
Rustの魅力は、上にも書いたように低レベルの処理をマルチ・スレッド処理も含めて安全に書けることに加え、しがらみが無いため単純で美しい点、エラーメッセージが懇切丁寧である点、また単体テストやビルドツールが標準で用意されている点などが挙げられると思う。最近は採用されるケースも良く聞くようになってきたので、今後ますますの普及に期待したい。
羽田空港でちょっと遊ぶ。
テレビ塔。
空港近くの支笏湖へ。
小径を登っていくと...
小さな展望台。
支笏湖は、山手線と同じ面積があるのだそう。スケールが違う...
最終楽章は長大なフーガ。最初に長い序奏が付いている。
フーガは調性が薄く、力強く進んでいく。
印象的なカンタービレが置かれている。弱音器の指定があるだけで、強弱の指定が一切無く演奏者に任されている。最後は消えいるように終わってフーガに戻る。
最後はffの力強い和音で終わる。
楽譜引用はヘンレ版から。
Apple Musicの方はこちら。
第3楽章は長大な緩徐楽章。最初のテーマは非常に長く、苦難に満ちた独白のようだ。
天から一筋の光が降りてくるかのようなテーマ。
長い階段を登っていくかのよう。
永遠に続く美しいもの、幸福、しかし手は届かない。
出口の見えない霞の中、あるいは深海のよう。
抗い続けるが、
不気味な影が近づく。
苦難が続く。
どれほど抗っても救われない。
あきらめのテーマが曲の終わりを告げる。
最後は長調ながらも、あきらめを感じさせるpppで終わる。
楽譜引用はヘンレ版から。
Apple Musicの方はこちら。
第29番は4楽章構成で、第2楽章にはスケルツォが配されている。
2つ目のテーマは、メロディなのかどうか分からないあやふやなもの。
突如Prestoになって流れが中断される。
最初のテーマが帰ってくる。
そして最後にもPrestoで流れが中断され、なんともスケルツォらしい。
楽譜引用はヘンレ版から。
Apple Musicの方はこちら。