覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

golang.tokyo #6 に行ってきたよ #golangtokyo

golang.tokyo #6 に参加してきました。

以下自分用のメモです。


概要

  • 開催日: 2017/6/1
  • 場所: 株式会社ディー・エヌ・エー


Gopher Fest 2017 参加レポート

上田拓也 氏 (メルカリ/ソウゾウ)

  • Gopher Festとは?
    • Google I/O に合わせて開催されるイベント
    • 5/15にサンフランシスコで開催
  • The State of Go
    • Goの開発状況
      • Go1.8は2/16にリリース済
      • Go1.9は5月1日にコードフリーズ済
    • 言語仕様の変更
      • 型のエイリアスを定義できるようになる
        • 完全に同じ型
        • キャスト不要
        • エイリアスの方でメソッドは定義できない
    • 標準ライブラリの変更
      • math/bits
        • ビット演算に便利なライブラリ
      • sync.Map
        • スレッドセーフなマップ
      • html/templateがより安全に
      • os.Exec
        • 重複する環境変数を削除するように、一番後ろのものを優先するようになった(直感的になった)
    • ツール類の変更
      • コンパイラのエラーメッセージの改善(少し優しくなった笑)
    • コンパイラの速度改善
    • go testの改善
      • 複数パッケージの場合にvendorを無視
    • go doc
      • フィールドにリンクが貼れるようになった


初めてGolangで大規模Microservicesを作り得た教訓

Yuichi MURATA (DeNA)

  • Golangで大規模なMicroservices構成のAndAppを作ったときに得た教訓
  • AndAppの基本構成/アーキテクチャ
    • Google App Engine / Go 1.6
    • Gin / Echo
  • 教訓1:フレームワークにこだわらない
    • Ginで始めた開発
      • シンプルで使いやすかった
      • App Engineとのインテグレーションもサンプルにあった
      • Framework Context vs App Engine Context 問題
        • gin,ContextからApp Engine Contextを派生させ回避  * Echo
      • ワイルドカードパスを共有したルーティングが可能
      • Webアプリ系のコンポーネント開発が捗る
      • 設計がガリガリ書き換わる
      • Version3でコンテキストの派生が不可能に
    • そもそもGoでフレームワークにこだわらない
      • 洗練されたnet/httpパッケージがある
      • Golangは言語仕様がシンプルかつgofmtがある
  • 教訓2: interfaceを尊重する
    • 独自のエラー型を定義して利用することに
    • Nilには型があるの罠
      • errorインターフェースと独自エラー型を混在した時に発生
    • 素直に他の関数にならってerrorインt-フェースに統一すればよかった
    • interfaceの定義されたものを積極的に使った方が標準ライブラリとの連携がシンプルになる
  • 教訓3: regex compile / reflection は遅い
    • 複数スキーマを読み込むためにgojsonchemaを選択
    • パフォーマンステストで問題が発覚
      • バリデーションの有無でパフォーマンスに顕著な差が出ることがわかった
      • パースの度にRegexコンパイルしていた
      • 動的にスキーマを解析する部分でrefletionを多用していた
    • そもそもgo-jsvalで頑張ればさらに段違いに良い結果になった・・
    • regex / reflection などのコスト高の操作を意識する
  • 教訓4: 非対称暗号は遅い
    • Microservicesにおいて肝となる認証・認可
      • JSON Web Token / Json Web Signatureを活用している
    • 非対称鍵の署名が重い
      • opensslと比べgoのcrypto/rsaが貧弱
      • 対象会議の署名:0.37msec, 非対称鍵の署名:486msec
    • cgoを使ったopensslのバインディングも存在する
  • まとめ
    • 困ったときにGoの哲学に帰りシンプルなアプローチをとる
    • Goを過信せずにパフォーマンスに気を配る


ゲーム開発には欠かせない?!あれをシュッと見る

Ryosuke Yabuki (カヤック)

  • CSV
    • CSVは視認性が悪い
    • カラムとデータの関係性が見づらい
  • csviewer
    • CSVをいい感じに表示するコマンドラインツール
    • CSVをテーブル形式で表示してくれる
    • 絞り込みなどもできる
  • 実装で使った便利だったライブラリ
    • sliceflag
      • 複数の値を肝がんに受け取ることができる
      • flagの普段の使い方と大きく変わらない
    • tablewriter]
      • CSVを表示するだけなら相当少ないコード量で済む


Go Code Review Comment を翻訳した話

鎌田健史 氏 (KLab)

  • Go Code Review Commentsとは
    • コードレビューする際にます見るべき箇所をまとめたもの
    • Effective Goを簡単にしたもの
  • 幾つかのカテゴリに分かれている
    • コードの見た目を改善
      • golintめっちゃ優秀
    • コメントや文章の体裁
    • tips系
    • 設計の指針になるようなもの
      • レシーバをポインタにするかどうか迷ったら読もう


ScalaからGo

James (エウレカ)

  • Scala
    • 経験者は関数型っぽく書く
  • 関数型開発はGoでできますか?

  • No!
  • 関数型開発のコンセプトはGoで使える?
    • Yes!
  • 関数型開発とは?
    • 副作用がない開発
  • コードレベル
    • 部分適用はGoでもできる
  • ScalaとGoどっちが好き?
    • Scalaが好き
    • 企業としてはGoがいいかも。Goの方が初心者でも綺麗なコードが書ける


Crypto in Go

Kengo Suzuki (マネーフォワード)

  • Goにおける暗号アルゴリズムを利用する
    • ECBモード
    • パディングとHMACの実装面倒くさい
    • ASE + GCM
      • とてもシンプル



関連エントリ・リンク