Skip to content

Go

Go 1.18

WSLのGoのバージョンをあげて、GitHub Actionsのバージョン指定も1.18にしてみた。

問題なくCIが通ったので、大丈夫そう。

関数化

細かい変換を関数化してみた。

strconv.Atoiをエラーだったらデフォルト値で返すやつとか。

titleやtempoを[]byteにして返すやつとか。

メソッドか関数か

最初は、構造体のフィールドを参照しているものはメソッドにしていた。

けど、フィールドのごく一部しか使っていないものはメソッドではなく関数にして、疎結合な感じにしてみた。

もちろんフィールドを更新しているものはメソッドのほうが良いかもしれないが、それでも新しく構造体を生成して返すようにすれば必ずしもメソッドにする必要はない。

Read more

main関数を分けたのでテストも書く

mainのテストは、os.Argsを直接設定するという割と無理やりな書き方でテストしていたけれど、処理部分を別関数にしたので、引数を変えて正常系と異常系をテストし分けることができるようになった。

コマンドライン引数をflagで処理する

入力ファイルをos.Args[1]で取得していたので、引数指定しないと範囲外アクセスでpanicしていた。

flagパッケージ使ってflag.Arg(0)で取得するようにしたので、引数指定しなかった場合にはファイルなしエラーで終わるようになった。

もっと親切にするなら、エラー終了ではなくヘルプ表示にするのが良いのだろうけど、それはまた余裕があるときにでも。

Read more

Goのconst

EOTとかbyteのスライスをconstで定義しようとしてできなかった。

const EOT = []byte{0x00, 0xFF, 0x2F, 0x00}
$ go run cmd/mdmml/main.go 
# github.com/umemak/mdmml
./mdmml.go:10:7: const initializer []byte{...} is not a constant

The Go Programming Language Specification - The Go Programming Language

文字列リテラルが許されるならbyteスライスも許されてもよいではないかと思ったけれど、ダメらしい。 varで我慢する。

Goのinterfaceを学ぶ

DeNA.go #3

https://dena.connpass.com/event/150676/

19:25 - 19:30 会場説明 @imoty

  • DeNA TechCon 2020やります

19:30 - 19:50 20分枠 @suhirotaka / [Go活用事例]安全運転支援サービスを支える運用サイト / オートモーティブ事業本部スマートドライビング部システム開発グループ

  • https://speakerdeck.com/suhirotaka/gohuo-yong-shi-li-an-quan-yun-zhuan-zhi-yuan-sabisuwozhi-eru-yun-yong-guan-li-sisutemu
  • goで何を作っているか
    • DRIVE CHART
    • AIはPython
    • Railsも使っている
    • 運用管理のWEBシステム
    • 管理画面をGoで作った理由
      • 2年間の実証実験
      • 実証実験時は、スピード重視でRails
      • 本サービスは、パフォーマンス重視でGo
        • サーバーが減らせるコストメリット
      • 順次goにリプレイス中
  • ライブラリ
    • フレームワーク
      • フルスタック・MVC
        • Beego を採用
        • Revel 開発停滞気味
        • Iris 運営に問題ありそう
      • Beego
        • 中国で人気がある
        • フルスタック
        • bee というCLIツールがある(Railsっぽい)
        • 若干使い勝手に気持ち悪いところがある
    • Railsとの共存
      • DB周りの定義の共通化
      • 暗号化周りの共通化
        • 鍵の管理が面倒
          • 更新タイミングを合わせるとか
      • ユーティリティ機能の共通化
        • メール送信・通知システムなどどちら側に実装するか
        • 寄せるとサービス感の通信が発生する
        • 両方に実装するとそれはそれで問題がある

19:50 - 20:30 40分枠 @karupanerura / WebシステムのパフォーマンスとGo/ ゲーム・エンターテインメント事業本部ゲーム事業部Publish統括部共通基盤部アライアンスシステムグループ

  • https://speakerdeck.com/karupanerura/websisutemufalsehahuomansutogo
  • Wabシステムにおける本当のGoの強み
  • 問題としっかり向き合う
  • Webシステムにおけるパフォーマンスを定義する
    • 単位時間あたりの処理するリクエスト
    • リクエスト単位で消費するリソース
    • パフォーマンス低下要因を排除すれば、向上できる
  • 具体例で考える
    • サマーインターンシップでのお題
      • チャットアプリをいい感じにする
    • c4.large 10台まで使用可
    • 発言が多くなるとどうなるか
      • DBのINSERTが詰まる(ロック競合)
        • 複数発言を1回でinsertできるようにする
        • バッファリングするワーカースレッド(ゴルーチン)を作って一定件数or一致機関でフラッシュする
      • 同時接続数が多くなると取得が多くなる
        • 差分だけ取得したい
          • Server Sent Events
            • WebSocketより扱いが簡単
            • サーバーとクライアントでコネクションを貼り続ける
            • サーバーからクライアントにデータをpushできる(一方通行)
  • まとめ
    • Goにしただけでは速くならない。リソースを効率よく使う
    • 便利なパッケージを活用する

20:30 - 21:30 懇親会

21:30 - 完全撤収

mercari.go

https://mercari.connpass.com/event/141122/

19:40 ~ morikuni GopherCon 2019

  • GopherConとは
    • 2014年デンバーで始まった。いろんなところでやっている。
    • 今年はサンディエゴで開催
      • 1800人を超える参加者
  • Mercariの関わり
    • Silver Sponsor
    • BOLD Scholarship
      • 学生向け
    • 11+2名参加
  • 1日目はワークショップ
  • 2日目3日目は発表がメイン
  • 4日目はコミュニティデイ
    • LTとか
  • One MOre Thing
    • Generics(Contracts)
    • Interfaceとの違い
      • 直和型

19:50 ~ mark.hahn Workshop: Go-Beginner Training

  • 英語の発表だけど聞き取りやすかった
  • Goは1日で習得できる(シンプル)

20:00 ~ micnnicim How Uber Goes

  • 1500サービス、200M行がGoで書かれている
  • MONOREPOへの移行
  • uber-go/fx
    • アプリケーションフレームワーク
  • glue
    • 非公開ライブラリ
    • クリーンアーキテクチャ
  • Bazel
    • OSSのビルドツール
    • monorepoに効く?

20:15 ~ upamune How I Write HTTP Web Services After Eight Years

20:25 ~ taqboz TinyGo

  • Small is going big
  • LLVMを使ったGoコンパイラ
  • WebAssembly対応
  • Goroutineのサポートが不完全
  • 使えない標準パッケージが多い(net系全滅)
  • IoTデバイス、マイクロコントローラーでの活用
  • Drone飛ばすデモ

20:40 ~ hunter PKI for Gophers

  • 暗号化の話
  • Hardware Keys
    • YubiKey

20:50 ~ yuki.ito Workshop: Observability in Go & Socket to me: Where do Sockets live in Go?

Go Quiz

  • 型厳密なのな。。