AmazonLinux 2 で parquet-tools をビルド

ビルドに必要なものを用意する

yum install -y wget git tar gcc gcc-c++ boost-devel make maven
wget -nv http://archive.apache.org/dist/thrift/0.12.0/thrift-0.12.0.tar.gz && \
    tar xzf thrift-0.12.0.tar.gz && \
    cd thrift-0.12.0 && \
    chmod +x ./configure && \
    ./configure --disable-libs && \
    make install
git clone -b apache-parquet-1.11.0 --depth 1 https://github.com/apache/parquet-mr
cd parquet-mr/parquet-tools/

依存ライブラリ不足でビルドに失敗したので dependencies に以下を追加

<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.10.0</version>
</dependency>
mvn clean package -Plocal

target/parquet-tools-1.11.0.jar にファイルができる。

Dockerfile

# parquet-tools
FROM amazonlinux:2
RUN yum install -y wget git tar gcc gcc-c++ boost-devel make maven
RUN wget -nv http://archive.apache.org/dist/thrift/0.12.0/thrift-0.12.0.tar.gz && \
    tar xzf thrift-0.12.0.tar.gz && \
    cd thrift-0.12.0 && \
    chmod +x ./configure && \
    ./configure --disable-libs && \
    make install

COPY pom.xml /tmp/pom.xml  # dependency を追加した pom.xml をカレントディレクトリに置いておく
RUN git clone -b apache-parquet-1.11.0 --depth 1 https://github.com/apache/parquet-mr /root/parquet-mr && \
    cd /root/parquet-mr/parquet-tools && \
    mv /tmp/pom.xml . && \
    mvn clean package -Plocal

4bit CPU TD4 を作った

GW をフルに使って自作界隈では有名な「CPUの創りかた」の TD4 を作ってみました。

CPUの創りかた

CPUの創りかた

  • 作者:渡波 郁
  • 発売日: 2003/10/01
  • メディア: 単行本(ソフトカバー)

f:id:goropikarikun:20200513234135g:plain

実は2年前にすでにパーツ類は購入済みだったのですが、当時はアセンブリ機械語の経験がなかったため本の命令フォーマットのところがいまいち理解できず、結局作らずじまいになってしまっていました。

現在は、コンパイラ作成の経験のおかげで多少なりともアセンブリの読み書きにも慣れていたので、比較的すいすいと内容を理解することができました。

概ねオリジナルの TD4 と同じ実装にしましたが、ROM の横に LED を追加したのと、74HC154 が手に入らなかったので 74LS138 を使ったところがオリジナルとの主な変更点です。74HC154 以外の IC は秋月やマルツ経由で Digi-Key から購入して揃えました。 74HC154 の置き換えに関してはこちらの方の投稿を参考にさせていただきました。

オリジナルからの変更点|cuboktahedron|note

全体像はこんな感じ

f:id:goropikarikun:20200513225148j:plain

f:id:goropikarikun:20200513225201j:plain

配線がなかなか苦しいことになっています。基本的には黒いビニール線を使いましたが、作成途中でカラフルなビニール線を買っていたことを思い出したのでなんとなく使ってみました。作成初期から使っていたら、どこをどこに配線したのかが見やすかったかもしれません。

今回は配線する前には回路図を改めて書いていたので配線箇所を間違えることなく進めることができました。

f:id:goropikarikun:20200513232423p:plain

f:id:goropikarikun:20200513231630j:plain

こまめに接続確認もしていたので手戻り作業を減らすことができたのかなと思います。 ただ、線と線の間隔が狭すぎたところは、はんだ付けしている最中に隣の線のビニールを溶かしてしまったようでショートが起きてしまいました。 最終的な動作確認のときに想定外の動作に気づいたのでそのときは絶望しかなかったですが、すぐにに原因箇所が見つかってスパゲッティコードデバッグ沼に踏み込むことはありませんでした。

今回簡易的なものとはいえ CPU を作ってみたことで、コンパイラを作ったときに疑問に思ったニーモニック機械語との1対1の対応関係や、その機械語を CPU はどのように解釈するのかといったところを身を以て学ぶことができた思います。 とはいえ、 IC で CPU 作るのは結構結構辛いなぁと思ったので次回作成するときは FPGA を使ったり、配線の負担を減らすためにプリント基板を使いたいと思いました。

github.com

自宅ではじめるDocker入門 を読んだ

日々、Docker を使っているものの今まで体系的に学んだことがないと気付いたので1冊買って勉強してみた。 約5時間で読了。

全体的に丁寧な解説でコマンドも省略せずに書かれていてとても読みやすい印象でした。 最後の docker-compose の章を除き、標準の docker コマンドで解説してくれているので今までなぁなぁにしてしまっていたコンテナ間通信が裏では何をやっていたのかがわかって有意義でした。

Compiler | Stanford Online を受講した

11月の頭から受講を始めて、5ヶ月弱かけてようやく受講しきりました。

何度か心が折れかけましたがどうにか完遂できました!

https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/aboutlagunita.stanford.edu

f:id:goropikarikun:20200321181551p:plain

この講義は COOL (classroom object oriented language)という、講義のために作られた言語のコンパイラを理論を学びながら作っていくというものです。

リアルの講義スピードだと11週間のコースなのですが、修了するまでに5ヶ月弱も掛かってしまいました。 self paced だったので良かったですが、これが実際の講義だったら落単必死です。

※ 今後は edX で受講できます。 www.edx.org

講義の流れとしては動画を見て理論を学び、学んだことをもとにコンパイラを実装していくといった感じです。 各週の最後のクイズに加えて、約2週間に1度プログラミング課題(lexer, parser, semantic analyzer, code generator)が出ます。

講義の難易度としては、Cコンパイラで有名な Rui Ueyama さんにとってはちょっと簡単過ぎて、G社のエンジニアが弱音を吐くくらいらしいです。(Ueyama-san のは正規の講義で私が受けたのはネットで無料で受講できたものなので難易度が下がっているかも)

ちなみに、私の感想をいうと今まで受けた講義の中で最も難しかったです。最終課題を出すまでに5ヶ月、述べ230時間をこの講義のために費やしました。edX でのコースページを見ると Level: Introductory となっていますが、さすがにそれは過小評価だと思います。最低でも intermediate くらいの難しさはあると思います。

スタンフォードの単位は通わなくてもリモートで取れるよ、テストとかの難易度は同じで|Rui Ueyama|note

教科書はなくとも受講できるという触れ込みでしたが、配布資料とネットの情報だけでは限界を感じて以下の本を購入しました。

Lexer, Parser の課題のときに大活躍でした!

Introduction to Compilers and Language Design
GitHub - dthain/compilerbook-examples: Example code for compilers textbook.

PDF を著者のページからダウンロードできます。結局ほとんど読まなかったですが、GitHub に上がっている Flex や Bison のサンプルを見て Flex / Bison の使い方の理解が進みました。

タイガーブックでおなじみの本ですね。不定期にやってくる Amazon の謎の値下げがちょうどあり、3700円と格安で買えました。 6章の Activation Record まで読みました。講義では LR Parsing がイマイチ理解できなかったのですがこの本のおかげで理解できました。 難しい本だと聞いていたのですが、少なからず私が読んだ6章までは CS のバッググラウンドがない私でも読みやすかったです。

タイガーブックは疑似コードで書かれている部分は良かったのですが、ML で書かれている部分は何をしているのかさっぱり理解できなかったので買いました。 初めて ML 触りましたが面白い言語ですね。パターンマッチが便利だなと思いました。

加えて正規言語、文脈自由文法といった予備知識が足りなかったので Automata Theory の講義の該当箇所も同時に受講しました。

www.edx.org

最後の Code Generation の課題は特に難しくて、要求される機能の実装方針が全く思いつきませんでした。講義を見返してもヒントになりそうなこともなかったので最終的に配布されているコンパイラ(バイナリのみ、ソースコードなし)の吐き出すアセンブリを読んで実装方法を推測するというリバースエンジニアリングっぽいことをしてどうにか課題を終わらせることが出来ました。

アセンブリから実装を推測するなんてよっぽどの変態優秀な人にしか無理な芸当だと思っていましたが、素人にも案外できるものですね。

おわりに

昨年の GoCon で Go コンパイラを作った方の話に触発されて軽い気持ちでコンパイラを作り始めましたが、思いの外時間がかかってしまいました。最初は毎日やっていれば1ヶ月もあれば終わるだろうと高をくくっていたのですが、全然そんなことなかったですね。

https://gocon.jp/sessions/selfhost_go_compiler/

今まで概念だけ知っていたクラスの継承などをコンパイラを作ることを通して実践的に理解することができたなと思います。

昨今ではコンパイラを作るのは珍しいことではないのかもしれませんが、自分で実際にコンパイラを作ったことがあるという経験は何事にも変え難いことだなと思います。

「なぜプログラムは動くのか」を読んだ

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識

プログラムはなぜ動くのか 第2版 知っておきたいプログラムの基礎知識

ふと立ち寄ったブックオフで安く売っていたので買ってみました。200円とやけに安いと思ったら第1版のほうでしたが、内容自体が原理に近いものだったのでそこまで古さは感じませんでした。(フロッピーディスクなどは出てきますが。)

帯に「10年後も通用する”基本”を身につけよう」とありますが、出版から20年近くたった現在でも十分通用する内容だと思います。

この本の各章の初めには数問のクイズがあるのですが、後半のハードウェアに近い話になればなるほどどんどん答えられなくなって、自分のコンピュータへの理解が浅いことを思い知らされました。

現在わたしはスタンフォード大学コンパイラの講義を受講していますが、これが終わったら OS でも作ってみようかなと思える本でした。 lagunita.stanford.edu

広く浅くといった本ですが、アセンブリ言語についても扱っており、コンピュータについてしっかり学びたいと思ったときに初めに読む本として丁度よいと思いました。