ls自体は、自分がパイプでどこかにつながれているか、出力がすぐにターミナルに吐き出されるかで、色付けをするかどうかを変えているみたいな小話があった(課題とは全く関係ないが)。ぼくはlsに色をつけなかったが。https://stackoverflow.com/questions/1061575/detect-in-c-if-outputting-to-a-terminal第三回マルチスレッド回。マルチスレッドで遊びます、終わり第四回ネットワーク回。tcp/udpで遊びます、終わり。実際ココらへんは際どい話が多くて実際もう一度やれと言われても綺麗にできる感じがしないので、正しい理解にはもう少し精進が必要そう。四回まではあんま真面目にやってなかった気が(ほんまか)。このあたりで僕のPCが壊れた。第五-六回シェルを作る。jobsなどのジョブ管理コマンドが正しく動くように実装する必要がある。catその中の右端でも左端でもないようなcatのプロセスをkillしたときの挙動というのが比較的面白かった(かつ課題の大筋とは関係ない)のでメモをしておくと、殺されたcatの左側はwriteしようとしたタイミングでSIGKILLを受け取り、これはデフォルトで終了するので、たかだかn回のenterによってすべての左側のcatプロセスは終了する。右側のcatは単純にEOFを受け取ることになり、終了する。パイプでつながれたcatはどれか一つ死ぬと、連鎖的に死んでいくことになる。かなしい第七回Linuxのシステムコールを作る回。人生で一度くらいLinuxカーネルを自分のPCでコンパイルするくらいしてもよさそう。第八-十回ベアメタル回。OSに頼らずにコードを書くことが求められる。livaさんが用意してくれた部分が多いのでややまだ理解の至らない部分が多い(なぜ、hoge番地でMMIOできるようになっているか?とか、そもそも例外ハンドラ部分は、「ハンドラ」を書いただけであって、GDTいじったりIDTいじったりみたいなことはしなかったりなど)。普通やらないであろう実験であることは確かで楽しいものではあった。lockの実装をする。lock、原理自体は結局CPU潰して待つというだけなんだが、結構奥が深い用で、複数コアで来た順にロックを獲得できるような仕組みというのはいろいろあるようである。本当に愚直に実装する場合は、単に一つのbitでロックの状態を管理し、atomic命令によってTestAndSetをすればよいのだが、これだと順序が保たれない。「横入り」されてしまうかもしれない。lockというのがある。これは、銀行とか病院の「番号札」のような仕組みで、自分の番号札になるまで待つ、ロックを解放する際に値を1増やす、のようなアルゴリズムを考えることができる。lockでは要求される。bouncing)が多発することになり、パフォーマンスに影響する。これを防ぐために、単純に「待っている人の数」だけ待ち時間を増やすbackoffテクニックというのがある。このような単純なアプローチではなく、ロックの構造自体をCPU一つ一つに与えて、それぞれのCPUはその構造を監視する。bouncingを極力抑えることができるようになる。lockといっても非常に低レベルな問題によって工夫の仕様があるんだなあという気持ちになる参考https://lwn.net/Articles/531254/https://lwn.net/Articles/590243/なんか色々書いてしまった第十一回ドライバ作成回もとい生のEthernetパケットをいじる回である。DHCPなどをいじって楽しむ。いうフェーズの部分がとてもエスパーのように感じたが、しかし全体としては僕は好きだった(あまり触れたことがない部分だったため)。ARPとかは目で見れば読めるようになった(ほんまか)気がする。通り関数型言語OCamlと論理型言語Prologについて学ぶ実験。驚くべきことにこの実験でRustも勉強してしまった。ところでこの実験のおかげでTeX力が1あがった(0から)1-4回OCaml自体で遊びます。isomorphism周りの話、モジュールを使ったGADT、リストモナドの"別実装"など。FLに一貫して言えるが、こういう発展的な"ネタ"は素直にOCamlを学んでいるときには見えにくい話なので、こういうの良いな〜っていう感じである。5-9回OCamlのインタプリターを作ります。lex/yaccから始まり、MLの基本機能を実装し、最後はlet多相を実装します。多相を実装するというのがありましたが、残念ながらできていない。x);;```という式は少なくともOCamlのバージョン4.06.1では、型がつかない。これは型がつかないのではなく、型推論が「終わらない」。これに型がつく(推論が生きている時間で終わる)ように拡張したりする。unifyの回は、let多相が案外コーナーケースがあるらしく、意外と正しく実装するのは難しいらしい。最初にPrologで遊びます。toeを完全解析するような述語を作ったりする。Prologを作ります。なんとなく公開する(まぁprolog処理系はいくらでも書きようがありそうなので)。https://github.com/moratorium08/pyoyog基本的に後半はPrologが論理的におかしい挙動をするという話が行われる。Prologがどのように動作するかというのはWikipediaのSLD導出を見たほうが良いが、Prologの実装が必ずしもそれに沿ってないというのが問題となる。これの最たる問題としてPrologの探索アルゴリズムが深さ優先であることPrologがunifyアルゴリズムを走らせるときに、出現検査をしないことPrologの否定を取る際に、変項を含む場合でもただちに否定をしてしまうことのような問題がある。これらを解決したProlog風処理系を作るのが課題になる。13回オセロの思考ルーチンを作る課題。Rustでも良かった(許された)(なぜ?)。Rustで書いたのだが、割とRustの勉強になってよかった。nomはlex/yaccになれた人間がいきなり使うと割としんどかったが。書き始めるとわかるが、OCamlのint型は63bitで、64bit目はGCのために使われるらしい。この性質が今回の課題ではやや仇で、オセロのbitboardを実装する際できれば64bitの整数が欲しくなる。処理の遅くなった64bit型整数というのがOCamlにも存在するが、bitboard上の演算は、速いほうがうれしそうという理由でRustで書いたほうが良いという話があったただ、Rustの場合、サーバーとの通信を行うクライアント側のコードなども自分で書く必要があり少ししんどかった。あとあんまり強くならなかったので悲しい。評価関数学習はそんなに簡単ではなかった。詳細に書くのがしんどくなってきたので、以降適当にまとめるハードウェア実験はVerilogとVivadoに""あいさつ""するような内容。少なくとも理情で学ぶ言語たちに比べてクセが強いのでお気持ちを理解するような感じで、多分秋のCPU実験に備える、ないしコア係にはならんぞの気持ちを高める。代入時の左右のビット数違い勝手に最適化の2つである。後者はとくにしんどく、ちゃんと回路がどのようにマッピングされたかを結局のところ見ましょうね〜という話らしい。ひえ〜具体的な内容は前半4回ほどで、簡単な加算器とかフリップフロップをブレッドボードで作るやつをやった後に、残りでVerilogで回路を書いて、FPGAで動かす、というのをする。UARTによる通信、AXI4バスのデータ転送回路である。最後のデータ転送あたりは、CPU実験が透けて見える内容になっていて、転送命令のFetch/Decode/Exec/Writeの工程をパイプライン化して速くするような課題をやった。3Sでは一番の低レイヤーだった。金:演習1離散数学と情報論理の演習である。それぞれ単位を取得するために問題の解答を発表する必要があるので、少し盛り上がる。基本的には、問題を解く授業で、それぞれグラフ理論の問題と論理の問題が配られる。ついて"すべての問題を理解する"ことが期待されているが、割とかなりの量の問題があるので割と厳しい。先生とTAの方々がかなり熱心に見てくださるので、色々とアツい感じの授業だった。講義は1限が無い、出席をほとんど取らないので期末試験でできれば(基本的に)良いという感じなのがとても良い。SystemOSの各種仕組みに関して概観する授業。Fault時のReplacementアルゴリズム周り(LRUやLRUの近似アルゴリズムについて)、IOとファイルシステム・権限周り、最後にバッチシステムや並列分散コンピュータ・メニーコアなどの話が非常にざっくりあった。なんか最後のメニーコア・GPGPUあたりの話が先生的には好きそう。スライドが包括的で良いが、しかししばしばおかしなところがあったりしてfuga、まぁお気持ちで読めるが。授業にはあまり行かなかった。火:離散数学グラフ理論の話。マトロイドの話が、双対性を軸に進む。内容が半分競プロで、まぁフロー周りとかは完全に競プロでは。単体法の計算がしんどい。マトロイド周りはどちらかというと、"数学"という感じで、あまり深くやってないのでなんとも言えないが、触りをやった。あと、""予告問題""として、「polymatroidを用いて、Kruscalアルゴリズムの妥当性を証明する問題」を出そっかな〜って言っていたのでオッってなったが出なかった(何)。真面目に授業に出ていなかったのでなんとも言えない・・・。最後にゲーデルの不完全性定理周りについて。内容が非常に広いので僕はどれほど理解できているかはわからない。いう感じで、多分反復深化が求められている。Predicateの話が続く。各論理は、syntaxとsemanticsそれぞれについて議論した後に、健全性・完全性の話をする。述語論理の完全性では、Herbrandの定理周りの話を(他の話題に比べて)深くやって、ある程度真面目に議論していた(と思う)。面白かった(ほんまか)。木:言語処理系コンパイラ周りの理論の授業。字句解析から始まり、LL・LR文法、型周り、中間コード生成と最適化、レジスタ割当などの話。https://www.amazon.co.jp/Modern-Compiler-Implementation-Andrew-Appel/dp/0521607647に沿った内容ではあるが、スライドが良いし、先生が良い(個人的な感想)。3S講義では一番好きだった。この授業は全部行ったと思う。金:計算機構成論コンピュータ・アーキテクチャの授業。Order・スーパースカラ周りの話は僕が知らない話だったので面白かった。授業には行っておらず、教科書を読んでいただけなのでhogeまとめ最後のほう少し書くの疲れてしまった。(1)はてなブログをはじめよう!moratorium08さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。