深酒とお昼寝で忘れる

深酒とお昼寝で忘れる

素面でも意図したことを忘れがちなしらふいとさんは、忘れる前に何かしら書き残せたらとても満足のようです

Vim で :cstag の検索順を変更できますか

できます。C や C++ 言語のプログラムを読み書きするときに活躍する ctagscscopeVim で、どちらか一方でなく両方とも使いたいという欲張りな人が使うコマンドが :cstag です。:cstag はまず cscope のデータベースを検索し、マッチしなかったら ctags のタグファイルを検索してくれるという優れもの。set cscopetag:tagCTRL-] などが :tag でなく :cstag を使うようになります。

今日は :cstag の検索順を入れ替えたいなーと思ったのでどう設定するかを調べました。結果、cscopetagorder というオプションが 0(デフォルト値)のときは先に cscope の検索を行い、1 のときに逆順になることが分かりました。ということで set cscopetagorder=1 しましょう。

AeroPress か Minipresso か、それが問題だ

自宅や旅行先でも美味しいコーヒーが飲みたいというのは万人の願いだと思います。ということでそんな人々の強い味方である二つの商品を紹介したいと思います。

AeroPress

Wikipedia のエントリが こちらWikipedia にも項目がありますが、うちでは Inverted Method(倒立法)という淹れ方を用いています。"AeroPress" “Inverted Method” などのキーワードで YouTube を検索すると沢山 動画 が出てきます。(宣伝文句は『エスプレッソの濃さの』)強めの美味しいコーヒーが手軽に淹れられます。おすすめ。

エアロプレス コーヒーメーカー

エアロプレス コーヒーメーカー

Minipresso

こちらはまだ Wikipedia にエントリがない模様。AeroPress と同様 YouTube に沢山 動画 があります。美味しいエスプレッソが手軽に淹れられます。オススメ。

比較とまとめ

ものとしては Minipresso の方が AeroPress よりも複雑だけれども、インターフェースはより直感的です。Minipresso はシングルショットのエスプレッソライクな飲み物に特化している一方で AeroPress は粉の量を調節したり通常の方法や倒立法で淹れる、といった自由さがあります。両方とも後片付けはそれなりに簡単ですので、毎日何回か淹れるのもそれほど苦ではないと思います。どちらか一つを選ぶと言うなら、コーヒーは普通にハンドドリップやコーヒーメーカーでも淹れられるので、少し値は張るけれどエスプレッソが淹れられる Minipresso の方がおすすめかなー。とはいえ、淹れられるコーヒーの種類がそもそも違うので単純に好みの問題な気もします。どちらも良いものです。ぜひお試しあれー。

GNU Parallel という名の簡易ジョブスケジューラ

世間ではジョブスケジューラと聞くと具体的に何を思い浮かべる人が多いんでしょう。(HT)Condor や Torque のような共有計算機におけるジョブスケジューラや、Mesos、Omega や Borg のようなクラウド上の大規模クラスタスケジューラ?シンプルに OS のプロセス(タスク)スケジューラや、はたまた cron だったり、しますかね?いや、きっとジョブスケジューラなんて単語は聞いたことがない人がほとんどなんでしょう……。はい。今日は手元にある計算機の CPU リソースを存分に使いたおしつつ、たくさんのジョブをバッチ的にスケジューリングしたいときに役立つ GNU Parallel (以下 Parallel)の紹介をします。

Parallel は複数のジョブ(コマンドやスクリプト)を複数の CPU コアで並列に実行しくれるツールで、実は(あまり知られていない気がしますが)簡易ジョブスケジューラとして使うことができます。本家 manEXAMPLE: GNU Parallel as queue system/batch manager というところに簡単な例が書いてあって、いきなりですがこんなコマンドを実行します。

$ true > jobqueue; tail -n+0 -f jobqueue | parallel

jobqueue というファイルが実行するコマンドのキューになります。Parallel はファイルを読み終わったら終了してしまうので、tail -f をパイプに流し続けることで実行しっぱなしにします(-n+0 はなくても同じだと思うけど man に書いてあるとおりにしときます)。この状態で、jobqueue ファイルに実行したいコマンドをどんどん追記していきます。

$ echo "my_great_program"                 >> ./jobqueue
$ echo "my_great_program_with_args a b c" >> ./jobqueue
$ echo "bash my_great_shell_script.sh"    >> ./jobqueue
   :

そうすると jobqueue に実行するジョブが書き込まれる度に Parallel が空いてる CPU コアで実行してくれます。空いているコアがない場合は実行を待ってくれるので、キューには好きなだけジョブを書き込んで大丈夫です。便利ですね。

手元では 4 コアのマシンを使っていてそのうち 2 コアだけを処理に使いたい、てなこともあるでしょう。その場合は Parallel に -j+N オプションを渡すことで使う CPU コア数(N)が指定できます。

$ true > ./jobqueue; tail -n+0 -f ./jobqueue | parallel -j+2

デフォルトでは(たぶん)システムが搭載している数の CPU コア($ parallel --number-of-cores)が全部使われる気がします。

これだけでも結構使いどころはある気がしますが、もう少し。ローカルのマシンに加えて ssh 接続できるマシンが何台かあって、それらも使いたいとします。ローカルのマシン名を local_machine、ssh 接続するリモートのマシン名を remote_machine_alpha、remote_machine_beta とします(注意点として、各マシンはパスワードなしで ssh 接続ができる必要があります)。この場合、下記のようなファイルを用意します。ファイル名は my_machines としましょう。

2/local_machine
4/remote_machine_alpha
8/remote_machine_beta

2、4、8 というのはそれぞれのマシンで使用したい CPU コア数です。Parallel は下記のように --sshloginfile オプションを用い上記ファイルを指定して起動します。

$ true > jobqueue; tail -n+0 -f jobqueue | parallel --sshloginfile my_machines

このようにすることで、合計 14(2+4+8)の CPU コアをフルに使ってジョブを並列に実行することができます。どのジョブをどのマシンで実行すれば良いかといった面倒くさい処理は全部 Parallel がよきに計らってくれるわけです。とっても便利ですね!