Software Engineer Blog

エンジニアブログです。技術情報(Go/TypeScript/k8s)や趣味の話も書くかもです。

golang.tokyo #6 に行ってきました

概要

golang.tokyo #6 に参加しましたので、レポートを記載いたします。
(会場は、DeNAさんでお寿司(食べ損ねた)とお酒をご用意いただいておりました。)
下記は各セッションのまとめです。

Gopher Fest 2017

@tenntenn さん

スライド

概要

サンフランシスコで開催されるGoSFが主催のイベントの参加レポートです。
セッションの中のひとつ The state of Go のお話

The state of Go

Go1.9での仕様変更や標準ライブラリの改善についてのお話
(余談ですが、tip.golang.orgで最新のmasterのドキュメントが見れるそうです)

  • Go1.9は5/1にコードフリーズ済み
  • リファクタリングを安全にする方法
  • Goで安全にリファクタできるのか?
    • 定数の場合は問題なし
    • 関数はラップして引き継げば問題なし
    • 型の場合→ 問題有り
      • 型を作る → メソッドが引き継げない
      • 埋め込み → キャストができない
      • Go1.9でAlias導入
  • 言語仕様変更
    • Alias を作成できる
      • 型のエイリアスを定義できる
      • こんな感じで type A = http.Client
      • 完全に同じ型
      • キャスト不要
      • エイリアスの方ではメソッドを定義できない
  • 標準ライブラリ変更
    • math/bits ビット演算に便利なライブラリ
    • syc.Map スレッドセーフなマップ
    • html.templateがより安全に利用可能に
      • errorを返却するようになる
    • os.Exec
      • 環境変数が重複の際、一番後ろのものを優先する
        • ソース中で上書き可能
  • go testの改善
    • vendorを無視するようになった

感想

Go1.9にあたっての改善点のお話がメインとなりました。
@tenntennさんもおっしゃってましたが、 go testvendor配下を
みなくなる修正はなかなか良いですね。

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

Yuichi Murata さん

スライド未公開(2017/06/01)

概要

GAE/Goで大規模なMicroservices(30くらい)を作った際の、教訓のお話

  • いきなりつかってみたため、失敗談が中心
  • 構成
    • GAE/Go
    • Gin/Echo
    • Microservices構成
  • 結論
    • 困ったときはGoの哲学にそったシンプルなアプローチを取る
    • Goを過信せずパフォーマンスに気を配る

教訓

1. フレームワークにこだわらない

  • Railsの経験から良いフレームワーク探しをこだわって行った
  • Gin
    • 良い点
      • シンプル
      • App Engine とのインテグレーション有り
      • Framework Context vs App Engine Context
        • gin.ContextからApp Engine Contextに派生させられることで解消
    • 困った点
  • Echo
    • 良かった点
    • 困った点
      • 開発が盛んなことにより設計が書き換わる
        • バージョンを固定することで対応(アップデートできない..)
  • まとめ
    • Goでは、net/httpパッケージで十分な部分もある
      • 足りない部分はライブラリを利用
    • フレームワークを利用しなくても統一的なコードとなる
      • 統一的なコードを書くためのフレームワークだったが、Goなら標準で統一的となる

2. Interfaceを尊重する

  • 独自のエラー型を定義
    • こちらの型にerrorを寄せる
      • 毎回キャストするのが面倒のため
  • Nilに型がある問題発生
  • まとめ
    • Interfaceが定義されたものはそのまま利用するほうが自然に実装できる

3. regex compile/ reflectionが遅い

  • バリデーション
    • JSON Schemaを利用
  • GolangでのJSON Schema
  • パフォーマンステストで問題発覚
    • バリデーションの有無でパフォーマンスに顕著な差が出る
    • pprof を利用して実行を解析
  • 問題点の解消
    • Regexコンパイルを毎回行う実装
      • キャッシュすることで解消
    • reflectionを多用していた
      • 利用しないように修正
    • go-jsvalを利用すればさらに早くなった
  • まとめ
    • regex/reflectionのコスト高を意識する
    • regex compile / reflectionはとにかく重い

4. 非対称暗号は遅い

  • 認証・認可処理
    • 非対称鍵の処理が重い
      • opensslと比べcypto/rsaが貧弱
        • 一桁程度の差が生じる
      • cgoを利用したopensslのバインディングも存在
        • GAEでは利用不可
  • 荒業で解消
    • 非対称鍵の処理署名処理をPHPにして外出し
    • httpリクエストのほうが早い

感想

GAE/Goでサービスを作る際の問題点がいくつか聞けました。
サービスでの利用はこれからあるかもなので、参考になりました。
またnilに型がある問題は、まだあたったことがないので知れて良かったです。

[LT]ゲーム開発に欠かせないあれをしゅっとみる

ゴリラのアイコンの方(@Konboi)

スライド

概要

  • CSVの話
  • カヤックではデータの受け渡しとしてCSVを利用している
    • マスターデータ等
  • CSV困る時
    • カラムとデータの関連性が見づらい
    • 空欄がつらい
    • DBにインポートする系はその際にわかる
    • 調査系で利用する時つらい
  • csviewer
    • csvをDBのテーブルを検索するように参照できる
  • ライブラリ
    • sliceflag
      • 同一オプションで複数の値を受け取りたい
      • 普段のflagの利用方法と変わらない
    • tablewriter
      • データをいい感じにテーブル表示してくれる

[LT] Go Review Commentを翻訳した話

@knsh14 さん

スライド

概要

Go Code Review Commentを読もう
(→ 読みます)

  • Go Code Review Commentとは
    • コードレビューをする際に見るべき箇所をまとめたもの
    • Effective Goの簡略版
  • 翻訳してみました(qitta)
  • 良かった点
    • 正解のパターンを勉強できるところが効率が良い
  • 内容
    • コードの見た目を改善
      • ツールでなんとかしよう
      • golintは優秀
    • コメントや文章の体裁
    • Tips系
      • より良いパターンを記載
    • 設計の指針
  • まとめ
    • 良いドキュメントの翻訳は英語の勉強に最適

[LT] ScalaからGo

James さん

スライド未公開(2017/06/01)

概要

  • 関数型開発はGoでできるか?
  • 関数型開発のコンセプトは利用できるか?
    • 利用できる!!
  • 関数型開発とは?
    • 副作用がない開発
    • 副作用あり
      • テストしにくい、バグの原因
    • 部分適用
  • Goは初心者が入りやすく会社での導入がスムーズに行える点が良い

[LT] Crypto in Go

概要

  • Goにおける暗号アルゴリズムの利用
  • AES
    • 固定長でしか利用できない
  • AES + Padding + HMac
    • 行数があって面倒
  • AES + GCM
    • 機密モード + 認証モードがひとつに
    • とってもシンプル

まとめ

各セッションとLTについて、ざっくりと記載いたしました。
詳細知りたい際は、スライドが公開されるはず(ほぼされてますが)ですのでそちらをご参照ください。
全体的に有意義な発表が聞けて楽しかったです。
開催いただきありがとうございました。(次回も参加したいです)