@kyanny's blog

My thoughts, my life. Views/opinions are my own.

ghn を Go で書いてみる

いま ghn には二つ不満があって、ひとつは新しいバージョンの Ruby をインストールするたびに gem install ghn しないといけないのがちょっとだけ面倒くさく、もうひとつは Notification API の結果 JSON から issue/pull request 等の permalink を取得する部分の実装が妙に複雑になってしまっている。

で、せっかくなら Go で書き直してみたらどうなるか試してみようと思って基本的なところだけ書いてみた。

gist.github.com

いくつか学びがあった。

  • Ruby 版のほうのいまの実装は /notifications の結果 JSON を文字列操作して無理やり permalink を組み立てており、なんでそうしたのか覚えてないが、それ API 用の URL にもう一回リクエストして html_url をとればいいだけじゃん、そこはスレッドとかで並行処理できるから遅くもならないはずだよね、と、よりスマートな解に気づけた
  • Go で並行処理といったら goroutine というのを使うのだろ?と思っていろいろなブログ記事とかをコピペしながらどうにか動作させることはできたが、 Mac OSX の open コマンドのなんか制約で、短時間のうちに呼び出しすぎるとエラーがでてしまうので sleep 1 しているので、結局 URL 取得部分を並行処理してもコマンド全体の実行速度にたいして影響なくて意味なかった

理解できてないところ

  • for ループの中で goroutine を呼び出し?て channel に string を入れて、ループが終わった == すべての URL への GET が終わったあとで channel にメッセージを送った? string を全部取り出したい、というとき、一つ目の for ループの外に <-ch を一行書いただけだと URL が一個しかとれず、配列の要素全部とるみたいなことも channel にたいしてできるものなのかわからなかったので、同じ回数 for ループを回して一個ずつとりだす、ということをやったが、これが正解とは到底思えない