Web備忘録

雑多に書いています

カミュの The Stranger(異邦人)を読んだ

カミュの The Stranger(異邦人):英訳を読みました。

自分の場合、英語で本を読むのは基本いつもめちゃくちゃ大変で挫折しがちなのですが、↑のような「難しい単語・文には日本語訳がついている」みたいな本を利用して、読み切りました。

感想

とても面白かったです。日本では「太陽が眩しかったから主人公が殺人を犯した」みたいなあらすじで紹介されますけど、実際はそんな感じではないかなーと思います。

それよりは「母の死を悲しんだ様子を周りに見せなかったことが裁判上での大きな争点となった物語」という方が近いかな。

短いストーリーだけにどこを書いても結構なネタバレになるのであまり詳細は書けません。あと、この小説は日本語訳が出たのが60年ほど前のせいか誤訳が多々あるため、日本語で読んでも楽しみきれないと思います。それだけに、日本でこの小説のファンが少ないのも悲しいです。

そもそもタイトルの「異邦人」ってのもピンとこないなあ、という感じです。the strangerにあたるような日本語を考えるのは難しいですけどね。ただ、やっぱ基本はstrangeな人、ということだと思っているので、「異邦」という言葉が与えるニュアンスはちょっと強すぎるかな、と。

ところで自分がこの小説を読んで、読書会とかがもし開けるなら議題に挙げたいテーマがありまして、

「どうしてマリーは獄中の主人公との面会のさい、『あなたが出たら、結婚しよう!』と言ったのか」です。

(そのシーンの英文)

She shouted again, "You'll get out and we'll get married!" I answered, "You think so?" but it was mainly just to say something. Then very quickly and still in a very loud voice she said yes, ....

主人公が 「本気?」("You think so?") と、返答すると、即答で「うん、それであなたが釈放されたら、また泳ぎに行こう」と大声で返す(周りがうるさいから大きな声を出さないと行けない)んですけど、ここのマリーの言葉の本気度については、作中では推測できる情報がほとんどないので、推測しがいがある点だと思っています。

主人公を励ますために言ったという点と、主人公のことが好きだから言ったという点には恐らく疑いようがないですけど、やっぱその辺りのグラデーションが大事だというか、つまり「本当に釈放されていたら結婚していたかどうか」が議題になって、たとえば「もし一ヶ月後に釈放されたら、結婚するのか」、「三ヶ月後だったら」、「そもそも、釈放されて冷静になったら気持ちが冷めるのか」みたく、条件を増やすと、どのように心情が変わるだろうか、という点で話し合えばたぶん盛り上がると思ってます。

まあ読書会をする機会もないんですが…。

本当に良い小説だけに、日本語訳では楽しみきれないのが悲しいです。

「ドメイン駆動設計 モデリング/実装ガイド」を読んだ

booth.pm

まえがき

DDDに関する書籍を今まで読んだ経験がなかったのでとても新鮮でした。

まとめと感想

2章

集約や記憶すべき値を定める。そして基本的にイミュータブルなインスタンス(ミュータブルに扱いたい場合は、それを扱うメソッドを意識的に公開する)を通じて、レポジトリに永続化を依頼する。

3章

4章

  • 集約・結合度について

以下のスライドを読んだことがあってそれを思い返した。

オブジェクト指向のその前に-凝集度と結合度/Coheision-Coupling - Speaker Deck

6章

値オブジェクトについてがむずい。

3分でわかる値オブジェクト - Qiita

一応の理解としては、プリミティブ型だけで表せないattribute(インスタンス変数など)に制限をかけ、イミュータブル(getter無し)にする、というプリミティブラッパー的なものにさらないロジックを化していくことで値オブジェクトを作っていくのかな、という気がした。

  • 抽象でなくドメインという具象に依存することについて、ドメインは変更の度合いが大きいのになんで?という質問について。

「最も重要なドメイン層を独立させて修正させやすくするため」

ドメイン層に依存させることについての自分の感想:

変更が多い箇所に依存させるという設計について、初見は違和感を持った。設計の基本としては、依存はできる限り「抽象」に寄せたほうがいいというのがクリーンアーキテクチャの一つの考え方としてあったと思っていて、それは具象といった変更される機会が多くなりがちなものに依存する構造をとると、ある変更が予期せぬところまで波及するケースが増えるからだ。

けれど、ある意味でドメイン駆動設計の場合は「最も重要なドメイン層を独立させて修正させやすくするため」に加えて、以下2つの理由で「ドメイン層に依存させていいのかもしれない」というふうに思った。というのが、一つはそもそもドメインというものの在り方自体がある意味規定じみていて(というのは、特定の呼び出し方をされるケースしかない? たとえばインスタンスを作るファクトリーのようなドメインサービスとか。)、そのドメインに依存するというのが、そこまで致命的なケースになりうるということはないと思った。つまり、ドメインに依存しているようで、実際は「ドメインとしてあるべき振る舞いという抽象」に依存するケースが多いのでないかな、とも思うけどどうなんだろう。

それと、もう一つは、ドメインが変更されたとき、いろいろな所に影響が及ぶというのは、「ある意味で健全」なのではないかと思ったからだ。つまり、ドメインというのはある意味でビジネスロジック自体のコード化で、そのビジネスの根幹である部分に「変更がある」とき、その影響は即座に波及してほしい、ということだ。(特にプレゼンテーション層などにおいて。)

もちろん、ドメイン層が変更されたことでDBと接続するミドルウェアなどに影響があるような依存になっているならそれは由々しき事態だが、実際のところ、そこまで影響が及ぶ形で依存させる設計には普通にコードを書いていたらない……と思う。

7章

シリアライズを使うなど。

8章

  • CQRSについて

自分のお気持ちだけど、このDDDを読む前から「ActiveRecordってDBからの参照とDBへの書き込みを同じモデルを通じて行っているけど、そのせいで一つのモデルにめちゃロジック増えるときあるよな」と思っていたので、こういう概念あったんですね、という気持ちになった。つまり参照のためのモデルという概念。

10章

お気持ちだけど、たぶん中規模以上のアプリを開発するときの概念な気もする。Railsに乗るなら、正直ARに結構ロジック寄せたかったりもする。でもそのせいでめちゃくちゃデブになるときもあるから困る。

このへんは状況に応じて適切な切り分け、たとえばある一連のロジックをモジュールにするとかそういうので乗り切れないかなという願望もある。

おわりに

とても面白かったです!

「ソフトウェアテスト技法練習帳」を読んだ

感想

具体的なテストケース・仕様40問に対して、主に4つの手法(「同値分割法・境界値分析」、「デシジョンテーブル」、「状態遷移テスト」、「組み合わせテスト」)を使ってアプローチしていくという内容でした。

テストをやっていく上で、具体的にどれだけの入力値と出力値の組み合わせを試していくのが適切なんだ…、といった気持ちになることがよくありますが、この本では具体的に試すべき組み合わせを列挙する形式をとっており、とてもわかりやすかったです。

例えば以下の仕様について、

  • お買い物合計金額が2,000円以上の場合、駐車料金が60分無料
  • お買い物合計金額が5,000円以上の場合、駐車料金が120分無料
  • 映画を見た場合、お買い物合計金額での駐車料金無料時間に180分追加

デシジョンテーブルを使って以下のように整理したり、と。

f:id:fujiten3:20210213165811p:plain
decision_table

かなり説明が丁寧なので、1問1問楽しんでやっていくのがいいんじゃないかなと思います。

自分はノートを取り出して実際に書き出してやってました。1年ぶりぐらいにちゃんとノート使った気がします。

余談ですが、以前、

という本を読んで、こちらもとても良かったんですが(テスト手法への網羅性がかなり高い)、どうしても「実際のケース」に対して、具体的にどんなふうに組み合わせを試していけばいいのかなーといった気持ちになることがあったので、そういう意味でとても助かりました。

ただ、これらの本ではプログラミング的に「テストしやすい設計」といった点には深く言及されていないので、(単一機能として抽出されたメソッド・関数について、どのようなケースを当てはめるべきか、に集中していると思います)、それはそれでまた学んでいきたいなという感想です。

おわり。

「革命前夜」(須賀 しのぶ)を読んだ

革命前夜 (文春文庫)

革命前夜 (文春文庫)

本屋にふらっと立ち寄ったとき、入り口でおすすめされていて、あらすじと最初5ページぐらいを読み、面白そうだと思って手に取りました。 ネタバレはなしで感想書いてきます。

内容

バブル絶頂期の日本を離れ、東ドイツに渡った一人の日本人留学生。住民が互いに監視しあう灰色の町で彼が出会ったのは、暗さのなかから生まれる、焔のような音楽だった。冷戦下のドイツを舞台に、日本人音楽家の成長を描く歴史エンターテイメント。

感想

海外が舞台の小説はその国の空気を味わえるから好きです。この小説も、舞台が1990年前後(ベルリンの壁崩壊前後)の東ドイツということで、当時の人々の様子を味わえる感じがして面白かったですね。

内容としては、序盤はちょっと事件が少ない感じがしてまったりしてるように感じました。中盤はかなり引きがありましたね、(ニナちゃんのあたりからだっけな)。 終盤については、正直事件が起きすぎていて、エンタメに振ったなーと感じました。個人的にはもうちょっと控えめでよかったかな。

最後、主人公がどうなっていくかはもうちょっと見たかったなー…という気も。一連の出来事を踏まえた上での、彼の考え方の変遷自体を強く追っていく形にはならなかったため、そこが不満点という感じです。

読んでいて、18世紀のロンドンが舞台の「開かせていただき光栄です」(皆川 博子)を思い出しました。あれも当時のロンドンの空気を味わえて面白かったなあ。

ただ全体的には、よい読書体験でした。

「コンピュータシステムの理論と実装」を読んだ

半年ほどかけて、やっとのことで読み終えた。

結論からいうと、難しくはありつつも、面白かった。「コンパイラアセンブラってなに?メモリ操作って具体的に何をしているの?CPUとは?」そのレベル感で、コンピューターサイエンスを体系的に学んでいない自分が読み進めたが、多くの内容が新鮮で(そしてとても難しく)、興味深かった。トランジスタが実現するゼロイチの世界から簡易的なCPUまで作る経験は、コンピュータというものが「一体なんなのか」という点に関して、確かな輪郭を形づくってくれたという実感がある。

( ただ、後半の4章(コンパイラ実装、簡易OS実装)は自前では実装していない。コンパイラについては、こちらの

低レイヤを知りたい人のためのCコンパイラ作成入門で学ぼうと思っていて、OSについては、汎用的な知識が身につくというより、「この本の中で紹介されているJackという言語仕様に特化したもの」になりそうな気配があったので、一旦パスした。ここについては、折をみてUnixLinuxを中心に学ぼうと思っている。 )

本題に戻る。内容がとても面白かった一方で、書籍内で文意を汲み取れず自分が理解できない箇所について、「知らないから理解できないのか(そもそも現状の理解度ではいくら考えても理解できないのか)」、「既知の理解を組み合わせれば解けるのか」といった点が、すぐには掴みづらい所もある、というのが悩みのタネだった。

考えることで解ける問題は楽しいけれど、いくら考えてもわからない問題は辛くなる。

そこで、この記事では、自分が詰まったところや理解したと思えるところについて文章にして残し、後にこの本に取り組む人や、あるいはコンピュータサイエンスを体系的に学んでいない人はこういうところでつまりがち、といった点の参考なればと思い、書くことにした。

記事内では正確性も出来る限り担保したいとは思っているが、自分なりの解釈や理解を言葉にしている箇所(つまり「感想ベース」の意見)も多くなっているとは思うので、そこはご了承いただければと思う……。

記事を分けることはせず、この記事で1冊を完結させた内容にしようとは思っている。

途中経過については、github上でも残している。コード自体はむちゃくちゃで設計はいまいちだけど、一応動くものではある。

GitHub - fujiten/Nand2Tetris

前準備

本書は、前準備としてわりと必要なものが多い。そして、その必要なものがそこまで明示的に表されていない。これが第一の難関である。

僕なりに必要なものをまとめた。

  • ハードウェアシュミレーターチュートリアル https://b1391bd6-da3d-477d-8c01-38cdf774495a.filesusr.com/ugd/44046b_bfd91435260748439493a60a8044ade6.pdf

  • エディタ

    • (VScode を使っている場合は、nand2tetrisという拡張機能があり、それを使うと本書のためのコードを書くためのハイライトなどがよい感じになるのでおすすめ。)
  • プロジェクトで使うtool、ファイル一式

    • 以下のページで、zip形式で落としてこれる。これをさがすのが大変だった。本書で明確に参照されていないが、これを落としてこないと何もできない。

    • Software | nand2tetris

  • Java環境

    • (ハードウェアシュミレーターという、Javaで書かれたデスクトップアプリをshで実行するさいに、Java環境を要求される。Javaをここ以外で使う予定がないのでローカルに落としたくなかったが、このためだけ立てたDockerコンテナでうまくデスクトップアプリケーションを起動することができず(Dockerむずい)、brew java で落としたと思う)

以上である。

また、本書は、「1章ごとに表題にあることについて解説をし、そしてその解説にそぐうような回路を作成する」といった内容になっている。章の終盤で「この章での君のプロジェクト(作るもの)はこれだ」と言われ、そこで「あ、これって何かを作るための解説だったのか」と気づく構成になっているので、もし最初から心の準備ができていれば有利だと思う。

まえがきを読んで

この本の対象読者は「情報工学コンピュータサイエンス)系の学生・大学院生」であるといった説明のがはじめにある。

この本に取り組むタイミングとして推奨されているのが、最初のプログラミング言語入門の次、または「すべての授業の最後に実践的なまとめ」らしい。恐らく、具体的な時期としては「大学1年生の夏」または「大学4年生の春」頃に、「これから大学で学ぶことについてはまずは手を動かしながら実践してみよう or 今まで学んだことについて、手を動かしながら実践してみよう」といったものなのだろう。

1章

1章では、ブール論理、つまり、0と1との組み合わせが表す論理関係と、その関係性を物理的に実現する回路の作り方について学ぶ。

ABの2つの入力値の組み合わせによって定義されるブール関数は16個ある。

f:id:fujiten3:20201101093912p:plain
bool

本書では、Nandゲートから他の回路(ブール関数)を作成していく。概念自体がとても難しいという章ではなかった。ただ、頭の中で、実際の電気回路をイメージし、入力と出力を線で結んでいくというイメージが最初は思いつかず、ただ「文法ルールに基づいてNAND論理からANDやORを作っていく」というふうに作業を進めてしまったので、そこがすこしもったいなかったかもしれない。

またMuxなどの実装については、プログラミングの考えを素直に適応しても実装できないな、という感がある。

if True:
  return a
else:
  return b

を表す処理を、NotやAnd、Orの論理組み合わせだけで表現するというのは、最初は手こずるかもしれない。自分は手こずった。

2章

今まで作成した論理ゲートを利用ながら「算術計算」を行なうことの出来るハードウェアを作成する。ハードウェアといっても、コードを記述し、それに則ったシュミレーションが正しく動くかどうか試すという形なので、ソフトウェア的な開発ではある。

2進数における足し算や負の数を、1章で実装した回路を使って表す。

3章

クロック(tick/tockのようなラベル付けがされる、時間の経過を表現するための継続的に変化する信号)によって担保されるメモリーを自前で実装していく。1Bitを記録できる論理から16bitを記憶するレジスターを作り、そのレジスターを組み合わせてRAMを作成していく。

この本で細部まで説明されない要素に「コンピューター内における時間経過(フリップフロップ)」がある。ここについての細部の実装はググってみたけれど、かなり難しかったため、本書においては一旦無視していいと思う。

load のフラグを立てると、メモリに「書き込み」をする挙動をみてテレビゲームのローディング中などの表示でよくある「now loading」って、読み込み中って考え方だけじゃなくて、RAMに情報を書き込み中、みたいな捉え方でも見れるんだなあ、と思った。

4章

機械語を自分で書いていく章。前章に比べて命令の抽象度が上がるため、自分の書いた機械語が「実際にメモリ、CPUに対してどのようなことを行わせているのか」を意識しないと全く理解できなくなる章である。

機械語を書いていく上での基本的な流れの一例は「メモリアドレスの指定 → 指定したアドレスのメモリに格納されている値をCPUが使用するためのDレジスタに格納 → 新たにメモリアドレスを指定し、そのアドレスに格納されている値と、先程Dレジスタに格納した値を2章で作成した演算装置にて演算 → 結果をメモリに保存」といったものである。

アセンブラを動かし、自分の書いた機械語が「0000001000001010」といった16bitのバイナリで表現されているのを確認し、そのバイナリが「正しい命令になっているか確かめる(バイナリをどう読めばいいかの説明は本書にある)」という流れで進めていくのが基本だと思う。

5章

4章における「機械語がバイナリ命令にアセンブリされる」流れを踏まえて、「バイナリ命令(ROM)とデータメモリ出力(RAM)を受けて、データメモリへの書き込みや次の命令のアドレスを指定するCPU」を作成する、という章である。

どの出力のフラグをどの回路に結びつければいいか、の概要図は示されるものの、今までの章を理解していないと確実に解けない。

自分の場合は、ある程度は算段がたったものの、実際の記述法がなかなか思いつかず(回路に対する命令を行うHDLという言語の仕様が難しい)、ネットでちょっと解法を探した。

6章

アセンブラの作成である。「@7」といった形で記述されている機械語を、バイナリに変換するプログラムを自分で書く。言語指定はないので、自分はPythonで書いた。

7章 ~ 8章

VM言語(中間言語)を機械語に変換する)コンパイラの作成である。VM言語とは、ある言語のコンパイラが、直接機械語を作る前に、まず一段階経由する言語ということのようである。たとえばJavaは、直接機械語を生成せず、まず中間言語を作成する仕様のようであるが、ただ、Go言語のように、中間言語を介さず直接機械語を生成できる言語もある。

スタックと呼ばれるシンプルかつ応用性が高い抽象データ型を利用した演算や、サブルーチン(関数)を呼び出すさいのスコープだったりを設定するためのメモリ操作について、コンパイラを作りながら勉強する。

正直、かなり難しく、8章の応用問題は解けなかった…。複数ファイルを名前競合しないようにコンパイルしつつ、再帰構造を含む各関数を適切に呼び出さなければならないが、メモリへの命令をどう書けばいいのか頭で処理できなくなったので飛ばした。

誰か、凄い人に解説してもらいたい…。

9 ~ 12章

ここについては、一番はじめに述べたとおり、他の教材で詳しく学ぼうと思ったので、演習問題は飛ばし、内容を読むだけにした。

最後に

コンパイラアセンブラってなに?メモリ操作って具体的に何をしているの?CPUとは?」そういった疑問に対して、言葉上の意味だけでなく「こういった挙動をするものなんだ」ということが、身にしみてわかったのでよかったと思う(小並感)。

これらの知識がすぐに実務に活きるかというとそうではないとは思うけれど、新しい技術に触れたり、自分で低水準の操作を行う必要があった場合は、役に立ってくる知識じゃないだろうか。

なので、もし低水準に興味があり、ただどうやって学べばいいか悩んでいる人の入門的位置づけの本としては、とてもよいと思います。(入門本だけど簡単ではないので注意! 自分は8章までやるだけでも50時間はかかった気がする。)