SNSへはこちら

slコマンドをオレオレ仕様にチューニング

ls の typo を矯正するコマンドとして sl があります。複数 OS を使った方なら分かるでしょうが、このコマンド、Mac と Linux で挙動が少し異なるんです。特にすぐ分かるのが、SL の走るスピードが違うということです。

この記事ではこのスピードをチューニングしてやろうという記事になります。

sl - cure your bad habit of mistyping

速度の違いを見てみる

ここでは実際にどう動くスピードが変わってくるかお見せしましょう。まずは Linux。Raspbian で動かしました。

続いて Mac。brew でインストールしたものです。

と、こんな感じで違ってきますね。この差は一体何なんでしょう...?

ダウンロード先に依る違い

いろいろ検証した結果、実は OS による違いではなく、どこからソースを引っ張ってきたかで挙動が変わるようなのです。

製作者豊田さん御本人による GitHub のリポジトリでは動きは遅いです。Homebrew もここから参照していると考えられます。

SL(1): Cure your bad habit of mistyping. Contribute to mtoyoda/sl development by creating an account on GitHub.

Ubuntu における APT のリポジトリでは動きは速いです

GitHub版は Version 5.03、APT 版は Version 3.03 です。バージョンがずいぶん違いますね。何があったんでしょう。そこでソースコードを見てみることにします。以下は GitHub 版 sl.c の main 関数の一部です。

    for (x = COLS - 1; ; --x) {
        if (LOGO == 1) {
            if (add_sl(x) == ERR) break;
        }
        else if (C51 == 1) {
            if (add_C51(x) == ERR) break;
        }
        else {
            if (add_D51(x) == ERR) break;
        }
        getch();
        refresh();
        usleep(40000);
    }

この usleep(40000) がクサいですね。ここを半分の usleep(20000) にしてみます。すると...なんと、APT 版と同じ挙動になりました!

2つのバージョンの比較

バージョンそのものが異なっているので挙動が変わっているのですが、今の部分が変更されたというログがないか見てみます。するとファイル冒頭で

/* sl version 4.00 : add C51, usleep(40000) /
/
by Toyoda Masashi 2002/12/31 /
/
sl version 3.03 : add usleep(20000) /
/
by Toyoda Masashi 1998/07/22 */

となっています。ふむふむ、APT 版の Version 3.03 が速い sl の最終版なのですね。。。どうやら APT のリポジトリでは更新が止まってしまっているようです。

そしてなぜ待ち時間を2倍にしたのか。これは多分、打ち間違えを矯正するために敢えて SL の速度を落とし、自省の念を駆り立てようとしたのではないでしょうか。しかしながら我々は技術を持っていますので、これを戻して快適な sl ライフを送ることができるのです。あれ?このコマンド本来の目的って??

ついでに

usleep() を消してみました。そんだけです。