zsh, plenv(rbenv), parallel
読むべき人
- .zshrcに export PATH を全部書いてる人
- .zshrcの中で eval (plenv init -) をやってる人
- .plenv/shimsを明示的に$PATHに追加してない人
どれか当てはまったらいつかハマるかも.
の助けになるかも.
って人も助かるかも.
GNU parallelを使って並列処理する機会がありハマったのでめもしておきます.
問題
zshの設定ファイルには.zshenv, .zprofile, .zshrc等がありますが,それぞれ読まれ方が違います.
参考:http://news.mynavi.jp/column/zsh/001/index.html
zsh hogehoge.sh
とかやった場合は.zshenvしか読まれないようです.
ここで気になるのはPATHがどうなるかですが,.zshenvに書いてなければ当然exportされません.
通したはずのPATHが通ってない!と困ることになります.
また perl の error では @INC に module への path がないよ!みたいな感じになります.
あと plenv を init する際に plenv の perl の path が export されるので,.zshenv に plenv init を書いてる人は問題が起きません.
sub CMD_init { home_init(); print <<"..."; export PATH="$PLENV_HOME/shims:\${PATH}" ... }
ただし.zshenv が読まれるたびに plenv init するのでオーバーヘッドが気になります.
oh-my-zsh 使ってると oh-my-zsh バージョンチェックのために zsh コマンドを使っていてそのタイミングでも plenv init するので余計気になります.
(そもそもoh-my-zshをマニュアル通りにインストールして使おうとすると .zshrc 読まないと .zshenv の内容読めないような気がするんだけどどうなんだろう…)
解決
- zsh の設定ファイルがそれぞれいつ読まれるのか把握する
- .plenv/shims も $PATH に入れとく
- export PATH を .zshenv に書く
- plenv init は .zshrc に書く
いろいろ試した結果これがいいかなあと思います.
2013-07-04追記
tmux使ってて新しいタブ開くと.zshenvが二回読まれててなんだろなとおもってたんですが,.tmux.confで
set-option -g default-command "reattach-to-user-namespace -l zsh"
としてzsh起動してました.
謎が解けた.
2013-07-08追記
まったく意識せずに書いてましたが私の環境では plenv を homebrew で入れてます.
なので
`brew --prefix`/bin
に plenv 自体のシンボリックリンクがある状態です.
git clone git://github.com/tokuhirom/plenv.git ~/.plenv
した場合には,.zshenv か .zshrc の plenv init する前に
export PATH=$HOME/.plenv/bin:$PATH
を書いとかないと login 時に plenv 自体が見つからずに init できませんので注意が必要です.
2013-07-31追記
Qiitaにもあげときました
http://qiita.com/rg_gs/items/5795fa777cac90d1359b
Arkのルーティング
Arkのルーティングが分かったっぽい
ずっとChained()の意味がわかってなかった
とりあえず目的は
# /job/{job_id}/job_edit
みたいなルーティング.
この時,まず'/'から'job'にChainする
# /job/{job_id} sub job :Chained('/') :PathPart('job') :CaptureArgs(1) { my ($self, $c, $job_id) = @_; $c->stash->{job_id} = $job_id; }
CaptureArgs()はパラメータ{job_id}を取ってくる.
引数はパラメータの数.
本題.
# /job/{job_id}/job_edit sub job_edit :Chained('job') :PathPart('job_edit') { my ($self, $c) = @_; }
jsのif文
if (i > 0) { j = true; } else { j = false; }
j = i > 0 ? true : false;
同義らしい.