Go言語でAPI開発して得た知見 / development of sentence check api with Go lang

Dd480bdb51e04003f1612ec890647782?s=47 Islands5
October 05, 2018

Go言語でAPI開発して得た知見 / development of sentence check api with Go lang

普段Rubyを書いてるエンジニアがGoでAPIサーバーを作成した時の知見を共有します。
APIってこの機能必要だよね、それってどうする?的な知見や
Ruby触っててGoはこんな感じでした
といった知見を共有しました。

Dd480bdb51e04003f1612ec890647782?s=128

Islands5

October 05, 2018
Tweet

Transcript

  1. Go言語でAPIサーバーを立てて得た知見 Umeda.go / 2018年10月5日(金) SCC Osaka Co.,LTD.

  2. 五島 僚太郎 自己紹介 ごとう りょうたろう

  3. 活動 イベント ・OsakaRubyKaigiスタッフ(この時にumeda.goのお声がけを頂く) ・naniwa.rbの運営へ(https://naniwarb.doorkeeper.jp/events/80283)  ※20日に第一回開催します! OSS活動...? ・rails newする時--templateに渡すとdocker周りの設定もしてくれるテンプレ  (https://github.com/Islands5/rails_template_source) ・mecab-golangに少し貢献

     (https://github.com/bluele/mecab-golang) とかやりながら社内SE、受託開発を行っています!
  4. None
  5. APIサーバー

  6. どんなやつ??

  7. 文章校正API やること ・入力されたテキストを受け取 り、文章解析 ・類語、読みにくい文の注意 e.g. 文長いのに読点ないぞ 口語表現やで 体言止めが続きすぎやな

  8. 1 2 3 普段Railsを書いてる人がGoを触ってみた感想 (めちゃ主観です) 文字列の取扱い API作成で必要になりそうな知識 アジェンダ

  9. 1 2 3 普段Railsを書いてる人がGoを触ってみた感想 (めちゃ主観です) 文字列の取扱い API作成で必要になりそうな知識 アジェンダ

  10. GoでAPIを作る際の選択肢(Awesome-go参考) 掲載Webフレームワーク ・およそ 38件

  11. GoでAPIを作る際の選択肢(Awesome-go参考) 掲載Webフレームワーク ・およそ 38件 お、多い...

  12. 薄いgoのWebフレームワークないかな〜... echoがいいよ! 前職CTO(@zaru)

  13. Echoに決定! (※今思い返してもいい選択でした)

  14. Echoのコード例

  15. フレームワークは決まった... さあ開発だ!!

  16. 色々ぶつかりますね...

  17. API作成で必要になったこと 課題 ・ajaxで叩くAPIのため、CORS(Cross-Origin Resource Sharing)設定 ・https対応 ・プロセス管理 ・Goで作ったバイナリで、443ポートをListenする

  18. CORS設定 Echoのミドルウェアをほんの数行追加するだけでOK 参考(https://echo.labstack.com/middleware)

  19. https対応 参考(https://echo.labstack.com/middleware,https://qiita.com/smith_30/items/147ba45fa74b2fc265b6) ※自ドメインがLet’s Encrypt認証局に何回リクエストを送ってるかチェックできる(https://crt.sh/)

  20. ミドルウェアのサポートが手厚い!

  21. Echo便利

  22. プロセス管理 参考(https://papix.hatenablog.com/entry/2015/08/05/131113) supervisorを利用 ・/etc/init.dにプロセス周りの処理を書かなくていい! ・自動起動

  23. Goで作ったバイナリで443ポートをlisten 参考(http://matope.hatenablog.com/entry/2014/09/28/031155) well known port(0..1023)では普通に起動するとPermissionDeniedになる 対策 ・iptables等でポートフォワーディング ・(nginx等で)リバースプロキシ ・(setcap)バイナリにケーパビリティの付与

  24. None
  25. 1 2 3 普段Railsを書いてる人がGoを触ってみた感想 (めちゃ主観です) 文字列の取扱い API作成で必要になりそうな知識 アジェンダ

  26. None
  27. Goの文字列のクセ 文章中から、特定の文字列をみつけて何文字目か知りたい... strings.Index(s string, target string) int で実現できそう。

  28. strings.Index(“あいうえおかきくけこ”, “お”)

  29. None
  30. 12

  31. strings.Index(“あいうえおかきくけこ”, “お”)

  32. strings.Index(“あいうえおかきくけこ”, “お”) 4じゃね!?

  33. Goの文字列のクセがすごい Goの文字は型が3つある (string, byte, rune) 字数を数えるには ・runeの配列にキャストしてlen() ・utf8.RuneCountInString(string) と少し工夫(動的型付け出身者の意見) 文字として出力するには、stringへ戻さなければいけない

  34. 字数カウント

  35. 字数カウント 30

  36. 字数カウント 10

  37. 文字列を参照する 227

  38. 文字列を参照する 12345

  39. 文字列を参照する あ

  40. Goの文字列のクセがすごい この辺りが整理できてなかったので、戸惑った 実際取ろうと思えばこんな感じ ※Goにおける文字列、バイト、ルーンと文字 (https://www.ymotongpoo.com/works/goblog-ja/post/strings/)

  41. None
  42. 1 2 3 普段Railsを書いてる人がGoを触ってみた感想 (めちゃ主観です) 文字列の取扱い API作成で必要になりそうな知識 アジェンダ

  43. Goを触ってみた所感 よかった点◯ ・型って便利(e.g. Hash, HashWithIndifferentAccess, BSON::Document) ・テストに対する見えない力 - Railsはリスタートしなくてもコードを書き換えると適用される -

    Goは変更を確認するため、コンパイルし直す必要がある #=> テストを書いて実行する方が早い ・並列処理超簡単goroutine、チャネル最高
  44. Goを触ってみた所感 めんどうな点△ ・型(´・ω・`) - 特にMongoDBにクエリ投げる時/レスポンスを使う時...今まで気にしなすぎ? ・GOPATH、GOROOT関連が複雑に絡み合って... - デプロイ周り難しい? - capistranoのcurrent切り替えの時とか...(デプロイ先でバイナリ作ろうとするからか

    なorz) - シングルバイナリを配置する方式?? - みなさんのデプロイ周りの経験をご教授ください!! ・日付のフォーマットがw(でも読む際はわかりやすい)
  45. まとめ API作成で必要になりそうな知識 - Echo使うとmiddlewareのサポートで色々楽に対応できる - プロセス管理はsupervisorがよかった - well-known-portをlistenする手法の紹介 文字列 -

    Goの文字列処理はあらかじめ頭を整理しておくとよい Goを触ってみた所感 - 全体的に書きやすい - 型、型推論、go fmtがいい仕事をしてくれてるんだと思います
  46. SCC Osaka Co.,LTD. 文字列に関するサンプルコード (https://play.golang.org/p/FPs_Bh7xvdo)

  47. SCC Osaka Co.,LTD. ご清聴ありがとうございました!

  48. Goについて 参考(http://matope.hatenablog.com/entry/2014/09/28/031155)