[toc]
golang.tokyo #4にブログ枠として参加してきました。 ブログ枠なのにレポートを上げるのが遅いのはご容赦ください。
参加理由
今の会社ではGo言語を使っていないのですが、個人的に勉強していて社内勉強会をやるようになりました。 プロダクトで使っていないので殆どの参加者は私含めGo言語初心者です。そのため、他社ではGo言語でどういったことをやっているのかを知りたいなと思いました。 また、今回のテーマが「Concurrency」で、イマイチ理解できていないところだったので、勉強しに行きたいと思ったので参加しました。
一般参加枠が定員を大幅にオーバーしており、抽選結果が出るまで予定が決まらないのが不安だったので、丁度空きがあるブログ枠として参加しました。 (LT枠はまだハードルが高くて断念しました)
ブログ枠について
主催者の @tenntenn さんによると、毎回枠が埋まるのが遅いらしく、勉強になるし、ビュー数稼げるしいいことあるよ!とのことでした。 確かに、こういった機会がないとブログにまとめることがない(正直億劫になって書かない)ため、ネタをもらったと思ってブログ記事が書ける良い機会なので、他の方も次回以降は狙っても良いのではないでしょうか。
会場
株式会社エウレカさんでした。 以前はオフィスが恵比寿だったなと記憶していたのですが、昨年の8月頃に移転したとエウレカの人に教えてもらいました。 めっちゃキレイなオフィスでした。羨ましい!
golang.tokyoについて
勉強会の冒頭でgolang.tokyoについての説明がありました。 Go言語の導入企業のメンバーで集まっている言語コミュニティとのことです。Go言語を導入している会社の人は参加できる良い場ですね。 動画の撮影もありました。毎回募集数が多いので、後ほど公開するためだそうです(ライブ配信ではないとのこと)。
Concurrency for distributed Web crawlers
分散されたWebクローラーのための並行実行
https://speakerdeck.com/puhitaku/concurrency-for-distributed-web-crawlers
末田 卓巳氏 (@puhitaku)
Golang歴半年だそうです。
- 何のためのWebクローラーなのか
- アプリに関する情報をAppStoreやGooglePlayから収集するため。
- システム要件
- Banされないためにする
- シングルドメインからクロールするとバンされる
- 24時間以内毎日クロールしないといけない!
- 画像のダウンロードもしているので一回毎のクロール時間が異なり、時間制御が難しい
- Banされないためにする
- 一からつくろう!
- informant
- 公開はしていない
- informant
- 役割
- 24時間以内に終わらせるためにGolangを使う
- S3にアップロードする時間が可変(画像サイズがそれぞれ異なるから)
- クローラーごとにバラバラ
- ゴルーチンで時間制御
- 時間制限を設けて過ぎたら別ゴルーチンでクローリングする
- 3秒間に一回 go文を実行
- Slack bot でInformantを動かす仕組み
- クローラーの状態を通知
- 一日数回チェックする
- 毎回Slack通知するの?楽にしたい
- Slackにはメッセージを編集機能がある
- botも使える
- github.comnlopes/slack
- ユーザのインタラクションで表示内容を変えてくれる
- 落とし穴
- 早いクエリだと問題ないけど、遅いと並列数が増えてしまってTCPコネクションが枯渇する
- Limit Chan
- 数を制限するチャネル
- キャパシティを指定して、キャパシティがいっぱいになるとブロックされる
Goのスケジューラー実装とハマりポイント
https://talks.godoc.org/github.com/niconegoto/talks/concurrency.slide
アドベントカレンダーでゴルーチンのスケジューラについて書いたらバズった。
- ゴルーチンの実装パターン
- M:N (多対多)
- コンテキストスイッチを素早く実行してシステム内のすべてのコアを活用してくれる
- スケジューラの追加が煩雑だけどゴルーチンはうまくやってくれている
- M:N (多対多)
- 用語
- M(Machine) => OSスレッド
- G(Gorunie) => ゴルーチン
- P(Processer) => コンテキスト、CPUコア数
- Pの数は環境変数
GOMAXPROCS
かGOMAXPROCS()
で決まる- 個々のコンピュータに合わせることができるCPUコア数が4なら
GOMAXPROCS
を4にすると、4つのスレッドでGoコードを実行する
- 個々のコンピュータに合わせることができるCPUコア数が4なら
- go文が実行されるとMはリストからPをポップする
- runqueuesというキューのリストからGを取り出す
- 待機しているGが無くなる(偏ると)他のPから半分奪ってくる
GOMAXPROCS
が1でも複数スレッドでGoが実行される- ハマリどころ
- スケジューラーが切り替わるタイミング
- システムコール
- メモリの割り当て
- time.sleep()
- rutime.Gosched()
- 参考
Ridge - A framework like GAE/Go on AWS -
https://speakerdeck.com/fujiwara3/go-on-aws
fujiwara 氏
- Ridge とは
- AWSでGAE/Goみたいなことをやる
- AWSサービス
- 課題
- 独自オブジェクトで指定したい
- ルーティング
- テスト
- Goで書きたい
- Apexを使う
- Goで書ける
- Goのバイナリを同梱し、子プロセスとして起動
- 標準入力/標準出力でプロセス間通信
- デプロイ簡単
$ apex deploy
- Goのビルド、zip作成、Lambdaにデプロイしてくれる
- API GatewayのObjec と Goのnet/httpを相互変換すれば動くのがEidge
ridge.Run()
以外は普通の net/http アプリケーションコードと同じridge.Run()
でしていること- Ridgeのいいところ
- Ridgeでできないこと
- 向いていないこと
- 向いていること
- ログの取扱い
- Cloudwatch Logsはいいお値段 + 見づらい
- Lambdaに流して
ridge.DecodeLogStream()
で見やすくする
懇親会&ライブコーディング
@kaneshin0120 氏
tailコマンドを実装する ソースコードはこちら↓ https://gist.github.com/kaneshin/a398720b8e20722a83bc6903e4017435
嫁に怒られずにGoを書く技術
https://speakerdeck.com/teitei/jia-ninu-rarezunigowoshu-kuji-shu
@teitei_tk 氏
- GoでLINEのチャットBotを作った
- Slack Botにしたかったが、家族がLINEを使いたい
- 現在、日本で一番使われているであろうチャットサービス
- 必要なもの
- やること : 今日の天気を通知する
- 天気情報の取得
- API: お天気Webサービス仕様
- 公式にオウム返しのサンプルがあるのでこれに手を加える
- 家族とのLINEグループにBotをいれる
- 実際に手をつけようとしているもの
- 漫画の新刊がでたときに
- Googleカレンダーのリマインダー
- ToDoリスト
- 嫁駆動開発にBot開発はオススメ
- LINEもSlackやHipChatと同じように使える
Gogland - Up and Comin Go IDE
Sergey Ignatov ( @sergey__ignatov ) / JetBrains Goglandの作者
英語を聞いていましたが、今の英語力だと限界なのでメモを並べます。 プレゼンはデモしながらなので言いたいことは何となくわかりました。
- IntelliJ IDEAにプレゼンモードがあるのか。発表の場で使いやすそう
- ショートカットを駆使している
- めっちゃスムーズ
- コーディングがより一層楽しくなりそう
- 関数一覧で引数名がみえる
- 関数リストとは別窓で関数の中身がみえる
- ワイルドカードで検索できるのはよいね
- メソッドからInterfaceに飛べる
- 変数の型がポップアップで表示される
- 曖昧な入力でも補完してくれるのはいいね
- fmPri -> fmt.Println
- テストをすぐ実行できて失敗してもコケたところにすぐ遷移できる
- メソッドがどのPackageからImportされたか表示してくれる
- 何かあったらIssue Tracker
Goglangは使ったことがなく、IntelliJ IDEA Goプラグインを使っていましたが、それよりパワーアップしている印象なので試してみたいと思います。
最後に
他社事例など聞けて参考になったし、楽しかったですが、Concurrency初心者な自分としてハードルが高く感じました。 次回参加するときまでにはGolang書きまくってレベルアップしていきたいです。