# Appendix 1. Code Layout 何か気になるプログラム/ソフトウェアに出会うと、特に、気になる動作をしていた場合、そのソース・コードを読んでみたくなるのですが、最近はオープンソースで開発されていてコードが公開されているものが多いので大変助かりますw 私の場合、このコード・リーディングが特に好きで、と言うか、独学での先生は素晴らしい沢山のコードたちでした。最初の頃は先行投資と銘打ってプログラム本を買い漁っていましたが、最近は、この手の本はすぐに内容が古くなってしまうことが多く、ネットにも情報が溢れているので、書籍を買うことは少なくなってしまいました。 コード・リーディングは、C言語でのプログラムに慣れてきたばかりの時に参加したプロジェクトで --- [NetWare](http://ja.wikipedia.org/wiki/NetWare) for Unix を移植するものだったのですが --- その膨大なコードと格闘した時に鍛えられたような気がします。 ネットワーク OS ということで、デバイス・ドライバからプロトコル・スタック、サーバ・アプリケーションまで、文字通りフルスタックのコードを全く動かない状態から読み込んで、単純に移植するだけじゃなく、そこに元々存在していたバグもデバッグする必要がありました。おかげで、大量のコードを見ても怯まないようになりましたw こんな感じで今でも結構コードを読むことから始まったりすることが多いです。これは Web でも同じで、新しい SNS に参加したらまず JavaScript を読み、API のパケットを見たり、機能を補完するためのツールを作ったりしています。 [jQuery](http://jquery.com/) もまだ JSONP の機能も内蔵されてなかった初期のころですがパッチを当てたりしていましたし、[Tombloo](https://github.com/to/tombloo/wiki) や [Taberareloo](https://github.com/Constellation/taberareloo) のコードも大変勉強になりました。Google の難読化されたコードはもうあまり見たくないですがw ## さて、肝心の CoreOS のコードですが、 レポジトリのレイアウトが他と変わっていて一箇所ではなく、各コンポーネント毎に別々のレポジトリになっていて、ビルド時に、それらのコミット・ハッシュをキーにして、一つのレポジトリに集められるようになっているようで、最初は取っ付き難かったです。 このレイアウトと作法はどこから来るのか?正確には調べてないのですが、CoreOS の派生元である Chrome OS の、さらにベースとなっている [Gentoo](https://www.gentoo.org/) から来ていると思われます。たぶん、Gentoo をご存知の方は当然のレイアウトなのでしょうね。 - Modifying CoreOS https://coreos.com/docs/sdk-distributors/sdk/modifying-coreos/#making-changes - CoreOS 入門 - Qiita http://qiita.com/mopemope/items/fa9424b094aae3eac580#2-4 - Google Chrome OS - Wikipedia http://ja.wikipedia.org/wiki/Google_Chrome_OS - Portage - Wikipedia http://ja.wikipedia.org/wiki/Portage ### それでは、実際に私がチェックしている主なレポジトリをご紹介したいと思います。 - coreos/coreos-overlay https://github.com/coreos/coreos-overlay 最終的に全てのコンポーネントのコミット情報が集まってくるレポジトリ。 CoreOS の中ではここのみ (GitHub で言うところの) Watch をしています。ここをチェックしていると次にリリースされるものには何が追加/変更になるのかが大体わかります。 それ以外は、全てを Watch していると大変なことになるので、各レポジトリの master ブランチのコミット RSS を RSS リーダーでチェックするようにしています。 この中でも、 https://github.com/coreos/coreos-overlay/tree/master/coreos-base がコアになっていて、各プラットフォーム用にカスタマイズするためのコードもここにあります。 例えば、GCE 用であれば https://github.com/coreos/coreos-overlay/tree/master/coreos-base/oem-gce/files Vagrant 用であれば https://github.com/coreos/coreos-overlay/tree/master/coreos-base/oem-vagrant/files という感じです。 - coreos/init https://github.com/coreos/init ここに CoreOS 起動時のスクリプト、及び `systemd` の unit ファイルがあります。CoreOS 全体に関わるカスタマイズはここに対して行います。 - coreos/coreos-cloudinit https://github.com/coreos/coreos-cloudinit CoreOS 用 `cloud-config` の実装がここにあります。CoreOS を SDK を使ってビルドし直さない限り、ユーザ・レベルではこの `cloud-config` を使ったカスタマイズ/設定がメインになりますので、ここのドキュメントは目を通しておいた方が良いと思います。 #### 以下、「[CoreOS の概要](#file-01-coreos-md)」の中でご紹介した CoreOS に内蔵されているツール郡もそれぞれレポジトリを持っています。 - coreos/etcd https://github.com/coreos/etcd Go言語で書かれていて、サーバである `etcd` だけでなく、それをコントロールするための `etcdctl` もここからバイナリをダウンロード出来るようになっています。CoreOS で使われる Linux 用だけでなく、Mac OS X 用や Windows 用のバイナリも配布されており、`etcdctl` を使えばローカルマシンでリモートからクラスタの情報にアクセス出来るようになります。 - coreos/etcdctl https://github.com/coreos/etcdctl - coreos/fleet https://github.com/coreos/fleet `etcd` と同じように Go言語で書かれていて、サーバ本体である `fleet` とともに、それをコントロールする `fleetctl` もここで配布されています。Linux 用と Mac OS X 用があり(なぜか Windows 版は無い)、ローカルマシンにインストールすればリモートからクラスタをコントロールすることが可能になります。 - coreos/update_engine https://github.com/coreos/update_engine CoreOS の更新をチェックするクライアント・デーモンで、C++言語で書かれています。また、このデーモンに関する unit ファイルも格納されいます。 - coreos/locksmith https://github.com/coreos/locksmith 上記 `update_engine` が更新を実行した際にクラスタ内のマシンのリブートを制御する為のツール。Go言語で書かれています。 - coreos/toolbox https://github.com/coreos/toolbox 「CoreOS の概要」の「[Docker centric](#docker-centric) 」でご紹介したデバッグ用ツール。ベースとなるファイルシステムをダウンロードし `systemd-nspawn` を起動する為のシェル・スクリプトになっています。