1行もGo書いたこと無いけどGo Conference Winter 2015に参加したので資料をまとめた

普段はRailsとかPHPでウェブサービスを作ったり保守してます。
パフォーマンスを求める処理とかWebAPIなどをミドルウェアのチューニングやキャッシュでやるのもやっぱり辛いよねって話が社内で上がってたのでようやく重い腰を上げまして、Goの勉強を本格的に始めようと思っていた矢先カンファレンスが開催されるっつーんで突撃したというわけです。

正直なところキャンセル待ちが出るほどのイベントなのにこんな素人が当選してしまったので懺悔も込めて資料とかまとめました。

# キーノート
## 発表者 [Andrew Gerrand](Andrew Gerrand "https://twitter.com/enneff")

### x/mobile gaming
ライブコーティングでランゲー作り始めた。

# 通常セッション

## Goが支えるインフラストラクチャーサービス
### 発表者 @yosida95

#### Goで作ったサービス
- [Gehirn RS2 Plus]("https://www.gehirn.jp/gis/rs2.html")
仮想マシンに常駐し、設定ファイル編集 コマンド実行 ユーザの環境をアップデートを行う箇所をGoで作成

- [Gehirn MTA]("https://www.gehirn.jp/gis/mta.html")
SMTPサーバをGoでフルスクラッチで作成

- [Gehirn DNS]("https://www.gehirn.jp/gis/dns.html")

#### なぜGoを使うのか
1. 標準ライブラリが充実している
2. 並列処理を用意に記述出来る
3. 複数の返り値 / exceptionがない
4. そのため例外をつまみ損なうことがないので、エラーを必ず処理出来る
5. バイナリファイル一つだけ配布するだけでユーザに配布しやすいし、デプロイするときもS3に配置してサーバがDLして完了
6. スケールしやすい。
7. デプロイしやすい、ネットワークサーバを書きやすい
8. memberlist
9. raft

#### Goはインフラサービスで生きる
- 大量のデーモン
配布・デプロイが用意

- 膨大な処理やリソース分散コンピューティング
クラスタリング

- ネットワークサービス
SMTP DNSが堅牢にかける

## gomobileでピアノの作り方
### 発表者 @nobonobo 

#### 発表資料 [HOW TO MAKE THE PIANO](HOW TO MAKE THE PIANO "http://golang.rdy.jp/gomobile-piano/#/")

https://gist.github.com/nobonobo

gomobileへの不満はアイコン付けたい、iOSへのビルドめんどい！
[ビルドツール作った！](ビルドツール作った！ "https://github.com/nobonobo/gomobileapp")

## Middlewares for log-collection in Go
### 発表者 cubicdaiya

#### 発表資料 [Introduce log collector in Go into production](Introduce log collector in Go into production "https://speakerdeck.com/cubicdaiya/introduce-log-collector-in-go-into-production")

## Introduction to golang.org
### 発表者 @qt_luigi

#### 告知
http://gophergala.com/

#### GDG Shikokuで講師募集中
http://gdgshikoku.connpass.com/

golang.orgの紹介

https://golang.org
http://golang-jp.org 
http://blog.golang.org
とかとかとか

## Webフレームワーク比較
### 発表者 @najeira

#### フレームワーク
- Gin
- Echo
- Kami
- Goji
- Vibe
- Gocraft
- Gorrilla
- Martini

##### ベンチマークしてみた
Get/gopherを送ってHelo Gopeherを返す
(ns/op)
1. Gin 734
2. Echo
3. Kami
4. Goji
5. Vibe
6. http(標準モジュール)
7. Gocraft
8. Gorrilla
9. Martini 5823

allocの値も計測していたけどやはりGinが一番だった。
まとめるとGinとEchoがパフォーマンス良いけど、結果は全部nsなのでGoすげぇ早い。
Ginは3年近く開発されているので、だいぶ枯れてきた印象。
おすすめのフレームワークを聞かれたらとりあえずGin使っとけ。

## ISUCON戦記
### 発表者 @y_matsuwitter 

#### [発表資料](発表資料 "https://speakerdeck.com/ymatsuwitter/isucon5-with-golang")

[ISUCON2015予選の問題](ISUCON2015予選の問題 "http://isucon.net/archives/45627361.html")

##### 基本チューニング
GOMAXPAROCS
GOGC
text/template削除
UnixDomainSocket化

プロセスキャッシュ
初期データはdumpして起動時にデータ構造を非正規化を行いメモリ上へキャッシュ
データ長が大きいデータはメモリにのっけられないので、Redisに乗っけた
Go => MySQL間のシリアライズコスト削減

##### ISUCONに勝つために
サーバのチューニングはパズルみたいなもの
メモリやCPUを誰にどれだけ割り当てて計算コストを削るか
どの行為が一番スコア高いのかを判断しスコアの低い処理に対応時間を減らす

## FINAL FANTASY Record Keeperを支えたGolang
### 発表者 @shibu_jp

#### [発表資料](発表資料 "http://www.slideshare.net/shibukawa/final-fantasy-record-keepergolang")

ゲーム内のマスターデータ(アイテムや必殺技やテキストなど)をGoogleDrive上のスプレッドシートで管理していて、これらをゲームサーバが使えるフォーマットに変換するツールをGoで作成している。
[文字列のdiffを抽出してうまいことマージしてくれるモジュール]("https://neil.fraser.name/software/diff_match_patch/svn/trunk/demos/demo_diff.html")面白そう。

## GoライブラリAPIの変更を知る (Diff'ing Go library API changes)
### 発表者 @motemen

#### [発表資料](発表資料 "https://speakerdeck.com/motemen/diffing-go-library-api-changes")

メソッドの引数変更などを検知して、バージョンアップに対応出来るかチェックしてくれるツール、[gompatibleを作った]("https://github.com/motemen/gompatible")

go/typesを使って実装している
今後はgo/typesを使って実装しているとWebインターフェースを作りたい
個人的にRubyで同じ機能を満たす物がほしい...スクリプト言語だと引数の数くらいしか検知出来ないから難しいか...

## 実戦へのGo導入
### 発表者 @songmu

#### [発表資料]("http://songmu.github.io/slides/gocon2015-winter/#0")

資料を見れば全てわかる。すごい。

## Goのレガシーコードと戦った話
### 発表者 @k_yokomi

[レガシーコード改善ガイド]("http://urx2.nu/pHju")

レガシーコードとは理解できず、変更の難しいコードを指す俗語

##### レガシーコードの紹介
Goが悪いってわけじゃないよ

1. テストコードが無い
コードを変えるよりもまずテストコード書く

2. ローカルファイルを読みまくる
ローカルファイルをS3にアップロード
保険としてローカルファイルは消さずにS3のファイル読めなかった場合に使う

3. 例外をにぎり潰す
ログに出そうぜ

4. goroutineの乱用
パフォーマンス要求された上でのgoroutineなのか？
そもそも要求仕様から確認しなおして本当に必要なのか見直す。

5. 社内共通ライブラリ的な共通パッケージ
API依存しているものはinternalに移動

##### 改善のためにやったこと
金曜日をリファクタリングDayとする
CircleCIで自動テスト
Coverailsでカバレッジを可視化
[gomockを導入]("http://qiita.com/tenntenn/items/24fc34ec0c31f6474e6d")

##### まとめ
Goでもレガシーコードが生まれる、ちゃんとテスト書こうぜ

## GoBGP : yet another BGP implementation written in Go!
### 発表者 石田 渉

#### Border Gateway Protocolって何？
インターネットを動かすためのルーティングプロトコル
もともとインターネットで使われているプロトコルだったが、VM上やデータセンターのルーティングでもつかわれるようになっている。

##### なぜGoで書き直すか
[GoBGP]("https://github.com/osrg/gobgp")
ネットワークの運用が時代錯誤
APIが不順分のためネットワークを運用自動化を行おうとするとtelnetとexpectで頑張らなければならない。
http://www.slideshare.net/taijitsuchiya5

##### まとめ
今まで泥臭い運用が多かったネットワークの世界にビックウェーブが来る予感


### 関連リンク
[togetter]("http://togetter.com/li/909182")
[なぜGojiからkamiへ？]("http://go-talks.appspot.com/github.com/guregu/slides/kami/kami.slide#1")