最近覚えたりやったりしたことを列挙
こんなことやったなぁを書いておこうと思った。
Scala系
型クラス
ぶっちゃけプロダクトでどう使えばいいのか全然ピンとこなかったのでもう忘れた...
型クラスがあることによってどんなことを型で表現するからメリットになるのか?の例が知りたい
scalikejdbcとscalikejdbc-bigquery触った
この辺
ついでにtypesafe-configとかも。
当初の目的としてはscalikejdbc-bigqueryをゴニョるために触った感じ。
普段のプロジェクトではいろいろなライブラリを使ってる関係で生scalikejdbcを触る機会が全然ないので適当に触って、クエリを発行できるようになるまでどんな手順でやればいいのかとかを適当に触った
=:=
型の同一性チェックができる(雑)
mockitoのeqをscalaで使う
Scalaには eq
が存在してるのでインポート時に別名でインポートしないと使えない(ハマった
ScalaからCLIツール(具体的には gsutil
コマンド)を叩く実装を書いた
要件として、
- コマンドはなるべく複数並列で叩きたいし、並列数も制御したい
- コマンドが応答しなくなったら並列で実行中のプロセスをkillしてからScalaのプロセスもちゃんと落としたい
というのがあって、Futureで並列度を制御しつつ、プロセスをkill出来るような実装を頭悩ませて実装したりした
jsでもCLIのラッパー書いたことあるけどキツかったので、CLIのラッパーはどの言語でやってもきついのかもしれない・・・
infra系
Ansible少々触った
- task,role,inventoryあたりの概念多少知った
- ユーザー定義の関数を作れるらしいと知った(作ったことはない)
- タスクランナー化したAnsibleは地獄だと知った(弊プロダクトのインフラはそうなってしまっている)
- 変数の出処を探すのが大変なのでシンプルに保とうという気分になった
- あと宣言的になるように、とかね。。。
CloudFormation少々触った
- スタック・変更セット・アウトプット・userdataあたりの概念を知った
- 順当に運用するのが普通に難しいということがわかった
- Ansibleに比べて変更の頻度が少ないし、作り直しみたいなことも普通はしないので、「冪等性を保つ」のが意識されにくい
- 最新のテンプレートだけを反映すればOKという状態になっていない不具合が起きてしまっていた
- 作って壊してを頻繁に実施するような運用にしたほうがいいのかもしれない
- インフラ系は触り始めて日が浅いので、ベストプラクティス・・・というかうちの事情を踏まえた上でどうすれば改善できるのか?というのがあまりわからない
- GCPのDeploymentManagerも多分似た話があるんだけど、こっちは今いるプロダクトだとCFnよりさらにめったに触らないので逆に問題が起きにくい感じがある
Storage Transfer Serviceを毎時集計に使うようにした
EMRでサマった結果をBQでロードするためにS3→GCSへ移動するのに利用。
どうやらこのTransfer ServiceはGCP上の共通のリソースを使っているらしくて、他のProjectがTransferのリソースを使いまくってるときにこちらもアオリを食らうということがあったりしてひどい目にあった
アレ本番運用で定常的に使ってる人がいたらどうしてるのか聞きたい・・・
なおうちはgsutil rsyncコマンドで対処できるように、という対応をしました
CircleCI
この辺↓のことをやった