ForkLift でファイル比較に CompareMerge を使う

先日ファイルマネージャとして ForkLift を導入した。2ペイン型のファイラで、SFTP や SMB に加え各種クラウドストレージもローカルと同じように操作できる。

ファイルの比較には FileMerge, Kaleidoscope, Beyond Compare, Araxis Merge が使えるが、次の理由で CompareMerge を使うことにした。

  • FileMerge は非 ASCII 文字を含むファイルを開くといちいち警告を出してくるため実用的でない
  • Kaleidoscope は試用してみたところ行間が広めの値で固定されており、一度に情報をたくさん表示するのに向いていない

さてここで問題は設定に CompareMerge が用意されていないことだが、 Kaleidoscope の呼び出しがコマンドラインツールから行われているのでこれを利用する。すでに Kaleidoscope のコマンドラインツールを使用している場合は使えないので注意

Kaleidoscope のコマンドラインツールは /usr/local/bin/ksdiff にインストールされる。なのでこれを CompareMerge を起動するスクリプトに置き換えてやればうまくいく。CompareMerge の起動には open コマンドを使うとコマンドラインからファイルを指定することができた。

したがって次の内容で /usr/local/bin/ksdiff を作成し、 ForkLift の Compare Tool の設定を Kaleidoscope にすればよい。

#!/bin/sh
open -a /Applications/CompareMerge.app "$@"

f:id:scientre:20200513161727j:plain

xargs の使い方メモ

たまにしか使わないで済んでいるのでいつも使い方を忘れる。

基本

コマンドの出力をパイプで渡すと、各行をコマンドの最後の引数として実行する。

ls | xargs md5 -q

これは次のように展開されたものと同じ。

md5 -q foo
md5 -q bar
md5 -q baz
...

ただしファイル名にスペースを含んでいると上記の方法ではうまくいかない。この場合、次の節で説明するプレースホルダを使用する。

プレースホルダ

xargs では -I オプションで引数を展開する場所を指定することができる。-I '{}' のように指定すると、{} の場所に引数が展開される。

ls | xargs -I '{}' md5 -q '{}'

これでスペースを含むファイル名もうまく展開される。

md5 -q 'foo'
md5 -q 'bar'
md5 -q 'foo bar'
...

処理系によっては小文字の -i オプションで -I '{}' と同等の動作になるので alias を指定しておくと便利かもしれない。

alias xargs-i='xargs -I "{}"'

拡張子の変更

xargs を使って拡張子を一括置換するにはプレースホルダに加え、 sed を組み合わせるとよい。

find . -name '*.txt' | sed -e 's/[.]txt$//' | xargs -I '{}' mv '{}.txt' '{}.md'

応用例として、 FFmpeg で動画から音声トラックのみ抽出するコマンドを挙げる。

find . -name '*.mp4' | sed -e 's/[.]mp4$//' | xargs -I '{}' ffmpeg -i '{}.mp4' -c:a copy '{}.m4a'

Windowsスクリーンショットを一括で JPEG に変換してリネーム

PowerShell は使わず、WSL の bashzsh などから使用する。ImageMagick (convert コマンド) がインストールされているものとする。

ls スクリ*.png | \
    sed -e 's/スクリーンショット (//' -e 's/)[.]png//' | \
    xargs -I '{}' convert 'スクリーンショット ({}).png' 'image-{}.jpg'

一部を切り抜きたい場合はその座標を指定して

# -crop (width)x(height)+(left)+(top)
ls スクリ*.png | \
    sed -e 's/スクリーンショット (//' -e 's/)[.]png//' | \
    xargs -I '{}' convert 'スクリーンショット ({}).png' -crop 1140x641+601+199 'image-{}.jpg'

FFmpeg でオーディオファイルの音量を調整する

Windows 10 に付属する標準の音楽プレイヤーは曲ごとに再生時の音量を設定することができないようなので、 FFmpeg を使って MP3 や AAC の音量を調整した。

ここで使用した FFmpeg のバージョンは N-93565-g0ad0533e91 (2019/2)。

ffmpeg -i INPUT -c:v copy -filter:a "volume=-6dB" OUTPUT

オプションの詳細は次の通り。

  • -i INPUT …… 入力ファイル
  • -c:v copy …… 映像パートはコピーする
  • -filter:a "volume=-6dB" …… 音声にフィルタを適用する
    • 音量は -6dB のようにも調整できるし、 0.5 など [0, 1] の値を設定することもできる。デシベル値を設定する場合は B が大文字でないといけないことに注意
  • OUTPUT …… 出力ファイル

macOS Mojave をクリーンインストールした

Catalina から Mojave にダウングレードするため macOS Mojave をクリーンインストールした。

この Mac にプリインストールされていた OS は Mojave だったので、Mac の起動直後に shift + option + command + R キーを押し、プリインストールされていたバージョンに最も近い OS をインストールした。OS のインストール自体は 1 時間足らずで完了。

データの復元は Time Machine バックアップで難なくできた。400 GB ほどのデータで 5 時間ほどかかった。

Homebrew を macOS Mojave にインストール

Homebrew のサイトに記述されている次のコマンドを実行すると、インストールされるファイルやディレクトリの一覧が表示される。

% ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
==> The following new directories will be created:
/usr/local/bin
/usr/local/etc
/usr/local/include
/usr/local/lib
/usr/local/sbin
/usr/local/share
/usr/local/var
/usr/local/opt
/usr/local/share/zsh
/usr/local/share/zsh/site-functions
/usr/local/var/homebrew
/usr/local/var/homebrew/linked
/usr/local/Cellar
/usr/local/Caskroom
/usr/local/Homebrew
/usr/local/Frameworks
==> The Xcode Command Line Tools will be installed.
Homebrew でインストールしたパッケージ
brew install rbenv ruby-build readline
brew install ffmpeg
brew install imagemagick
brew install dnsmasq
brew install unar

Node.js のインストール

Node.js は最新の推奨バージョン 12.14.1 をインストーラからインストールした。

MuseScore プラグイン API

サンプル

Score

プロパティ/メソッド 説明
newCursor() : Cursor
nstaves : Number 譜表の数

Cursor

プロパティ/メソッド 説明
staffIdx : Number 譜表のインデックスを参照または設定する
voice : Number 声部のインデックスを参照または設定する [0, 4)
segment : ?
element : Element カーソル位置の要素を取得する
rewind (position : Number) : void カーソル位置を指定の場所に巻き戻す
next () : void カーソルを次の位置に進める

Element

プロパティ/メソッド 説明
type : ElementType 要素の型を取得する
notes : Note[] コードに含まれる音符のリスト。低い順
ElementType
説明
Element.CHORD コード(音符)
Element.REST 休符

Note

プロパティ/メソッド 説明
type : Number
name : String
parent : Object
selected : Boolean
visible : Boolean
small : Boolean
offsetX : Number
offsetY : Number
z : Number
lineType : ?
line : Number
direction : ?
velocity : Number ベロシティを参照もしくは設定
veloOffset : Number 相対ベロシティを参照もしくは設定