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勉強会」の資料を読み進めるようです。