2014年5月25日日曜日

Golang Cafe #30

5/18(日)に開催された「Golang Cafe #30」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、+Hideki Matsuda さん、私の4名でした。

前半:presentコマンドの紹介&解説


前半は、Haginoさんによるpresentコマンドの紹介&解説でした。

presentスライド(?)は「Go Talks site」などでよく見かけていて「どうやって作られているのか?」と興味を持っていましたが調べるまでには至っていませんでしたので、助かりました。

解説内容を実際にスライドにしてApp Engine上にデプロイしてプレゼンして下さったおかげで、解説と見た目を同時に確認することができて、非常にわかりやすかったです。

presentに関する流れは、以下の通り。

1. presentコマンドをインストール
2. $GOPATH配下にて、スライド内容をmarkdown風に記述して.slideファイルで保存
3. $GOPATH/bin/presentコマンドを実行
   →$GOPATH配下の.slideファイルが収集されたhttpサーバーが3999ポートで起動

 $ $GOPATH/bin/present
 ... Open your web browser and visit http://127.0.0.1:3999/

4. WWWブラウザーにて「http://127.0.0.1:3999/」アクセスしてスライドを選択。

今度Goで何か発表する機会があれば、presentでスライドを作成してみようと思います。
# presentスライドだと、Gopherっぽさ(?)が増しますよね!? q@w@p

後半:dockerのソースリーディング - 「バージョンを表示する」処理


後半は、dockerの各処理を見て行こうということで、簡単であろう「バージョンを表示する」処理をソースリーディングしました。

server/server.goのInitServerメソッドに処理名と処理の対応マップがあり、その値はjobに設定されています。バージョンを表示する処理はsrv.DockerVersionメソッドです。

for name, handler := range map[string]engine.Handler{
...
"version": srv.DockerVersion,
...

DockerVersionメソッド内では、engineが所有しているengine/env.goのEnv配列に各種バージョン情報を設定しています。

 Dockerのバージョン:"Version", "ApiVersion", "GitCommit", "KernelVersion"
 Go関連のバージョン:"GoVersion", "Os", "Arch"

APIサーバー側の処理としては、api/server/server.goのcreateRouter関数にパスと処理の対応マップがあり、バージョンを表示する処理はgetVersion関数です。

m := map[string]map[string]HttpApiFunc{
"GET": {
"/events": getEvents,
"/info": getInfo,
"/version": getVersion,
...

getVersion関数内では、eng.ServeHTTP(w, r)の結果をapplication/jsonで返すようになっており、ServeHTTPメソッドはengine/http.goに実装されています。

ServeHTTPメソッド内では、Engineレシーバーのjobに対して、パス名をjob名として実行しているので、恐らくInitServerメソッド内で定義された"version"処理が実行されていると思われます。


次回:Go Concurrency Patterns: Pipelines and cancellation


このままだとGoではなくDockerをソースから学ぶ会になりそうだということで、Dockerのソースリーディングを一旦中断して、次回は、以前から気になっていた「Go Concurrency Patterns: Pipelines and cancellation - The Go Blog」を読み進めることになるようです。


2014年5月18日日曜日

Golang Cafe #29

5/11(日)に開催された「Golang Cafe #29」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、ハムエッグさん、私の4名でした。

今回はdocker.goのデーモンモード処理をソースリーディングしました。

  if *flDaemon {
    // デーモンモード処理
  } else {
    // クライアントモード処理
  }

デーモンモードの処理の流れは、以下の通りです。

  1. 実行環境がLinux(amd64)であることをチェック
  2. 作業用のテンポラリーディレクトリーを作成
  3. テンポラリーディレクトリーを保有するengineを生成
  4. engineの登録
    1. engineに"initserver"と"init_networkdriver"のハンドラーを登録
    2. engineに"serveapi"のハンドラーを登録
  5. engineから取得したjob「initserver」をGoroutine起動
  6. engineから取得したjob「serveapi」を起動

engineとjobは構造体で、それぞれの役割は以下の通りです。

  • engine
    • Dockerのコア機能で、ジョブを実行してコンテナーを操作
  • job
    • Dockerエンジンで動作する基本ユニット
      • 例)プロセス実行、コンテナ生成、ダウンロード、http API 提供、など

他の参加者に比べて、ソースを追いかけている時に迷子になる場面が多かったのですが、私のVimmer力不足が原因でした。(もっと使いこなせば...T_T)

ちなみに、参加者が使用しているソースビューワーは、以下の通りです。

  • Takashi Yokoyama さん、Takanobu Hagino さん
    • Sublime Text
  • ハムエッグさん
    • Emacs
    • Vim + less

大量&多階層のソースを扱うなら「LiteIDE X」を使う手もありかも。

一ヶ月前にソースリーディング用としてダウンロードしたソースと、github上のソースとで、差分が生じ始めていました。活発なプロジェクトである証拠ですね。

2014年5月11日日曜日

Golang Cafe #28

5/4(日)に開催された「Golang Cafe #28」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、ハムエッグさん、そして、帰省中の +Shingo Ishimura さんと私の5名で、初の満員御礼でした。

引き続きDockerソースリーディングの予定でしたが、Shingo Ishimura さんからの「外部コマンドの入出力のやりとりをGoで制御するには?」という問い合わせに取り組む回となりました。

私は答えを出せず、結果的にcmdパッケージの見直しを行う形で終わりましたq@w@p

P.S.この週は、お仕事で休日出勤やら半徹夜やらでいろいろダメダメでした...(T_T)