09

正月三ヶ日はPythonと格闘してた

ほんとは社内システムの糞コードと格闘するつもりだったけど、番組を変更してPythonの環境構築との格闘をお送りします。

書いたコードの量としては数十行程度の小さな物なんで大した物ではないんだけど、実装以外でほとんどの時間を消費した。 要件としてシングルページの Webアプリケーションと cron で動かす前提のバッチ処理的なコード数本なんだけど、最初Webページの方をよく知りもしないFlaskで書き始めて、バッチ処理がほとんどかけたところでWebアプリとバッチ処理でデータをDBで共有した方が良いという感じになってきた(もともとは単なるテキストファイルでやってた)。DBはsqliteで十分だとおもうんだけど、そうすると接続情報やなんやかやは双方で共有しておきたいし、モデルデータのハンドリングのコードなんかも共有したい。しかしFlaskは本当に薄いフレームワークでその辺というかDB周りはほとんどサポートしてない。となると、バッチ処理はDjangoでmanage.pyのコマンドを追加する形で実装したほうがきれいになるかもと思ってDjangoに移植した。移植自体はそんなに難しくはないんだけど、試行錯誤して時間を取られた(多分ドキュメントちょっとあっさりすぎる気がする)。 開発環境はPyCharmを使っていたので、開発についてはあまり気にすることはなく開発できたんだけど、とりあえずうちで借りてるサーバにデプロイしてみようと思ったら、まあPythonのバージョンが違ったりするので仮想環境いるよなーとか、Webアプリ配備するのは良いけど依存ライブラリの管理どうやんの?とか全く知らないから調べてたら全然進まない。

  • easy_installとpipとsetuptoolsとdistributeとか基本的なところで同じような役割のツールとかパッケージとかあるんだけど、こっちが新しい、とかこっちに統合された、とか情報が散らばってて結局名に使えば良いの、って感じになる。
    • easy_installでpipをインストールして以後easy_installを使わなければいいの?
    • distributeはsetuptoolsから分化してできたパッケージらしいけどマージされてsetuptoolsに戻ったらしい
  • 仮想環境はvirtualenv使えば良いらしいけどPythonは個別のバージョンごとに自分でインストールしなきゃならない。
    • pyenvにvirtualenvプラグイン入れればこの辺きれいに解決できるっぽい。
      • この場合に予めeasy_installとかpipとか入っている必要はあるんだろうか?
      • pyenv と pyenv-virtualenvが使えれば環境に関しては満足な感じする
  • 依存ライブラリの定義とセットアップに関してはsetup.pyつくってそこに依存先として定義してあればデプロイ先でもインストールしてくれる?

まだテストとか全く書いていないので、CI周りはこれからやってみようかな・・・という感じ。だけど、多分(内部的な制約により)Travisとかは使えないので、代替手段必要。jankinsはセットアップ簡単で良いんだけど重そうなのでちょっと避けたい気がしている。その辺も調査からやる感じかなあ。

そもそも、 ユニットテストもどう書けば良いんだ、と思って調べてみたらなんか色々あってどれ使えば良いの?状態になってはいる。複数あるソリューションから一つを選ぶ場合、「どれが最もコミュニティの活動が活発か」とか「どれが最も息が長そうか」といったことを気にしてしまうんだけど、そしてそんな事いくら気にしても正確な答えなんて出ない訳なんだけど、悩みに悩んで時間を浪費してしまうのがもうつらい。 そう考えるとRoRみたいなフレームワークがあるのって結構いいんだね・・・。

日頃使い慣れていればこの辺全く悩まなくていいんだろうけど、技術的に節操無くSIなんてやっていると、その「慣れ」を作る事ができない。おかげで毎回試行錯誤みたいな感じになるし、そもそも試行錯誤しなきゃいけないのにそこに先進的な取り組みを取り入れるとかするとさらに試行錯誤しなきゃいけなくなって、プロジェクトなんかだとリスクヘッジ考えるとまずやれない。その結果今回みたいに仕事に関係ないところで急に何かしようとすると毎回調査事項が多くなる。何か作りたいと思い立ったところでそもそも効果的な作り方がわかってないので短期間では何つくる力も無い、と、プログラマとしてはどんどん無能になっていくな。