著作権の適法マーク

d:id:rubikitch:20070926#1190810855の続き。
偽装した適法マークをつけているサイトを利用した場合、利用者は適法だと信じているから、たしかにどんな拡大解釈をしても違法にはなりえない。しかし、無数の違法サイトが偽装適法マークを付けちゃったら、ダウンロード禁止法が適用できなくなるからいたちごっこになりそうだ。

それにしても著作権保護ってここまでしないといけないものかね。俺が著作権者の立場でもそこまではやりすぎだと思うけどなぁ。たんに無欲な性格だからかもしれないけど。でも、利用者にそっぽを向かれてしまったら利益は上がらんと思うな。

カスラック著作権法の本来の目的を忘れて拡大解釈しまくりで暴れてることからも、インターネット産業の萎縮効果が期待できる。音楽生演奏とインターネットの差はあれ同じ著作権法だもん。

はぁ‥これが鬱苦しい国日本か…オワタ。

6日生存

http://d.hatena.ne.jp/rubikitch/20070916#1189909004 以来fast-emacsではなくて普通にemacsを立ち上げてみることにした。

今日で生存6日目。最初の頃はいろいろhackしてて再起動してたので途切れていた。
ただ、昨日今日でメモリ使用量が増えまくってるのが不気味だ。昨日の朝120MBだったのに夜160MB、そして今195MBになっている。でかいファイルを開いているわけでもなく、バッファ数も190ほどだというのに。メモリ2GB積んでるので200MB占有しててもわずか10%なんだけど、以後昨日の割合で太ったらそろそろEmacs再起動したほうがいいな。

history-menu - 最近入力したコマンドを現在位置に挿入

最近実行したコマンドをつなげて再実行したい場合みんなならどうする?直前のコマンドならば!!で実行できるね。zshならば!!のあとにTabを押すと実際のコマンドに展開されるし、!!などを使ってコマンドを実行しても展開された形で履歴に登録される。さすがzshだ。
2つ前のコマンドも!-2で展開される。けれど、打ちにくい上Tabも入れると4ストロークと多いので俺は好きではない。

そこで俺はirbsh風のヒストリメニューwidgetを作ってみた。C-vで過去20個の履歴が表示され、asdf〜とホームポジションのキーで選択するとカーソル位置に挿入される。これなら2ストロークでなおかつ履歴が一覧できるので効率的かつ直観的だ。

C-vはquoted-insertでEmacsならC-qなのでC-qに移しておいた。

[*]の位置でC-v s C-v a Enterを押したところの様子はこんな感じだ。zshは複数行にわたるコマンドを編集できるので、履歴の後に改行を入れておいた。これで長ったらしくならずに見やすくなる。

スクリプトに含まれる\021はC-qなのでquoted-insertをデフォルトのC-vで使っている人は\026に書き換えればいいです。

% echo bake
bake
% echo boke
boke
% [*]echo bake
echo boke
bake
boke

ソースは以下だ。もってけ!

HISTORY_MENU_LENGTH=20
typeset -A HISTORY_MENU_KEYS
set -A HISTORY_MENU_KEYS a 1 s 2 d 3 f 4 g 5 h 6 j 7 k 8 l 9 q 10 \
                w 11 e 12 r 13 t 14 y 15 u 16 i 17 o 18 p 19 @ 20
history-menu () {
    zle -M  "`history -n -$HISTORY_MENU_LENGTH  | tac | \
      ruby -e '%w[a s d f g h j k l q w e r t y u i o p @].zip(ARGF.readlines){|k,l| print %[#{k}: #{l}]}' `"
    zle -R
    read -k key
    if [ -n "${HISTORY_MENU_KEYS[$key]}" ]; then
        zle -U "`history -n -${HISTORY_MENU_KEYS[$key]} | head -1 | perl -pe 's/\\\\n/\\021\\n/g'``echo \"\021\"`
"
    else
        zle -R -c
    fi
}

zle -N history-menu
bindkey "^V" history-menu
bindkey "^Q" quoted-insert

ほんとなんでもありだ。なんせzsh内でテトリスすら作れてしまうくらいなんだから。

学校でデスクトップLinux

http://gigazine.net/index.php?/news/comments/20070926_adapt_linux/

外国の話だが、学校でデスクトップLinuxを導入する利点の話。俺は10年前からLinuxを使っていたけど、もうすぐみんなが使う時代に。

シェルスクリプトの内容を丸ごと履歴に登録する

zshは複数行のコマンドを編集・実行できる。そして履歴は強力。だったら小さいスクリプトを丸ごと履歴に入れてしまえないかと考えてみたら、やはりその機能は存在した。

print -s -f "%s" "`cat /path/to/shell-script`"

正規表現履歴検索

d:id:rubikitch:20070925#zshicicles で考えていた正規表現による履歴検索。isearchになっていない代わりに id:rubikitch:20070927#1190850678 同様20個の選択肢から選ぶ形を取った。

# ここからはhistory-menuと共通
HISTORY_MENU_LENGTH=20
typeset -A HISTORY_MENU_KEYS
set -A HISTORY_MENU_KEYS a 1 s 2 d 3 f 4 g 5 h 6 j 7 k 8 l 9 q 10 \
                w 11 e 12 r 13 t 14 y 15 u 16 i 17 o 18 p 19 @ 20
# ここまで
autoload -U read-from-minibuffer
HISTORY_GREP_TEMPFILE=/tmp/hmgrep.tmp
history-grep-menu () {
    read-from-minibuffer "history grep: "
    if [ -n "$REPLY" ]; then
        history -n 1 | egrep "$REPLY" | tail -100 | uniq | tail -$HISTORY_MENU_LENGTH | tac > $HISTORY_GREP_TEMPFILE
        zle -M  "`ruby -e '%w[a s d f g h j k l q w e r t y u i o p @].zip(ARGF.readlines){|k,l| print %[#{k}: #{l}]}' $HISTORY_GREP_TEMPFILE`"
        zle -R
        read -k key
        if [ -n "${HISTORY_MENU_KEYS[$key]}" ]; then
            zle -U "`head -${HISTORY_MENU_KEYS[$key]} $HISTORY_GREP_TEMPFILE | tail -1 | perl -pe 's/\\\\n/\\021\\n/g'`"
            zle -R
        fi
        zle -R -c
        rm -f $HISTORY_GREP_TEMPFILE
    fi
}

zle -N history-grep-menu
bindkey "^[r" history-grep-menu

使い方はM-rでプロンプトが出るので正規表現を入れればメニューが出てくる。メニュー左のキーを押すとコマンドが挿入される。history-menuと違いわざと改行は入れていない。

502 Bad Gateway

[2007/09/27 13:43]現在、はてダラで日記を更新しようとしたら「502 Bad Gateway」と言われて更新できない。[観] 502 Bad gateway、あるいは Proxy Errorによると、ユーザではどうしようもないエラーなのでしばらく放っておく。

俺版Emacsはてな環境では内部的にM-x compileで更新しているが、こういう予期しないエラーが出たときもわかるので、これでいいかと思ってる。

シェルスクリプトでフルパス展開するには?

たとえば $1 のフルパスを得たいとき(もちろん$1がすでに絶対パスになってる可能性もある)、どういうコマンドを使うべきなんだろう?basenameでもdirnameでもないし苦し紛れにruby使ってるんだがかっこわるい。

`ruby -e 'puts File.expand_path(ARGV[0])' "$1"`

拡張子への関連付け

zsh 4.2以降ならばwindozeでいう「拡張子への関連付け」が行える。大昔から欲しかった機能だったが4.2以降ってかなり遅いのね…

たとえば.jpgファイルにおいて

alias -s jpg=xzgv

と設定しておけば foo.jpg を見るためには ./foo.jpg と打つだけでよくなる。
とりあえずアーカイブファイル、画像、音声、動画については登録しておいた。はてブに「CUIでそれをやるのはキモい」という意見を見かけたが、一番行われる操作を登録しておくのは意味があることだと思う。アーカイブならば展開だし、画像は表示、音声・動画は再生。

zshいじりは楽し

長年zshを使っているものの、シェルスクリプトが苦手なこともあってあまりカスタマイズしていなかった。Emacsのshell-modeばかり使っていたのでzsh本来の力を発揮させられなかった。GNU Screenを使っていればログが取れるんで、shell-modeでやらなくてもよくなる。
拡張子への関連付けやEmacsを思わせるようなinteractive widgetなど、いじっているうちに楽しくなってきた。