Pythonのスクリプトを実行するときになぜかやたらにウィンドウをキャプチャするなぁと思ってたら、間違って/bin/shで実行していたのだ。
先頭付近のimport
が悪い。っていうかマウスカーソルが変わった時点ですぐに気付けよ>おれ
ImageMagickのimportはデフォルトではPostScriptで保存される。import os
だったら「os」という名前のPostScriptファイルができて、ちゃんとキャプチャされていることが確認できる(できてどうする)。
Category: プログラミング
Pythonで便利だと思っている引数ラベル(と呼ぶのかどうかは知らない)。これは引数に名前がついていて、例えばfunc(name=val)
のように呼び出し時に引数の名前を指定できる機能だが、S言語にすでにあったことがわかった。S言語はフリーでないのでGNUのR(r-project.org)という互換(?)ソフトがあるので、Rを使うといいだろう。統計処理には重宝されているらしい。日本にもファンがついていて、日本語のRjpWiki(jp.org)というのがあったのでとりあえずリンクしておく。RSSを眺めていると、かなり活発に更新されていることがわかる。
統計処理は難しいがなかなか興味のある分野の一つだ。少し勉強してみたいなぁと思う。
REPLでhelp()
などは揃っているようだが、そうとう頭の悪い私でも使えるだろうか。
このhelp()
で気づいたのだが、引数のデフォルトが書けるのは当然としても、Rはこの引数のデフォルトにif
文を置けている。カッコいい!!
ここ(hyuki.com)から辿ってクラス設計に関するメモ(nifty.com)。それなりに参考になるよなぁ、と思った矢先の出来事。今はJava使ってないけど。
まず、「粒度」ですが「りゅうど」と読みます。でもワタシはわざと「つぶど」と 読んでいます。その方が自分の直感に訴えるのでそう発音しています。
この文、すごくいいなあと思った。 ついでだから私のことも書こう。 私のやり方は、「なるべくクラスを使わない」「クラス間になるべく関係を持たせない」「関係を持たせたとしても1重、継承と包括(って言うんだっけ?)のみ」そして一番重要なのは「最小コード量主義(今名付けました)」である。…なんて原始的な。 こうしたほうが綺麗だけどしないほうがプログラムが短かくなる、という状況では敢えて短かくなる選択をする。読みやすい1000行よりも読みにくい10行。そして共通化と特殊化を繰り返すことでもっと短かくすることを考える。例えば「Cの3項演算子が好き」「#defineのマクロの複雑なやつが好き」と言い切ってしまうとわかりやすいかな。 あとは、処理の内容よりも意味の表現を好む。説明しづらいけど。 一時期は「ヒープを使わない」というストイックなことをやっていたりもした。全部スタックなのね。あれはあれで非常に綺麗だった。メモリリークもぜったい起こらないし。さすがに破綻したけど(笑) …という感じの極悪プログラマであるから逆に、構文にうるさいPythonを使いたがるという一面も。だって、PHPやPerlって普通に書いてるだけでどんどん汚くなってくんだもん。書き方が悪いのだけど。
今までJapaneseCodecsを使っていた人が多い(というかそれしかない)と思うが、CVSにやっとCommit(python.jp)されたらしい。次のリリースが出たらそれこそ速攻インストールは間違いない。CVS版を試すほどではないと思ってるけど。 今でも私が使ってるPython 2.2.3のRPMには最初から入ってるんだよね、JapaneseCodec。このSPECファイルはどこ由来だろう。RedHat標準だったかなぁ。
weblogのpingがXML-RPCを使っていたとは知らなかった。XML-RPC、こんなところで日の目を見ていたとは…
XML-RPCは大学時代の先輩に教えてもらって以来ちょっと凝っていた時期があって、会社で仕事に使ったり、某編集者に雑誌の記事でXML-RPCについて書かせてよ、プロキシ越えられるRPCなんてすごいじゃん、みたいなことを言ったことを思い出した。いわゆる「普通のPC雑誌」だったので反応はなく、当然のように没だったけど(笑)。当時はSOAPが出てきたけど理解するのが難しく、私を含む「なんちゃってプログラマ」がどんどんXML-RPCに流れていってたのだ。
というわけで当時を偲びつつPythonでpingを送る単純なスクリプトを書いてみた。UTF-8で送るが、encoding="utf-8"
のところを変えればエンコーディングも変わる。試みにping.bloggers.jpに送ってみたら正しく登録された。…冗談のテストに使うなって話もあるので実際のURLとタイトルを使ってしまった。たぶんアクセスが激増するほどの影響力はないと思うので使ってもいいと思った。思ったら?
(追記) 2004-01-18 16:38
まじか。Myblog japan の Ping 受信エラー原因を予想してみるの巻(dyndns.org)より、
今さらだが、dotGNU-0.1(gnu.org)を入れてみた。サンプルプログラムを動かしてみるに、なんか、悪くない気がする。
ilrun --register
を実行すると、/proc/sys/fs/binfmt_misc/以下を勝手にごにょごにょして、実行属性をつけた.exeファイルを実行できるようになる。ilrunというのがILのインタプリタでもある。
付属のベンチマーク(linpackとscimark2)のスコアはAthlon XP 2100+/WindowsXPと比べるとMobile Pentium3-M 1200MHz/Linux-2.4は1/10程度だが、これは思っていたよりは速い。起動速度も悪くない。GNUだし。.exeが生成されて気持ち悪いけど。
C++、C#、Java、D…どれを選ぶべきなのだろう。CとPHPとPythonとその他のone-linerで生きてそれなりに便利なのだが、仮にGUIを使って書くことを考えると今はPython/Tkinterしか選択肢を持っていない。gtk+もJavaも、aalibやcursesも(笑)ずいぶん長いこと追ってないし、CでGUIを書くのは避けようよ。で、このままではいつか困ったことになるかもしれない。そう漠然と思っていた。
C#でPythonみたいなhelp()が使えてカンタンならいいのだが、まともに学ばなければならぬとなると臆する。ずいぶん前にC++で懲りた。Javaのときもいいかげんだったし。学習方法やドキュメントなんてなくていいから、ものごとを調べやすい環境であってほしい。Javaはjavapがあったからまだマシだった。C/C++はヘッダがあるのでまだわかる。C#はどうなんだろうか。
昨日はBug Day(gnomedesktop.org)だったらしい。知っていたら仕事もデバッグ寄りの作業にしたのだが。
readlinkコマンドはシンボリックリンクを辿り、リンク先を表示する。しかしこのままではファイルへのパスとして妥当なものにならない。 こういうときはdirnameと組み合わせればよい。
# 実際のファイル名を出力する D=$(dirname $i) L=$(readlink $i) if [ -z "$L" ] ; then echo $i elif [ -z "$D" -o "$D" = "." -o $(echo $L | cut -c 1) = "/" ] ; then echo $L else echo $D/$L fi
しかし、これでは「../」などが残ってしまう。そこで、こういう感じのを噛ませる。sedでパターンマッチだけでやろうとしたがなかなかいまいちになったのでPerlを登場させてしまった(不覚)。
echo $1 | \ perl -ne ' @a=split("/"); for($i=0; $i<=$#a; $i++){ if($a[$i] eq ".." & $#b!=-1 & $b[$#b] ne ".."){ pop(@b); }elsif($a[$i] ne "."){ push(@b, $a[$i]); } } print join("/", @b)."\n";'
だいたい実際のファイル名が得られる。厳密ではないと思うけど。
組み合わせると、以下のようになる。しばらくこれで使ってみようと思う。なんかでもバグってるかも。
#! /bin/sh
delete_parent(){
echo $1 |
perl -ne '
@a=split("/");
for($i=0; $i<=$#a; $i++){
if($a[$i] eq “..” & $#b!=-1 & $b[$#b] ne “..”){
pop(@b);
}elsif($a[$i] ne “.”){
push(@b, $a[$i]);
}
}
print join("/", @b)."\n";'
}
delete_parent_old(){
O=$1
while [ “$S” != “$O” ]; do
S=$O
O=$(echo -n $S | perl -pe ’s|/([^./][^/]+)/../|/|g;s|/./|/|g;s|^[^./][^/]+/../||g;’)
done
echo $O
}
for i; do
D=$(dirname $i)
L=$(readlink $i)
if [ -z “$L” ] ; then
echo $(delete_parent $i)
elif [ -z “$D” -o “$D” = “.” -o $(echo $L | cut -c 1) = “/” ] ; then
echo $(delete_parent $L)
else
echo $(delete_parent $D/$L)
fi
done
/bin/sh
とは書いたものの、素のBourne Shellでは無理だろうな。bashなら動くようだ。
勿論これだけの操作では1つしかリンクを辿らない。また途中のディレクトリにシンボリックリンクがあってもそれは辿らない。指定されたファイル名のみについて1つ辿ってそれらしいファイル名を返す、というものだ。
絶対パスにしたければ、先頭文字が/でない場合に先頭に$PWD
をつければよい。いじょう。
久々のプログラミングねた。 Cの型で、unsignedとかsignedってあるじゃん。あれと同じような感じでnetworkっていう修飾できないかなー、なんて思ったりして。 つまりネットワークバイトオーダーを修飾子としてつけたいわけだ。 IA32 endianなアーキテクチャの場合(big/littleどっちか忘れたけどたしかlittleだったような気がするな)、
network int a_n; int a=1; a_n=a; printf("a_n=%d, a=%d\n", a_n, a);
の場合は微妙だがprintf
が型変換しないとして、
a_n=16777216, a=1
と出力され、printf("a_n=%d, a=%d\n", (int)a_n, a);
の場合は
a_n=1, a=1
と出力される。つまりhtonX
やntohX
をキャストだけでやってほしいわけ。htonl
でも戻ってくるのはint(long)であって、処理しているものがどっちのバイトオーダーかを判別するくらいコンパイラがやってくれても罪にはなるまい。ネットワークバイトオーダー型のままで四則演算したいこともあるしさ。キャストでbyteswap
が勝手に走る。64bitのntohll
(だっけ? FreeBSDのnetinet/in.hにはあったような気がするがLinuxのにはない)がない処理系でも問題がなくなる。いいことずくめだ。
これは別にCじゃなくてもいいけどね。C++ならクラスとして書けるか。しかし中身のないクラスになるだろうな。むしろテンプレートかな。
Purenum(nailstorm.com)。C++のBigInt。なかなか簡単に使えて便利そうだ。gmpとかって最初は感動したけど、使うのが面倒でねぇ。
そう言えばC++ってbigintが言語仕様には入ってないのだな。complexは入ってたような気がする。complexよりはbigintでしょう。fractionとかbigfloatは入ってないのかな。普段C++を使ってないからよくわからないが、分数計算や無限桁演算くらいあっさりやらしてもらいたいと私は思う。学校では複素数や小数よりは分数のほうを早く習う。…あ、その理論で行くとunsigned int
からsigned int
になる前に分数が入ってしまうな。