2010/7 (a)

Last Modified: Sun Aug 1 14:57:16 UTC 2010

人間というのは、夢をみたがる植物だ。

/01 [Sun]


(23:56)
休みの日、家にずっと閉じこもっていると気分が落ちこんでくるのだが、 かといって外に出るとすげーーアチイのでうんざりするのであった。

/31 [Sat]


(11:10)
ひっっさしぶりに二日酔いして気分最悪。
(20:43)
ツールがあると、ついそれに頼っちゃうんだな。
(00:59)
これは醜態をさらしているようにしか見えない、正直のところ。

/29 [Thu]


(08:23)
涼しい朝は、たいてい寝坊する。
(22:26)
釣れますか??
(22:27)
ノストラダムスの予言はいつだって正しい。 なぜならまだ 1999年は来ていないのだから!

/27 [Tue]


(08:24)
会社行かなきゃ
(23:01)
キムコとキムチはどう違うんだい??

(追伸…いますごいこと気づいた。 「チョムスキー」の文字を並び替えると 「キムチスキヨ」になる!! ああそうだ? これは偶然ではない!!!1)

/26 [Mon]


(18:35)
会社を出るとき、雨がポツポツとあたり始めてたので 「やばい!!」と思ったのだが、どうやら雨雲を避けて航行していたらしく、 たいして濡れずに帰宅。そのごザーザ−アふり出したが、まだ暑いね。
(19:54)
きょうは、自称オブジェクト思考を理解しているという人が、 「“多態”ってようするに仮想関数を実行させる仕組みですよね?」などというアホな発言をしたために ブチきれていた。新山はこういう「わかったフリ」をする人に対して非常にキビしいのでして…。 ようするにカテゴリーの混乱というやつだ。しかし、ウィキッペ日本語版にある このアホな説明 も同レベルなので、ようするにこの程度の理解しかしてない人は多いのかもしれない。

そもそも“多態 (poly-morph-ism)”って言葉の意味をちゃんと考えたことがあんのかね? その名のとおり「複数の形態をもつ」って意味である。 これと仮想関数のあいだに直接の関係はない。 たとえば、以下の例は仮想関数を使ってないが多態だ:

class A {
public:
  void foo() { printf("foo\n"); }
};

class B {
public:
  void bar() { printf("bar\n"); }
};

class C : A,B {
};

main()
{
  C* c = new C;
  A* a = reinterpret_cast<A*>(c);
  a->foo();
  B* b = reinterpret_cast<B*>(c);
  b->bar();
}

ここでは C は、お互いにまったく異なる型 A, B として ふるまうことが可能である。-- つまり型 C はひとつのオブジェクトなのに、 型 A と型 B の2つのを見せることができるのである。 しかし、これは危険な多態だ。 なぜなら A と B は互いにまったく関連がないため、 共通の窓口がなければ、使う側はどうしていいかわからない。 だから型付けのある言語では普通こんなことはしない。 ある意味、型C は「手なづけられていない野獣」であって、 何に化けるかわかんないのである。それはキケンなので、 とりあえず檻の中に入れて格子窓から様子を見よう、 ということになる。ここで始めて、共通のインターフェイスが必要だという話が出てくる。

…しかし、ここまで来ても、まだ仮想関数は必ずしも必要ではない。 そもそもC++の“仮想関数 (virtual function)”ってのは、その名のとおり 「関数のようであって関数でないもの」「事実上は関数」「ほとんど関数」 という程度の意味であって、これは単なる関数のラッパ、あるいは 「スイッチつきの関数」にすぎない。Stroustrupp にもそう書かれている。 仮想関数を使わなくっても、自分で型情報を覚えておくフラグを入れておいて 自前のスイッチ関数を作れば、同じことはできる。ただしメンドーくさいし、 あいかわらず危険なキャストは必要となるので、言語のサポートを利用した 仮想関数が一番安全なのだが。

いっぽう、Python などはducktypingなので、もっとワイルドに 野獣を野獣のまま扱っている。だから、どこの馬の骨とも知れないオブジェクトを いきなり正統派の file オブジェクトとして扱いだしたりする。 ときに裏切られて予想外の AttributeError で落ちたりもするが、 それはワイルドさの代償というもんだ。いっぽう“正統派”オブジェクト指向言語における 基底クラスは、そのオブジェクトのふるまいをある程度規定するので、 これはその動物の家柄の良さをしめす“血統書”のようなものと考えることができる。 もっとも、「家柄が良くても実はダメな奴」 って奴は、人間界にもオブジェクト界にも一杯おりますがね…

/25 [Sun]


(21:50)
平日に会社で昼寝をすると、「時間を有効に使った」という感覚にひたれるのだが、 休日にうちで昼寝すると「なんかソンした」という気分になるのはなぜ?
(00:44)
またぞろ頭がおかしくなり、 cmonitor.tar.gz などというアプリを書いていた。これは色だけを使って現在のシステム情報を表現する チョー単純な負荷監視プログラムである。loadavgと現在のメモリ使用率、ディスクアクセスおよび ネットワーク流量が見える。これまでは Python + Tkinter で書いたものを使っていたが、 そもそもPython自体が重いので、超軽量なものが欲しかったのだ。 そんでついでに画面スペースをとらないこと (新山は端末を画面いっぱいに使いたい)。 これはウィンドウの枠よりも細い領域 (100×2ピクセル) しか占有しないので、 まったく邪魔にならない。(ただし override_redirect を指定してないので、 これ自体に枠を表示させないように fvwmか何かの設定をしておく必要がある) 新山はもちろんGnomeのアプレットなぞ使わないし、xloadではCPU負荷しかわからないのでダメ。 しかし、文字ベースの情報はいらない。UI Toolkit は何を使ったかというと、 聞いて驚くべし、いまさら Xaw だぜ。 Gtkを使わないとなると代替品はこれしかない。おかげでできたバイナリはたった8kb。 久しぶりに Xt なぞ使ったんでメマイがしてきた。もう寝よ。

/25 [Sun]


(12:53)

うぶんつ 10.04 アップデート顛末記: Ubuntuやめました。

もうこんなアホなOSをいじっているのは時間の無駄だ… ということで、さっさとハードディスクを買ってきて Arch をインストールした。 これは急に決めたことでない。実は半月ほどまえに、 まず eeePC に Arch をインストールしてみたのだ。ついでに、 会社で使っている VM も Arch にしておき、最初の手順をあらかたマスターしたところで いちばん重要な家のPCにインストールしたのである。 今のところは、まあ、快調というところ。

いくつかのプログラムは自分でビルドした。 おもに日本語関係のものである:

2時間ほどでほぼ使えるようになったが、そのあと「hibernationができない」問題で長らくハマった。 最初はswapパーティションが明らかに少ないことが原因だったのだが、それを解決してもだめ。 なんでー? と思ったら、結局、Arch Wiki に書いてあるように、 initrd で resume させる設定を書かないとダメなのである。この点だけは Ubuntu のデフォルトのほうが 親切であった。しかし Arch のいいところはドキュメンテーションがずっとまともなことである (少なくともUbuntuに比べると)。そして、upstartとかの素晴しい試みもない。だから全体的に、 より「Unixっぽい」感じで、新山にとっては Slackware をほうふつとさせるところがある (Slackware自体、まだあるのだが)。Gentooとかも文書がしっかりしてて結構スキなのだが、 オレは glibc とか jdk をソースからビルドしている時間はないんだよ!

(12:55)
名前づけについて。あれからさらに凝りだしてしまい、 巨大な Java のプロジェクト (おもに Apache関連) で使われている名前を調べることにした。 こうしたプロジェクトでは、名前の規則はほぼ CamelCase に従っているので、 識別子を英単語に分割するのは簡単である。まずANTLRを使って クラス名・メソッド名・メンバ変数名を抽出し、それをPythonで分割して集計した。 結果は以下のとおり:

Apache log4j 1.2.16

Class NameMethod NameVariable Name
first wordlast wordfirst wordlast wordfirst wordlast word
1.log... (29)...converter (35)get... (482)...format (79)logger... (39)...logger (39)
2.category... (15)...test (29)test... (478)...arg (76)serial... (38)...name (38)
3.my... (13)...appender (28)set... (312)...info (71)m... (38)...uid (38)
4.pattern... (11)...case (21)create... (69)...name (52)cat... (27)...cat (24)
5.enhanced... (8)...filter (19)format... (60)...trace (50)d... (20)...instance (18)
6.default... (8)...renderer (15)parse... (54)...log (48)instance... (18)...info (18)
7.socket... (7)...layout (12)is... (47)...performed (46)port... (16)...port (17)
8.property... (7)...handler (12)action... (46)...level (44)max... (15)...level (13)
9.appender... (6)...writer (8)main... (43)...options (44)level... (14)...util (11)
10.name... (6)...model (7)close... (42)...append (43)log... (13)...size (11)
11.level... (6)...throwable (6)to... (41)...main (43)root... (12)...method (10)
12.date... (6)...thread (6)log... (40)...debug (40)util... (11)...root (10)
13.null... (6)...parser (6)add... (39)...close (40)date... (11)...message (10)
14.mock... (6)...format (5)activate... (38)...pattern (40)location... (11)...pattern (10)
15.logging... (5)...level (5)debug... (36)...warn (39)buffer... (9)...log (10)
16.custom... (5)...configurator (5)trace... (35)...size (39)next... (8)...count (8)
17.file... (5)...exception (5)warn... (34)...string (37)category... (8)...counter (7)
18.logger... (4)...mbean (5)append... (33)...layout (36)appender... (8)...filter (7)
19.syslog... (4)...manager (4)info... (33)...instance (33)get... (8)...trace (7)
20.init... (4)...abbreviator (4)do... (31)...filter (32)name... (7)...filtered (7)

考察: メソッド名の上位3位は "get", "test", "set" である。 "test"が多くなっているのは、unittestの項目が多いためだろう。 また (当然ながら) クラス名・変数名には "log" という名詞が使われていることが多い。


Apache Maven 2.2.1

Class NameMethod NameVariable Name
first wordlast wordfirst wordlast wordfirst wordlast word
1.default... (57)...test (100)get... (536)...safe (111)artifact... (53)...manager (29)
2.project... (26)...exception (48)test... (485)...version (92)plugin... (21)...id (23)
3.artifact... (23)...manager (14)set... (255)...id (81)project... (17)...artifact (19)
4.plugin... (19)...utils (11)create... (102)...artifact (69)logger... (13)...map (17)
5.maven... (17)...diagnoser (9)is... (67)...repository (56)container... (12)...version (16)
6.abstract... (16)...filter (8)add... (62)...identity (38)repository... (12)...artifacts (16)
7.invalid... (10)...metadata (7)clone... (61)...project (35)wagon... (10)...logger (14)
8.test... (9)...activator (6)build... (36)...artifacts (35)version... (10)...project (14)
9.wagon... (8)...factory (6)resolve... (27)...directory (35)model... (10)...container (13)
10.mojo... (8)...builder (6)merge... (25)...metadata (27)original... (10)...factory (13)
11.repository... (7)...monitor (5)assert... (21)...string (26)user... (9)...repository (11)
12.build... (6)...case (5)to... (20)...configuration (26)global... (8)...builder (11)
13.model... (6)...source (4)retrieve... (17)...management (24)execution... (8)...properties (10)
14.activation... (4)...transformation (4)check... (17)...file (24)group... (8)...file (10)
15.settings... (4)...listener (4)inject... (16)...roots (23)local... (8)...roots (9)
16.ant... (4)...interpolator (4)can... (16)...key (23)maven... (8)...message (8)
17.string... (3)...resolver (3)path... (14)...scope (22)type... (8)...type (8)
18.requirement... (3)...result (3)construct... (14)...properties (20)path... (7)...source (7)
19.version... (3)...artifact (3)find... (12)...diagnose (19)mojo... (7)...scope (7)
20.dependency... (3)...field (3)execute... (12)...dependencies (18)settings... (6)...repositories (6)

考察: メソッド名の上位3位は "get", "test", "set" である。


Apache Lucene 3.0.1

Class NameMethod NameVariable Name
first wordlast wordfirst wordlast wordfirst wordlast word
1.test... (283)...filter (131)get... (1686)...string (302)term... (166)...att (209)
2.field... (42)...analyzer (75)test... (1438)...query (233)doc... (146)...count (96)
3.term... (34)...query (74)set... (832)...token (180)field... (142)...field (83)
4.query... (33)...builder (52)to... (259)...stream (178)max... (87)...uid (72)
5.just... (32)...task (51)add... (258)...equals (177)num... (86)...dir (69)
6.doc... (31)...test (48)is... (188)...doc (157)serial... (72)...name (67)
7.multi... (31)...collector (39)do... (184)...close (152)query... (60)...doc (65)
8.simple... (28)...reader (37)close... (143)...code (120)current... (58)...length (64)
9.payload... (27)...impl (35)create... (117)...up (109)offset... (55)...size (61)
10.token... (26)...stream (33)read... (113)...reader (108)last... (53)...offset (60)
11.span... (25)...thread (33)equals... (112)...terms (107)buffer... (51)...analyzer (51)
12.my... (22)...scorer (32)hash... (111)...document (99)analyzer... (47)...reader (50)
13.saved... (20)...source (30)increment... (108)...set (98)pos... (46)...buffer (49)
14.default... (19)...node (29)next... (107)...value (95)index... (45)...state (49)
15.index... (17)...writer (27)assert... (106)...index (94)reader... (43)...searcher (48)
16.boolean... (14)...stemmer (27)doc... (102)...length (90)directory... (42)...scorer (44)
17.qptest... (14)...exception (26)token... (91)...size (88)next... (41)...writer (42)
18.segment... (13)...parser (25)new... (88)...field (88)dir... (39)...directory (42)
19.standard... (12)...processor (22)run... (85)...score (87)default... (39)...stream (41)
20.instantiated... (12)...queue (21)clone... (81)...to (85)end... (38)...index (40)

考察: メソッド名の上位3位は "get", "test", "set" である。 また "doc", "query", "term" などの、それっぽい単語がよく使われている。


Apache Xerces 2.9.1

Class NameMethod NameVariable Name
first wordlast wordfirst wordlast wordfirst wordlast word
1.deferred... (15)...impl (195)get... (2304)...name (249)f... (1930)...uid (188)
2.schema... (12)...dv (26)set... (1115)...element (213)serial... (188)...type (79)
3.element... (9)...decl (14)is... (306)...decl (209)fg... (24)...id (62)
4.security... (9)...traverser (13)start... (230)...id (174)name... (22)...handler (62)
5.document... (8)...configuration (13)end... (220)...node (155)debug... (21)...table (58)
6.xmlgrammar... (8)...op (12)create... (214)...type (154)next... (17)...name (56)
7.default... (8)...handler (12)add... (140)...value (148)type... (17)...count (46)
8.xmlschema... (7)...support (11)print... (102)...string (108)namespaces... (13)...index (45)
9.object... (7)...pool (11)reset... (102)...entity (105)max... (13)...manager (43)
10.configuration... (7)...exception (11)process... (91)...document (104)value... (13)...value (40)
11.xinclude... (6)...validator (11)check... (89)...handler (101)validation... (13)...context (35)
12.xpath... (6)...token (10)scan... (85)...error (93)node... (12)...pool (34)
13.abstract... (6)...factory (10)to... (81)...reset (89)min... (11)...symbol (31)
14.htmltable... (6)...error (9)parse... (78)...data (86)schema... (10)...depth (31)
15.string... (5)...container (8)remove... (60)...feature (84)base... (8)...qname (30)
16.datatype... (5)...formatter (8)run... (59)...property (75)g... (8)...reporter (29)
17.entity... (5)...wrapper (8)traverse... (50)...uri (74)length... (8)...stack (29)
18.node... (5)...xmlschema (6)clear... (46)...item (73)singleton... (8)...buffer (28)
19.list... (4)...proxy (6)has... (44)...index (71)system... (8)...source (28)
20.tree... (4)...nsimpl (6)normalize... (43)...source (61)error... (8)...annotations (26)

考察: メソッド名の上位3位は "get", "set", "is" である。 クラス名は "impl" で終わっているものが多く、これはおそらくインターフェイスと実装を 厳密に分離しているためだろう。


ANTLR 3.2

Class NameMethod NameVariable Name
first wordlast wordfirst wordlast wordfirst wordlast word
1.test... (50)...exception (18)test... (800)...string (140)tree... (54)...tree (50)
2.grammar... (14)...stream (18)get... (639)...rule (93)grammar... (35)...name (32)
3.debug... (11)...message (12)set... (197)...tree (77)token... (25)...state (23)
4.tree... (11)...ast (8)to... (143)...label (71)num... (19)...index (22)
5.rule... (11)...editor (8)add... (59)...index (62)rule... (18)...grammar (19)
6.rewrite... (8)...target (8)is... (59)...node (61)input... (16)...adaptor (17)
7.common... (6)...test (7)create... (50)...token (52)debug... (15)...options (16)
8.output... (6)...listener (6)visit... (30)...name (47)adaptor... (15)...scope (16)
9.g... (6)...set (6)consume... (29)...error (44)state... (13)...line (16)
10.mismatched... (5)...action (6)check... (26)...set (43)decision... (13)...map (16)
11.input... (4)...scope (5)gen... (23)...type (42)type... (12)...input (16)
12.base... (4)...controller (5)enter... (23)...state (40)name... (12)...debug (15)
13.runner... (4)...tree (5)error... (21)...lexer (39)label... (12)...tokens (14)
14.abstract... (3)...parser (5)define... (21)...text (37)line... (11)...type (13)
15.tool... (3)...node (5)exit... (20)...root (34)last... (11)...rule (12)
16.error... (3)...generator (4)rewind... (20)...visit (32)is... (11)...directory (11)
17.parser... (3)...state (4)on... (18)...alt (29)eof... (11)...token (10)
18.non... (2)...adaptor (4)m... (18)...decision (28)tokens... (10)...number (10)
19.bit... (2)...iterator (3)report... (17)...line (27)alt... (9)...eof (10)
20.token... (2)...pane (3)equals... (17)...equals (24)text... (9)...labels (9)

考察: メソッド名の上位3位は "test", "get", "set" である。

/24 [Sat]


(10:58)
きょうは午前中に洗濯をすませようと、ヒーヒー言いながらコインランドリーまで行っていた。 ら、途中でモノマー (ものみの塔) の方々に声をかけられた。 やつらはこのクソ暑い中、長袖のブラウスと厚手のスカートで日傘をさしている。 しかし、新山もべつに笑えたものではない。よく思うんだけど、 崇拝する対象がインチキであればあるほど人は熱狂的になるんだよな。 どうしてだろ

/23 [Fri]


(19:16)
きょうは会社で名前づけ規約 (naming convention) について盛り上がってた。 名前づけ規約については世の中あいかわらず混乱している。 ここでいっているのは「クラス名にはUpperCamelCaseを使うべし」などという安直な話でない。 コードの意味に対応してどういう単語を選ぶべきなのか、 という語用論的な話である。これについては今のところほとんどガイドラインがないし、 研究資料もすくない。新山が見つけたのは、せいぜい といったことぐらいである。でもこんなんじゃ全然ガイドラインとは言えない。 ちなみにこのようなすごいサイトを見つけた。 この論文では意味論的・認知的な議論にまで踏みこんで名前づけに関する考察をまとめている。 しかしこれは調査研究であって、実際に参考にできる教訓はあまり載っていない (長すぎてまだほとんど読めていないが)。

ちなみに、C# 界における「スリジャヤワルダナプラコッテ」はこれ:

System.Windows.Forms.ListViewVirtualItemsSelectionRangeChangedEventHandler

これは現在 .NET の標準ライブラリにあるもののうち、もっとも長い型名であるそうな。 自然言語における長い名前については ウィキッペを参照のこと

(19:45)
名前についてふたたび。ひとくちに「名前をつける戦略」といっても、 保守的になったほうがよい場合と、新奇な名前を選んだほうがいい場合がある。 その概念・動作が、真にユニークなものである場合は、 ユニークな名前を選んだほうがよい。場合によっちゃ、そのために新しい動詞をつくってもいいくらいだ。 しかし問題は既存の概念と関連づけたいときである。こういうときに、下手に汎用性が高い単語を使うと、 そのぶん誤解もされやすい。

たとえば「getなんとか」という関数は、 それこそ山のようにあるが、それらの "get" がホントに同じ意味 (語義) で使われてるか? といえば、あやしい。ほとんどの getなんとか関数は、 現実世界の物体を「取る」ようには動作しない。たいていの getなんとかは 情報をコピーするだけだ。たとえば GetAttribute などの関数は、 通常そのオブジェクトの属性を別の領域にコピーするだけで、もし GetAttribute したからといって その属性が消えてしまったら、プログラマはさぞかし驚くだろう。いっぽうで GetEvent のような関数は、文字どおり「とったらなくなってしまうget」を実現している。 あるいは、GetId() のような関数は、"get" と名はついているものの、 実は呼ばれるたびに新規なIDを生成しているかもしれない。こういった関数は例外的で、 通常のプログラマは "get" といえば「とってもなくならないもの」を期待することが多いだろうが、 すべての単語でこうした憶測に頼るのは危険である。

たとえば、関数名・メソッド名としてよく使われそうな動詞をざっとあげてみよう。 以下は新山の主観による不完全な分類だが、"get" には、少なくとも 4つぐらいの潜在的な語義がありそうだ:

こんだけあると、ニュアンスの違いをきちんと表すには相当の覚悟が必要だ。 ちなみに言語やプラットフォームによってもこれらの傾向は違っている。 たとえば Win32 API で "Createなんとか" と "Destroyなんとか" という 名前が使われているのはよく知られているし、Java の流儀では アクセサには "getなんとか" を使え、 と書いてある。これは新山もおおむね同意見だが、いっぽう Apple / Objective-C のガイドラインでは "get"を使っちゃダメ!って書かれてるのだ。 つくづく、世の人々というものは不同意がスキである。
(01:23)
ANTLRをいじっていたらこんな時間だ。寝よう

/22 [Thu]


(07:42)
あぢ〜〜〜〜
こんチクショウ
(22:13)
新山は、親指と人さし指をよく間違える。 そうすると「名前」が「有名」になってしまったり、 「○○」が「▲▲」になってしまったりするのだ。 今日もまたやった。
(22:16)
人間の記憶における precision (適合率) と recall (再現率) について。

人間、だれしも嫌なことは早く忘れたい。そのいっぽうで、楽しいことは長く覚えていたい。 しかし人間の記憶装置というのは出来が悪いので、覚えたくもないことを 永く覚えていたり、逆に覚えなきゃいけないことをサッサと忘れたりする。 といって、いいことだけを覚えようとしていたらそれだけ思い出は減り、 逆にすべてを細部まで覚えていたらきっと精神病になってしまう。 …そもそも、本当に「イヤなこと」と「楽しいこと」をどうやって区別できるんだ? いま現在と10年後ではまったく意味合いが違ってくるかもしれないじゃないか!

結論: 記憶力(ようするにrecallの高さ)だけを自慢するヤツは、アホである。 不完全な記憶は、天の恵みである。

(22:44)
HDDを買いたいのだが、去年買ったHITACHIはどうもWDCと比べてウルサイ。 PCの静かさを専門に評価するサイト、 www.silentpcreview.com でも同じような結論が述べられている。 つうことで、次回はべつのやつにしようと思う。 このサイトによると、静かなのは Seagate と Samsung だと書いてある。 heh.
(00:51)
雨だ! hooray!!

/21 [Wed]


(08:17)
なんだ朝からこの暑さは? あまりに暑いので日本語の語順が狂っている。 IJHT (I Just Hate Tokyo.)

どうでもいいいけろ (どうでもよろ)、 DSL (Damn Small Linux) って知ってるかい? 明らかにこの名前は人々のハートをキャッチしたらしい。これ。 Damn Vulnerable Linux。 朝から笑った。DVL は脆弱性のあるソフトウェアばかりで作られたディストリビューションである。 学習に最適。

(21:47)
今日は会社が終わってから、某駅北口広場の「納涼の集い」なるものを手伝いに行く。 しかし今日は正直いって後悔した。だってスゲーーー暑っちいのである。 ぜんぜソ納涼じゃねえよ!! ちなみに、新山がやったのはヤキソバに並ぶ群衆整理と屋台の後片付けだけ。 そういやー、今日ってナカシキョー (中視協)の人たちも来てたのかな? たぶん前のバザーのときもいたはずだけど…。が、とにかく暑くてそれどこじゃなかった。 終わってから、またぞろ銭湯に行ってしまった。とにかく夏場は銭湯がなによりも 一番のごちそうだ。

/20 [Tue]


(19:13)

プログラミングの学習によさそうなソースコード…か?

(20:07)
here. skk-cdb.el

(追記) ちなみに、自然言語処理の研究者にはskkユーザが多い。 これは、偶然じゃないと思う。このインチキさを笑え。

(00:32)
名前のつけられた“正義”は、たいていホンモノじゃない。

/19 [Mon]


(22:37)
某所の道の駅に行ったら、「菜の花アイスクリーム」なるものと、 「アスパラアイスクリーム」なるものが売っていた。 アスパラのほうを食ってみたが、あんまりアスパラの味がしない。 そんだけ。

/17 [Sat]


(17:33)
きょうはどういうわけか朝から気がふれており、Emacs Lisp 上から cdb を読むための cdb.el などという モジュールを書きはじめてしまった。なぜかっつうと、skkserv (dbskk-cdb) を インストールするのがイヤんなったからである。そもそも skk はセットアップが簡単なのがいいのに、 なぜわざわざ xinetd 経由でサーバを起動したりせにゃならんのか?

…しかし、いざやりはじめてみると、あいかわらずいかに emacs の プログラミング環境がどうしようもない代物 (だいぶつ) であることを 思い知らされた。まず cdb を読むためには各キーに関連づけられた 32ビットのハッシュ値を計算する必要があるのだが、 Emacs Lisp の整数ってのは 30ビットまでなのである。 なんじゃとーー!? しょうがないので、vector を使って擬似的に 32ビット演算をやるルーチンをまず作成。 つぎにハマったのが、 Emacs Lisp ではファイルからデータを文字列などに直接読みこむ機能がないということ。 なんでも一度バッファに入れなければダメなのだ。しょうがないので、 cdbの読みこみ用に *cdb:なんとか*というバッファを作ることにする。 さいわいにも、cdb はファイルアクセスが非常に少ないので、この程度のものなら (効率悪いけど) まあ使えると思う。そしてきわめつきが、 Emacs には構造体がないということだった。 まあ CL 拡張など使えばあるのかもしれないが、オレはそんなに話を大きくしたくないんだよ! 結局、buffer local な変数っちゅうのがあるので、Emacs の場合は 「バッファ」を事実上の (グローバルな名前をもつ) オブジェクトのようにして 扱うしかない。あとは全部グローバル変数をいじることになる。 おまけに新山は Emacs Lisp のスコープがどうなっているのか、よくわかんない。 まあとにかくだ…

そして、肝心の skk拡張のほうはまだできていない。

それにしてもだな、新山はおそらくもう一生の間、 新しい日本語入力システムのキーバインディングその他を覚える必要がないと思う。 昔は大学で Wnn、サークルで ATOK、バイトで VJE を使って 混乱したもんだったが、SKKを覚えてから他のシステムを覚えようという気にならない。 会社でも、くだらぬ短文を書くときには Windows の IME を使ったりするが、 まともな文章を書くときには全部、Emacs + SKK で書いている。 この後、いくら携帯電話の入力システムが進化しても、自分にとって これ以上に効率よく使えるものはおそらく登場してこないだろうよ。 (歳をとったら、ますます覚えにくくなるということもある。)

SKKを使ってわかったことは、 「日本語を書くことは奥が深いが、日本語を入力することは奥が浅い」 ということである。真の問題はあいかわらず質の改善であって、 入力速度を100倍に改善しても大していいことはないのであった。

/16 [Fri]


(20:58)
If you're gonna use it for thirty years, you can recommend it to me.

/15 [Thu]


(21:38)
ケンコーーー診断の結果が帰ってきゃがったが、あいかわらずツマンねえ。 もっと、こう、なんだ、「数値上はもうコイツ絶対に死んでます」的な kickassなパラメータを得るには、一体どうすりゃいいんだ? やぱり cheat code を入力するしかないのか。

/14 [Wed]


(19:32)
歴史の教えるところによれば、正当な Unix の継承者は BSD だが、
ducktyping の教えるところによれば、Linux もまた正当な Unix である。

なぜなら、それっぽく見えるから!

(19:34)
きょう、おかしいと思った日本語:

“初期化されていなければ、初期化する。”

でも、いま考えてみると別になんともない…ような、気がする。 どこがどうおかしいのだろう?

(19:38)
久しぶりにLynxでgoogleを使ったら、ビックリした。 なんだこのページ先頭にでてくる謎の <textarea> は?? でも、もうドーでもいいや。

ただ速いだけで事がたりるなら、たとえばガン細胞はきわめて速いよ。(意味不明)

(21:43)
市場主義経済について。うちの会社に、シューイチさん、という人がいるが、 かれは市場主義経済のヒーローのような人である。なぜかというとこの人は 財布のヒモがユルいのだ。妻子持ちで、家のローンも一杯たまってるというのに、 パチンコが好きで、勝った金で Wii などを買ってしまう (「おかげで子供との会話がはずむようになった」とは本人の弁)。 べつに金持ちではないし、とりたてて浪費家というわけでもない (むしろ「パチンコのために昼飯代を削った」などという涙ぐましい話を聞く) が、 シューイチさんを見ていると「ああ、日本経済はこういう人間のおかげで回っているのだ」と思う。 ホントに。米国型・市場主義経済においては、社会の主役は金を使う人 (= 消費者) だ。 もし世の中が新山みたいなドケチ野郎ばかりだったら、絶対にいまの消費社会は成り立たない。 だからこそシューイチさんはエラいのである。彼のような人々に、我々は足を向けて眠れない。 もっとも本人にこんなこといったら「バカにすんな」と言われそうだけど… (いや実際、新山も半分ぐらいバカにしているが、あとの半分は本気ですごいと思っている)。

そういうこってす。

/14 [Wed]


(08:09)
計算機科学で世の中を語るのシリーズ・その1729:

-- これらを理解する鍵は「分離 (separation)」にある。

/13 [Tue]


(07:46)
そういえば… (さふいへう゛ぁ)

じゃあもしかして、

なのか?
(19:37)
久しう゛りにすずしくてよいね。 ところでさっきなにげなく このTED talkを見ていたら、 すごいことを言っていた:

“米国では、2歳未満の乳児の5人に1人が、(コーラなどの)炭酸水を飲まされている。”

なぜならソフトドリンク類はあまりにも安いので、 バカな親が哺乳瓶に入れて飲ませるんだそうな。 バカな親はそれこそ日本にもたくさんいるが、5人に1人かよ!

(20:39)
銃が人を殺すのではなく、
人が人を殺すのでもなく、やはり
悪魔が人を殺すのだ、と思う。

「ぼくがリザヴェーダを殺したんじゃない! 悪魔が殺したんだ!」
-- ラスコーリニコフ

/12 [Mon]


(20:05)
インターネット時代になって、
ミニュケーションが簡単になったと思ったら大間違いだ。
ミュニュケーションは本質的に簡単ではない。
もし、コミュニケーションが簡単だと思っている人がいたら、
それは相手が自分のかわりに迷惑してるだけなのである。
(22:43)
みにくく勝つよりは、優雅に負けるほうを選ぶよ。

/11 [Sun]


(20:29)
子がいなくても親は育つ(*1)、とはよく言ったもんだね。 あるいはY演算子。

(*1) 脚注 [1] 参照。

/10 [Sat]


(17:50)
やばい! 昼寝しすぎた!

/08 [Thu]


(22:29)
「金の亡者」などに見られる「亡者」という言葉の使い方は秀逸だる。 これは文字通り、タマシイが亡くなっている者という意味なのだ。 しかし、もう死んでるのに「者」という文字を使うのはおかしくないか?
(22:30)
きょうは、会社で、非難訓練をした…いや遭難訓練をした。あれ? ちがったっけか? 近くの署から消防士に来てもらい、 消火器の使い方等について訓練をうける。 新山はアメリカ国から多大な影響を受けているので、 「消防士 == ヒーロー」という考え方をもっているが、 たぶんこれは 9.11 のときの印象が強いためかもしれない。 なんしろ、NYでは消防署に参拝する客がいるほどなのだ! (18'30''〜) ちなみにこの消防署、プラモデルまであるとはおそれいったね。
(00:09)
新山の大きな欠点は、たかが35年ちょい生きたぐらいで 「世の中、なんでもわかったつもりになっている」ことだ。 これは非常によろしくない。とはいえ、たとえ300年生きたとしても、ちっとも十分じゃないケド!

/07 [Wed]


(20:16)
うぶんつ 10.04 アップグレード顛末記。 さいきん、会社から帰ると、なぜか PC がつきっぱなしになっていることが多かった。 「アレ? ちゃんと消したはずなのにな」と思っていたが、どうにも毎日繰り返されるので、 きょうはアッタマにきて電源が切れていることを確認し出かけたところ、 帰ってきたら案の定ついてやがる。ムキーーーーーっ!! ログを確認したら、 どうも朝9時きっかりに電源ONになっているらしい。

…で、調べてみたら、Linux 2.6.32 にアップグレードされた途端、 うちのパソコンでも wakeup 制御が効きだしたということが原因らしい。 これは以下のようにすればわかる:

$ cat /proc/driver/rtc
rtc_time        : 11:18:48
rtc_date        : 2010-07-07
alrm_time       : 00:00:00
alrm_date       : ****-**-**
alarm_IRQ       : yes
alrm_pending    : no
24hr            : yes
periodic_IRQ    : no
update_IRQ      : no
HPET_emulated   : yes
DST_enable      : no
periodic_freq   : 1024
batt_status     : okay

で、このアラームは UTC 00:00:00 に設定されていた。 これは日本時間でいうところの 9:00 なので、毎日こいつがブートしていたというわけだる。 まったく。これをクリアーするためには

$ sudo sh -c 'echo 0 > /sys/class/rtc/rtc0/wakealarm'
のようにする。ついでに BIOS 設定も変えてアラームを完全に禁止しておいた。 これでたぶん大丈夫だろう。しかしまったくむう。

ほかにも、アップグレードしたら毎回、shutdown か reboot するたびに fsck する (正確には fsck はしないが、EXT3-fs が recovery 警告を出す) ようになった。 なんでかよくわからないが、/etc/rc{0,6}.d をみたら、 halt や reboot をする順序がおかしい。ほんらい S90halt とか S90reboot でなければ いけないのところを、S01halt とか S01reboot になってる。 ムキーーーーーっ!! おそらくどっかのパッケージがいじったんだろうが、どこの誰だこんなアホなことをするやつは!!

それから、あいかわらずネットワークを認識しない話。どうやら、新しいバージョンの e1000e モジュールがうちのハブと相性悪くなったらしい。ケーブルを一度抜いてまた挿したりすると 通じるようになる。この手の現象はホントーにやっかいだ。確率的に起こるうえに、 なんか電気的なアレがアレして、いつのまにか直っていたりする (前はハブの口を変えたり、ケーブルの終端を逆にしてみたら直ったことがあった)。 結局 (ケッキョキ)、auto-negotiation をオフにするととりあえずこの現象は出なくなることが判明。

$ sudo ethtool -s eth0 autoneg off

しかし、どうにも気分がわるい。 新山はパソコンがちゃんと動かないのには慣れているので、 それ自体に腹を立てているわけではない (でも一般人の感覚だったら絶対こんなのおかしい)。 Ubuntu のダメなところは、意味もなくメカニズムを複雑にしすぎてて、 しょっちゅう動かなくなるくせに「おかしくなっても直せない」ことだ。 まったく、ムカーーーー!

(まだ続く… (顛末記なのに))

(22:19)
銭湯に入っていい気分で出たら、カサを盗まれていた。 まったく今日わ (こんにちは) ついてないなあ…。

ちなみに鍵をかけておかなかったオレは悪くない。絶・対・に。 これからもかけないからな! 何度でも何度でも盗むがいいさ。

(in case you don't know yusuke is a verry stubborn guy.)

/06 [Tue]


(22:41)
ようやくページ変えたゾーー

ぞんだけ


Document ID: 2eff6b56e6b6865ac4ae975d01007f8d

Yusuke Shinyama