| 2010-03-11
(*)
|
# star -- simplified tar もしくは *ar |
|
その昔 jar は偉大なり と書いた。
今でもそう思うが、tar も jar もコマンド体系が複雑である。
そこで、機能を絞ってしまってはどうか、と。
tar のオプション指定には個人ごとに好みがあるのだが、次の三つに集約し、他は無視する。
- cf
- c(reate) f(ile) つまり新しくアーカイブファイルを作る
- tf
- t(able of) f(ile) つまりアーカイブの内容を確認する
- xf
- (e)x(tract from) f(ile) つまりアーカイブから取り出す
多くの人が xvzf のように使うのは知っている(これも流儀によって xzvf だったり zxvf だったり)が、今や(というかもう何年も前から) GNU tar は z なしで x を使える。
v は、要らないだろうといつも思っているが、まあ付けたい人のために -v というオプションを許そう。
ということで、上の三つだけをサブコマンドと思う。
残りは引数のファイル名を見て判断する。
.tar.gz だったら tar 形式で gzip 圧縮し、.jar や .zip だったら zip 形式を使う。
できれば他の形式にも対応する。
ということで、コンセプト実証用シェルスクリプト:
#!/bin/sh -
subcommand=$1
case $subcommand in
cf) ;;
tf) ;;
xf) ;;
*) echo "invalid subcommand";
exit 1 ;;
esac
shift
if [[ $1 == "-v" ]]; then
subcommand="${subcommand}v";
shift
fi
if [[ $1 =~ \.tar(\..*)?$ ]]; then
command=tar;
if [[ $1 =~ \.gz$ ]]; then
subcommand="${subcommand}z"
elif [[ $1 =~ \.bz2$ ]]; then
subcommand="${subcommand}j"
fi;
elif [[ $1 =~ \.([jwe]ar|zip)$ ]]; then
command=jar
else
echo "ambiguous argument $1";
exit 1;
fi
exec $command $subcommand $*
本当は Windows にこそこういうものを用意してもらいたいものである。
|
|
posted at 10:08:16
#
|
|
| |
| 2010-02-17
(*)
|
# コメントの分離 |
|
ソースコードとコメントは別レイヤーに置けないのだろうか。
確かにエディターだけで両方書けるのは素晴らしいが、そもそも別の目的のものをひとまとめにするから、コードの変更に追随できずに無意味になるコメントといった問題が生ずる。
現在の技術をもってすれば、二つのファイルを一体に見せるなどわけもない。
であれば、いつまでもソースコードにコメントを埋め込んでないで分離したらどうだろう。
というようなことを AR という技術から夢想する。
ソースコードがリアリティー。
|
|
posted at 09:06:24
#
|
|
| |
| 2010-02-06
(*)
|
# コメントのスコープ |
|
プログラムに書くコメントにはそれぞれ自然な適用範囲がある。
この範囲を実際に書いてみたらどうだろう。
たとえば
# this function do something {
def f(x):
....
# }
とか
# later initialized {
foo = None
bar = None
# }
とか。
コードが Python でもこの範囲指定にはインデントを使えないし、c に対しては範囲指定に波括弧({})を使わない方がエディターで対応する括弧を探す時に楽かもしれない。
|
|
posted at 12:05:36
#
|
|
| |
| 2009-12-21
(*)
|
# install-elisp |
|
twitter で install-elisp という、emacs lisp のプログラムをインストールする emacs lisp プログラムに触れていた人がいた(作者っぽい)。
それをインストールする ebuild を書いた。
install-elisp が取ってきたプログラムをインストールする場所は自分で決められるのだが、~/.emacs.d/ に入れるようにサンプルが書いてあったのでその通りにした。
そして、そのことに安堵感を覚える自分がいる。
なぜか。
ホームディレクトリの下はパッケージ管理していないものが置いてあっても自己責任である。
たとえ依存関係を解決してくれなくても、そういうもの、と思うだけである。
翻って、常々気持ち悪いと思う Python の easy_install は、基本的に /usr/lib の下にある site-packages にファイルを置こうとする。
これがいけない(ということに、今回思い至った)。
easy_install のような仕組みは個人的なパッケージ導入に留まっていればいいのであって、システムとしてのパッケージ管理と競合するべきではない。
勿論、依存関係はどこに入れようと同じであるから、機能として重なる部分はあるのでそこは API などで提供して上げるのはいいと思う。
しかし、システムとして提供するものをインストールするのは、他人の領分を侵す行為であると思うのだ。
Windows にパッケージ管理が存在しないのは別問題なので、それは別途対処していただきたい。
|
|
posted at 20:50:24
#
|
|
| |
| 2009-11-25
(*)
|
# LattE |
|
LattE というソフトウェアをインストールしなければいけなかったのだが、かなりクラクラする代物。
ソフトウェアのできの話ではなく、インストール方法。
最初は ebuild を作ろうかと思ったけど、無理(やってやれないことはないだろうけど手間ばかり掛る)。
linux だと ./install だと一発です、と書いてあるものの、こちとら OS X なので案の定うまくいかない。
インストールのステップを追ってやってみようと中身を見たら、まずはシェルスクリプト代わりのC++プログラムをコンパイルさせる。
実質的に system しか呼んでないプログラムって。
malloc.h が OS X には無いのでコメントアウトする。
本当は適当なマクロで #ifdef して分岐すべきなんだろうけど、まあ自分用だからいいか。
cdd というプログラムはバイナリーで収められているのだが、ELF なので OS X では実行できない。
cdd+ の 0.77dev1 というのが一緒にあるので、まあこれだろうと思ってコンパイルしたら通らない。
仕方ないのでぐぐったら、どうもスイスにいる日本人らしき人が作者。
cdd and cddplus Homepage に 0.77a というのが置いてあって gcc 4.1 でコンパイルできる、と書いてあるのでそれをもらってきてコンパイル。
ということでどうやら動く。
C++ をシェルスクリプト代わりに使う、というのが、何はともあれ本日一番の衝撃。
|
|
posted at 00:02:24
#
|
|
| |
| 2009-10-01
(*)
|
# link-local |
|
解っていないままに書く。
Konica Minolta の mc1650-en というプリンターを使っているのだが、印刷しようとするたびにプリンターを認識させるところからやり直さないといけない、といういらつく状況なのである。
基本的に DHCP で繋げばいいと思っているので、IP アドレスの割り振りは DHCP/BOOTP を選択してある。
上手くこれでアドレスが取得できれば 133.1. というプレフィックスになるはずなのだが、頻繁に 169.254. というプレフィックスのアドレスを使いたがる。
169.254/16 は IPv4 link-local (RFC 3927) に使うものなんだそうだ。
要するに DNS サーバーにアドレスを聞かないでも、自分で振ってしまえるアドレス。
ということで DHCP サーバーからアドレスをもらえたりもらえなかったりしている、あるいはリース更新に失敗するために IP アドレスが安定しない。
ここまでが前段。
今度はこのプリンターを Mac から探す方だが、Bonjour という機構でリストを出してくれるのでその中から選択する。
ここまではどちらのアドレスでも良い。
ところが、プリンターを選択した後にドライバーの選択をするところで link-local の方のアドレスでは失敗するらしい。
ここのところはプリンターの名前しか出てないので(IP アドレスの)違いは表面上判らないのであくまで推測。
失敗するというのはまずドライバーが自動選択で出てこないし、この自動選択に失敗したが最後プリンターの機種からドライバーを探して「追加」ボタンを押しても、「失敗しました」というダイアログが出るだけでプリンターの追加は不可能という現象である。
そうなるともう何もできない。
詳細はユーザーには知らされないので、できないということしか判らない。
Mac のプリンター追加方法は Bonjour の他に直接 IP を指定する方法もあって、これで HP Jet何とかを選べば、ドライバーも指定できて印刷自体は普通にできる。
ただ、元来固定でない IP アドレスを直接指定しているので気持ち悪い。
まとめると結局は「このプリンターが DHCP サーバーと上手くやる設定が知りたい」ということになる。
|
|
posted at 22:37:04
#
|
|
| |
| 2009-09-18
(*)
|
# Vista Business |
|
とりあえず PC 買っていいよと言われたので ThinkPad X200s を買ってもらった。
それが今日届いて、プリンターの設定とかしてた。
OS は Vista の Business というのが入っていた(デフォルトで特に考えてなかった)。
Gentoo prefix の Windows Guide (pdf)を見たら、SUA が無いから入れられないらしい。
何てこった。
まあ、firefox と emacs と python をそういうものを経由せずにただインストールしておけば当面困りはしないのではあるが。
|
|
posted at 01:53:20
#
|
|
| |
| 2009-07-14
(*)
|
# emacs-cvs-23.0.96 |
|
放置している間に 23.0.96 までバージョンが上がってきた。
そろそろリリースか?
ということで、前回の 23.0.93 の時とほぼ同じように ebuild を修正した。
疑問が1つ。
open -a はどこからアプリケーションを探し出し、どこからアプリケーション名を取得するのか?
man には特に何も書いていないのだが、場所はどこでもよくて、名前はファイル名から、のようだ。
~/Applications 辺りからシンボリックリンクを張って、複数バージョンを切り替えるようなことを考えていたのだが、シンボリックリンクは見てくれないという実験結果。
シンボリックが駄目ならハードリンク、ということで cp -la した。
あとはフォントが惨めだったので、この辺を参考に
(when (= emacs-major-version 23)
(set-default-font "Courier-14")
(modify-all-frames-parameters (list (assq 'font (frame-parameters)))) ;複数フレームに対応
(set-fontset-font
(frame-parameter nil 'font)
'katakana-jisx0201
'("Hiragino Maru Gothic Pro" . "iso10646-1"))
(set-fontset-font
(frame-parameter nil 'font)
'japanese-jisx0212
'("Hiragino Maru Gothic Pro" . "iso10646-1"))
(set-fontset-font
(frame-parameter nil 'font)
'japanese-jisx0208
'("M+1MN+IPAG" . "iso10646-1"))
(set-fontset-font
(frame-parameter nil 'font)
'latin-iso8859-1
'("courier" . "iso-10646-1"))
)
を .emacs に書いておく。
必要に応じて他の言語のフォントも指定しておくべきなのだろうが、この方法以外に簡単な方法があるのではないかという疑念(半分は期待)ゆえに今はこれぐらい。
|
|
posted at 00:40:48
#
|
|
| |
| 2009-06-20
(*)
|
# 本当にあからさまなゴミだけ弾く awk スクリプト |
|
最近大学のメールサーバーがスパムの多さに音を上げて弾くのを諦めたらしい。
ということで .forward でスクリプトを呼び出す。
昔のコードの使いまわしなので、exit 65 に意味があるのかどうかすら忘れた。
#!/usr/bin/awk -f
BEGIN {
spam = 0;
i = 1;
mailcommand = "/usr/sbin/sendmail tensousaki@example.com";
}
spam {next}
/^[Mm]essage-[Ii][Dd]:.*<[^>]+$/ {spam = 1; next}
/yumenosekai\.org/ {spam = 1; next}
/otonanorakuen\.com/ {spam = 1; next}
/mixclub\.org/ {spam = 1; next}
{
message[i] = $0;
i = i + 1;
}
END {
if(spam) {
exit_as_it_is_a_spam();
} else {
for (i = 1; i <= NR; i = i + 1) {
print message[i] | mailcommand;
}
close(mailcommand);
}
}
function exit_as_it_is_a_spam() {
exit 65;
}
next の処理がいかにも非効率なんだけど nextfile をこの文脈で使っていいものかを把握していない。
疑問点は、標準入力から読んでいるときに nextfile を使うと END に飛べるのかということ。
|
|
posted at 03:18:40
#
|
|
| |
| 2009-05-22
(*)
|
# Wanderlust フォークか? |
|
本気なのかどうか判らないが、wl-en で「フォークしたらいんじゃね」という人が出始めた。
そういう議論にも反論が出てこないし、実現する可能性はあると思う。
もっとも、現在のメンテナーが「じゃあ交代」といえばフォークにはならない可能性も残る(でも連絡しても梨の礫とか)。
注目。
|
|
posted at 18:59:28
#
|
|
| |
| 2009-05-18
(*)
|
# そういえば Google Books って便利なの? |
|
ということで、先ほどの
Introduction to the Construction of Class Fields
を調べてみた。
このページ。
全部は読めない。
意図的に抜けたページを作っているらしい。
出版社(この本では CUP = Cambridge University Press だ)のページへのリンクもある。
試しに飛んでみても Unavailable - out of print だが。
じゃあってんで、Dover 版のページ。
こっちは最初の20ページ程度と裏表紙だけ読める。
そこに書いてある値段は7ドル95セント。
つまり定価800円。
でも品切れ。
結局、定価の20倍で買うか図書館を活用するしかない。
検索…うーん。
いざというときの保険としては心許ないなあ。
|
|
posted at 23:47:28
#
|
|
| |
| 2009-04-21
(*)
|
# umask 022 |
|
最近の1人1グループ的な環境なら 022 じゃなくて 002 でいいんじゃないかと思った。
発想の元は逆に共有ディレクトリにグループ書き込み不可なファイルを作られたからなんだけど。
|
|
posted at 23:58:08
#
|
|
| |
| 2009-04-16
(*)
|
# みんなで正誤表 |
|
随分前から nifty の方で 勝手に正誤表 というのを作っていたりしたのだが、自分で書いているだけより他人にも作ってもらえるようにした方がいい、とは思っていた。
具体化しないままだったのだが、今回 Google App Engine を使って みんなで正誤表 というサイトを立ち上げた。
是非使ってみてほしい。
|
|
posted at 20:01:20
#
|
| |
# 比喩: この3分割は世の中に良くある3分割の一例かもしれず |
|
Unix が流行らない理由は勉強だからである。
Mac はファッションであり、Windows はスポーツである。
Unix はユーザーの理解を信じ、Mac はユーザーの感性を疑わず、Windows はただ反復に頼る。
|
|
posted at 01:40:32
#
|
|
| |
| 2009-04-03
(*)
|
# twitter |
|
Guido もやっているというので、アカウントを取ってみる。
mft は埋まってたので mf2t に。
使うのかねえ
|
|
posted at 09:55:28
#
|
|