Pipenvに移行した話

Pipenv がPyPAに移ってからしばらく経ちました。 以前個人のPC環境は virtualenvwrapper を使用していましたが、折を見て自分も pipenv に移行しました。

理由は次の3つです。

  • virtualenvwrapper スクリプトが bash 起動を遅くする原因になっていた

  • Windows/macOS/Linux問わず同じように使いたかった

  • peco&ghq でのディレクトリの移動や管理に慣れてきた (peco&ghq に関する記事は探すと色々あったのでこの記事では割愛します。)

現在主に使う環境はこんな感じでやってます。

OS

macOS Sierra/Ubuntu 17.10

Python

3.6.x

pipenv

11.8.0

Pipenvとはなんぞや

稲田さんのツイートによるとこうです。

要は pipvirtualenv (と requirements.txt) をいい感じにラップしてくれるツールです。 インストール方法やどんなことができるか詳しくは Pipenv: 人間のためのPython開発ワークフロー を参照してください。

冒頭にある動画を見るとどんなことができるかイメージがつくと思います。

個人的Pipenvとの付き合い方

前述の通り、Pipenvは pipvirtualenv をいい感じにラップしてくれるツールなのですが、以下のルールで使用しています。

  • PIPENV_VENV_IN_PROJECT=true にしてプロジェクトのディレクトリに .venv を作成する

  • $HOME のようなプロジェクトのディレクトリ以外の場所に requirements.txtPipfile を残置しない

  • 困ったときは pipvirtualenv の使い方にならう

PIPENV_VENV_IN_PROJECT=true を設定

これを bashrc などに設定しておくと、プロジェクトディレクトリ(~/projects/hoge など)で pipenv install/shell した時に ~/projects/hoge/.venv となるように仮想環境を作成してくれます。

デフォルトの挙動だと /Users/<username>/.local/share/virtualenvs/プロジェクトのディレクトリ名+ハッシュ値 のように仮想環境名が決まるため、どこを指定すればいいのかわかりにくいです。これが PyCharmVSCode で仮想環境を設定するときに面倒でした。

プロジェクトディレクトリに仮想環境が作成されることで、その欠点が解消できます。

Note

WORKON_HOMEを指定すると、指定した箇所にまとめて仮想環境を作成してくれます。 仮想環境を作成する場所をまとめたい時は export WORKON_HOME=~/.virtualenvs などとするとよいです。

requirements.txt や Pipfile を放置しない

ホームディレクトリ ( $HOME )に requirements.txtPipfile を放置していた結果、 個別のプロジェクトディレクトリ以下で pipenv install するときに意図しないライブラリがインストールされました。

原因は $HOME に放置していた pipenvPipfile を読み込んでいたからでした。 しかし $HOME に置いていたファイルが影響するとは想定していませんでしたので、 プロジェクトのディレクトリ以外に requirements.txtPipfile を放置しないようにしました。

困ったときは pip と virtualenv に戻る

pipenv に移行しましたが、「 pipenvpipvirtualenv をいい感じにしたい」から使っています。 なので個人的には、次のようにコマンドを置き換えて使ってる感じです。

virtualenvの場合

pipenvの場合

virtualenv .venv

pipenv install/shell

souce .venv/bin/activate

pipenv shell

deactivate

exit

pip install とかは普通に使ってますし、 requirements.txt も現役です。

注意すべきところとして、 pipenv はそれ自体で単体のツールではなく複数のライブラリを組み合わせて使用するものだということです。 何かトラブルが起きた時は最低限 pipvirtualenv の使い方が理解できていないとツラいかもしれません。

2018/03/15時点での依存関係は次のとおりです。

(test)kashewnuts@ubuntu:test$ pipenv graph

pipenv==11.8.0
  - certifi [required: Any, installed: 2018.1.18]
  - pip [required: >=9.0.1, installed: 9.0.1]
  - setuptools [required: >=36.2.1, installed: 38.5.2]
  - virtualenv [required: Any, installed: 15.1.0]
  - virtualenv-clone [required: >=0.2.5, installed: 0.3.0]

触り始めの pipenv==8.2.x と比べて依存するライブラリが必要なものに絞られてきて、いい感じになってきました。 しかし、 virtualenv+pip をラップして使うため予期せぬ不具合を踏むこともあります。 そんなときは pipenv の問題なのか、それとも virtualenvpip の問題なのかを切り分けて考えるとよいと思います。

実際どうなのよ

「普通にvirtualenv/venv+pip使えばいいじゃん」という方には不要なものだと思います。

個人的には結構便利です。ただ慣れるまでハマりどころはあるかもしれません。

virtualenvwrapper が担っていていたプロジェクトへの移動を peco&ghq でできるようにしたので、 pipenv にそれ以外のところを任せられてる感じです。

Pythonに限った話だと virtualenvwrapper の方が「仮想環境の管理」+「自動activate」とセットで機能が提供されているので楽でした。 workon projectname で「自動activate」+「プロジェクトディレクトリへの移動」なんかもできましたし安定していました。

しかし「 .env ファイルを自動で読み込んでくれると嬉しいな」とか、Windows/macOS/Linuxと共通の手順で導入できるし、 peco&ghq を活用すればディレクトリの移動もお楽にいけそうだと思ったので、「個人でよしなにやるプロジェクトなら pipenv の組み合わせでいいかー」と思い移行することにしました。

今のところ個人の環境でしか試してないので、本番環境で運用したりしてる人はどうしているのかなとは気になりますね。

tmux導入メモ

自宅PC環境でLinuxデスクトップを導入するのに合わせて、tmuxを使うようになったので自分用にメモ。

使い方

tmuxを使い始めたので基本的な機能の使い方とかを整理してみた - 完熟トマト を熟読した。自分の使っている環境をイメージできるくらいには読んで試しておさえてみました。

tmux.conf

今のところ設定にはそんなにこだわっていないので、行数も割と少ないのかなと感じています。

~/.tmux.conf 設定
# -----------------------
# Basic Config
# -----------------------
# <prefix>キーを<C-b>から<C-s>に変更
unbind C-b
set -g prefix C-s
bind-key C-s send-prefix
# 256カラー&バッファスクロールを有効化
set -g default-terminal screen-256color
set -g terminal-overrides 'xterm:colors=256:smcup@:rmcup@'
# Escapeキーを押したときの遅延をなくす
set -sg escape-time 0
# マウスを有効化
setw -g mouse on
# ヒストリのサイズを大きくする
set -g history-limit 5000
# インターバルの間隔を空けておく
set -g status-interval 10
# ステータスラインを変更
set -g status-right '"#H" %Y-%m-%d(%a) %H:%M'

# -----------------------
# プラグイン設定
# -----------------------
# tmuxのplugin manager
set -g @plugin 'tmux-plugins/tpm'
# PCを再起動してもセッションを復帰できるようにする
set -g @plugin 'tmux-plugins/tmux-resurrect'
# tmux-resurrectを自動で操作する
set -g @plugin 'tmux-plugins/tmux-continuum'
# tmuxのヤンクをOSのクリップボードと共有する
set -g @plugin 'tmux-plugins/tmux-yank'
# tmux実行時に自動的セッションをリストア
set -g @continuum-restore 'on'

# tmuxのプラグインマネージャーを有効化
run '~/.tmux/plugins/tpm/tpm'

設定を変更したら <prefix> + d でデタッチした後、 $ tmux source ~/.tmux.conf で反映させます。

tmuxのprefixキーをどうするのか問題

前提としてVimのキーバインドに影響を及ぼしたくないので、tmuxデフォルトのprefixである <C-b> は変更する必要がありました。

そこでまずVimで <Ctrl> キーを使う操作は何があるか調べました。 GitHubのdotfilesを見たり、Twitterを眺めたりしているといくつか候補は挙げられていましたが、 実質的に候補となるのは次の3つしかありませんでした。

  • <C-j>

  • <C-k>

  • <C-s>

この中で自分が選択できたのは <C-s> です。 前の2つはすでにVimのプラグインや、pecoのキーバインドとして設定していたからです。

既存の設定をつぶしてよければ <C-a>, <C-t> が押しやすそうではありましたが、 ターミナルでの移動やVimのタグスタックの使用に影響がでるので断念。

いざ <C-s> に設定してみたところ、どこにもぶつかってないようなのでいい感じです。 (Emacsのことは知らないのですが、自分の知ってるEmacs使いはターミナル上でEmacsは使わないらしいので問題なさそう)

prefixを設定するにあたり Vim で使える Ctrl を使うキーバインドまとめ - 反省はしても後悔はしない はすごく参考になりました。 @c0hama さんありがとうございます。

prefixキー変更に伴い端末ロックを無効化

ターミナルで <C-s> を押すと、ターミナルの出力がロックされました。 しかし出力がとまっているだけで、キー入力自体は受け付けていて紛らわしいので無効化しておきます。 無効化しなくても <C-q> を押すと解除されますが、忘れていたことにまた戸惑いそうなので設定。

~/.bashrc 設定
stty stop undef   # <C-s> によるターミナルロックを無効にする

所感

CLIのツールを導入するときはGUIのツールとは別の覚えることがあるけど、自分の手にしっくりくるようにいじれるのがいいよなーと。 ただ設定やプラグインは必要なものに絞っておかないと余計なところにハマったりするので、そのへんはよしなにしたいところです。

SQLAlchemyとJupyterNotebookで遊んでみた話

../../../_images/sqlalchemy.png

SQLAlchemy触ったことはあるのですが、ふわっとした知識しかなかったので入門してみました。 (とはいっても2017年の12月ぐらいの話なのですが、供養のため公開しておきます)

資料は次のURLから閲覧できます。今回はその写経をJupyter Notebookでやった話です。

動作環境

  • Python 3.6.3

  • SQLAlchemy==1.1.15

  • jupyter==1.0.0

SQLAlchemyについて

先に上げた2つの資料を見るまでは、SQLAlchemyに対して次のような疑問やイメージを持ってました。

  • 「ORMとして紹介されることがあるけど、単純にそれだけじゃない気がする。」

  • 「DjangoのORMと比べるとなんでもできそうに見えるけど、どう学んだらいいかわからん。」

  • 「ドキュメントどこ見たらいいかよくわからん」

資料をやり終えて少なくとも1つ目と2つ目の疑問はなんとなく解消し、3つ目もなんとか見れるようになったと思う。 個人的には「よくある誤解」のくだりが納得感がありました。

資料では事前準備としてSQLite版のDB(データ入り)の準備から説明されており、SQLAlchemyの構成する要素の説明、それを実際に手を動かして試していくハンズオンも含まれているのでスムーズに入門できました。困ったときは資料や公式ドキュメントに立ち返ろう。あとは実践だ。

0.6.5と古いものになるけど日本語訳のドキュメントもある。公式のURLと併せてメモしておきます。

写経した環境について

最初はREPLで写経していたんですが、「Jupyter Notebookを使用して写経すればよいのでは?」と後から気づきました。 コードとMarkdownによるメモと実行結果を同居できるのやっぱりいいですね。

ショートカット

当方Vimは使えるので、 j, k, dd, <Esc>, <Tab>, <Ctrl+Enter> などは雰囲気で使えていました。 しかし以下のコマンドモード(<Esc>を押したときのモード)のショートカットを使えるとかなり捗ったのでメモしておきます。

  • 1: 「見出し1(大見出し)」で書き出す

  • 2: 「見出し2(中見出し)」で書き出す

  • y: セルをコードモードに変更

  • m: セルをMarkdownモードに変更

  • Space: 下にスクロール

  • Shift+Space: 上にスクロール

  • a: セルを上に挿入

  • b: セルを下に挿入

コマンドモードで h を押すと、ショートカット一覧がでるので他のショートカットも気になる方はそちらもご覧ください。

参考リンク: Jupyterのショートカットキー一覧を調べてみた - Qiita

Jupyter Notebookをどこで動かすか問題

写経するたびにJupyter Notebookの環境用意するのが面倒だなと感じてしまいました。

  • 1つJupyter Notebook用の仮想環境を用意して、そこにライブラリを全部突っ込むようにすると動かないときが面倒そう。

  • Jupyterをグローバルな環境に突っ込むのは依存ライブラリが多すぎて問題になりそうだから避けたい。

  • 新しくJupyter Notebookの環境を作るたびにnbextentsionを都度設定するのダルい

といろいろ考えたのですが、NotebookはNotebookでも Azure Notebook が良さそうだという結論になりました。

  • 無料で使える(少なくとも現時点は)

  • Python3系に対応してる(現状は3.5と3.6をサポート)

  • ほしいライブラリは !pip install hogehoge できる

という点だけで十分使えそうだと判断しました。

対抗馬としてGoogleの Colaboratory があったのですが、参考リンクにあるように、次の理由から

  • 現状ではPython2.7にしか対応していない (Python3使いたい) →Python3対応してた

  • 最新すぎて公開されている情報が少なすぎるため、困った際に検索しても解決策が出てきにくい。

  • 現段階では申し込みをする必要があり、即時使用はできない。

  • キーボードショートカットが違いすぎる

気になる方は Colaboratory/FAQ も参照するとよいでしょう。

まとめ

  • 手を動かす環境をつくるの大事

  • SQLAlchemyべんり。DB操作フレームワークという表現に納得した

  • JupyterNotebookも活用しよう