Chienomi

Multi-machine utils

開発::util

Multi-machine utilsは私がローカルで複数マシン運用をするために使っているプログラムをまとめたものである。

複数マシン運用はファイルシステムやクラウドドライブの設定、リポジトリでのシェアなどシステム構築による割合が大きいが、複数マシンでの作業を想定したプログラムも使用している。 例えばMy Browser Profile Chooserとプロファイルの共有、AtnowとRedNotebookを使う前提での日記データの共有など。

そして、従来GitHubでの公開のなかったEncFSツールリポジトリ同期ユーティリティ、そしてゲームプレイ動画の変換に使っているスクリプトが第一弾として含まれている。 これらを一般化したものだ。

今後、よく使っているが公開していないものが見つかったら追加予定だ。

Auto EncFS, Repos util

share-central-repoは複雑なシェルスクリプトだ。

スクリプトの中で最も複雑なrepos-checker.bashに関しては以前の記事で詳しく解説している。

このプログラムのポイントは、複雑なYad、Bashの関数エクスポート、keyring(python-keyring)を用いたGnome Keyring/KWalletの利用といったところになるだろう。

従来の版との大きな違いとしては、MercurialだけでなくGitに対応していることである。 環境変数を使うが、混在する場合、リポジトリパスの後ろに@@@GitとつけるとGitであると認識される。

手順を日本語で:

  1. 実行ファイルをパスにコピー
  2. keyring set localencfs <キー名>で鍵をセット
  3. encfs-sample.desktop~/.local/share/applications/にコピーしてリネーム
  4. リネームしたファイルのExec行を編集。引数は「キー名」「EncFSディレクトリ」「マウントポイント」
  5. マウントするものがリポジトリであるならば、open_encfs.zshの代わりにrepos-treat.zshを使用する
  6. 登録した.desktopファイルを自動起動に入れる。ディレイを入れるのがおすすめ

当然だけど、なにより最初にマウントしようとするEncFSディレクトリを作っておかないと成立しない。

ffmmr (multimuchines-ff-rinda)

概要

大量に動画データの変換を行うときに複数マシンで並列変換ができるようにしたもの。 「大量に」であるのは、単体動画処理における終了時間が早い・遅いにフォーカスしているわけではなく、何日もかかるような処理、例えば20日かかる変換処理が10並列になることで2日で終わる、というような使い方を前提としたものである。

libx265の場合、複数並列処理はあまりおすすめできない(遅い上に失敗することがある)ことから、主にlibvpx-vp9による変換を意識している。 もっとも、並列処理でないとしてもファイル名の指定などの手間が省けるため悪くない。

これはRindaによるキューを用いたもので、Rindaの活用として何度か解説している。

今回公開するにあたって

  • 複数ホストの分散時のIPv6エラーの解消
  • スクリプト本体でなく設定ファイルを置く形に変更
  • ffmpegオプションやフォーマットの指定が可能
  • ファイル名変換オプションの追加
  • サーバーアドレスやポートなど、スクリプト埋め込みの値を設定可能に
  • 処理クラスタからの脱退が可能に

といった変更を加えた。 実際のところ各フォルダにハードコーディングで置くものからの大変更である。 この変更は公開するためというのもあるが、やるゲームが増えてコードや調整が大変になってきたのと、いくつかの不具合があったことから修正したかったというのもある。

概念的にも変更が加えられており、「作業ルート」にmmffr.yamlファイルを配置し、同ディレクトリ上でffmmr-ts.rb, mmffr-q.rbまたはmmffr-qc.rb, mmffr-run.rbを実行するというものになっている。 mmffr.yamlは全項目埋める必要がある。

設定

設定項目はREADMEを読んでもらうといいだろう。 説明だけではわかりづらいため、exampleも書いてある。

codecの指定があるため、ffmpegのコマンドを打てる人でないと難しいだろう。 もっとも、codecの設定をそのまま流用しても問題はあまりない。 私が使っているlibvpx-vp9の場合の設定は

- "-c:v"
- libvpx-vp9
- "-r"
- "60"
- "-crf"
- "42"
- "-c:a"
- libopus
- "-b:a"
- 128k

となっている(extwebm)。

if-filterはNICを選択するものであると同時に、IPv4/IPv6を選択するものでもある。 IPv4に固定する場合、192.168.1.*のように設定する。 これが何になるかはip addrと打てば分かる。

NICの選択というのは127.0.0.1(ループバックインターフェイス)ではなく外につながっているNICということを示しているが、それは192.168.1.10192.168.2.10というふたつのインターフェイスを持つようなホストにおいてインターフェイスを選択するという意味でもある。

注意点として、これは並列実行する全てのホストで共有される値であり、if-filterの値は全てのホストで通用するものでなくてはいけない。

IPv4アドレスのフィルターを書いた場合、自動的にIPv4が使われる。 IPv6アドレスを使う場合はより重要な値で、リンクローカルユニキャストアドレスを使う場合はfe80:*、ユニークローカルユニキャストアドレスを使う場合はf[cd]??:*のように書くことになる。

複数のインターフェイスがあり、いずれにもIPv6アドレスが設定されているケースは、全ホスト共通の値を設定するのは難しいかもしれない。 その場合、~/.config/reasonset/mmffr.yamlに設定すると良い。このファイルは作業ルートのmmffr.yamlの設定を上書きするため、有効なのはif-filterだけだが、ホスト別の設定が可能。

なお、簡単なツールという扱いのため 設定値の妥当性の検証は行わない。なので設定が不正だと単純におかしくなる。

クラスタからの脱退

作業ルート上のmmffr-stopというファイルにホスト名を書くことで次のファイルをtakeせずに終了する。 これは結構便利な機能だ。

例えば

$ hostname
barclient

であるならば、このファイルに

barclient

と書いておけばいい。

ファイルパス変換

私が使っている環境上、対応しているファイル名はRadeon ReLive, OPPO Screen recorderだけである。 他のファイル形式に対応してほしい場合、issueを立ててもらえれば対応できるだろう。