2014年12月31日水曜日

Goのスライス(slice)を復習

年末年始で落ち着いて時間をとれたので、Goのスライス(slice)について復習しました。以下、参照させて頂いた記事の一覧です。黒四角(■)が付いている記事を中心に読み進めました。

Go Slices関連

Go言語のスライスを理解しよう(オリジナルを踏まえたスライド)
 □Go言語のArrayとSliceについて(オリジナルを要約した記事)
 □slices_usage_and_internals.md(オリジナルを日本語訳した記事)
 □Go Slices: usage and internals(オリジナルの記事)

Jxckさんの記事
 □SliceTricks
 □Arrays, slices (and strings): The mechanics of 'append'
Go のスライスでハマッたところ(その2)
 □GoのSliceもヤバイ

自分として復習できた点は、以下の通りです。

・配列から要素を取得する時にインデックスを指定するが、上限値は取得したいインデックスの+1である。

ド忘れしていました(^^;) ["a", "b", "c", "d", "e"] という配列から ["b", "c", "d"] を取得する場合のインデックス指定は [1:3] ではなく [1:4] です。Pythonのスライス操作と同じでしたね。

・スライスに値を追加する時は、キャパシティを超えるか超えないかを意識する。

再確認しておきたかった点です。値を追加してキャパシティを超える場合、内部ではメモリが再確保(アロケート)されたりスライスが新規作成されたりとコスト高になっています。Goにはガベージコレクションがあるとは言えど、メモリ効率なども意識できるようになれば初心者を卒業です。

・スライスの実体はSliceHeader構造体である。

新しく知り得たことです。関数の引数にスライスを指定するとコピーされます。関数内で引数のスライスのLenやCapを変化させてもこれらは値なので、その結果は関数に引き渡す前のスライスには反映されません。Dataは参照元の配列へのポインタでなので、関数内で配列を変化させた場合はどちらのスライスからも反映された状態を取得できます。

2014年11月2日日曜日

Golang Cafe #52

10/26(日)に開催された「Golang Cafe #52」に参加してきました。

参加者は +Takashi Yokoyama さん(主催者)、+Takanobu Hagino さん、+Hideki Matsuda さん、@ravencoding さん、私の5名でした。

今回は、@ravencoding さんが「ISUCON4」に参戦中ということで「オンライン予選問題」に取り組むことになりました。

動作環境はAWSで提供されていますが、お金が掛かるためローカルに構築することに。

結果的には、皆さんは動作環境の構築だけで終わってしまいましたが、私は早々に構築をあきらめて(^^;)goのソースを少し読み進めていました。

WAF(Web Application Framework)としてmartiniが、データベースにはMySQLが使われていました。

どちらも初見であり、かつ、サンプルながらGoのWebアプリの実ソースを見るのも初めてだったので、良い機会になりました。

実際の競技では「高速化」を目指すため、WAFの変更や廃止、データベースの変更やオンメモリ化、開発言語の再検討など、トータルで考えて行くことになりますが、Golang Cafeでは「Goのソースでどうするか?」の視点で取り組むことになると思います。

後日、私も動作環境の構築を行い、サンプルが動作するところまで準備できました。

次回も引き続き、オンライン予選問題に取り組んで行くようです。

2014年10月13日月曜日

Golang Cafe #50

10/4(土)に開催された「Golang Cafe #50」に参加してきました。

今回は第50回記念ということでグーグル株式会社様の東京オフィス(六本木ヒルズ森タワー)にて開催されました。



岡山からは +Takashi Yokoyama さん(主催者)、+Takanobu Hagino さん、私の3名が、東京や大阪からは12名の方々が参加して頂き、合計15名で開催されました。

会場入りする前、「大都会岡山では食べられないモノを!」というHaginoさんの思いに従って森タワー下のハンバーガー屋さんに寄りました。私は今回のGolang Cafeと同じ50thということで(?)マーガレット50th記念バーガーを頂きました。(とにかくデカくてジューシーでした!)



以下、タイムテーブル(?)に沿って。

Golang Cafe とは?


主催者のYokoyamaさんから説明が始まったところで私が横入りをして(^^;)当日の朝に作成したpresentスライドにて、簡単にですがGolang Cafeの説明と岡山から来た3名を紹介させて頂きました。(Yokoyamaさん、すみませんm(__)m)

各種ハンズオン


前半は、Yokoyamaさん、Haginoさん、私の3チームに分かれて、それぞれGoのハンズオンを行いました。各チームの内容は各人のブログに掲載されると思うので、そちらをご参照下さい。

Yokoyamaさんチーム(4名)


初心者の方々を対象に、雑誌「WEB+DB PRESS Vol.82」の記事「はじめてのGo」をやり進めたようです。会場には本記事の著者であるJxckさんも参加されていたので、安心して(?)取り組めたのではないかと思います。

Haginoさんチーム(6名)


ネットで一度はお見受けしたことがあろうGopher達(山口@とんぷーさん、tenntennさん、真さん、松本さん、Jxckさん)が集い、書籍「増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編」の「Worker Thread」パターンをGoで実装して行ったようです。最後に各メンバーの実装結果がGistに上がりまくって行った様は圧巻でした。

Iwataさんチーム(5名)


私のチームは、Gunosy様から日本と外国の方が1名ずつ、大阪から来て頂いた方が1名、茅ヶ崎の植木屋さんが1名、という、ごった煮チームとなりました。

ごった煮だけに、サーバーサイドでGo、趣味でGo、GAE/Go、など様々な用途や立場からのGo話を聞くことができて良かったです。あとエディターもごった煮(Atom、Emacs、IntelliJ IDEA、Sublime Text、Vim)だったのも印象的でした。

本チームは、書籍「増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編」の「Producer-Consumer」パターンをGoで実装して行きました。

パターンとしては、channelのキャパシティを指定して同時実行できるgoroutine数を制限する「Bufferd Channel」の内容では?ということでした。

Gunosyチーム(?)のお二方は業務でGoを使っているということで、バリバリとコーディングを進められていた姿に勇ましさを感じました。

休憩時間


Golang Cafeということで(?)みんなで森タワー1階のスターバックス様にコーヒーなどのドリンクを飲みに行ったりトイレに行ったりして一休み。

この時、今回参加されていた方の中で以前同じ職場にいらした方からお声掛けを頂き、驚いたのと同時に世間は狭いなぁ、と。

部屋に戻ると、Haginoさんによる先走りアクシデントもあり、良き思い出に...(^^;)
(この瞬間を撮っていたSuzukiさんがスゴい!q@w@p というか、いつの間に!?)

岡山Gophers(?)より、お土産おやつを皆様へ。(きびだんご、久々に美味しかった!)

同時に名刺(手裏剣)交換会も行われました。(何人のGopherと交換できたかな?)

終盤、私から皆様へサプライズ企画をご提供。(このために来たようなもの!)

その内容は「Rob Pike先生からのGolang Cafe #50 開催の記念メッセージ」でした! q@w@p

プロジェクターの不調に焦りながらも、無事、皆様へお届けすることが出来ました。会場の皆様に「驚き」を提供できていたのなら大成功です。(何気に山口@とんぷーさんやAndrewさんにご迷惑をお掛けしていたという、後日談...m(__)m)

あと、請謁ながら、管理メンバーの立ち位置からのGolang JP Google+ Communityの紹介を少しさせて頂きました。

プレゼン大会(急遽?)


後半開始直後、山口@とんぷーさんがgoenvやgoofなどを使ったGo開発をプレゼンして下さいました。

その後、私からの希望(という名のYokoyamaさんからの無茶振りに応える形w)で、急遽、松本さん、tenntennさん、Jxckさんにプレゼンをお願いしてしまいましたm(__)m

こちらの3名の方にお願いさせて頂いたのは、以下の理由(思惑?)からです。

  • Goのイベントを開催したり参加したりしており、発表資料のストックも幾つかお持ちのはずなので、急な要望にも何とか応えて頂けそうだと判断したため。
  • そういった方々からのお話を「生」で聞いてみたかったため。
  • お顔を知りたかったため。q@w@p

松本さんからはGunosy様でのGoを開発に使ったお話を、tenntennさんからはinterfaceに関するお話を、Jxckさんからはご自分がGoを始めたキッカケ(http2をGoで実装)のお話をして頂きました。

ご本人様たちから直接、様々な貴重なお話を聞くことができ、実のある時間を過ごせました。

クロージング


最後に、主催者のYokoyamaさんにてクロージングが行われました。

退室間際、参加者の皆さんの集合写真を撮らせて頂くことができました。



その後、引き続き12名のGopherが参加して懇親会が行われました。


所感


感想としては「山盛り楽しめた!」の一言です!q@w@p

第一の目的であった、東京Gophersの方々と交流を深めることが出来ました。実際に会ってみたい人に会えたり、改めて会うことが出来た人もいたりして、Gopherで良かったなぁ、と。

もう一つの目的であった、自分の今のGo力を再確認することも出来ました。パッケージ情報とコーディング力の不足は痛感しました。今後、補って行きたいところです。

その他には、東京へ泊まりに行くための方法や英語を少々、学習することができました。

謝辞


会場を提供して下さったグーグル株式会社様、ありがとう。

私たちの企画を快諾して頂いた +Yoshifumi YAMAGUCHI さん、ありがとう。

集団行動の際にはご迷惑をお掛けしてしまった、そして、何より私たちの我がままに付き合って下さった参加者の皆様、ありがとう。

ハンズオンの際、私のチームに参加して下さったメンバーの方々、ありがとう。良い出会い&良い刺激になりました。

東京Gophers様へのお声掛けや懇親会会場の確保など、東京での準備を一手に引き受けて下さった +Shingo Ishimura さん、ありがとう。真さんのおかげで東京で開催できました。

行きの飛行機から会場到着までの間、思いっきりご迷惑とお気遣いをさせてしまった +Takanobu Hagino さん、ありがとう。私がこの場に立てたのはHaginoさんのおかげです。

開催までの準備や主催、帰岡する日の付き添いなど、Golang Cafe #50 という日を用意して下さった +Takashi Yokoyama さん、ありがとう。今回の企画はYokoyamaさんあってこそです。

And thank you very much, Rob and Andrew.

Happy Hacking! q@w@p

2014年9月18日木曜日

Golang Cafe #47

9/14(日)に開催された「Golang Cafe #47」に参加してきました。

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

今回はGoでWebSocketを叩きました。週中にHaginoさんが先行して触られていたので、要所で説明を頂きながら進めて行きました。

まずはgolang-samples/websocket/simpleのソース(main.goとindex.html)とgo.net/websocketのドキュメントをにらめっこしました。

クライアント側のサンプルとして、昨年、Haginoさん主催で開催された「HTML5を業務アプリで使うための勉強会」でのファイルが紹介されたので懐かしかったです。
# サンプルの中で対象となるファイルは「sample01.html」と「sample01.js」です。

途中、Goをソースからビルドしていた「Yokoyama@早すぎる男」さんが「Go 1.4からはsrc/pkgはsrc/に変更」にハマっていて作業が遅れていた事が発覚。それに触発されて「Hagino@先走る男」さんもGo 1.4化にチャレンジしたのですが「Windowsの最新ビルドはfail中」にハマってしまってGo 1.3.1に戻られていました。
# 私ができたのは、そんなお二人の姿を向かいの席から暖かく見守ることのみ...q@w@p

その後、Haginoさんから「チャットを作ってみよう」という提案があったので、そちらにチャレンジしましたが、私の結果は半分成功で半分失敗(^^;) 原因はHaginoさん作のソースを中途半端に実装していたためでした。

ちなみに、半分成功で半分失敗の挙動は、Webブラウザーにて2つのウィンドウからアクセスした後、メッセージを送ると片方のウィンドウにしか表示されないというものです。

以下、記録として、そんな私の半々ソース(?)です。

package main

import (
        "code.google.com/p/go.net/websocket"
        "io"
        "net/http"
        "sync"
)

var (
        mux       sync.Mutex
        clientMap = make(map[*websocket.Conn]bool)
)

func addClient(ws *websocket.Conn) {
        mux.Lock()
        defer mux.Unlock()
        _, ok := clientMap[ws]
        if !ok {
                clientMap[ws] = true
        }
}

func echoHandler(ws *websocket.Conn) {
        addClient(ws)
        for k, _ := range clientMap {
                io.Copy(k, ws)
        }
}

func main() {
        http.Handle("/echo", websocket.Handler(echoHandler))
        http.Handle("/", http.FileServer(http.Dir(".")))
        err := http.ListenAndServe(":8080", nil)
        if err != nil {
                panic("ListenAndServe: " + err.Error())
        }
}

後日、タイムリーにQiitaへ「WebSocketをGoで触ってみた」という記事が投稿されたので、見直しておきます。

次回は、9/11(木)に東京で開催された「GolangTestNight (Gunosy.go#10)」の各発表資料を読み進めるようです。

2014年9月7日日曜日

Golang Cafe #45

8/31(日)に開催された「Golang Cafe #45」に参加してきました。

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

今回は各種資料の読み進めとHaginoさんが作成されたGoツールのソースチェック(?)を行いました。

今週は、ruiさんのQiitaへの記事の投稿が始まったり、8月に開催された各Goイベントの資料が公開されていたりと、関連資料が豊作の週でした。

前半は、公開された資料の中から、以下の2つを読み進めました。


ruiさんの投稿も牧さんのスライドも量が多いので斜め読みになりましたが、再度、どちらもじっくりと読み直したいところです。

後半は、Haginoさんが作成された、サイト「textream(テキストリーム)」の記事をWebスクレイピングするツールのソースチェック(?)を行いました。

以下、自分用のメモも兼ねて、ツールのセットアップ手順です。

1)SQLiteがインストールされていることを確認
  →インストールされていなければインストールして下さい。

 $ sqlite3 -version
 3.7.12 2012-04-03 19:43:07

2)go-yahoo_textreamをインストール

 $ go get github.com/taknb2nch/go-yahoo_textream

3)必要なパッケージをインストール

 $ go get github.com/mattn/go-sqlite3
 $ go get github.com/coopernurse/gorp
 $ go get code.google.com/p/cascadia
 $ go get github.com/PuerkitoBio/goquery

4)Webブラウザーにて、サイト「textream」からWebスクレイピングしたい記事を表示

  1. トップページの左側の一覧からカテゴリーを選択。
    例)ニュース速報
  2. 一覧からメッセージを選択。
    例)アイドル(エンターテイメントの欄)
  3. 各メッセージのパーソナルのリンクをクリック。
    例)Yahoo!ニュース トピックス

4)go-yahoo_textream/batch/配下のusers.json.sampleをusers.jsonにリネームした後、テキストエディターにて、表示した記事の内容で書き換え

  • YahooId
    パーソナルページの右側のYahoo! ID/ニックネーム
  • DisplayName
    パーソナルページの右側の表示名
  • Url
    パーソナルページのURL

 書き換え例)
  "Id" : 1,
  "YahooId" : "y_news_topics",
  "DisplayName":"Yahoo!ニュース トピックス",
  "Url" : "http://textream.yahoo.co.jp/personal/history/comment?user=HrwFiSBtiy9RitKhZWXCdRGC"

5)同ディレクトリ内のmain.goを実行
  →記事をWebスクレイピングしてSQLiteに格納するため、時間がかかります。

 $ go run main.go

6)go-yahoo_textream/web/配下のmain.goを実行して、Webサーバーを起動

 $ go run main.go

7)Webブラウザーにて、http://127.0.0.1:8080/users/ にアクセス

8)記事を最新化したい場合は、5)を実行した後、Webブラウザーをリロード

次回も引き続き各種資料の読み進めを行うようです。

2014年8月31日日曜日

Golang Cafe #44

8/24(日)に開催された「Golang Cafe #44」に参加してきました。

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

今回は8/9(土)に東京で開催された「Go lang勉強会」の資料の中から「インタフェースの実装パターン」を読み進めました。

当日はスライドを読み進めたのですが、後半に進むと理解できない部分が多く出てきたので、後日、Qiitaの「インタフェースの実装パターン #golang」と合わせて読み直しました。

構造体やインターフェースについては、一通り理解していたつもりでしたが、本資料を読み進めた結果、それは基礎の部分だったことを再確認できました。

今回、新たに得ることのできた知識は、以下の通りです。

  • 関数にメソッドを実装できる。
    →関数にインターフェースを実装できる。
    →インターフェース型の引数に関数を引き渡せる。
  • インターフェースを実装した構造体を埋め込んだ構造体は、埋め込み元のインターフェースを実装したことになる。
  • 複数のメソッドを持つインターフェースがあり、そのメソッドを全て実装し切れていない構造体があった場合、埋め込み先の構造体で残りのメソッドを実装すれば、そのインターフェースを実装したことになる。
  • 型名が大文字で始まる型は、小文字で始まる型名で再定義することで、外部からアクセスを防ぐことができる。

仕組みは理解できるのですが、使いどころがわからないのが、正直なとろこです...q@w@p

次回は萩野さんのGoソースをみんなでレビューする予定です。

2014年8月19日火曜日

Golang Cafe #43

8/17(日)に開催された「Golang Cafe #43」に参加してきました。

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

今回は8/9(土)に東京で開催された「Go lang勉強会」の資料を読み進める予定でしたが、久々のGolang Cafe初期メンバー3人ということで、脱線してトークの回となりました(^^;)

脱線と言えどもやはりその内容はGoに関するものばかり。いつもはスライドやドキュメントを読み合わせたりパッケージやライブラリーをハンズオンをしたりして全員で同じ時間や内容を共有していますが、今回、改めてそれぞれのメンバーの「今」のGoへの期待や想いをじっくりと話し合ったり確認し合ったりできたので、とても有意義な時間となりました!

次回こそは「Go lang勉強会」の資料を読み進めるようです。

2014年8月16日土曜日

Golang Cafe #42

8/10(日)に開催された「Golang Cafe #42」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、+Hideki Matsuda さん、私の4名でしたが、途中から植木浩次さんが参加されて最終的に5名となりました。

台風11号がちょうど会場を通過する予報だったため、初の「開催中止」となる可能性もありましたが、「晴れの国」らしく(?)台風の進路が少し東にそれたことで、無事に開催されました。

今回は公式サイトの「Effective Go」のIntroductionからCommentaryまでを、その場で英文を読み砕きながら読み進めて行ったので、それなりに時間がかかりました。

自分にとって新たに得られた情報は以下の通りです。

Introduction

 ・本ドキュメントは、Goのコードをわかりやすく慣用に記述するためのコツを紹介。

Formatting

 ・gofmtを実行すると、演算子の優先順位をスペース(半角空白文字)で表現してくれる。

   a*b + x/y a + b/x - y
     足し算・引き算よりも、掛け算・割り算の方が先に計算される。

Commentary

 ・関数の最初の説明文は関数名で始めておくこと。

   関数名を忘れたが、パッケージ名とその機能を表す単語は覚えていた時に、
     godoc パッケージ名 | grep 単語
   を実行すると説明文が得られ、その先頭を見れば関数名がわかるため。

Golang Cafeに参加して得られたモノの一つに「英語」があります。参加者の英語への意識の高さに影響され、自分も英語で読み書きしなければ!と意識して英語に接するようになりました。

次回は、8/9(土)に東京で開催された「Go lang勉強会」の資料を読み進めるようです。

2014年8月10日日曜日

Golang Cafe #41

8/3(日)に開催された「Golang Cafe #41」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、初参加の植木浩次さん、私の4名でした。

今回はO/Rマッパー「gorp」を叩く回でしたが、私は植木さんのフォローをさせて頂きました。

植木さんはWindowsユーザーということで、都度、WindowsチームのHaginoさんからアドバイスを頂きながら作業を行いました。

植木さんはGo言語は初めてということで、まずはGoのインストールから開始。

  1. 今回はバイナリー版をインストール。
    →ソースからだとMercurialやGCCの別途インストールが必要で時間がかかるため。
  2. 環境変数にGOROOTとGOPATHを設定して、Go ToolsへのPATHを追加。
  3. 「Hello, World!」をコーディングしてgo runにて実行できるところまで確認。

ここから本線のgorp叩きに参加して頂こうとしましたが、go getを使う際にGitクライアントが必要なことが発覚。さらにデータベースも必要で、セットアップが続きそうな状況に...(@o@)

さすがに時間がもったいないので、再び脱線して「How to Write Go Code」の「Your first library」から進めて頂く事にしました。

本線チームの方は、順調に進んで無事gorpでデータベースにアクセスするところまで到達されていました。(後日、本線チームのメンバーのブログを追っかけて補完しますm(__)m)

Golang Cafe #4」にてdatabase/sqlパッケージ + PostgreSQLを触っていたため、より順調に進められたようで、データベースをSQLiteに変更してみたり、参考サイトの内容をPosgreSQLで実行してみたりと、変化をつけて叩かれていました。

私の場合「How to Write Go Code」を使ったハンズオンは、GDGChugokuで1回、Golang Cafeで2回、行ったことになります。この範囲であればフォローできますので「Go言語は初めて」という方がいつGolang Cafeに来られても大丈夫...のハズ?

個人的には、初めての方が参加された時は、今回のように「他のメンバーの方々には随時フォローを頂きつつ、初めての方は主に私が担当して、他のメンバーの方々には本線を進めて頂き、その成果をブログにまとめて頂き、後日、私はそのブログを追って補完する。」というパターンで大丈夫だと思っています。

次回は「今から?」いえいえ「これから!」公式サイトの「Effective Go」を読み進めるようです。が、台風11号が接近中...q@w@p

2014年8月9日土曜日

自分が作成したGopherを公開するには?

ネット上で各自が作成したオリジナルGopherを見かけるようになりました。私の周囲でも「オリジナルGopher君グッズを作ろう!」といった話もちらほらと?嬉しい限りですね!q@w@p

そこで、自分が作成したオリジナルのGopherをネットに公開したりグッズに使うために気をつけること、すなわち、Gopherのライセンスについて調べてみました。

Gopherのライセンスについての記述はどこ?

公式サイトのFAQに「What's the origin of the mascot?」として記載されています。

 [抜粋] The mascot and logo were designed by Renée French.The logo and mascot are covered by the Creative Commons Attribution 3.0 license.

また、公式ブログの「The Go Gopher」の文中にも掲載されています。

 The gopher images are Creative Commons Attributions 3.0 licensed. That means you can play with the images but you must give credit to their creator (Renee French) wherever they are used.

これらにより、Gopherには「Creative Commons Attribution 3.0 Unported日本語版)」のライセンスが付与されていることがわかります。

「Creative Commons Attributions 3.0」とは?

略称は「CC BY 3.0」で、「Criative Commons日本版)」という組織が発行しているライセンスで、バージョンは「3.0」、種類は「表示」であることを表しています。

種類は、CCサイトの「クリエイティブ・コモンズ・ライセンスとは」に記載されており、Gopherの場合は「表示(BY)」です。

 【表示】原作者のクレジット(氏名、作品タイトルなど)を表示することを主な条件とし、改変はもちろん、営利目的での二次利用も許可される最も自由度の高いCCライセンス。

これらにより、Gopherに関する著作物を使用する場合は、原著作者、すなわち公式サイトのFAQにもある「Renée French」氏のクレジット表示が必要になります。

「二次的著作物(derivative work)」とは?

CCサイトのFAQに「二次的著作物とは何でしょうか。」として説明があります。

今回の話題でいえば「自分で作成(描いたり作ったり)したGopher」になります。

「二次的著作物」のライセンス制約

表示ライセンスは、二次的著作物でも原著作者のクレジット表示が条件です。


原則、二次的著作物のライセンスは原著作者のライセンスより緩められません。


これらにより、自分で作成したGopherを公開する場合は、原著作者のクレジットも表示する必要があり、さらにCCライセンスを付与するなら、原則「表示」以上の制約を持つ種類になります。

「二次的著作物」の公開

二次的著作物には、自分のクレジットを付けてもO.K.です。

 CCライセンスで作品を提供する場合に、気をつけることはありますか?

Web上に公開する場合、クレジット表示は二次的著作物と同一のベージが望ましいです。


これらにより、自分で作成したGopherにCCライセンスを付与した場合は、自分のクレジットも表示させることができ、Web上に公開する場合は、自分で作成したGopherと原著作者のクレジット、CCライセンス付きなら自分のクレジットを、なるべく同一ページに配置するようにします。

結局、どうすればよい?

Renée French氏が作成した公式サイトのGopher画像を使ったり、自分が作成したGopherをCCライセンスなしで使う場合は、

 「Gopherの原著作者はRenée Frenchさんです。」

といったクレジットを、自分が作成したGopherをCCライセンス付きで使う場合は、

 「このGopherは○○○○が作成しました。
  Gopherの原著作者はRenée Frenchさんです。」

といったクレジットとCCライセンス情報を一緒に公開するだけでO.K.です。

つまり

このGopherはRyuji Iwataが筆ペンで作成!
Gopherの原著作者はRenée French氏です。

2014.08.09 二次的著作物をCCライセンス付きで公開する場合には、原著作者の種類に関わらずCCライセンス情報を提示するように修正。

2014年7月27日日曜日

Golang Cafe #39

7/20(日)に開催された「Golang Cafe #39」に参加してきました。

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

今回は「Gorilla web toolkit」のcontextsessionsのパッケージを叩きました。

contextパッケージは「requestの範囲にて、値をmap形式で保持する入れ物」だと理解しました。

contextパッケージは前回muxパッケージをインストールした際に含まれていたので無意識に使えたのですが、sessionsパッケージは今回新たにインストールする必要があり、その際securecookieパッケージもインストールされました。

sessionsパッケージは「sessionの範囲(=requestの間)にて、値はmap形式で保持して、受け渡しはCookieを介して行う仕組み」だと理解しました。

自分はコードを書き切れなかったので体感できていないのですが(^^;)、YokoyamaさんやHaginoさんは以下の方法を実行しても保持している値がクリアされない事象に見舞われていました。

  • httpサーバーを再起動
  • WWWブラウザーを再起動
  • WWWブラウザーをCookieを保持しない状態で使用

Webシステム構築はJavaでの経験が多いため、まずは「サーブレット脳」で機能や処理をイメージして理解するようになっていますが(^^;)、それでは太刀打ちできない場面もありましたので、GoでのWebシステム構築に関する知識を体系的に学習しておきたいところです。

次回はGorillaの残りのパッケージ(reverse, rpc, schema, securecookie)を叩くようです。

2014年7月20日日曜日

Golang Cafe #38

7/13(日)に開催された「Golang Cafe #38」に参加してきました。

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

今回は「Gorilla web toolkit」のmuxパッケージを叩きました。

muxパッケージの説明に「powerful URL router and dispatcher(強力なURLルータとディスパッチャー)」と記述されており、私はここで初めて「URLルータ」という言葉を聞きました。

コーディングをしてみて、「URLルータ」とは「リクエストパラメータなどを元にして遷移先のURLを作成(=ルーティング)するもの」と解釈しました。

muxパッケージのOverviewを参考に、net/httpを使った簡易Webサーバーを作成して動作を確認して行きました。

コーディングの終盤で「mux.Vars()」で扱うパラメータをURL用ではなく画面からの引数と勘違いしていたのに気付いたため、進捗はかなり悪いものとなりました。
# <TEXTARE>ダグを使った画面があるのは、その時の「なごり」です(^^;)

エラーコードが404の時に自作のエラー画面を表示するには、NotFoundHandlerに自作のエラー画面のハンドラー関数を設定すれば実現できることを教えて頂いたので実装してみました。
以下、作成したコードです。
# Overviewのままなので参考にならないかと。自分用メモとして。

package main

import (
        "bytes"
        "fmt"
        "github.com/gorilla/mux"
        "net/http"
)

func main() {
        r := mux.NewRouter()
        r.NotFoundHandler = http.HandlerFunc(NotFoundHandler)
        r.HandleFunc("/", HomeHandler)
        r.HandleFunc("/gorilla/{key}", InputHandler)
        http.Handle("/", r)
        http.ListenAndServe(":8080", nil)
}

func NotFoundHandler(w http.ResponseWriter, r *http.Request) {
        bs := bytes.NewBufferString("")
        bs.WriteString("<h1>Not Found!</h1>\n")
        bs.WriteString("<a href=\"/\">Top</a>")
        fmt.Fprintf(w, bs.String())
}

func HomeHandler(w http.ResponseWriter, r *http.Request) {
        bs := bytes.NewBufferString("")
        bs.WriteString("<h1>Hello Gorilla!</h1>\n")
        bs.WriteString("<a href=\"/gorilla\">Nothing</a><br>\n")
        bs.WriteString("<a href=\"/gorilla/input\">Input</a>")
        fmt.Fprintf(w, bs.String())
}

func InputHandler(w http.ResponseWriter, r *http.Request) {
        vars := mux.Vars(r)
        key := vars["key"]
        output(w, key, "")
}

func output(w http.ResponseWriter, title, value string) {
        bs := bytes.NewBufferString("")
        bs.WriteString("<h1>%s</h1>\n")
        bs.WriteString("<form action=\"/gorilla/output\" method=\"POST\">\n")
        bs.WriteString("<textarea name=\"message\">%s</textarea><br>\n")
        bs.WriteString("<input type=\"submit\" value=\"Go!\">\n")
        bs.WriteString("</form>")
        fmt.Fprintf(w, bs.String(), title, value)
}

ちなみに、上記のコードを「gori_mux.go」といったファイル名で保存して、黒い画面で「go run gori_mux.go」と入力してWebサーバーを起動させて、Webブラウザーで「http://127.0.0.1:8080/」にアクセスすると動作確認できます。

次回(1〜2時間後:^^;)はGorillaのsessionsやcontextのパッケージを叩くようです。

2014年7月13日日曜日

Golang Cafe #37

7/6(日)に開催された「Golang Cafe #37」に参加してきました。

参加者は主催の +Takashi Yokoyama さん、+Takanobu Hagino さん、+Hideki Matsuda さん、+Tam T さん、私の5名(久々の満員御礼!)でした。

今回はGoogle I/O 2014の開催中に公開された「Gmail API」をGoで叩きました。

YokoyamaさんやHaginoさんは「Golang Cafe #18」にてgoauth2を使われていたため、Pure Goでのアクセスを試みましたが、私はその回に参加できていなかったため、Gmail APIのクライアントライブラリーを使ってアクセスすることにしました。

結論から言うと、私はGmail APIにアクセスするところまで辿り着けませんでした(T_T)

当日は、以下の流れで作業を行いました。

  1. Gmail API」ページの「Downloads」リンクをクリック。
  2. Gmail API Client Libraries」ページの「Google APIs Client Library for Go (alpha)」リンクをクリック。
    # Alpha版を含めて、様々なプログラミング言語がサポートされています。
  3. google-api-go-client」ページの「Getting started documentation」セクションのURLリンクをクリック。
  4. Getting Started」ページの内容に従って作業を進める。
  5. 「OAuth HTTP Client」セクションでgoauth2に出会い、#18のリンクからご両人のブログを読み返す。
  6. examples」ページのgoソースを参考にして、コーディングを進める途中で終了。

#37の参加者のブログを見て、復習しておきますm(__)m

そろそろフレームワークを試して行きたいということで、次回は「Gorilla web toolkit」を試してみるようです。

2014年7月6日日曜日

Golang Cafe #36

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

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

今回はGoogle I/O 2014でGoのセッションがあれば閲覧する予定でしたが残念ながらありませんでしたのでcodelabの「Go: Build a Backend on App Engine」を行うことになりました。
# 「box-talks」には幾つかGoのコーナーがあったようですね。

資料は初心者向けであり、ピュアGAE/GoだけではなくAngularJSCloud SDKGorilla frameworkといった技術も絡める内容となっているようなので、GAE/Goのチュートリアルをやり終えた方が復習がてら取り組むのにもオススメです。

今回は久々に +Takashi Yokoyama さんから進行役をふられ(^^;)、その場で英文をざっくりと意訳しながらGAE/Goハンズオンとして進めて行って「3. Creating lists」まで行いました。

要所要所で +Takashi Yokoyama さんが解説やフォローを入れて下さったので、スムーズに進めることができましたm(__)m
# Golang Cafeは、GAE/Go本の著者様が主催されている会であることも、ウリ&強み!q@w@p

今回もWindowsチームの +Takanobu Hagino さんからたまに声が上がるのが印象的でした(^^;)

GAEのローカルサーバーの管理ツールはPythonで作成されているため、その部分で質問を受けたりしたのですが、Pythonを忘れかけていたのはナイショです...(^^;)

次回は、Google I/O 2014の開催中にひっそりと公開された「Gmail API」をGoで使ってみる回になるようです。

2014年6月29日日曜日

Golang Cafe #35

6/22(日)に開催された「Golang Cafe #35」に参加してきました。

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

今回は「Go Conference 2014 springを開催しました #gocon」の中から「Five things that make Go fast」が選択され、「二 Inlining」まで読み進めました。

「Goを速くする5つの事柄」ということで、コーディングテクニックやイケてるパッケージの紹介かと思いきや、Goコンパイラーにおける速度向上の仕組みや工夫に関する内容でした。

個人的には好きな方の話だったので、都度、感心しながら読み進められました。

以下、ざっくり、かつ、超意訳にまみれた内容紹介ですm(__)m

最初に「Gopherに聞きました!Goを採用した理由トップ3」が紹介されていました。

  • 同時実行
  • デプロイが簡単
  • パフォーマンス

今回、Dave Cheneyさんはパフォーマンスを「Goの速さ」と捉えて説明されています。

一 Values

Goにてint32型で値を定義した場合は1byte/桁のメモリを消費します。(「2014」なら4byte)

Pythonでは何回もメモリを確保したり、Javaではプリミティブ型はGoに近いですがクラス型はVMのbit数に左右されるなど、落ち着きがありません。

メモリはより大容量になり、CPUはより高速になっているため、データをやりとりするバスの差は広がる一方ですが、その差を埋めるためにCPUキャッシュが導入されています。

Goは正確にメモリを確保するため、CPUキャッシュを有効に活用することができ、結果としてパフォーマンスの向上につながっています。

二 Inlining

関数呼び出しにはコストがかかり、そのオーバーヘッドを軽減させる技術として「関数のインライン化」があります。

インライン化のデメリットはバイナリーファイルのサイズが大きくなることです。

Goは単純な関数に対してインライン化を行います。複雑な関数では呼び出し時のオーバーヘッドは関数本体の処理に比べて影響が少ないためインライン化を行いません。

パッケージがコンパイルされる際、インライン化に適した単純な関数にマークが付けられます。

.a ファイルでは、コンパイラーが迅速に処理できるようにソースが少し変換されています。

コンパイラーは、到達不能なコードがあれば排除します。

Goコンパイラーはファイルやパッケージ全体に対して自動的に関数のインライン化を行います。これには標準ライブラリーからインライン化可能な関数を呼び出すコードが含まれています。

以上、ざっくり、かつ、超意訳にまみれた内容紹介でしたm(__)m

次回(本日 ^^;)は「Google I/O 2014」でのGo関連の資料を見て行く模様です。

2014年6月15日日曜日

Golang Cafe #34

6/15(日)に開催された「Golang Cafe #34」に参加してきました。

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

今回は「<htmlday> 2014」としての開催ということで、GAE/Goのチュートリアルの

 3. Hello, World!
 4. Using the Users Service
 5. Handling Forms
 6. Using the Datastore

を行いました。

書籍「Go言語プログラミング入門 on Google App Engine」の著者である横山さんに解説を入れてもらいつつ、コードを写経してローカルで実行して動作を確認しました。

チュートリアルということで、特に引っ掛かることもなく、久々のGoコーディングを味わいながら、進めることができました。

横山さん曰く「チュートリアルの内容は書籍を書いていた当時とあまり変わっていない」とのことでした。

同日、静岡県では「Shizuoka.go(Experimental)」が開催され、GAE/Goハンズオンが行われました。独学にも使えそうな資料を作成されていましたので、ご紹介させて頂きます。


これを機に、そろそろ?いよいよ?GAE/Goを使い始めたいと思います。みんなで使ってExperimentalを外して行きましょう!q@w@p

次回は「GoCon 2014 spring」資料の「Five things that make Go fast」を読み進めるようです。

2014年6月14日土曜日

Golang Cafe #33

6/8(日)に開催された「Golang Cafe #33」に参加してきました。

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

今回は「Go Conference 2014 spring」のKeynoteスライド「Go: 90% Perfect, 100% of the time.」を読み合わせました。

最初は63というページ数に圧倒されましたが、実際にはCafe中に余裕を持って読み終えることができましたし、英語もそこまで難しくないと思われますので、興味があればご一読下さい。

内容的には「新プロジェクトの開始に際してGoを採用した理由と結果」を「他言語との比較」や「Goの現状や足らず」を交えて解説されていました。

Cafe中には、たまに「After Go」ページの図で「そのGoの位置、良過ぎでは?(^^;)」とみんなでツッコミが入ったりもしました。

個人的に驚いた(?)のは「違和感なくスライドを読み進めることができた」ことでした。事例紹介なので元々わかりやすい内容なのだとは思うのですが「これは何の事だ?」と引っかかるような部分がほとんどありませんでした。

ほぼ毎週、半年以上「Golang Cafe」にも参加させて頂いており、自分にもそれなりにGo力が付いてきているのだなぁ、と感じた一日でしたq@w@p

次回(=本日^^;)は<htmlday>に合わせて久々の土曜日開催&GAE/Goとなるようです。楽しみ!

2014年6月7日土曜日

Golang Cafe #32

6/1(日)に開催された「Golang Cafe #32」に参加してきました。

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

今回は「Go Conference 2014 spring(以下、GoCon)」の翌日に開催ということで、GoConで発表された資料をピックアップして読み進める会となりました。

資料の一覧はGoCon主催者の山口さんのブログにまとめられています。


気になる題材とかでランダムにピックアップして、以下の順番で5つの資料を読み進めました。


本投稿は勉強会の開催報告の記事ということで、資料を見直しながらコメントを付けることが可能ですが、実際、当時は資料を見て行くのが精一杯でして(^^;)、また、資料だけでは作成者の意図を汲み取ることはできないと判断して、資料へのコメントは避けましたm(__)m

全体的には、

  • 何となく選んだ資料の順番が、意外にもそれらしい流れを形成していた。
  • 前回、シダ描画の改造に取り組んだおかげで(?)置き換えて考えやすかった。

という感じでした。

引き続き、Goのプロダクション投入に益々期待したいところです!q@w@p

次回はGopherCon 2014の終(つい)のセクションで発表された「Go for gophers」を読み進めるようです。

2014年6月1日日曜日

Golang Cafe #31

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

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

今回は「Go Concurrency Patterns: Pipelines and cancellation」を読み進める予定でしたが、急遽「「プログラムでシダを描画する」をGoで描画する」をよりGoらしく書き直す会になりました。

Gopherらしく(?)すぐ目についたのは計算処理を同時実行させるところで、各自で書き直しを開始。Yokoyamaさんはゴルーチンで、Matsudaさんはsyncパッケージで、挑戦されていました。

私も「チャネルで同期をとりながらゴルーチンで実行させる」まではイメージできたのですが、いざ書き始めると、再帰関数に対して同時実行処理を適用させる(goを記述する)箇所を上手くイメージできずに手が止まりました。

後半はYokomayaさんが作成されたソースを拝見させて頂きながらあれこれ考えてみましたが、あまり進展もなく、そのまま時間切れとなりました。

先にプログラム全体を最適化する必要があるのかもしれません。例えば、f()関数には計算処理と描画処理が混在しているのでそれらを切り離したり、先に計算処理を行ってから最後に一気に描画する、など。

平日にでも何か改善できればと思っていましたが、上手く時間がとれず成果ゼロでしたm(__)m

次回は前日(5/31)の「Go Conference 2014 spring」での資料を読み合わせる予定です。

P.S.みんなもシダを描画してみよう! - 「「プログラムでシダを描画する」一覧

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)

2014年4月26日土曜日

Golang Cafe #26

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

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

今回からコンテナ型仮想化環境「Docker」のソースを読み始めました。

DockerがGoで記述されているのは知っていましたが、肝心のDockerを知らなかったので(^^;)、この状態でソースを読み進めると後々ツラいと思い、前日に開催されていた「Docker入門」に参加して、概要だけでも頭に入れて参加しました。

前半はDocker談義や雑談を行い、Dockerソースの総行数を求めたりしました。

後半からエントリーポイントとなるdocker/docker.goを読み始めました。

import部にて、実際にパッケージ名の別名(省略)を行っている例を初めて見ました。

  import (
   ...
   flag "github.com/dotcloud/docker/pkg/mflag"
   ...
  )

別名を"_"にすることで、パッケージ配下の全てのgoファイルを対象にinit()関数が実行されるため、初期化処理に利用できます。

  _ "github.com/dotcloud/docker/pkg/mflag"

const部で定義されているファイル名の拡張子に".pem"が記述されていたり、パッケージ名に"x509"の文字が見受けられるので、電子証明書を使った暗号化通信が行われるようです。

あと、オプション表記に"#"を使うパターンがあるのも初めて知りました。

  bridgeIp = flag.String([]string{"#bip", "-bip"}, ...

dockerは指定するオプションなどによって、3つのモード(init, daemon, client)で起動します。

起動時に以下のファイルが存在すればinitモードで起動します。

  $HOME/.docker/.dockerinit

この判定処理はmain()関数の先頭(=オプション判定よりも先)に記述されています。

  func main() {
      if selfPath := utils.SelfPath(); strings.Contains(selfPath, ".dockerinit") {
          // Running in init mode
          sysinit.SysInit()
          return
      }

"d(-d)"オプションを指定して起動するとdaemonモード、それ以外ならclientモードで起動します。

daemon&clientモード判定のif部はコード量が少しあるため、今回はclientモードを読みました。

if *flDaemon {
    // daemonモードの処理
    ...
} else {
    // clientモードの処理
    ...
}

自分の感覚だと、上記のif部は「コードが長過ぎる・インデントが深過ぎる」と判断して、分岐後の処理を別関数に切り出そうとするのですが、そうなっていない理由を知りたいと思いました。

もしかしたら、

  • ソースリーディング時の流れを考慮しているため。
    • 重複したコードもなく処理も一度しか出現しないので関数化不要?
    • 関数化するとリーディングの流れが中断して(=目線が途切れて)しまう。
  • コンパイラーの最適化に影響があるため。
    • 生成されるバイナリーファイルのサイズが増加する?
    • バイナリーファイル実行時の速度やメモリ消費量に影響がある。

といった理由があるのかもしれません。

余談ですが、自分は普段からソースはlessやvimで読み書きしているのですが、lessでソースを見ていたら横山さんに驚かれてしまいました...(^^;)

次回も引き続きDockerソースを読み進める予定のようです。

P.S.情報処理技術者試験後のGolang Cafeはやはりキツかったですね...(^^;)

[2014.04.27] 余談にて横山さんからのコメントを反映して、P.S.を追加しました。

2014年4月14日月曜日

Golang Cafe #25

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

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

今回より、ハッシュタグは #gdgchugoku を交えつつ #golangcafe をメインに使っていくことになりました。

ハムエッグさんはGoをほとんど触られていないということで、#1 以来の「How to Write Go Code」を見て行くことになりました。

その際、横山さんから「進めてみて下さい」とのフリがあり、5/10の予行演習を兼ねたり、ご両人には物足りないかと思い、私の方で進行を引き受けさせて頂きました。

私とハムエッグさんは「How to 〜」を読み進めたため、横山さんと萩野さんがどのような話をされたのかわかりませんでした。後日のご両人のブログで確認したいと思います。

「How to 〜」の方は、記載されている内容を進めてもらいつつ、要所でGoコマンドやディレクトリー構成の説明、コーディングしたGoソースの解説などをさせて頂きました。

私事ですが、5/10(日)にGDG中国様主催の「第24回勉強会@岡山」にてGo言語のハンズオンをさせて頂く事になっており、今回は、そこの場所に生かせる良い経験をさせて頂きました。

参加者の方々のブログなども是非ご覧下さい。


次回からは「Docker」のソースを読んで行く予定なので、前日に「Docker入門」の話を聞いておくものよいかも。

2014年4月9日水曜日

GDG DevFest Japan 2014 Spring

4/6(日)に京都で開催されたGDG様主催の「GDG DevFest Japan 2014 Spring」に参加しました。

「お祭り」ということで、主役である全国のGDG&GTUG Girlsのマネージャー&オーガナイザーの皆様に加え、API Expertsやグーグル株式会社の方々も参加されるなど、多くの方々(ざっと見で50名以上)が参加されていました。

参加の経緯


Golang Cafe #23」にて、主催者&GDG中国横山さんから「#24はDevFestのセッションで開催します」というお話があり、それを聞いた萩野さんと私は「じゃあ京都で」ということに(^^;)

LTに申し込み


アジェンダを見た時に「Golang Cafe #24に参加しない人はGoに触れることなく一日が終わってしまうではないか!」と思い、5〜10分なら何とかなるかとダメもとでLTに申し込みました。

関西にも多くのGopherがいらっしゃるので、もし他にGoを話す人がいらっしゃればそちらが優先されてよし、仮に自分も話せた場合にはテーマが被っていても大丈夫なように「Go」ではなく「Gopher」をネタに選びました。


京都(丹波口)に着いた感想


  • 新幹線にて約1時間で到着!
  • 大都会と同じ位の肌寒さ。
  • 桜が散り始めていた。
  • 会場が街の中にあった。
  • 建物が低いため街が広く見えた。

自分が受講したセッション


オープニング

Google Developer Relations Japan鈴木さんの説明で、初めて今回は「GDG&GTUG Girlsのマネージャー&オーガナイザーの皆様の祭りの会」であるということを知りました(^^;)
# だから皆さんハッピを着ていた訳ですね、納得!

Google Compute Engine 入門

講師はGDG四国Oshimaさん。ゆっくり&丁寧な説明で参加者全員の足並みが揃うように進められていたのが印象的でした。おかげさまで、私もゼロの状態からインスタンスの生成・起動・削除までの一連の作業を行うことができました(^^)v

ゆるキャラをSVGで描く

講師はGDG九州Matsuokaさん。前半はSVGの概要からInkscapeでの図形や色の使い方までの説明、後半は「Inkscapeハンズオン」として、ゆるキャラである(?)「ドロイド」を描いて行き、最後はSVGファイルをテキストエディターで編集して手足をアニメーションさせました。
# 復習として、ゆるキャラ「ゴーファー」も描いてみたいところ!

GAEの紹介

講師はGDG名古屋中垣さん。前半はGAE/Jの機能と、実例として著書「作ればわかる!Google App Engine for Java プログラミング」からのアプリの紹介、後半はGAEの事例(モバイルゲームのサーバーサイド、など)が紹介されました。
# 著書、私も購入済みです!

Dart + StageXL

「参加の経緯」からすると、この時間帯は「Golang Cafe #24」に参加しているシーンなのですが、めちゃくちゃ悩んだ末、Dartのセッションを選択しました。
# なぜなら、まだ”Flight"できていないため...(^^;)

講師はGDG京都Kuranoさん。「Dartは専門ではない」と言われながらも、ご自分で試されたサンプルソースやデモを交えながらStageXLを紹介されました。パーティクルエミッターを使って雪景色の画像に雪を降らすデモなどでは、会場からも「おぉ!」と声が上がっていました。
# StageXLは「HTML5のCanvas上に描画するFlashに近いフレームワーク」です。

トークセッション

壇上にGDGのマネージャー&オーガナイザーの皆様が集結!皆様への質問を受け付けていた「Google モデレーター」が途中からコケていたハプニングもありつつ、参加者からの質問に対して、組織のまとめ役としての体験談などを交えながら回答されていました。

参加者からの質問が落ち着いたところで、スクリーン上に「質問パネル」が登場!参加者が選んだパネルに隠されていた質問に回答していく形式となったことで、番組さながら「まずはドロイドの10」「ゴーファーの40?」「アップ猿人の20!」など、会場が暖まって行きました。

ライトニングトーク&懇親会

間違った日付を指定していたらしく、注文していたピザが届かないハプニングが発生!立て直しまでの時間にAPI Experts江川さんが「Chromecast」のデモを見せて下さいました。
# 食事のリカバリー対応をされた方々、お疲れ様でしたm(__)m

LTの内容はこの場での発表だったため全てを拾えませんでしたが、全部で6つあり「Google I/Oへの参加」「HTML5で対戦ゲーム」「Drupalの紹介」「Android Ware」などが、笑いや感心を交えながら発表されました。

私は1分ほど短く終わってしまい「時間オーバーよりはよかったかも」と思っていたところで、司会の中垣さんから「名古屋では時間いっぱいまで何かやって頂くことになっています」といわれ、とっさに出てしまったのが即興の「Go音頭」でした...q@w@p
# あれは、はずかしい!(>_<) 失礼しましたm(__)m > 皆様 そして、名古屋こわい!w

クロージング

参加賞として「GDG DevFest Tシャツ」が配られ、最後は全員でTシャツを身に付けて集合写真を撮りました。

個人的な感想


セッションの内容はもちろんのこと、いつもと違う会場の雰囲気を知ることができたり、全員とは行きませんでしたが、ネット上でしかお見受けしていない方々を実際に見れたり、また、お話ができたり、そして、新しい出会いがあったりと、有意義な時間を過ごすことができました!

あと、熱狂的Gopherの山口さんとの再会は驚きでした!q@w@p
# お声掛けやら資料のご指摘など、ありがとうございましたm(__)m

主催関係者の皆様&参加者の皆様、お疲れ様でした&ありがとうございました!
# 横山さん&萩野さん、お疲れ様でした&ありがとうございました!


LT資料


@tenntennさん、顔文字の件、ありがとうございましたm(__)m

2014年4月7日月曜日

Golang Cafe #23

1週間遅れとなってしまいましたが、記録ということでm(__)m

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

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

前回に引き続き、横山さんが作成されたOAuthのGoソースを各自で整理する会となりました。前半の30分ほどは「#24 に参加するならば?」といった話をしていました。

自分は似たような処理をまとめる方向で作業を開始。関数化などに挑んでいましたが、途中で関数化するメッシュが定まらなくなり、何度も同じところを書き直しているうちに時間となりました。

敗因は「森を見ずに木を切り始めたら」かと。OAuthの学習ができていればもう少し余裕を持ってファイル全体を眺めた上で手を入れられたのではないかなぁ、と。あとは自分のコーディング判断のブレっぷりに少々悲しくなりました(T_T) がんばれ自分。

横山さんや萩野さんのブログも是非ご覧下さい。


次回の「Golang Cafe #24」は「GDG DevFest Japan 2014」のセッションの一つとして開催されます。(この記事を書いている時点では「開催されました」ですね ^^;)

私は悩んだ挙げ句、#24 は欠席とさせて頂き、同時間帯の「Dart + StageXL」のセッションを選択させて頂きましたm(__)m

2014年3月25日火曜日

Golang Cafe #22

3/23(日)に開催された「Golang Cafe #22」に参加してきました。

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

前半は、横山さんがGDG中国で使用するプロジェクターの検討会&萩野さんの質問タイムでした。

後半は、横山さんが作成されたOAuthのGoソースを「Twelve Go Best Practices」で学んだ成果を駆使して各自でエレガントに仕上げていくことになりました。

横山さんから簡単に処理の流れや解説をして頂き、いざ、ソースを見てみると...質・量ともに結構あり、結果、今回はソースの読み込みで終わってしまいました(^^;)

私は#18のOAuth2の回に参加できていない分、処理内容について理解しきれなかっため、関数化したりGoらしい記述に書き直したりして楽しんで行くことにしました。

横山さんや萩野さんのブログも是非ご覧下さい。


次回も引き続き同ソースの改善を行う会になるようです。

[2014.04.07] 横山さんと萩野さんのブログへのリンクを追加しました。

2014年3月22日土曜日

Golang Cafe #21

3/15(日)に開催された「Golang Cafe #21」に参加してきました。

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

今回は「春の Google 勉強会 2014」へ参加する道中の「フェリーでGo」という形で開催されました。フェリーで約1時間、現地のカフェで約1時間半、「Twelve Go Best Practices(Go言語の12のベストプラクティス)」の25ページから最後まで読み進めました。

自作したAPI(関数やメソッド)内での同時実行の使用は避けましょう。

 Goでは、頭に"go "を付けて関数を呼び出すだけでその関数を同時実行できる特徴がありますが、関数を「普通に呼び出す」か「同時実行で呼び出す」かは呼び出し元の都合なので、関数内で同時実行するように実装されていると、その選択が出来なくなります。 

ゴルーチンとのやりとりにはチャンネルやチャンネル構造体を使いましょう。

 本来の見出し文は「状態を管理するためにゴルーチンを使いましょう」です。ゴルーチンによる状態遷移を制御する時はチャンネルを上手く使いましょう。28ページのチャンネルは長さゼロで生成されているため、同期をとるために使用しています。

ゴルーチンが絡んだため内容もやや難しくなり、また、長めのコードを読み解いて行くのにも時間がかかったため、フェリー内での読み進めはここで一旦終了となりました。

上陸後、会場近くのコーヒー屋さんで、再開されました。

長さを指定したチャンネルを使ってゴルーチンでのメモリリークを避けましょう。

 読み解くまでに時間がかかりました...(^^;)長さゼロのチャンネルへのアクセス中にラーが発生すると、チャンネルをブロックした状態(参照したまま)になるため、処理が終わってもガベージコレクションが効かない状態になります。そのため、長さを指定したチャネルを使うことでブロック状態を回避することができるようになります。

 この辺りは、ゴルーチンやチャンネル、はたまた、ゴルーチンの考えのもとになっているCSP(Communicating Sequential Processes)の動作や考え方を勉強して行かないと厳しいなぁ、と感じました。

別個に中止用のチャンネルを用意してゴルーチンでのメモリリークを避けましょう。

 空構造体「strunct{}」は初めてみました。別途、どこからもアクセスできないように空構造体でチャンネルを生成し、それを処理を中止させる時に使用することで、長さゼロのチャンネルを使ったゴルーチン処理でエラーが発生した際のメモリリークを回避できるようになります。

腹に落とし込むまでには何回も見直す必要がありますが、今回の資料は大変ためになりました!

詳細&技術な内容につきましては、横山さんや萩野さんのブログをご覧下さい。


次回(明日...^^;)は通常通りの開催(内容は未定)のようです。

P.S.山下さんも知的好奇心を満たすことができたようです!

2014年3月17日月曜日

春の Google 勉強会 2014

3/15(土)に開催されたGDG Shikoku様主催の「春の Google 勉強会 2014」に参加してきました。

今回は「Android」と「Go」の豪華二本立て!に加えて、さらに!講師としてグーグル株式会社 Google Developer Relations Japan 所属の荒木佑一さんと山口能迪さんが、それぞれAndroidとGoを直々に紹介して下さるという、貴重かつ贅沢な勉強会でした。

開催の告知が1週間前だったので、人が集まらないのでは?と少し心配していましたが、当日、勉強会には約20名の方々が、懇親会には約半数の方々が参加されていました。

当日のスケジュール


発表順が入れ替わりました。

16:00 - 16:40 「Android 開発 最新動向」(荒木さん)
16:40 - 16:50 休憩
16:50 - 17:35 「Goではじめる簡単Webアプリケーション」(山口さん)
17:40 - 18:30 懇親会への移動
18:30 -            GDG Shikoku 春のGoogle勉強会 懇親会

内容のご紹介(ダイジェスト)


Android 開発 最新動向

荒木さんは公の場で発表を行うのは今回が初めてだったそうです。
[Tips]:Android DevelopersサイトのURLは「http://d.android.com/」と短く書けます!

Android Studio

 機能やキーボードショートカットの紹介、など

・サポートライブラリー

 ActionBarCompat、など

Google Play Services

 Google Drive Android API、Google Play Game Services、Fused Location、Geofence、など

個人的にはAndroid Studioの安定性や導入タイミングなどが気になっていましたが、

  • ゲーム開発といったネイティブなものには、まだ厳しい。
  • ツールやアプリの開発には、そろそろ使い始められる時期。
  • でもまだ不安定であり、開発やリリースのサイクルを早くすることで対応。
    →前バージョンで作成したプロジェクトがコンパイルできなくなったりすることも。

という話を聞くことができました。もうしばらくは「イバラの道」を進むことになるようです(^^;)

Goではじめる簡単Webアプリケーション

会場にはGoを触った事がない方が多くいらっしゃいました。

・Goの概要説明

 Goの歴史、なぜGoが開発されたのか、Goが開発された目的、など

・標準のツールとパッケージ

 ツール:go fmt、godoc、など
 パッケージ:net/http、encoding/json、など

・ライブコーディング

 Hello, World → Hello, WWW → Hello, GAE
 # 順番にコードを書き換えて行かれました。

・情報源の紹介

 主要サイト(公式日本語チュートリアル、など)、メーリングリスト、など

ライブコーディングでは、Go特有の文法や記述を「気持ち悪いでしょう?」と表現されたり(^^;)コードをサジェスト機能なしで「ガシガシ」と書いて行かれたりと、山口さんがワイルドなGopher(=Go使い)を体現されていました。q@w@p

懇親会

一次会は「骨付鳥 一鶴」で親鳥&雛鳥にかぶりつきながら交流を深め合い、二次会では「手打ちうどん 鶴丸」でカレーうどんに舌鼓を打つなど、みんなで「うどん県高松市」を味わいました!


感想など


興味を持って参加された方にとっては「一粒で二度美味しい」勉強会だったと思います。

個人的には、宇野〜高松間のフェリー内で開催された「Golang Cafe #21(フェリーでGo)」にも参加したため「行き・現地・帰り」と文字通り「Go三昧」な一日となりました!

2014年3月14日金曜日

Golang Cafe #20

3/9(日)に開催された「Golang Cafe #20」に参加してきました。

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

今回は「Twelve Go Best Practices(Go言語の12のベストプラクティス)」の13ページの「Organizing your code」から読み進めました。

import文でパッケージを列挙する際は、グループ化して空行で区切って記述しましょう。

 本来の見出しは文は「重要なコードは最初に書きましょう」ですが、import文を空行でグループ化してgo fmtするとグループ単位でソートしてくれることに感動したので、つい...(^^;)

パッケージ名や関数名やメソッド名などのシグネチャーを正しく書きましょう。

 godocで出力されることを意識して、正しく書くようにしておきましょう。

命名は短めに。

 Javaを書いている方は、戸惑うかと(@o@)
 Goの設計思想の一つである「シンプルさ」から考えると納得できるのかも。

パッケージやコードやテストなど、適切に分けて書きましょう。

 手軽に試そうとすると、ついダラダラと記述してしまいがちですよね〜(^^;)
 ちなみに私はこの章で「doc.go」の存在を知りました。

再利用できそうな処理はパッケージ化しましょう。

 私がプログラミングする時は、こちらの「再利用レイヤー(App, AppParts, Generic)」を意識してモジュール化しています。

インターフェースを使って依存性を下げましょう。

 メソッドの引数を具体的な型で定義してしまうとテストケースが用意し辛くなる場合もあるので、インターフェースにして柔軟性を持たせておきましょう...ということなのですが、「具象」と「抽象」の採用判断、難しいですよね...

パッケージの独立性を保ちましょう。

 Goの場合、パッケージ名を1単語で表現しようとしている点で、自ずとカテゴリー化されるというか、複数の機能が一つのパッケージに含まれようとする曖昧さを取り除くことができるので、Goに入ってGoに従った書き方をすれば大丈夫のハズです。

個人的には、今回の部分を学習したことで、標準パッケージのドキュメントやソースを読みやすくなったと感じています。例えば、いろいろとABC順になっていることに気が付くことが出来ました。

詳細&技術な内容につきましては、横山さんや萩野さんのブログをご覧下さい。


次回は資料スライドの25ページからの予定&フェリーでGo〜 q@w@p 

[2014.03.19] 萩野さんのブログへのリンクを追加しました。

2014年3月7日金曜日

Golang Cafe #19

3/2(日)に開催された「Golang Cafe #19」に参加してきました。

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

Cafe中に時々「Goらしい書き方を知りたいよね」という話もあったりして、今回から「Twelve Go Best Practices(Go言語の12のベストプラクティス)」を読み進めて行くことになりました。
# 前回は不参加(T_T)だったので...詳しい経緯までは...(^^;)

関数やメソッドの先頭でエラー処理を行って、if文のネストを避けましょう。

 正常処理を書き進める派(?)の方には、最初、違和感があると思います。

可能な場合は処理を関数やメソッドにして重複する記述を避けましょう。

 他のプログラミング言語でも同じですね。同じような処理はまとめましょう。

型switch文を使って、型ごとに処理をしましょう。

 判断基準となる値は抽象的な型になります。Go言語だと「空interface(interface{})」ですね!

型switch文の型アサーションの結果を変数に格納する記述もあります。

 型アサーションした結果を、case文中の処理で使えるようになります。

「全て処理する」か「何も処理しない」

 Cafe中には記述内容から判断して「都度書き出すのではなくバッファリングして最後に書き出しましょう。」とつぶやいていましたが、これはトランザクションのACID特性の「Atomicity(原子性)」のことでしたね(^^;)

関数アダプター

 最初、何のことだかわからなっかのですが、萩野さんが「Javaだとこんな感じになりますよ」とサンプルを記述して下さったのを見て、デザインパターンの「Adapter」パターンの関数版だと理解できました。

詳細&技術な内容につきましては、横山さんや萩野さんのブログをご覧下さい。

次回は資料スライドの13ページの「Organizing your code」からの予定です。

2014年2月27日木曜日

Golang Cafe #18

2/23(日)に開催された「Golang Cafe #18」に参加...できませんでした(T_T)

今回は、OAuth 2.0クライアントのgoauth2パッケージと横山さんのサンプルを使ってGoogle APIへのアクセスを試みたようです。

TogetterをまとめているとGoogle App Engineのappcfg.pyについてのツイートがちらほらと。何のことかとソースを見てみようとしたら、2種類ありました。


コード量の差、あり過ぎ...前者の話だと信じておきます(^^;)

[2014.03.02] 消えたコード(?)はwrapper_util.pyとして別ファイルになっていました。

早速GAE 1.9にアップデートしたら、前者の方はコード量が減っていました(@o@)

詳細&技術な内容につきましては、横山さんや萩野さんのブログをご覧下さい。


次回は「Twelve Go Best Practices」を読み進めるようです。次回こそは参加だ!