俺は悪い子なんだ
注: この記事はそれなりにニッチです
使っているpythonパッケージに無い機能が欲しくてたまらなかった。
時に研究者は他人の使わないような物を用意せねばならぬのだ。
しかし、その機能はニッチなもで1プルリクしたって受け取られるわけがないのだ。
だからパッチを作成した。
自前patch?gitじゃ駄目なん?
ご存知の通り、UNIX系にはpatchというコマンドがある。これを用いる。
gitでいいけど、論文に「変な変更はしてないぽよ。差分はここだけぽよ。」って書きたかった(重要)。
作成手順
git diffをすることによって自分やった変更を出力できる。
だから、patchの作成のためだけにgitを使う。歴史を巻き戻せるのも良い。
というわけで、結局gitは使うのだけれどね。
まず、編集するために、使っているパッケージのソースコードの元に飛かねばならなかった。
仮想環境だろうがどこだろうが、ワンライナーで行ける。下記のhogeを書き換えて飛んでいった。
cd $(python -c "import hoge as target; from pathlib import Path; print(Path(target.__file__).parent)")
で、編集する前に、一応git管理しておく。
git init
git add *
git commit
git branch patch
git checkout patch
vim hoge.py
git add *はキャッシュまで含んでしまうかもなので、まぁ、そこは適切に。
僕はvimmerなのでvimで編集しているが、もちろんvimじゃなくていい。変更し終わったらdiffする。
mkdir ~/warui_patch
git diff > ~/warui_patch/complex.patch
これでパッチの作成は終了だ。
ソースコード
以下、さっきのパッチをパッケージに当てるためのシェルスクリプトだ。
下記ではmneパッケージに、さっき作成したcomplex.patchを当てている。
オプションをいくつかつけている。
- -R: パッチを戻す
- -p: 該当のパッケージのパスを表示する
- -h: ヘルプ
この、該当のパッケージのパスを表示するのは、僕が何か編集したい時に
cd $(sh ./patcher -p)
として、該当パッケージのもとにひとっ飛びできるようにするためのオプションだ。
当然仮想環境でも鉄の意志で飛んでいくぞ。
# !/usr/bin/env sh
OPT=$1
PACKAGE='mne'
PATCH='complex.patch'
make_python_path_code () {
echo "import $PACKAGE; from pathlib import Path; print(Path($1.__file__).parent)"
}
make_python_path () {
echo "$(python -c "$(make_python_path_code $1)")/"
}
patch_python () {
patch $OPT -u -p 1 -d $(make_python_path $1) < $2
}
if [ "$1" = "-h" ]; then
echo Patch script for python.
echo ========================
echo -h: Show this message
echo -R: Reverse patch
echo -p: Print script dir
exit
fi
if [ "$1" = "-p" ]; then
echo $(make_python_path $PACKAGE)
exit
fi
patch_python $PACKAGE $PATCH
感想
研究のためとはいえ、本当はパッケージの書き換えなんか、やりたくない。
辛い…(´・ω・`)
-
脳波をWavelet変換して複素数から絶対値の平均を算出し、脳内での脳波の大きさを推定したかったが、俺は絶対値の平均じゃなくて複素数が欲しかったのだ。平均しないぶんだけ、計算コストはヤバくなる。 ↩