最近、触ったものたち

この4月終わりから5月にかけて触り始めたり、勉強したことのメモです。

Android

携帯をiOSからAndroid端末に変えました。Huaweiにしたんですが、その直後にGoogle vs Huaweiの対立が激化して、困り果てています笑

P20 Liteと言う廉価のスマホなので、大してスペックもよくはないですし、RAMやROMもそれほど良い訳ではないです。今なら型落ちしてるので、2万円くらいで買えるかもしれません。私は、スマホそれほどたくさん使わないので、しばらく触ってみた感想は「これで十分だな〜」と言う感じです。

ちなみに、写真撮る人は選ばない方が良いかもしれません。ワイドアパーチャとポートレートの人物検出の精度が大してよくないので、うまくやらないと加工してることがバレバレの写真ができることもあります。ぼかすとかなら、後述するLightroomとかで後から加工したり、実装できる人は自分でガウスぼかしをしたりとか、セグメンテーションしてしまった方が好みの感じになるかもしれません。(もちろん、性能は画像の特性にもよります。)

Huaweiのカメラは、画像処理(ぼかしなど)にはまだまだ発展の余地があるものの、カメラの画素数自体は十分な性能を持っているので重宝しています。実際、プロ写真とモードを使うと、ISOやSなどの微調整ができるのでとても良い気分になれます。加えて、フィルターが個性的で面白いなあと思っています。インスタもそうですし、後述のLightroomもそうですが、フィルター頑張るのほんとすごいし、クリエイティブな仕事だな〜と思っています。

Adobe Lightroom 

カメラを変えて、多少画素数が前の時よりもよくなったので、最近話題になっていた、Lightroomを使ってみています。Adobe製品は、Indesign, Illustratorは使ったことがあり、UIに馴染みがあったので比較的、キャッチアップはそれほど大変ではありませんでした。

Lightroomは写真の編集から、管理、共有までトータルでできてしまうすごいツールで、設定できる項目も多く、これだけあれば写真は十分と言う感じに見えてしまいます。

特に、自動補正はよく使っていて、補正された後の画像のヒストグラムをみて変化を確認したりとかすると、「どう言う点が修正されるのか」が理解できて、それも勉強になります。

正直、画像はプログラムで加工したり、変換したりとかしたことはありましたが、実際に画像処理の技術がどのようにソフトで応用されてるのかを十分に知る機会は今までなく、昔やった知識が今、実際に役に立っている感覚がものすごいあります。

何より、僕みたいな画像初心者に優しいので、このツールは使ってよかったなと思っています。

Cookiecutter

自分で分析したり、開発したりするときによく設定するディレクトリ構造を手頃に使えるようにしたいと思い触り始めました。最初は、Docker imageを作ったりすることも考えたのですが、やっぱりインタラクティブにプロジェクト名とか決めたいと言うことで、Cookiecutterに取り組みました。

触り始めたと言っても、Cookiecutterも本当によくできていて、cookiecutter.jsonを書けば、大体の設定のデフォルトをコントロールできるし、中括弧で {{ cookiecutter.hoge_name }}とすれば、大体のファイルで指定された名前が代入されるので本当楽だな、と思います。

作成したのは以下の2つなのですが、1つは実際に使ってみて、「あーもう少し改良が必要かな」と思っているので、今後もアップデートしていくつもりです。理想的には、Cookiecutterでプロジェクトを生成して、docker-composeとかkubectlを使って、コンテナを操作するような感じにできればとっても楽かな〜と思っています。

API用のサーバーとかもプロジェクト名が変わるだけで、よく使う構成は似ていることが多いでしょうし。イメージ作って、DockerHubでもいいですが、まあもっと楽したいよねという思いだけです。

Elastic Stack [Elasticsearch, Logstash, Beats, Kibana] 

Elasticsearchの勉強をしようと思って、以下の本をGWに読みました。

そして、今は以下の本を読んでいます。

Elasticsearchやその周辺のElastic Stackをなぜ勉強するかと言えば、ログの情報を使った分析をする際に、収集されるデータのイメージを持てるようにしておきたいからです。

例えば、RDBでも、保管されるデータもいつどのタイミングで、どう言うデータがどこに、どう言う風に蓄積されていくのかをイメージする際には、実際にアプリケーションの簡単な開発をしてしまうのが一番早いのと同じことです。深くなくても、把握さえしてしまえば、アプリケーションのコードを自分で読んで、どのタイミングでどう言うPOSTをしているのか理解する助けになります。上記と同じようなことをログ収集でもしていきたいと考えており、目下取り組んでいます。

副次的に、裏側で動いているアルゴリズムは、NLPでよく使われるTF-IDFの改良版だったり、シャーディングとかクラスタとかはk8sの文脈と近い物を感じたり、デザインパターンのマルチスレッド編をもう一回やり直そうかな〜と思うきっかけになったりと、いいことずくめです。データをESに格納して分析してみたり、Kibanaで描画してみたりと少しずつですが、自分の業務にも利用できるようになってきています。

FastAPI

職場の同僚が教えてくれて、最近ドキュメント読んだり、開発に利用したりしているフレームワークです。

パッと見は、flaskっぽい感じのコードスタイルで、Type Hintをしっかり書くことで、型のバリデーションを標準で提供してくれる良さがあります。また、非同期処理を積極的に使っていて、速度がとても早いです。なぜかAPIを書くと、2つドキュメントのエンドポイントが作成されるのかいまだに謎ですが、どちらも綺麗なUIなので使いやすくていいです。

DjangoでRestfulなAPIを書くケースが一般的には多いと思いますが、たまには違うフレームワークを使うのもいいですね。

from fastapi import FastAPI

api = FastAPI()

@app.get("/")
async def root():
   return {"message": "Hello World"}

こんな感じでシンプルです。

Jupyter Lab

今まで、日頃の分析ではJupyter Notebookを使うことが多かったのですが、最近はJupyter Labに移行し、快適な開発をしています。

移行したのは、公式のREADMEに以下のような記載があったからです。

JupyterLab is the next-generation user interface for Project Jupyter offering all the familiar building blocks of the classic Jupyter Notebook (notebook, terminal, text editor, file browser, rich outputs, etc.) in a flexible and powerful user interface. JupyterLab will eventually replace the classic Jupyter Notebook.

要は、将来的にJupyter NotebookはJupyter Labに置き換えられる予定で、このJupyter LabはNotebookの拡張であると言うことらしいです。

すでに、Jupyter Labのextensionもたくさん出ていて、かなり使いやすくなってきています。利用するのに、node.jsを使うため、余計な設定が面倒な人はAnacondaから使うのが一番楽だと思います。この辺の環境を整えたDocker ImageやCookiecutterなどをこれから自前で揃えてしまおうかなと思っています。

私がよくつかっているextensionは、

- jupyterlab_templates : notebookのテンプレート作成
- jupyterlab-toc : Table of Contents
- jupyterlab-git : Jupyter Lab上でのGit操作
- jupyter-hub : マルチユーザー管理

です。最終的には、Jupyter Lab + Jupyter Hubの環境をPodに詰めて、クラスタ管理したらとてもいいな〜と思いながら、少しずつ周辺の知識を埋めています。ミドルウェア管理の統一やデータの保護、PCスペックからの解放などいろんな面で、この方向に進んでいくのが良いなあ〜と思っています。

なお、extension何があるの?って思った時は、awesome-jupyterlabが参考になると思います。

1つ難点があるとすれば、Jupyter Lab上で.pyファイルを書くのは大変面倒で、それだけがいまだに解消できていません。結局、私はJupyter Labで分析をしながら、PyCharmを開いて関数やクラスを記述して、読み出す。みたいな結構手間なことをしています。いいエディタができてしまえば、全部クラウド上で分析業務を完結させてしまうこともできるんだけどなあ。

Docker, Kubernetes, Helm 

GWに、ESの本と合わせて

を読みました。Dockerやdocker-composeなどは、比較的触ったことがあったのですが、その先のswarmやkubernetes、Helm、そしてこの本では出てこないkustomizeなどは、なかなか勉強する機会がなかったため、勉強しています。実際に何をやっている物なのか、どう言う良い点があるのか、どう言う仕組みなのかを理解できれば、また新しい知見も得られるだろうと言う思いがありました。

実際の開発で利用して初めて、理解できるなとも感じる内容で、プライベートで開発しているAPIなどをk8s上に乗せていくチャレンジもしていこうと考えています。

エンジニアのみなさんが作ってくれるデータを触ることが多いので、ソフトウェアのアーキテクチャやモダンな構成などを知っておけば、DBに溜まっているデータのドメイン知識も自力で得やすくなって良いことばかりです。

上記の本の中で出てきた、Helmというk8s用のパッケージマネージャー?のいまいち良さがまだ腑に落ちていないところがあるので、詳しい人がいたら教えて欲しいです。

読了ありがとうございます。よければいいねも!