Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gopher道場#3を振り返る

Daichi Hioki
September 18, 2018

 Gopher道場#3を振り返る

Daichi Hioki

September 18, 2018
Tweet

More Decks by Daichi Hioki

Other Decks in Technology

Transcript

  1. Gopher道場#3を振り返る
    @hioki-daichi

    View full-size slide

  2. 自己紹介 兼 宣伝

    View full-size slide

  3. - 最大週4リモート
    - 私は基本週4
    - モダンな開発スタイル
    - GitHub, Slack, PivotalTracker, esa, 2 人以上のレビュー体制
    - 使用している言語やバージョン
    - Ruby on Rails + Vue.js (基本的に最新バージョン )
    - 対応ブラウザは Google Chrome 最新版のみ
    クリニカル・プラットフォーム株式会社
    https://clinical-platform.com/
    エンジニア募集してます〜

    View full-size slide

  4. 参加の動機を振り返る

    View full-size slide

  5. 参加の動機 ~Gopher道場になぜ参加しようと思ったか?~
    - 好きなのは Haskell のような関数型言語だけれど・・
    - 学習コストが高くて流行らない・・

    View full-size slide

  6. 参加の動機 ~Gopher道場になぜ参加しようと思ったか?~
    - 現在仕事で使っている Ruby はというと・・
    - 界隈の高齢化を感じるような・・
    - Go は若いイメージ
    - Ruby の懇親会で若い Gopher を見かけた
    - 「Go で API サーバーとか書いてますよー」といっていた

    View full-size slide

  7. 参加の動機 ~Gopher道場になぜ参加しようと思ったか?~
    そんな時に「Gopher道場#3」の選考で
    Go の課題が存在することを知る

    View full-size slide

  8. 参加の動機 ~Gopher道場になぜ参加しようと思ったか?~
    『え !? Go 書いたらメルカリのエンジニアが見てくれるの !?』
    『これをモチベーションにして Go 入門しよ !!』

    View full-size slide

  9. 選考課題を振り返る

    View full-size slide

  10. 選考課題 7/27 - 8/4
    - 当時の自分の Go 歴
    - vim-go チュートリアル をやった
    - ※ Vim のプラグイン vim-go のチュートリアル
    - A Tour of Go がバズった時にちょっとやったような・・うっすらとした記憶・・

    View full-size slide

  11. 選考課題 7/27 - 8/4
    - 実装方法は・・
    **ネタバレになるため公開時に削除されました**

    View full-size slide

  12. 選考課題 7/27 - 8/4
    - これではまずそうなので追加で・・
    **ネタバレになるため公開時に削除されました**

    View full-size slide

  13. 第1回を振り返る

    View full-size slide

  14. 第1回の講義 8/6 ~Goに触れる/基本構文/型と関数/コマンドラインツール
    ~
    - 帰りに、道場生との間で選考課題の実装の話になった
    - @shuntaka9576 さんのコードを見せてもらった
    **ネタバレになるため公開時に削除されました**

    View full-size slide

  15. 第1回の講義 8/6 ~Goに触れる/基本構文/型と関数/コマンドラインツール
    ~
    - 翌日からは @shuntaka9576 さんのコードを味わう日々
    - 日記
    - 『8/8 shuntaka9576さんのコードをもとにいちから書いてみてるけれど変
    数を使い回すのだったり、for 文で index でたどっていったり、読み込ん
    だ分だけ引いていくところだったり、脳のワーキングメモリーを多く使うの
    ですごく疲れる。go は疲れる。でも面白い。試すたびに発見があるスルメ
    のようなコード。』
    - 『8/8 shuntakaさんのリポジトリ、Makefileがある。初めてちゃんと見た
    気がする。こうやって書くのか。テストコードもすごく参考になる。』

    View full-size slide

  16. 第1回の宿題
    ~画像変換コマンドを作ろう~

    View full-size slide

  17. 第1回の宿題 8/6-8/20 ~画像変換コマンドを作ろう~
    - いざ着手し始めると・・
    - ImageMagick が不要なの不思議
    - Ruby の `File.exist?(path) -> bool` が Go にはない !?
    - REPL 欲しいな・・
    - ※ 現在では gore を便利に使ってます

    View full-size slide

  18. 第1回の宿題 8/6-8/20 ~画像変換コマンドを作ろう~
    - 一応できた・・が、もうひと工夫
    - GIF 対応
    - ファイル名が重複した時に上書きする -f オプション
    - 冗長なログ出力をする -v オプション
    - ファイルの内容が期待するフォーマットかどうかのチェック
    - JPEG だったらファイルの内容が FF D8 FF で始まるかなど
    - ※ 後になって同様のチェックが標準パッケージ側でされていることが
    判明
    - https://github.com/gopherdojo/dojo3/pull/20#discussion_r21
    4764456

    View full-size slide

  19. 第1回の宿題 8/6-8/20 ~画像変換コマンドを作ろう~
    - いざ提出 (8/14)・・が・・
    - osamingo さんから以下のアドバイスが
    - 『自力で作る => セルフレビュー => 昔の道場生の作品をみる => 書き直
    す をすると、PDCA が回るはず。』

    View full-size slide

  20. 第1回の宿題 8/6-8/20 ~画像変換コマンドを作ろう~
    - さっそく昔の道場生の作品を全部見てみた
    - https://github.com/gopherdojo/dojo3/pull/1#issuecomment-413155710
    - この日の日記
    - 『8/15 過去の道場生の作品から学ぶことが多すぎ』
    - JPEG だったらファイルの内容が FF D8 FF で始まるかなどのチェック、昔の
    道場生の @onoyama-git さんも同じことやっていて親近感を感じるなど

    View full-size slide

  21. 第1回の宿題 8/6-8/20 ~画像変換コマンドを作ろう~
    - そこからコミットを 52 個積み・・・再提出 (8/19) !!
    - ついでに昔の道場生 @int128 さんが実装していた画像変換時の品質等のオ
    プションも実装してみたり・・
    - JPEG: Quality
    - GIF: NumColors
    - PNG: CompressionLevel

    View full-size slide

  22. 第1回の宿題 8/6-8/20 ~画像変換コマンドを作ろう~
    - PR 提出したところ・・
    - tenntenn さんから GOOD ラベルを頂く

    View full-size slide

  23. 第1回の宿題 8/6-8/20 ~画像変換コマンドを作ろう~
    - この日の日記 (※ エモ注意。会場限定コンテンツ)
    - 「8/20 tenntenn さんに GOOD ラベルを頂けて感無量。しばらく尊すぎて説
    明が頭に入ってこなかった。godoc も README も PR 本文もちゃんと書い
    たのが功を奏したと思われる。**これ以降は公開時に削除されました**」

    View full-size slide

  24. 第1回の宿題 8/6-8/20 ~画像変換コマンドを作ろう~
    - その後、レビュー指摘事項を修正 (+20 コミット)
    - 合計: 89 コミット (+631 -0)

    View full-size slide

  25. 第2回を振り返る

    View full-size slide

  26. 第2回の講義 8/20 ~パッケージ/抽象化とエラー処理/テストとテスタビリティ
    ~
    - 日記
    - 『8/20 しかしこのクウォリティーを無料で4回も添削付きでやってくれるの、
    ちょっと改めて太っ腹すぎる。』

    View full-size slide

  27. 第2回の宿題
    ~第1回の宿題のテスト~

    View full-size slide

  28. 第2回の宿題 8/20-9/3 ~第1回の宿題のテスト~
    - 日記
    - 『8/23 テストカバレッジが 72 % までいった。正常系は一通りやった気がする。
    異常系をどうするかだな。』

    View full-size slide

  29. 第2回の宿題 8/20-9/3 ~第1回の宿題のテスト~
    - 日記 (その2日後)
    - 『8/25 テストカバレッジが 90 % 超えた。codecov が落ちてたから `$ make
    cov` でローカルに吐けるようにしたけど便利で最初からこれで確認すりゃよ
    かった。』

    View full-size slide

  30. 第2回の宿題 8/20-9/3 ~第1回の宿題のテスト~
    - 日記 (その夜)
    - 『8/25 カバレッジ 96.86% までいったけれどもう無理そう・・』

    View full-size slide

  31. 第2回の宿題 8/20-9/3 ~第1回の宿題のテスト~
    - 日記 (翌日)
    - 『8/26 カバレッジ 98%までいった..!光が見えてきた!』

    View full-size slide

  32. 第2回の宿題 8/20-9/3 ~第1回の宿題のテスト~
    - 日記 (さらに翌日)
    - 『8/27 カバレッジ 100 % 達成 !!!』
    - ※ main.go のテストを書いていなかった実は 100 % ではなかった

    View full-size slide

  33. 指定した回数だけ Seek を成功させるような Mock を作ったのが山場
    ← 2 回目の Seek
    ← 1 回目の Seek

    View full-size slide

  34. 第2回の宿題
    ~io.Reader と io.Writer が標準パッケージでどのように使われているか調べる~

    View full-size slide

  35. 第2回の宿題 8/20-9/3 ~io.Reader と io.Writer~
    - アプローチの仕方が難しかった
    - ファイル名が reader.go や writer.go で、かつ、Read や Write の実装を持つ
    ファイルを片っ端から読んでいくというアプローチをとった

    View full-size slide

  36. 第2回の宿題 8/20-9/3 ~io.Reader と io.Writer~
    - 読むだけだと理解が怪しいためさらに片っ端からサンプルコー
    ドを書くなど・・
    - kadai2/hioki-daichi-sandbox/main.go

    View full-size slide

  37. 第2回の宿題 8/20-9/3 ~io.Reader と io.Writer~
    - iotest package が便利そうなことを知った
    - 主にテストに役立つ Reader や Writer を提供しているパッケージ
    - 例えば TimeoutReader ( src/testing/iotest/reader.go#L73-L88 ) は 2 回目
    の Read でタイムアウトエラーを返すような Reader になっている
    - (どこかで聞いたような・・)

    View full-size slide

  38. 第3回を振り返る

    View full-size slide

  39. 第3回の講義 (9/3) ~ゴルーチンとチャネル ~
    - 日記 (※ エモ注意。会場限定コンテンツ)
    - 『9/3 3回目が終わった。やはりてんてんさんは尊かった。とてもありがたい時
    間。何かに向かって複数人で真剣に学ぶ経験は実は初めてかもしれない。そ
    ういえば**これ以降は公開時に削除されました**』

    View full-size slide

  40. 第3回の宿題
    ~タイピングゲーム~

    View full-size slide

  41. 第3回の宿題 (9/3-9/10) ~タイピングゲームと分割ダウンローダー ~
    - タイプする単語のソースはどうしよう?
    - 最近スプラトゥーンしてない・・
    - 道場通い中はスプラトゥーンをしないという掟
    - かといって溜まったスプラ欲を発散しないのは不健康・・
    - タイプする単語のソースをスプラ関連にすることで昇華しよう
    - ソースをスプラトゥーンに出てくるブキ名に !!

    View full-size slide

  42. 第3回の宿題 (9/3-9/10) ~タイピングゲームと分割ダウンローダー ~
    - 文字ごとのヒット数も出したいなー
    - 以下を出すことに
    - トータルのヒット数
    - 文字ごとのヒット数
    - 1 秒あたりのヒット数

    View full-size slide

  43. 第3回の宿題 (9/3-9/10) ~タイピングゲームと分割ダウンローダー ~
    - 1 文字ごとにヒット判定したかったが・・断念 !!
    - ScanLines なので Enter を入力するまでヒット判定ができない
    - https://github.com/pkg/term を使えば実現できそうなことはわかったが・・
    - 実際にやってみると入力は一見上手く動いているように見えるが、表示が
    少しずつズレれていく・・

    View full-size slide

  44. 第3回の宿題
    ~分割ダウンローダー~

    View full-size slide

  45. 第3回の宿題 (9/3-9/10) ~タイピングゲームと分割ダウンローダー ~
    - 動く実装はできたが PR 出せるレベルに至らず・・
    - Context もテストも間に合わず・・

    View full-size slide

  46. 第3回の宿題 (9/3-9/10) ~タイピングゲームと分割ダウンローダー ~
    - レビュー後
    - タイピングゲームの方は再び tenntenn さんに GOOD ラベルを頂けました。
    尊みが深い。

    View full-size slide

  47. 第4回を振り返る

    View full-size slide

  48. 第4回の講義 (9/10) ~HTTPサーバ・クライアント ~
    - 後半内容が難しかった
    - あっという間に終わってしまった

    View full-size slide

  49. 第4回の宿題
    ~おみくじAPIを作ってみよう~

    View full-size slide

  50. 第4回の宿題 9/10-9/18 ~おみくじAPIを作ってみよう~
    - 工夫点 (1)
    - URLクエリパラメータとして name を指定できるようにした
    - `?name=名前`

    View full-size slide

  51. 第4回の宿題 9/10-9/18 ~おみくじAPIを作ってみよう~
    - 工夫点 (2)
    - name が 33 文字以上の時にバリデーションエラーになるようにした
    - ステータスコード: 400

    View full-size slide

  52. 以上、振り返りでした !! ありがとうございました !!
    - メルペイさま、複数回に渡って会場のご提供ありがとうご
    ざいました。
    - 講師の皆さま、本当に貴重で素晴らしいお時間をありがと
    うございました。
    - 道場生の皆さま、一緒に課題に取り組んでくださり、また、
    Slack を盛り上げてくださり、ありがとうございました。
    - 特に @shuntaka9576 さんは毎回の帰り道でお話
    して楽しかったです。ありがとうございました。
    - 昔の道場生の皆さま、コードたくさん参考にさせていただ
    きました。ありがとうございました。
    - 課題1: 画像変換コマンドを作ろう
    - https://github.com/gopherdojo/dojo3/pull/1
    - 課題2: 課題1のテスト・io.Reader と io.Writer
    - https://github.com/gopherdojo/dojo3/pull/20
    - 課題3-1: タイピングゲーム
    - https://github.com/gopherdojo/dojo3/pull/42
    - 課題3-2: 分割ダウンローダ
    - https://github.com/gopherdojo/dojo3/pull/50
    - 課題4: おみくじAPIを作ってみよう
    - https://github.com/gopherdojo/dojo3/pull/65

    View full-size slide