2017年の振り返り技術編

ふと思いたったので書く。2016年は自然言語研究者からWeb系エンジニアになったということで、今振り返ってもキャッチアップで精一杯だったなーと思うが、2017年は去年よりは慣れたこともあり、もう少し自分にとって新しいことに取り組めたかなーと思う。といっても、XXXやり始めたという内容のほとんどが仕事で必要だったという理由なので、Mackerelチームで働くための基礎体力が本当になかったんだなと改めて痛感している(なぜはてなに入社できたのか謎)。飽きる暇もなく勉強の毎日です。来年はもう少し狭く深く掘り進めていきたいかな。

Go言語やり始めた

仕事でGo言語をやる必要があって勉強し始めたのが今年の初めだった。A Tour of Goを最初にやったけど、実際に手を動かしてレビューで見てもらったほうが早いなと思って、MackerelのグラフアノテーションをmkrでできるようにPRを出したのが初めだったと思う。

書き始めた最初はsortやるにもあれこれやんないといけないし、かっこよく書けないなーと思っていた。しかし、慣れてくるととにかく素朴に書くのがいい文化であることが分かってきて、慣れるとそれはそれでよいもんだということが分かってきた。最近では一番好きになった言語かもしれない。mattn/memoのソースコードを読んで小さいPRを出したり、中規模なものではSlackで能動学習をできるようなアプリケーションを書いたり、係り受け解析器、エントリ推薦を書いたりした。このくらいの規模をいくつか書くと大分慣れることができた。go routineはまだ使いこなせているとは言えない。

Goはcliアプリをさっと書けて、シングルバイナリで簡単に使ってもらえるのが最高だということが分かって以降、Mackerelのプラグインを作りまくったりしていた。Goの練習に丁度いいと思うので、どんどん書いて欲しい。

勢い余って他の人のプラグインのmkr plugin install対応活動もやっていた(しゅっとmerge & releaseしてもらってありがとうございました)。

Pythonやり始めた

こちらも今さら感がある。去年は仕事の機械学習のコードはPerlで書いていたけれど、今年はPythonで書く仕事がきた。Python自体は遠い昔書いていた時代があったので、大きな戸惑いは特になかった。scikit-learnやjupyterがあって、便利な世の中になっていた(激しく今さら感)。githubやgithub enterprizeがipynb対応していて、プロトタイプや調査結果の共有に便利。はてなのインターンの機械学習講義も今年からついにPythonにしました、講師を担当していた。

一方で機械学習以外ではGoがよかったこともあって、趣味ではあまりPythonのコードを書く機会がなかった。色んな環境でさっと使ってもらえることを考えるとpyenvでpython3.6をインストールしてもらって、pipでライブラリをインストールしてもらって...というを考えると面倒で、この辺はGoがいいなと思う。

異常検知やり始めた

書籍での勉強は昨年末に始めたけど、今年は手を動かして社内の多次元の時系列データでの異常検知のプロトタイプやproductionのコードを書いたりしていた。異常検知、教師なしがdefaultなので難しいだろうなと思っていたけど、予想通り簡単ではなかった。現場的には誤検知をどうやって抑えればいいか、どういうデータにはどういう手法ならばいいかのノウハウを少しずつ貯めていってという感じだった。中間アウトプットとしてMackerelのチェック監視で異常検知を行なうものを出したりしていた(これはさすがにGoじゃなくてPython)。

論文もちまちまと読んでいた。異常検知回りは問題設定でまだまだやられていないことも多いので、論文読んでて楽しいですね。

一般の機械学習や深層学習はそこかしこで勉強会やコミュニティが存在するけど、異常検知peopleはどこに行くと会えるんでしょうか。

深層学習やり始めた

仕事で現状必要になっているわけではないが、これからどう向きあっていくかを含めて色々試している。深層学習の本は山ほど出ているので、それで勉強しつつkerasで手を動かして感覚を掴んだりしていた。LSTMやCNNを使って社内の既存タスクを解き直してみたが、多少精度は上がるものの劇的というほどではなかった。これまで社内で取り扱っていなかった生成系のタスクや画像系の問題について面白い(かつお金にもなるような)問題を探っていく試行錯誤がもう少し必要そう。画像系は教師データと大量の計算機リソースが必要だと思っていたが、転移学習をベースにすれば全く手が出ないなんてことはなかった。とはいえ、深層学習に関係なく、社内のコーパスを含めたリソースは今後も定期的に整備していきたい。

AWSやり始めた

これも仕事で必要だった。MackerelのAWS/AzureのIntegrationをやっているにも関わらずcloudほとんど自分では使ったことがなく、仕事でもLambdaやDynamodb、EC2を使っていなかった。これはどう考えてもまずい、と思って趣味で動かしていたElasticsearchをAWS Elasticsearch Serviceに引っ越ししたり、Mac Miniで動かしていたクローラーをEC2に引っ越ししたりすることから始めた(これはraspberry piを買ったので、今はやめた)。Jenkinsで動かしていたいくつかのJobをAWS Lambdaで動かすようにした。

仕事でやるような規模のものは趣味の範囲では無理なので、この辺で得た知見をベースに仕事でも生かしていきたいなという感じ。

Docker&Ansible始めた

これも仕事で。最初はすでに存在するdocker imageをdocker runしかやっていなかったけど、Dockerfile書いたり、composeが何者か分かってきた。簡単なやつではあるけど、自分でよく使いそうなものはDocker Hubに置いたりしていた。

Ansibleは自分のクローラーのコードや環境設定をEC2でバチっとやりたかったので、少し勉強した。sshしてあれこれやらなくていいのは便利ですね。EC2だと環境作っては壊してというのがお手軽にできる。mackerel agentのcheck監視の設定で細かいところに手が届かなかったのでPull Request送ったりしていた。

IDEに魂を売った

これは仕事じゃなくて趣味。去年までは頑張ってScalaをEmacs(ensime)で書いていたんだけど、いよいよ辛くなってきた。これはEmacsに固執している場合じゃないと思って、IntelliJ IDEAを使い始めた。変数の型が分かったり、関数の定義元にさくさく飛べるので、大分効率が上がった。メモリがっつり持っていかれるのが痛いけど、これは諦めた。IntelliJ IDEAが便利だったので、Python(PyCharm)やGo(Goland)を書くのもIDEを使うようになってしまった。

Emacsで書くものがmarkdownだけになってしまったので、気分転換がてらvimに乗り換えをした。今のところそんなに困っていない。左手が楽になった。なお、SKKはまだ捨てれていない。多分捨てられない。