あまりコンピュータにさわりたくない気分だったので意図的に日記の更新をやめてみた。はあ……。
金欠が限界に来た。それでも本だけは減らせないので携帯を捨てて本代にまわすことにする。それでも足りなければあとはサーバ代を削るしかない。これだけは削りたくなかったんだけどな。
『Interface』7 月号。FD 一枚でブートできる Linux を作る特集が面白そうなので買ってみた。ローレベルの話は好きだ。それにしてもローダ、リンカは最近の流行りなんですかね。『Linkers & Loaders』もそうだし、あと『エキスパート C プログラミング』もリンカの話が結構あって役に立つ。というかこの他にはほとんどない。
『UNIX プログラミング環境』B.Kernighan, R.Pike、ASCII。ずいぶん古い本だよねえ。sh とか awk とか sed とか C とかの本。なんていいかげんな紹介なんだ。新しさという点で言えばまったく役に立たない本。本文でバックスラッシュだけが全角なのが気持ち悪い。最近はまっている UNIX 考古学の一環として購入。
あ、ワールドカップやってるんだ……。
苦戦。とりあえず SparcV9 では flushw で V8 以前は ta 0x3 (ta はソフトウェア割り込み)、Linux だと 0x83、ただし 0x01〜0x07 は SunOS のエミュレーションもする、ということがわかった。さらに [ruby-list:34921] からのスレッドを見ると、sparclite (SparcV8 Embedded) は flushw なのか、という気もしないでもないような気配が濃厚な可能性がやや高いかもしれない。
それにつけても思い知ったのは、"ta 0x83" なんてアセンブラ検索するだけ無駄ってことさっ!
GC の話。明示的なプロテクトが必要なく、保守的 (conservatice) でない GC を使ってる言語、てのを ruby-{list,dev} でまつもとさんが話してたような……と思ってひたすら探す。K で始まる Lisp ってのは覚えてたんだけど。KCM……? とか KMC……? とかいろいろ検索しまくった挙句、全然関係ないメールを読んでる途中で発見 [ruby-list:29735]。ぬぁー、K と M は合ってたのにー。
そんでそれを今読んでるんだけど、これはいったいなんなんなんなんでしょう。(続)
微妙に google から来るようになったが、二つめの検索語が「辛ほむら」ってのはどうなんだろう。
ほむらと言えば、また新しいのが登場したようだ。黒い。くそう。弱味につけこんで次々と新しいものを出しやがって。そんな余裕があるなら最初の奴をもいっかい出せー。
いきなり FLUSH_REGISTER_WINDOW と書いて ruby の gc.c で定義されているマクロだとわかる人はどのくらいいるのだろうか。一桁だろうなあ。
もはや意地だけ。
部屋の掃除がはかどるということは、かなりテンパってるわけだなあ。
腰が痛い。ずっと座ってるうえに姿勢わるいからなあ。あと運動不足で筋力が衰えてるのも非常に大きい。背筋腹筋をちゃんと鍛えとけば酷使してもけっこう耐えられる。そういうわけで久しぶりに一時間ばかりジョグしてきた。
うう、たった一時間で苦しい。しかも暑いし。今度からは帽子をかぶってこよう。
ちなみに、走るときは帽子を逆にかぶって首筋 (後ろの) を影にするほうがいいのです。首のうしろのとこには神経とか血管の束が通ってるので、そこに直射日光をあてとくと身体の前に脳がやられてしまいます。だからマラソン用の帽子には前後両方につばがついてるんですね。
そういうわけで今日は ELF の仕様書を印刷した。フォーマットは PDF。xpdf で見たらかなり汚なかったけど、Linux 用の AcrobatReader だとさすがにキレイだ。pdftops で PS に落として GhostView で見てもかなりよい。印刷するともっときれいになった。
Linux でもたいていのことは困らなくなってきたけど、フォントまわりだけはどうにも進歩がないよなあ。特に日本語が。256 倍本のときも最終チェックは PDF だったけど日本語がズレまくってて苦しかった。
本当にどうにかなんないですかねえ。フォント。
ソースコードを読みなさいとはよく言うけど、「読みかた」それ自体について書いてあることはあまりないのではなかろうか。というわけで書いてみた。
「こういうドキュメントがあるぞ」とかその他意見募集。
この中でも書いたけど、関数の呼び出し関係を図にしてくれるツールってないですかね。関数に限らず、オブジェクトのグラフを受け取って図にしてくれるものでもいいな。あ、とすると、オブジェクトインスペクタが流用できるかな? そういえば rdoc がそういうのを使ってたような……
うーむ、またしても「ほむら」で来た人がいるようだ。この日記、「ほむら ラーメン」で google 検索すると二枚目に来るんだな。すごい。
それはともあれ「ほむら 黒マーユとんこつ」買ってきた。明日食べよう。でもマーユってなに? 黒マーユだとヒットしない。マーユだと関係なさそなサイトばっかり。ついでに http://www.homura.jp は Flush only のようだ。やめろー。
■
kjana [呼び出し関係というと cflow とか gprof とか?
残念ながらどっちもあんまり見やすくはない.
きっとその線でツールあるんだと思うんですけどね.]
■ matz [「ソースコードを読むための極意」は『目的をもって読む』ことです。たとえば、ただ漫然とソースコードを読むのは苦痛です。]
■
なひ [楽しくソースコードを読む極意は、
「読んでいてつまらないソースコードは読まない」だと思います。
ソースコードなんて、たまたま自然言語じゃなくてプログラミング言語で書いてある
だけの小説なんだから、
主題のない、伏線のない、読み手を意識してない、つまらない小説は捨てる。ぽいっ。
という話じゃないですね。脱線ですいません。言ってみたかったんです。
結論: ソースコードがドキュメントです(汗]
ちくしょーわかんねー。なんなんだこの GC は。なんでこれで大丈夫なんだあー。
食べた。今回は固形スープがない。具も少ない感じがする。ついでに、とんこつスープが白いので黒って感じじゃない。
が、それはそれとしてやっぱうまい。これまでのほむら味(謎)も残しつつとんこつスープな味わいだ。辛ほむらはマイナーバージョンアップだったけど今回の黒ほむらはメジャーバージョンアップと言ったらいいのだろうか。また生麺、スープの出来はこれまで通り非常によい。どちらかと言えば個人的には素ほむらのほうが好きだけど、今回のも悪くない。少なくとも他のカップラーメンに比べればずっとうまい。そのぶん高いのが難点だが、100 円ちょいアップでこれだけ味の差があれば十分ではなかろうか。
rb_f_binding → blk_copy_prev → scope_dup → frame_dup → rb_f_block_given_p → rb_thread_current → scope_dupというような呼び出し関係を関係を図にしたいんです。なんかありそうですよねえ。
configure; make; sudo make install で完了……と思ったけど、使ってみると freetype サポートが効いてなくてフォントが汚ない。freetype が入ってなかったようだ。とっくに入れたと思ってたけどな。速攻でつっこむ。
コンパイルしなおし。……configure で "freetype/freetype.h not found" と出る。--with-freetypeincludedir=/usr/local/include/freetype2 が必要だった。
ぐあー、まだだめじゃん! --with-freetypeincludedir=/usr/local/include も必要なのか。二つ同時に指定するには…… --with-freetypeincludedir="/usr/local/include/freetype2 -I/usr/local/include" でごまかした。いいのかこんなんで。
うう、今度はコンパイルが止まるよう。--without-tk --without-tcl も必要だった (graphviz には tk8.3 が必要なんだけど、家には tk8.0jp しかない)。
README はちゃんと読まないとだめですねえ。手で書きかえたほうがよいところが一ヶ所あるようです (特許関係でわざとオフにしてある)。ついでに prefix も /usr にしとく。これで graphviz もオプションなしでいけるようになった。
ドキュメント生成ツール doxygen は graphviz を使ってクラスツリーのグラフを出力してくれるらしい。ということは関数グラフの視覚化もやってくれるかも? ということで試してみた。
……関数はやってくれないようだ。くそっ。
ここのデザインを変えてみた。名付けて「LoveRubyNet なテーマ」。
完成。ruby の eval.c の関数呼び出し関係のグラフです。
余分な関数を手動で削ったあと、部分 DAG を刈り込んでます。刈り込みなしのはこちら。なんと画像サイズは 10139x990、バイト数も 198KB あります。ノード数は約 300 です。
いろいろな意見がありますねー。
まつもとさんから。目的を持って読むのが極意ですか。言われてみれば確かにそうかも。なんとなーく興味だけでカーネルのソースを読んでみてもさっぱり理解できないけども、「GC の仕組みを調べよう (それ以外はどうでもいい)」というように明確な目標を持っていると非常に見通しがよくなりますね。
なひさんから。おもしろくないソースは読まない。逆に言えばおもしろいソースを読むと。なるほど、これも納得できます。どんなに難しくても面白ければなんとかなってしまう、というのはよくあります。子供がポケモンの歌を何の苦労もなく覚えられるのと同じ理屈ですねっ。
それとバカが征く」から。ソースを書き換えながら読む、というのも確かにやりますー。「ここはこういう名前のほうがいいんじゃないか」と考えてみるとか、とにかく自分の好みに変えていく。ソースを変更して動かしてみて (またはコンパイルしてみて) 影響範囲を調べたりするのは便利ですね。
さらにたむらさんの日記から。やっぱり時代はとっくに IDE なのか……。と言ってもですね、正直なとこ言うと、別に IDE は嫌いじゃないんですよ。ただマウスで作業させようとするのが嫌いなだけなんです。GUI も嫌いじゃないんですよ。ただマウスで作業させようとするのが嫌いなだけです。コマンドラインから操作できて端末用コマンドが (も) 使える GUI だったら、さらに自分で機能が好きなように拡張できるなら、何も文句は言いません。
そういえば、ぼくは肝心なとこは印刷していろいろ書きこみながら読むんですけど、みなさんは紙は使いますか? 紙だととにかく図が簡単に書けるのがいいと思うんですよね。それにモニターは狭いのでソースコード二つを横に並べるともう幅が足りなくなるのが気に入りません。さらに図を書くとなるともう……。パソコンも進歩しましたけど、なんでこうモニターの大きさだけはたいして変わんないんでしょう。まともに作業したかったら最低 50 インチくらいは必要ですよ、絶対。日本 IBM の社長も「ウィンドウ切り替えなんて役に立たん」って言ってデスクにパソコン三台くらい並べてるそうです (しかしそれはそれでキーボードが多くて嫌だ)。
■
しん [大変参考になるシリーズ「ソースコードを読むための技術」で、おもわずほじって呼んでいます。ありがとうございます、感謝しております。
ぼくはツールとして「仕様書工房」っていうの使っています。
まあ概要みるのと、ドキュメントの体裁つくるのにはかなり便利です。あとソースへのドキュメントの書き方が標準化されるのも副次効果でいいかもしれません。
ソースの読み込みは僕も紙に打ちだして、4色ボールペンでいろいろ書き込みながら読んでいきます。
解らない処理やキーの部分とかに赤を使って「?」とか「☆」とか書いておいて、解ったらそこに追記していくという感じです。
やはり直接メモを図でも矢印でも簡単に書けるので一番便利です。
紙のソースを読むのに、補助としてPCのツール(Grep,仕様書工房)とかを使います。
あと仕様読むだんかいからですが、自分の解らないキーワード、最重要キーワードとか略語とかはエクセルで簡単な辞書の表を作ります。 ついでにこの辞書のキーワードごとにリンク設定したりしておきます。ファイル単位のリンク指定ですが、文書内の指定までできるともっと便利ですね。そんなツールほしいですね。]
w3m のマウスサポートをオンにするとカット&ペーストができなくてヤじゃない? さっきコンパイルしなおして外した。
そういえば X は (というか X アプリは) カット&ペーストの仕組みもイマイチだよなあ。
さくさん&わたなべさんのツッコミによりわたしの不満はタコだったことがわかりました。Shift+ドラッグでクリップボードコピーできますし、マウスが邪魔なら option のとこでオフにできるのですね。便利です。
よく現在のページの URL をコピーしてます。そういうときは c とか = で出してカット&コピーしてるのですが、手数が増えるのが面倒です。面倒なだけでなく、しっぽが切れてしまうとそもそもコピーできません。やはりキーひとつでコピーできるのがベストです。なんかいい方法はないもんでしょうか。
考えついた。まずコマンドラインからの引数をクリップボードにコピーするコマンドを用意する。そんで w3m 側で external browser としてそのアプリを起動すれば終わりっ。
コピーだけしてくれるクライアントってありそうだな。ちょっと検索してみよ。xclipboard とか xcb ってのがそれっぽいけど、なんかうまくいかない。うーむ……
書いたほうが早ぇ! ということで書いた。コマンドラインから受けた文字列をクリップボードにコピーするプログラム。
w3m の設定はこんなかんじ。
-- ~/.w3m/config -- extbrowser /usr/X11R6/bin/xclipstr %s & -- ~/.w3m/keymap -- keymap C EXTERN # 現在のページのURL keymap M EXTERN_LINK # いま乗ってるリンクのURL
かんぺき〜
おおっ、Imakefile ありがとうございます > なかださん。Makefile のかわりに入れて、ver0.2 にしました。そのほかは全く同じです。
■
なかだ [# Imakefile for xclipstr
NAME = xclipstr
VERSION = 0.1.0
PROGRAMS = $(NAME)
SRCS = xclipstr.c
OBJS = xclipstr.o
FILES = $(SRCS) Imakefile ChangeLog README
LOCAL_LIBRARIES = $(XONLYLIB)
AllTarget(ProgramTargetName($(PROGRAMS)))
NormalProgramTarget($(PROGRAMS), $(OBJS), $(DEPLIBS), $(LOCAL_LIBRARIES), NullParameter)
InstallProgram($(PROGRAMS), $(BINDIR))
/*
SimpleProgramTarget($(PROGRAMS))
*/
dist:
rm -rf $(NAME)-$(VERSION)
mkdir $(NAME)-$(VERSION)
cp $(FILES) $(NAME)-$(VERSION)
tar c $(NAME)-$(VERSION) | gzip > $(NAME)-$(VERSION).tar.gz
rm -rf $(NAME)-$(VERSION)]
■
kjana [ネットワークの設定
URLを開く時のデフォルト文字列
* 無し
* 現在のURL
* リンク先のURL
....というのはあるけど現 URL とリンクの URL の
両方に対応してるのってのはないんだな....]
■
なかだ [うっかりツッコミに貼り付けるときに#でコメントを入れてしまいましたが、
Imakefileはcppを通すのでXCOMMでないとまずいっす。]
■ あおき [直しときました。]
始めて awk のコードを書いた。とりあえずはこんなのから。
df -h | egrep '^Filesystem|home' \ | awk '{ print $2, "\t", $3, "\t", $4, "\t", $5 }'
実に頭悪いコードだ。でもいいのさ、結果が出れば……
いまさら ruby 1.1c9 をコンパイル。うわっ、エラー出まくり。なぜか strdup を extern 宣言してるとパースエラーになるようだ。ちょっと試してみたところ、-O2 なしだとならない。-O2 -E を見てみたら問題が発覚。strdup がマクロで memcpy に展開されてた〜。昔は問題になってなさそうなのは、その当時の gcc は strdup をマクロにしなかったということかな?
拡張モジュールのコンパイルも失敗しまくってるな。いいや、1.1c9 で curses や tk なんて使わんし。
うお、--program-suffix も効いてない……。面倒だから ruby 本体だけ手でインストールだ。
しかし懐かしいなあ。ぼくが最初に使った ruby は 1.1b9 でした。たぶん。
うわ、ちげえよ。#include なしでは展開されないんだからgccがやってるはずない。 これだ。(string.h)
#if defined __GNUC__ && __GNUC__ >= 2 # if defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__ && !defined __cplusplus /* When using GNU CC we provide some optimized versions of selected functions from this header. There are two kinds of optimizations:
なにー、xclipっていうのがあるんですか。まさか名前までほとんど同じとは……。まあこっちのほうがシンプルだからこれでいいや。
xclipstr は日本語通りますよ。少なくとも emacs と rxvt へのペーストは OK でした。
CVSのワーキングコピーで、チェックインしてから変更された ファイルをリストするコマンド cvsdiffl。 前に grep と cut で書いたのを awk にできることに気付いたので直してみた。
# 変更前 cvs diff --brief "$@" | grep ^Index | cut -d\ -f2 # 変更後 cvs diff --brief "$@" | awk '/^Index/ { print $2 }'
長さは変わらないが微妙にすっきりした。満足。
なんとなくすることが思いつかないときは cvsdifflと cvschk を連発して、出力がなくなるまでチェックインしまくるのがいつものパターン。
cvschk とはレポジトリに入れてないファイルをリストする自作コマンドだ (Ruby)。cvs の contrib に cvscheck というのが入ってることに気付いてしまったのだが、こっちのほうがシンプルだし .cvsignore を無視したりしなかったりできるオプションがあるのが便利だと思う。きっと。
でも cvsutils ってのもあるのね……あ〜、これには負けそうだ……
cvsdifflやcvschkを連発する、と書いたが、具体的にどれくらい連発している のだろう。高林さんの「履歴マニア」を読んでいらい、zsh の setopt append_history を使ってコマンドラインヒストリを全部ためこんでいるので grep で簡単に数えられる。結果は 26634 コマンド中 620 回 (2.3%) だった。 これは……多いのか? 少ないのか?ちなみに cvs diff を入れると 1020 回、 cvs で始まるコマンドを全部合わせると 2058 回だった。これはかなり多いと 言えそうだ。
100 回以上使ったコマンドはこんなかんじ。
5163 ls 栄えあるダントツ一位! 3480 less 2881 vi cdより多いってことは…… 1755 cd 1419 cvs プログラム + 原稿 + ウェブだしなあ。 1060 ruby rubyキタ―――――――――――――――! 668 grep属 643 w3m google様のおかげです 574 mv mv、rmはcpの倍も使ってるという意外な事実。 534 make ちょうどmake = tar * 3くらいか 531 rm 499 dirs poとともに使う 491 cat 短いのはcatするのが好きなので 483 po n回popd 404 cvsdiffl 303 pop 対Mew兵器 その1 238 cp 236 man 228 exit shutdown前にktermとXを落とすのでそのたび三回つかう 214 echo 190 cvschk 186 mkdir 168 tar 159 refe 意外とヘルプ系が上位ですね! 147 gcc 147 sudo 141 sh 131 date 131 ps 身におぼえなし 117 mboxchk 対Mew兵器 その2 100 jobs fgは94回
うちの zsh オプションは setopt hist_ignore_dups のみです。重複はあとからでも消せるし。
そうそう、プログラマーの性?ってのはぼくも思いました。操作も軽いですしね。「cp だと write(2) が○回……」と一瞬考えてしまうのはぼくだけでしょうか。
今週は数が少なくてラッキー。
毎回やるたびにスレッド表示が見たくなって、それだけのために自作メーラを立ちあげてます。まだメールを出すこともできないというのに、なぜかスレッド表示はできるんです。ちなみにマルチパートメールも表示できます。base64 も gzip もデコードできます。普段から使ってればとっくに実用段階に入ってると思うんですが、メールが使えなくなると致命的なので恐くて移行できずにいます。
■ ただただし [あるある。mvする時も、パーティションをまたぐときは躊躇しちゃうもんな(笑)]
最近、マイクロソフトが気にならなくなってきた。
気にならない、というのは、つぶれなくてもいいとか、好きになった、ということではまるでない。ただ、何をしてもどうでもよくなってきた。なんでか考えてみるに、なんて言うかな、もうマイクロソフトでもないな、と思うわけです。どうでもいいです。なんか三年くらいたったらポックリ逝ってそうな、そんな予感すらします。
でも Linux や MacOSX が潰すというような形ではないでしょうね。全然別のところから飛んできた流れ弾に当たってイチコロ、というパターンがありそうです。それはたとえば政治的な意図かもしれない。あるいは市場かもしれない。それとも消費者かもしれない。とにかくなにか社会的なパワーに潰されるような予感がします。
■ matz [KSMのGC、すごいよねえ。なんでこれでうまくいくのか。]