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とはなんぞや¶
稲田さんのツイートによるとこうです。
https://twitter.com/methane/status/823442564556537857
要は pip
と virtualenv
(と requirements.txt
) をいい感じにラップしてくれるツールです。
インストール方法やどんなことができるか詳しくは Pipenv: 人間のためのPython開発ワークフロー を参照してください。
冒頭にある動画を見るとどんなことができるかイメージがつくと思います。
個人的Pipenvとの付き合い方¶
前述の通り、Pipenvは pip
と virtualenv
をいい感じにラップしてくれるツールなのですが、以下のルールで使用しています。
PIPENV_VENV_IN_PROJECT=true
にしてプロジェクトのディレクトリに.venv
を作成する$HOME
のようなプロジェクトのディレクトリ以外の場所にrequirements.txt
やPipfile
を残置しない困ったときは
pip
とvirtualenv
の使い方にならう
PIPENV_VENV_IN_PROJECT=true を設定¶
これを bashrc
などに設定しておくと、プロジェクトディレクトリ(~/projects/hoge
など)で pipenv install/shell
した時に ~/projects/hoge/.venv
となるように仮想環境を作成してくれます。
デフォルトの挙動だと /Users/<username>/.local/share/virtualenvs/プロジェクトのディレクトリ名+ハッシュ値
のように仮想環境名が決まるため、どこを指定すればいいのかわかりにくいです。これが PyCharm
や VSCode
で仮想環境を設定するときに面倒でした。
プロジェクトディレクトリに仮想環境が作成されることで、その欠点が解消できます。
Note
WORKON_HOMEを指定すると、指定した箇所にまとめて仮想環境を作成してくれます。
仮想環境を作成する場所をまとめたい時は export WORKON_HOME=~/.virtualenvs
などとするとよいです。
requirements.txt や Pipfile を放置しない¶
ホームディレクトリ ( $HOME
)に requirements.txt
や Pipfile
を放置していた結果、
個別のプロジェクトディレクトリ以下で pipenv install
するときに意図しないライブラリがインストールされました。
原因は $HOME
に放置していた pipenv
や Pipfile
を読み込んでいたからでした。
しかし $HOME
に置いていたファイルが影響するとは想定していませんでしたので、
プロジェクトのディレクトリ以外に requirements.txt
や Pipfile
を放置しないようにしました。
困ったときは pip と virtualenv に戻る¶
pipenv
に移行しましたが、「 pipenv
は pip
と virtualenv
をいい感じにしたい」から使っています。
なので個人的には、次のようにコマンドを置き換えて使ってる感じです。
virtualenvの場合 |
pipenvの場合 |
---|---|
virtualenv .venv |
pipenv install/shell |
souce .venv/bin/activate |
pipenv shell |
deactivate |
exit |
pip install
とかは普通に使ってますし、 requirements.txt
も現役です。
注意すべきところとして、 pipenv
はそれ自体で単体のツールではなく複数のライブラリを組み合わせて使用するものだということです。
何かトラブルが起きた時は最低限 pip
と virtualenv
の使い方が理解できていないとツラいかもしれません。
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
の問題なのか、それとも virtualenv
や pip
の問題なのかを切り分けて考えるとよいと思います。
実際どうなのよ¶
「普通に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¶
今のところ設定にはそんなにこだわっていないので、行数も割と少ないのかなと感じています。
# -----------------------
# 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>
を押すと解除されますが、忘れていたことにまた戸惑いそうなので設定。
stty stop undef # <C-s> によるターミナルロックを無効にする
SQLAlchemyとJupyterNotebookで遊んでみた話¶
SQLAlchemy触ったことはあるのですが、ふわっとした知識しかなかったので入門してみました。 (とはいっても2017年の12月ぐらいの話なのですが、供養のため公開しておきます)
資料は次のURLから閲覧できます。今回はその写経をJupyter Notebookでやった話です。
SQLAlchemyについて¶
先に上げた2つの資料を見るまでは、SQLAlchemyに対して次のような疑問やイメージを持ってました。
「ORMとして紹介されることがあるけど、単純にそれだけじゃない気がする。」
「DjangoのORMと比べるとなんでもできそうに見えるけど、どう学んだらいいかわからん。」
「ドキュメントどこ見たらいいかよくわからん」
資料をやり終えて少なくとも1つ目と2つ目の疑問はなんとなく解消し、3つ目もなんとか見れるようになったと思う。 個人的には「よくある誤解」のくだりが納得感がありました。
資料では事前準備としてSQLite版のDB(データ入り)の準備から説明されており、SQLAlchemyの構成する要素の説明、それを実際に手を動かして試していくハンズオンも含まれているのでスムーズに入門できました。困ったときは資料や公式ドキュメントに立ち返ろう。あとは実践だ。
0.6.5と古いものになるけど日本語訳のドキュメントもある。公式のURLと併せてメモしておきます。
写経した環境について¶
最初はREPLで写経していたんですが、「Jupyter Notebookを使用して写経すればよいのでは?」と後から気づきました。 コードとMarkdownによるメモと実行結果を同居できるのやっぱりいいですね。
ショートカット¶
https://twitter.com/kashew_nuts/status/942111252142219264
当方Vimは使えるので、 j, k, dd, <Esc>, <Tab>, <Ctrl+Enter>
などは雰囲気で使えていました。
しかし以下のコマンドモード(<Esc>を押したときのモード)のショートカットを使えるとかなり捗ったのでメモしておきます。
1: 「見出し1(大見出し)」で書き出す
2: 「見出し2(中見出し)」で書き出す
y: セルをコードモードに変更
m: セルをMarkdownモードに変更
Space: 下にスクロール
Shift+Space: 上にスクロール
a: セルを上に挿入
b: セルを下に挿入
コマンドモードで h を押すと、ショートカット一覧がでるので他のショートカットも気になる方はそちらもご覧ください。
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 も参照するとよいでしょう。