メインコンテンツまでスキップ

開発小ネタ

bash の history をすべて保存する

ターミナルを複数開いていると、入力の履歴が保存されなくなる。それを回避する方法があった。.bashrc に下の行を追加するだけ。

export PROMPT_COMMAND='history -a'

これデフォルトで良い気がするけど後方互換性とかの問題でなってないのかしら。fzf と組み合わせれば無敵になれる。

VS Code の Pylance で外部モジュールの import でエラーが出る

いつかのアップデートで、 VS Code で Pylance が zero configuration で使えるようになった。今回 luigi を使ったら

Import "XXX" could not be resolved

のエラーを出していた(requests ではなぜか問題なかった)。これは Python のインタープリタをそのプロジェクトの仮想環境のインタープリタに設定することで解消できる( 参考記事)。けどそうすると integrated terminal を開くときに自動で仮想環境のターミナル開かれるので history が残らない。設定で "python.terminal.activateEnvironment": false にすれば通常のターミナルが開くようになる。

Luigi で luigi.Task の名前が衝突する

これは超ハマった。別々のファイルで同名のタスク(ここでは MyTask とする)を作成して、親でそれぞれ import して実行すると失敗する。しかも表示されるエラーの内容は

Unfulfilled dependencies at run time: MyTask()

だけなので何が原因なのかの手がかりが無くデバッグの初手で非常に手こずった。しばらく試行錯誤して、どうやら名前が衝突しているらしいことがわかり luigi.task.py のコード内で namespace を検索したらそれっぽい関数があった。この関数を見て、そういえばドキュメントを流し読みしたときそんなこと書いてあったような、と思い出してドキュメントを読み返したら書いてあった。けど luigi.task.auto_namespace() については書いてないのでやはりちょっと不親切。少なくとも実行時のエラーはもうちょっとわかりやすいものを返してほしい。

commit を squash する

仕事での開発は Mac なので Git のクライアントには Sourcetree を使っている。 Sourcetree だとコミットグラフ上で右クリックして Rebase children of ~ interactively を押すと GUI 上で便利に squash できるのだが、個人開発は Linux で行っていて Sourcetree の Linux 版は無い。なので練習として CLI でしばらくなんとかやってる。コミットグラフは GitLens が無料で使えるのでそれで見ている。

つらくなったら Ungit を使用うことを検討している。 GitHub はほぼバックアップとしてしか使っていないので GitKraken も無料で使えて良いかもしれない

CLI で commit を squash するには、

git reset --soft HEAD~1  # HEAD~ のあとの数値は任意

をやるとできる。ただ、別 branch を作って checkout せずにやってしまうと undo できないので緊張感がある。

ブランチを「切る」

完全に余談だが「ブランチを切る」という表現を初めて聞いた時に、文脈的にはブランチを作成することを指しているんだけど、樹木の枝打ちの場面が脳裏に浮かんで混乱した。「ブランチを生やす」と「ブランチを切る」が同じ意味なのすごい。誰がこの表現を最初に使い始めたんだろうか & いつごろから市民権を得たんだろうか。