2013年10月27日日曜日

Golang Cafe #1を開催しました。

今日は、Golangをみっちりやるという目的で、Golang Cafe #1を開催しました。

内容は、最初なのでHow to Write Go Codeの内容を中心に進めました。

順番は、

  1. 今後のために、Workspaceの構築
  2. パッケージについて
  3. Your First Program
  4. Goコマンドについて
    1. go build
    2. go install
  5. go test
    1. TestXxx()
    2. BenchmarkXxx()
    3. ExampleXxx()
注目のポイントとしては、まず、パッケージについて。

  1. 基本的にソースコードのパッケージ名とディレクトリ名が一致している必要がある。
  2. mainが含まれるパッケージ(コマンドのプログラム)には、mainパッケージしか配置できない。
  3. mainから他のパッケージを参照する事は可能。
    1. したがって、自作の外部パッケージは別のディレクトリで作成する。
    2. 参照する時はWorkspaceのsrc以下のディレクトリ構成をフルパスで指定する感じの記述が必要
      1. ex) sample.com/firstlib/sublib
      2. ex) sample.com/firstlib
      3. など。
  4. サブディレクトリにパッケージを作成する事が可能。
  5. go buildでは自作パッケージ(≠コマンドのプログラム)は-oオプションがない限り、何も出力されない。
  6. go installで、pkgディレクトリにコンパイル後のライブラリファイルが出力される。
  7. go install は、パッケージを省略すると、カレントディレクトリのパッケージのビルドを行う。特定のパッケージをインストールする場合は、パッケージ名を絶対パス指定するか、相対パス指定する。
  8. go installはコマンドとライブラリで出力先が自動的に切り替わるのでコマンドの違いはない。
次に、go testについて

  1. go testコマンド
    1. ユニットテストを行う場合
      1. テストコードはtestingパッケージを利用する
      2. ファイルの置き場所はパッケージのソースコードと同じ場所に置く。
        1. ファイル名はXXX_test.goとする。(自動的にテストコードと認識される)
      3. テストコードの関数はTestXxx(t *testing.T)とする。
        1. 先頭はTestで始まる関数を自動的に読み取ってくれる。(JUnit3と同じ)
        2. Xxxの所はテスト対象の関数名にする。(任意ではあるがわかりやすい?)
    2. ベンチマークを取る場合
      1. テストコードと一緒に記述すれば良い。
      2. ベンチマークの関数名はBenchmarkXxx(b *testing.B)とする。
        1. 自動的に読み取ってくれる。
        2. Xxxの所は対象の関数名にする(ユニットテストと同じ)
      3. コマンドパラメータが必要。指定がなければ実行されない。
        1. go test -bench .
        2. go test -bench=".*"
    3. Exampleコードを作成する場合
      1. テストコードと一緒に記述する。
      2. Exampleの関数名はExampleXxx()とする。
        1. 自動的に読み取ってくれる。
        2. Xxxの所は対象の関数名にする(ユニットテストと同じ)
      3. 関数の最後に、特殊なコメントが必要。なければ実行されない。
        1. // Output: で始まる。(これが無いと実行されない)
        2. 以降、標準出力に出力される文字列をコメントで記述。
        3. 標準出力には、自分で出力するようにコードを書く必要がある。
        4. 用途が不明。(簡単なユニットテスト?)
    4. 複数のパッケージを一気にテストする場合。
      1. go test [パッケージ名を空白で区切って羅列する]
      2. 相対指定も使える。
      3. ちょっと面倒だけど、シェルなどを使って、文字列を作るしか無さそう。
      4. ディレクトリを指定するとかでは実行できなかった。
    5. go testのコマンドパラメータについては、ドキュメントを参照。
ということで、今回は3名で集まって、中身を進めました。
(本日のお題を用意していたので、Google Documentですが、URLを置いておきます。
http://goo.gl/iVLEXf
今後は、Go Playgroundにソースを貼って動かして動作を確認も良いのですが、
テストコードを書いて動作を確認して進めてみようと思っています。

それから、基本的には毎週日曜日に気が済むまでやってみたいと思います。

2013年10月13日日曜日

第22回GDG中国勉強会を開催しました。

10/12(土)の第22回GDG中国勉強会@岡山を開催しました。
今回は、Google Cloud Platformを使ってみるという会でしたので、参加者の皆さんもいろいろなサービス、APIを使われたことだろうと思っています。
見た限りでは、Google App Engineが多かったようです。
そのうち、Blogを書いてくれる事だろうと思うので待っていることにします。

私はGoogle Cloud SQLと、Google Compute Engineを動かしたので、その手順を書いておきます。

※事前にGoogle Cloud Consoleでプロジェクトを作っていること。

まず、Google Cloud SQLから。

  1. Cloud SDKをダウンロード、展開する。(Go版に萌えましたが、コマンドが少ないのでPython版か、Java版が無難です。もしかしたらPython版だと早い?)
  2. Google Cloud SQLに接続する場合は、
    1. ./gauth
    2. (プロジェクトIDなどを聞かれ、認証URLが出てくるのでブラウザで認証させる)
  3. ./google_sql.sh [インスタンス名]

とすると、Google Cloud SQLに接続できるので、これで、select version();とか実行すれば結果が取れます。
参考:G+の投稿

次に、Google Compute Engineの接続。ほぼ、Getting Startedの通りですが、Webのコンソールも利用しました。方法をメモしておきます。
  1. プロジェクトのメニューからAPIs&auth→APIsを選び、「Google Compute Engine」を探し、ONにする。
  2. メニューのCompute Engineを選択し、NEW INSTANCEボタンを押す。
    1. OSはDebian6、7とCentOS6が選べる。(私はCentOSにしました)。
    2. 以下の画像はDiskを再利用していますが、New Persistent Disk from Imageを選択すれば新規作成できます。
  3. ./gcutil auth --project=[プロジェクト名]
    1. 承認用のURLが表示されるので、ブラウザにコピペして承認する。
    2. 承認キーが表示されたら、コンソールにコピペ
  4. ./gcutil ssh [インスタンス名]
    1. sshで接続してCompute Engineのコンソールを利用する。
    2. 思ったより重たいので注意。
    3. ここからCompute Engine側でコマンド実行となる。
  5. sudo yum install httpdとかする。
    1. Apacheを動かすので。
  6. sudo /etc/rc.d/init.d/httpd startとかする。
    1. Apache起動。(service httpd startも可能ですが、私は上のコマンドを実行しました。)
  7. ここで、一旦Compute Engineからログアウト
  8. firewallを追加。
    1. ./gcutil addfirewall http2 --description="Incoming http allowed." --allowed="tcp:http"
    2. iptablesを書き換えても何も意味はありません。(Google側で管理されているそうです。)
  9. 適当にIPアドレスで接続。
  10. 表示されれば成功!
  11. 最後に、インスタンスを削除して終了。
    1. コンソール上で可能(削除とリブートしか無い)
    2. ./gcutil deleteinstance [インスタンス名]でも可能です。
    3. ちなみに、Compute Engineでshutdown -h nowしたら、削除するしかできなくなります。(REBOOT INSTANCEボタンはエラーになります)
私はスターターパックを使っていじり倒そうと思いましたが、多分プロジェクト名を間違って申し込んだので、$1000が設定されないと思うので、適当に払います…。

2013/10/27追記:
金額が表示されたのをG+に投稿したのですが、こちらにもリンクを張っておきます。
https://plus.google.com/114183076079015753160/posts/88dV7kCuTrL

よくある質問
Q1. お金…?
A. 今のところ、どれくらいかかっているか不明です。が、そこまで課金されない気がする。まだ、Cloud Console上には課金情報は出ていません。
https://cloud.google.com/resources/starterpack/から、$1000のスターターパックに申し込んでおくと吉…?(Promo Code「fuy-in」です)


2013年10月7日月曜日

OSC広島2013に参加してきました。

オープンソースカンファレンスHiroshima 2013に急遽参加してきました。

ここ2、3年はブース出展をしても来る人は皆無という状態が続いていたことと、私のスケジュール調整が難しい事もあって、今年は参加しない方針にしていました。
しかし、スタッフの高田さんから「LT参加」の依頼があったので、LTのみ参加という、久しぶりにバカな事をやってみました。(5分のために新幹線で往復しました)

会場の様子はTwitterの#osc2013hiを追いかけて頂くなどで知っていただけたらと思いますが、大盛況だったようで、当日の参加者も200人ということだったようです。

私が駆けつけた時はすでに撤収準備に入っていたりして、あまり会話ができませんでしたが、ある程度話ができたのでよかったかなと思っています。
(やっぱり、オンラインよりは直接会った方がいいなと思います)

で、LTの時にthinreportsの発表の時にGoogle Closure Toolsというのを目にして、ちょっと感動しました。(Google Closure Toolsは西日本で聞ける人がいるのか?という程度には誰も使ってなかった…)thinreportsは裏でGoogle Closure Toolsを使っているらしく、何か協力ができるかも。ということでした。

島根の方だったので、またOSC島根にも出展を考えてもいいかなー。と思ったりしていますが、今年のようにセッションが15分しかないとかだとちょっと厳しいかな…。という気もしたりしなかったり。
(島根はけっこう遠いからな…)

LT自体は、本来の内容は2分30秒ぐらいで終わってしまったように思いますが、すぐに終わってしまうのはもったいないと思ったので、少しだけフリートークをさせていただきました。が、やっぱりおとなしく終わっておくべきだったかなと思っています。
暗い話題だけを提供してしまったので、今後はもう少し明るい話題があっても良いかな?と思うのですが、どうだろう…。

2013年10月5日土曜日

Androidプログラミングレシピ増補改訂版が発売されました。

昨年のテクニカルレビューアを務めたことのつながりで、今年も2冊のテクニカルレビューを担当させて頂きました。

昨年担当した書籍のことは以下のリンクをごらんください。
(ブログに書いたと思っていたが、どうやら書いていなかったようなので、)
https://plus.google.com/114183076079015753160/posts/bzhS5X5CUw6
https://plus.google.com/114183076079015753160/posts/EqYR5iWKsca

今年の2冊は初版でAndroid2.3までの内容として、英語で書かれた書籍が改訂されたので、日本語に翻訳されたものを、技術的観点で、私がレビューを行いました。
幅広い内容になっているのと、Android4までの内容が書かれているので、前回は1冊でしたが、今回は2冊に分かれています。
(1版のことについては、http://takashi-yokoyama.blogspot.jp/2012/01/android.htmlへ。)

1冊目のAndroidプログラミングレシピ​増補改訂版 アーキテクチャ/UI/ネットワーク編は、環境構築、各種View、通信(ネットワーク、Bluetooth、NFC、USBホスト)について扱われています。

2冊目のAndroidプログラミングレシピ​増補改訂版 メディア/データ/システム/ライブラリ/NDK編は、マップ、カメラ、音声、動画、センサー、GPS、Preference、SQLite、
ライブラリプロジェクトについて、NDK、RenderScriptの事が書かれています。
こちらに関しては、少し残念だったのが、Google Map Android API v2ではなく、v1のMapViewに関する説明になっていることです。
(公式に非推奨になっていることもあり、MapViewを使った新規開発は不可能なため。)
ここは、翻訳本の制約でしょうか。どうすることもできないので、興味がある皆さんが購入して頂いて、次回作に期待するしか無さそうです。

2冊とも文字が多いので、書籍に書かれているソースコードを入力して動かしながら読んだ方が理解は早いと思います。
そして、あまり知られていない便利なクラスがあるということに気がつくこともあるかと思いますので、ぜひ一読いただければと思っています。