2016年12月19日月曜日

Google Cloud Platform 2016

この記事は「Google Cloud Platform(2) Advent Calendar 2016」の17日目の記事とさせて頂きますm(__)m

12/17(土)に岡山で開催された「合同勉強会 in 大都会岡山 -2016 Winter-」にて「Google Cloud Platform 2016」というタイトルで2016年のGoogle Cloud Platform(以降:GCP)をダイジェストで振り返る内容で発表を行いました。



私自身、今年の後半に数多くのGCPサービスに触れられたことも、潜在的に本テーマを選定した要因だったかもしれません。


資料的には「Google Cloud Platform Japan 公式ブログ」で月初めに公開される「月刊 Google Cloud Platform ニュース」の今年12か月分を元にトレンドを探り、これに私の知り得た情報や知見を織り交ぜて仕上げた形となっています。

2016年度版として書き上げてみると、次のテーマに力が入っていました。

機械学習

 Machine Learning元年(?)にふさわしく、GCPでもサービス公開のラッシュでした。我こそはと言う方は資料の中ほどの「機械学習サービス連携例?」にチャレンジしてみてください!(^^;)

Microsoft技術への対応

 近年のMicrosoft社のオープンソース技術への対応には目を見張るばかりです。これに負けじとMicrosoft社のオープン技術にGCPも数多くのサービスを対応させているので、お見逃しなく!

ついに(やっと?)東京GCPリージョンも登場しましたし、来年もGCPひいてはクラウド業界の盛り上がりが楽しみです!q@n@p

2016年9月19日月曜日

書籍「みんなのGo言語」

2016年9月に発売された「みんなのGo言語」を一読(厳密にはブログを書くため二読)しました。

他の日本語のGoの書籍と比べて、お財布に優しいお値段だし、ページ数も薄いし、IT雑誌のムックっぽい作りだし、読みやすそうだと思って入手してみると...q@w@p

Goの入門書を読み終えた方、Goをプログラミングしていて困った方、Goの知識を整理&確認したい方、そして、業務アプリをGoで開発したい&している方にオススメの内容かと思います。

以下、読書感想文ですが、本書を入手して実際に読み進めて頂きたいため、少しぼやかして書いています。あと、目線?着眼点?がおかしかったらすみませんm(__)m

各章について


第1章

松木さん:「みんなのGo言語」の執筆に参加しました
http://www.songmu.jp/riji/entry/2016-09-18-go-book.html

これからGoのコードを書いていくにあたっての内容です。

Goのプログラミングを進めていくにあたり、必要だったり便利だったりするツールやその使い方が紹介されています。ツールについては公式と独自のものがバランスよく紹介されています。

プロジェクトの作成、コーディング時の注意点、コードの検証、テスト、ビルド、モニタリングまでとGoで開発を進めるにあたっての一連の流れが解説されています。最初の頃はこの辺りで迷われる方も多いので良い指標となる内容です。

コーディング時の注意点については、2016年のISUCON予選でGoを選択した参加者がハマった件も書かれていますので、要チェック!? q@w@p

個人的には、他の章で書かれている内容については他の章に誘導することで役割分担であったり紙面の制約や内容の重複を上手く抑えられている&書かれていると感じました。

[補足]

本章ではパッケージ管理ツールにてGoをインストールしているため27ページの右側の上から2行目以降でGoのソースコードを別途入手していますが、公式サイトのインストーラーでインストールした場合はソースコードも一緒にインストールされます。

第2章

mattnさん:「みんなのGo言語」の執筆に参加させて頂きました。
http://mattn.kaoriya.net/software/lang/go/20160808013725.htm

マルチプラットフォームに対応させるにあたっての内容です。

Goは多くのOSに対応しているが無条件にOSの差分を吸収できている訳ではなく、意識して対応しなくてならないことがわかる章です。

ファイル操作に関して、標準パッケージの挙動の差異、クローズ処理、日本語の受け渡し、など注意すべき点が多く解説されています。

OS固有のGoコードの分け方、エスケープシーケンス、OS別のデーモン化、シングルバイナリー化、Windowsでの注意点、設定ファイルの扱い方、など幅広い範囲において公式および独自のパッケージを使った解決策が紹介されています。

個人的には、業務や自機でWindows、Mac、Linuxを使っているので差異の発生箇所や原因がイメージしやすく、また、自作する際には気を付けなければと、ためになる内容でした。

第3章

藤原さん:「みんなのGo言語」の執筆に参加しました
http://sfujiwara.hatenablog.com/entry/2016/09/09/000506

業務アプリを作成するにあたっての内容です。

実際のGo製の業務アプリをベースに必要となる機能や注意すべき点が紹介されているため、実践的で説得力のある内容となっています。

バージョン管理では、実行バイナリーへのバージョンの埋め込み方や、リリース後のバージョンアップを検知する方法などが紹介されています。

データの入出力に関しては、ファイル、HTTP、Amazon S3の3つのメディアからの入出力を軸として端末入力やログ出力も加えて、バッファリングやハッシュ化などデータを効率的に扱うためのノウハウが解説されています。

その他にも、乱数の生成、外部コマンドの呼び出し、タイムアウト、シグナルの扱い、goroutineの停止、など業務アプリとして必要となる機能が多く解説されています。

個人的には、タイムアウトやシグナルなど、まだまだ考慮しなければならない点があることに気付かせて頂いた章でした。

第4章

中島さん:(deeeetさーん、執筆ブログ、お手すきの時などに〜:q@w@p)

コマンドラインツールを作成するにあたっての内容です。

第1章でも紹介されていますがディレクトリー構成については本章でより多く解説されていますのでお見逃しなく!q@w@p

引数、終了コード、標準出力と標準エラー、エラーメッセージ、など、Go特有の話ではなく一般的にコマンドラインツールを作成する際に注意しなくてはならない要素が解説されています。

引数の扱い方として、Goとしては通常の引数とサブコマンドのパターンがあることが解説されており、サブコマンドに関しては多くの独自パッケージが紹介されています。

flagパッケージを使ったGoでの引数の取り扱い方が詳細に解説されていますので、ぜひ公式のパッケージドキュメントとソースコードと合わせて読み進めてください。

私自身、本書を購入する数日前にflagパッケージのドキュメントとソースコードを読み直していたため、めちゃくちゃ理解しやすかったです。

[補足]

102ページの左側の下から8行目以降にてエラー状況を英文で付加する際は文中に入ることも考慮して小文字で記述します。(CodeReviewComments - Error Strings)

第5章

牧さん:「みんなのGo言語」執筆参加しました!
http://lestrrat.ldblog.jp/archives/49260847.html

リフレクションを使うにあたっての内容です。

恥ずかしながら、どの言語しかり私は今までリフレクションを使ったコードを書いたことがないため「この章を読んでリフレクションを理解しよう!」と興味を持って読み進めました。

reflectパッケージの使い方、使わない方が良い理由、あえて使うときの局面、などが詳しく解説されています。

コードを解析する機能だけにコード例も多く掲載されているので、わかりにくいと感じられるところもコードと解説をじっくりと読み比べれば読み進めることができます。

後半に入るとポインターを扱う話が出てきますので、本章を読み進める際はGoの基礎を身につけてから挑んでください。

以前のGolang勉強会(togetter)の時にtenntennさんやsinmetalさんがreflectでコネコネしていた時の会話や言葉がやっと少し理解できました。

[補足]

サンプルコードにてメッセージの出力にprintln()組み込み関数を使っている箇所がありますが、print()組み込み関数と共に将来的なサポートが保証されていないため、fmtパッケージを使った出力に書き換えてください。(https://golang.org/ref/spec#Bootstrapping

第6章

鈴木さん:「みんなのGo言語」の執筆に参加しました
http://suzuken.hatenablog.jp/entry/2016/08/08/132303

テストを行うにあたっての内容です。

testingパッケージを使って行えられる、テスト、Examples、ベンチマーク、サブ系、テストメイン、について解説されています。

より実践的なテストとして、構造体の深い比較、競合の検出、Webサーバー、テストガバレッジ、などtestingパッケージだけでは対応できないテストの実施方法についても解説されています。

変数やインターフェースで既存の処理をテスト用の処理に置き換える部分ではGoらしさを感じとることができます。

個人的には、testingパッケージについては「Golang Cafe #1」での知識ベースのままだったので、テストメインの存在を新たに知るなど、リフレッシュする良い機会となりました。

全体を通じて


何らかの方向性?注意点?が読み取れるのではないかと思い、ざっくりとですが特徴や複数回でてきた内容を列挙します。

本書について

  • 本書はGoでコマンドラインツールを作成するノウハウを紹介している。
  • 執筆時点では正式リリースされていないGo 1.7の機能も積極的に紹介している。

著者について

  • 著者はGoで自作ツールなどを開発しておりOSSでGitHubに公開している。
  • 著者の多くがMakefileでビルドを行っている。

コンパイル時

  • コンパイル時には「_」などで始まるファイルは無視される。
  • 実行バイナリー作成時には -ldflags オプションでバージョンを埋め込む。

コーディング時

  • 全てをGoで処理するのではなく他のツールと連携する。
  • map型はスレッドセーフではない。
  • 処理によってerrorをそのまま返すのではなく適切なメッセージを添える。

テスト時

  • インターフェースを活用して実装を切り替える(例:プロダクションとテスト)
  • テストケースを用意する際は Table Driven Test を活用する。

読み進めるにあたって


よくわからないところはひとまず飛ばして、わかるところ・興味のあるところから読み進めれば良いでしょう。一通り読み進めた後、同様の問題に直面した時、本書を開いてみてください。

標準パッケージの内容が解説されている部分では、公式のパッケージドキュメントやソースコードにも目を通すことをオススメします。

余裕があったり、より理解を深めたい方は、本書のサンプルコードも動作させてみてください。

以上の内容を実施することで、Goへの理解度がぐんと深まるはずです。

みんなのGo言語 第n弾


もし第2弾、第3弾が発刊されるなら、次のテーマが含まれていたら嬉しいかも!? q@w@p

  • pprof、cgo、並列処理、AST、generate
  • GAE/Go、gomobile、GopherJS、gobot

P.S.三連休はみんGoで始まりみんGoで終わった...成果物はブログ記事1件と正誤報告8件!

2016年7月10日日曜日

書籍「Go言語入門」

2016年6月に発売された「Go言語入門」を一読しました。

本書籍はGo 1.6対応と「Raspberry Pi」を使った組み込みプログラミングを謳っています。私は「Raspberry Pi」を所有していないため本書の最後の約1/4は更なる流し読みとなりました(T_T) ラズパイを入手するようなことがあれば読み直したいところです。

以下、初回の読み進めでの私の読書感想文です。

良かった点

パッケージ(goファイルの構成)について解説されている

第2章でパッケージ(goファイルの構成)について解説されています。internalやvendorの話もあり、作成するgoファイルの構成に疑問や迷いを持たれている方には役立つ内容です。

CLIツール以外の作成についての話がある

学習した内容を確認するためのコードがWebアプリケーション作成になっています。第16章では Google App Engine(GAE)について解説されているため、作成したWebアプリケーションをGAEにデプロイするといった応用学習も期待できます。

その他に共有ライブラリーやモバイルアプリケーション(gomobile)の作成についても紹介されています。

メモリ上で云々の話がある

Goはガーベジコレクション搭載ということで(?)意外にも他のGoの日本語の入門書ではメモリ上で云々の解説や図が少ないです。unsafeパッケージに関する記述もあったりするなど、メモリ上での姿も意識できるようになっています。(実行効率の良いプログラムを書くためには必要不可欠ですよね:q@w@p)

「そんなところ」も解説されている

その他、OSやアーキテクチャーに依存したソースコードの書き方やビルドの制約や、名前のある型ない型を意識させるなど、かゆいところに手が届いた解説も多く見受けられました。

悪かった点

急にWebアプリケーション作成の話が登場する

各章にて文法や機能の解説を読み進めた後、いきなりWebアプリケーションを作成して確認をとる話になるので戸惑ったり違和感を覚えたりします。個人的には第16章のGAEの前に別途「第xx章 Webアプリケーション」と章立てをして解説した方がわかりやすいと思います。

6.3.5 「rangeを用いたfor文」の解説が不十分?

「range対象がチャネル型の時だけ変数が1つ」といった解説がなされていますが、チャネル型以外でも変数を1つだけ指定した記述が可能であり、この場合は「1つ目の値」を取得します。

    str := "abc"
    for i := range str {
        fmt.Println(i)
    }
    // 結果:インデックスを取得
    // 0
    // 1
    // 2

読み進めると「11.1.7 配列とスライスのfor文」のコード中にrange対象がスライス型の時に変数を1つだけ指定した記述した文が出てきたので「6.3.5できちんと解説しておけば良いのに」と少し残念に思いました。

意外だった点

CLIツールの作成についての解説がない

os.Argsやflagパッケージなどコマンドラインツールの作成に関する解説はなく、その代わりをWebアプリケーションの作成で対応しているところは意外でした。

「Raspberry Pi」を持っていなくても大丈夫

「Raspberry Pi」の章ですが、解説に使用されているソースコードの中には組み込みに依存せずGoの標準パッケージだけで作成されているものもあります。「Raspberry Pi」を所有していなかったりあまり興味がない方でも一度はざっくりと目を通してみると役立つ情報が見つかるかもしれませんよ。(インターネットから情報を取得するコード、など)

2016年5月5日木曜日

書籍「スターティングGo言語」

2016年4月に発売された「スターティングGo言語」を一読しました。

最新のGo 1.6に対応しており、他の開発言語でプログラミング経験のある方がこれからGo言語を学ぶ際に適した入門書だと思います。

最後まで読み進めると、例えばインターネットから取得したテキストファイルを取り扱ったり加工したりするといった、コマンドラインツールを作成できるまでの内容を習得できます。

著者の松尾愛賀さんにて、しっかりと準備や下調べを行って自信を持って執筆されている印象を受けました。

ちなみに松尾さんは4/23(土)に東京で開催された「Go Conference 2016 Spring」にてお見受け致しました。移動の新幹線の中で読もうと本書を持参していたので、あわよくばサインでも頂ければ!?と思っていたのはナイショの話です(^^;)

以下、私の個人的な所感を徒然なるままに。ご参考までにm(__)m

良かった点


通常の学習では気にしない&ならないような部分までコーディングして動作を検証されていました。私自身も「こういうものなのだろう」と流して学習していた部分を回収できたところがあったので良かったです。

 例)ポインターのポインターを操作するためのポインター:***int

前半の文法に関する章では、本質的な表記だと冗長化したり理解に時間がかかるが、一先ず学習するであろうものはシンプルに表現されていることを体験できます。(Go言語のポリシーのひとつである「Simplicity is Complicated」ですね!q@w@p)

後半にはgoコマンドや標準パッケージに関する解説があり、本書の前半や「A Tour of Go」などで一通り文法を学んだ後、次に何ができるか?何をやろうか?となった際などに活用できます。

悪かった点


ページ数の制限もあるのだと思いますが、コード例の多くが一部を抜き出したものであり、例えば変数の定義が前出のコード例に中にあったりするなど、読み解きづらい箇所があります。

ダウンロードできるサンプルコードは、紙面のすべてのコードを網羅したりgo runで実行できる形式にするなど「本書でのコードの正しい姿」として収録しておいた方が良かったです。

見つけた正誤表


98ページの下から6行目のコード内

 戻り値の( )が省略されていない。

  誤:func div(a, b int) (int, int) // コンパイルエラー
  正:func div(a, b int) int, int // コンパイルエラー

225ページのコード内の上から14行目

 MyStringではなくStrings

  誤:/* []stringへのエイリアスMyString */
  正:/* []stringへのエイリアスStrings */

私なりの補足


58ページの「暗黙的な定義」に追加

 定義されている変数(a)に対して暗黙的な定義を行うとコンパイルエラーになりますが、

  var a int
  a := 1 // コンパイルエラー

 定義されていない変数(b)が含まれていれば、暗黙的な定義を行うことができます。

  var a int
  a, b := 1, 2 // bは定義されていないため暗黙的な定義ができる

97ページの下から2行目のreturnはなくてもよいのでは?

 Go 1.1から、関数の最後の文が構文的に終端ステートメントである場合は最後のreturn文は省略できるようになっています。(https://golang.org/doc/go1.1#return

121ページの下から4行目の「どのような局面で役に立つのか?」

 同名のパッケージをimportする時に役立ちます。

 import (
         "text/template"
         htmplt "html/template"
 )

P.S.付録は読んでいないのですが上田さんがレビューされているので大丈夫でしょう!q@w@p

2016.05.19 出版社に報告して正誤表になりました。

2016年3月12日土曜日

Golang 勉強会 in Kagawa

2/27(土)に香川で開催された「Golang 勉強会 in Kagawa」に参加してきました。



今回はGDG Shikokuさん主催のGo言語のイベントで、東京からGoCon主催者の上田さん、開催地の香川から堀内さん、岡山から萩野さんと私が発表&スタッフで参加しました。

堀内さんが参加されるということで所属の「SLP-KBIT」の方々も多く参加してくださり、参加者の社会人と学生さんの割合がおおよそ半々となりました。

上田さんはモバイルアプリに関するお話しを、堀内さんはWebアプリに関するお話しを、私は概要紹介と入門ハンズオンを、とバラエティに富んだイベントでした。

発表資料につきましては、イベントサイトの「イベント資料一覧」をご参照ください。私の発表資料は「It's gotime!」(概要説明)と「入門ハンズオン」です。

記録として、私目線での開催までの流れをご紹介。

  1. 堀内さんとGDG Shikokuさんが出会う。
  2. 香川でGo言語の勉強会を開催する話に。
  3. GDG Shikokuさんから登壇のお話しを頂く。
  4. 私から萩野さんに参加をお願いする。
  5. Go Conference 2015 Winter」にて登壇者を募集。
  6. 上田さんが参加を表明してくださる。
  7. 第2回 関西golang勉強会」にて堀内さんが登壇者&参加を募集。
  8. Okayama ComCamp 2016 powered by MVPs」にて開催を告知。
  9. 無事に開催!q@w@p

以下、自分のお話しです。

会場でのアンケートでGo言語は初めてという方も多かったので、しっかり説明しよう&わかってもらおうと概要説明に少し力が入っていたようで(^^;)長めの時間となってしまい、その分、入門ハンズオンの時間が短くなってしまいました。

概要説明は、結果として後で発表された上田さんや堀内さんのお話しの内容について簡単に説明できていた部分もあったので、進行としても良かったかと思います。

業務多忙でまとまった時間がとれていなかったため、入門ハンズオンのネタは会社のお昼休みの30分ほどを使って日々準備していました。前日になっても資料化する時間がとれないほどで当日の移動のフェリーの中でなんとか資料化できました。



入門ハンズオンでは「タイピングゲーム」を題材にしました。時間がなかったのでGo言語のコード構造をお話ししつつ、ゲームのソースをコーディングして動かして頂く流れになりました。

内容的には、goツールでは

  • go fmt
  • go run
  • go build

を、文法では

  • 標準入力(fmtパッケージ)
  • 標準出力(fmt.Scan())
  • 条件文(if文)
  • 繰り返し文(for文)

を紹介できたので、まずは最低限のプログラミングは行って頂けると思います。

ハンズオン中は、上田さんや萩野さんから補足やアドバイスを発言して頂いたり、学生さんのフォローを堀内さんが引き受けてくれたりと、皆さんのご協力を頂いて進められました。

次のステップとして改善内容も用意していたのですが、時間がないため内容の紹介だけで終わってしまいました。いつの日かGo入門ハンズオン(?)としてリベンジしたいところです。

改善では、

  • 問題をテキストファイルから読み込む
  • タイマーを使ってカウントダウンを表示
  • 乱数を使って問題をランダム表示

などを紹介していますので、興味のある方には引き続きチャレンジして頂けると思います。



参加者の皆様、不足の点すみませんでした&ありがとうございました。
上田さん、講師のお引き受け&東京からの来香、ありがとうございました。
堀内さん、イベント告知&学生さんのフォロー、ありがとうございました。
萩野さん、体調不良となっての来香&フォロー、ありがとうございました。
GDG Shikokuの皆様、お世話になりました&ありがとうございました。

心残りは、業務のため翌日の「うどんツアー」に参加できなかったことですね(T_T)

Okayama ComCamp 2016 powered by MVPs


2/20(土)に岡山で開催された「Okayama ComCamp 2016 powered by MVPs」に参加してきました。



私はMVP (Most Valuable Professional) ではないのですが、主催者のきよくらならみさんからお声掛けを頂きまして、今回登壇させて頂くことになりました。

Microsoft社主催のイベント「Japan ComCamp powered by MVPs」ということで、私は「Microsoft × Go」というタイトルでGo言語にまつわるプロダクトを中心に以下の内容でお話しさせて頂きました。



Go言語の紹介

Go言語を概要レベルで紹介させて頂きました。会場でGo言語を使ったことがある人に挙手して頂いたところほとんど手が挙がらなかったので説明意義があって良かったです。

MS Open Tech社

Microsoft社とオープン技術の橋渡し役を担ったMS Open Tech社とその中で取り扱われたGoプロダクト(Packer、Docker、Kubernetes)の紹介、その全てがMicrosoft Azureに取り込まれて今後のWindows Containerにも引き継がれるだろう、という内容でお話しさせて頂きました。

vscode-go

コードエディター「Visual Studio Code」用のGo言語エクステンション「vscode-go」とインストール手順を紹介させて頂きました。

こちらは昨年末の「Go Advent Calendar 2015」の23日目の記事「vscode-go/READMEとdelve/Buildingの日本語訳」を要約する感じで仕上げました。

本当は実際にデモを行ってコード補完やデバッギングの様子をお見せしたかったのですが、発表時間の関係でそこまでできなかったのが残念です。

Azure SDK for Go

Microsoft AzureのREST APIをGo言語から扱うための「Azure SDK for Go」について紹介させて頂きました。Go言語だけがベータ版の状態なので早く正式版となって公式サイトに掲載して頂きたいところです。

ベータ版というだけのことはあり、私が資料を作成していた期間中にもディレクトリー構成が大きく変わったりしました。(おかげで見やすくなったので嬉しかったです。)

Azure App Service

Microsoft AzureのPaaS環境でWebアプリを開発&実行できるサービス「Azure App Service」でのGo言語用の「Go Sample App」と3つのデプロイ方法(GitHub経由、Web内、FTP)を紹介させて頂きました。

こちらもWebブラウザーだけでコード編集からデプロイまでを行えるデモを行いたかったのですが、発表時間の関係でそこまでできなかったのが残念です。

Visual Studio Online "Monaco"やKuduを使うことによってWebブラウザー内でコード編集からコンパイル&デプロイまでをシームレスで行えられた時には正直感動しました。

個人的には発表駆動と無料1時間枠のおかげで初めて触るApp ServiceでGo言語のWebアプリを実行させるまでの手順を習得できて良かったです。


さいごに

とにかくMicrosoft社とGo言語にまつわる情報が少なかったです。日本語となるとさらに減りましたので、本記事が少しでもお役に立てば幸いです!q@w@p

参照記事