深酒とお昼寝で忘れる

深酒とお昼寝で忘れる

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

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 がよきに計らってくれるわけです。とっても便利ですね!

tail -f を grep できますか

できます。grep--line-buffered を渡しましょう

$ tail -f file | grep --line-buffered pattern

重い腰を上げて Atom ことはじめ − LaTeX 環境設定編

もう随分長いこと、文章やコードを書くときは Vim というテキストエディタ(以下エディタ)のお世話になっています。良い感じに手に馴染んでおり大きな不満はないけれど、ときどきは世間の流行りが気になるものです。もっと良いものあるんじゃないかな?って。

巷では Sublime TextAtom というエディタが注目されている模様。2017 年になったし心機一転、ブログでも始めるついでに新しいエディタをさわってみることにしました。まずは、日頃から少し不満を持っていた LaTeX 文書の作成を Atom でトライ!

目標としていたのは:

です。少し試してみて、まあまあいけるかな、っていう感じにはなりました。ちなみに計算機の環境は Mac で OS は El Capitan (10.11.6) です。

とりあえず Atom の設定

まずは Atom をインストールします。バージョンは 1.12.7 でした。少しだけ設定をいじります。

  • 行間が開きすぎかなーと思ったので、Settings => Editor => Line Height1.5 から 1.3
  • なんとなくおしゃれになる気がしたので、Settings => Editor => Show Indent Guide を有効に
  • Ctrl-TabCtrl-Shift-Tab の挙動が気にくわなかったので、keymap.cson (Atom => Keymap...) に下記を追加。何をしているかは ここ を参照
'body':
  'ctrl-tab ^ctrl': 'unset!'
  'ctrl-tab': 'pane:show-next-item'
  'ctrl-shift-tab ^ctrl': 'unset!'
  'ctrl-shift-tab': 'pane:show-previous-item'

本題ではないのでとりあえずこれくらいにしておきます。

LaTeX 用にカスタマイズ

LaTeX 環境はもともとインストール済み。MacTeX (なんか .pkg が 3GB くらいあるやつ)を毎年インストールしてます。気が向いたら $ sudo tlmgr update --self --all としてパッケージの鮮度を保ってます。

さて。Atom には下記のパッケージをインストールしました。

latex

文書のコンパイル担当。競合パッケージとして latex-pluslatextools があるようです。latex-plus が一番センスが良さそうな気がしたけど latex を選択。理由は後述。

pdf-view

Atom 内の PDF 表示担当。Vim ではこれができないので憧れてました。SyncTeX もちゃんとサポートされています。PDF ビューワ内をクリックまたはダブルクリック(pdf-viewSynTeX Reverse sync behavior で設定)すると Tex ファイルの該当個所に (backword search)、Tex ファイル内で Ctrl-Opt-S (Latex: Sync) することで PDF の該当箇所に (forward search。こちらは latex の機能) 飛びます。

autocomplete-bibtex

最初からインストールされている補完パッケージ autocomplete-plus 用の BibTeX autocomplete provider(と書けば良いのかな)。ちょっと設定にてこずりました。

config.cson (Atom => Config...) に下記を追加。

"autocomplete-bibtex":
  bibtex: [
    "FULL_PATH_TO_YOUR_BIBTEX_FILE1"
    "FULL_PATH_TO_YOUR_BIBTEX_FILE2"
     :
  ]
  resultTemplate: "[key]"
  scope: ".text.tex.latex"

@example という風に @ キーをトリガーに続けてタイプしていくと候補を絞ってくれます。 resultTemplate の設定はお好みで。\\cite{[key]} とかする手もあるけど \cite{} 内に複数の key を書くことはよくあるのでとりあえず [key] にしました。

latexer

これまた補完担当。\ref{ とかタイプすると候補を出してくれたり(参照)、\begin{itemize} とかして改行したら勝手に \end{itemize} を挿入してくれたり(環境)、\cite{ とかタイプすると候補を出してくれたり(引用)します。引用の補完には上記の autocomplete-bibtex を使うので、Settings 内の Autocomplete citations は無効に。

linter-chktex

LaTeX 用の Linter。chktex というのが LaTeX 文法の静的チェックをしてくれるツール(存在を今まで知らなかった)。

language-latex

LaTeX シンタックスのハイライト担当。

リアルタイムプレビュー(自動保存と自動コンパイル

さてあとはもう少し。文書を作成していて、自分でファイルを保存してコンパイルしないと更新された PDF を確認できないのって面倒くさいですよね。更新はリアルタイムに裏で勝手にやってほしい。つまり編集したそばからファイルが自動で保存されて、自動でコンパイルされる、という機能が必要です。ちなみに Vim のときは下記のように実現していました。

Atom でも同等のことを実現したいので少し調べてみました。自動保存に関しては最初から autosave というパッケージがインストールされており、これを有効にしてみたものの思ったような動作ではなかったので同種のプラグインを色々(autosave-plusatom-idle-autosave など)試してみたところ autosave-onchange というパッケージが所望の動作をすることが分かりました。自動コンパイルに関しては latex パッケージにだけ Build on Save というドンピシャなオプションが用意されていました(これが latex にした決め手)。

はい。autosave-onchange パッケージをインストールして latex パッケージの Build on Save を有効に。これでリアルタイムプレビューができるようになりました。

まとめ

AtomLaTeX、結構良いですね。今年はこれで頑張ってみましょう。