2005 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
2014 1 2 3 4 5 6 7 8 9 10 11 12
2015 1 2 3 4 5 6 7 8 9 10 11 12
2016 1 2 3 4 5 6 7 8 9 10 11 12
2017 1 2 3 4 5 6 7 8 9 10

ホーム

2005年11月30日

ハァ? ジュニアがラグナロクのエミュ鯖? 自作なの?、それ?
よくしらないんだけど、要はサーバ側を自作したってこと? そんな世界があっ
たのか。

まぁ、クロいわな。ストーリー設定なんかパクらないといけないわけだから、
そりゃ著作権上問題があるわな。ただのプロトコルじゃ済まないでしょ。裁判
になってみないとわかんないけど、まず負けるでしょ。営業妨害の意味ももち
ろんあるし。

まぁ、でも、それはともかく、そんなことできるんだったらジュニアなんか辞
めちゃって、どこぞのソフトウェアハウスに就職したほうがいいでしょ。もっ
たいない、マジで。

情報元はブブカね。

本家Permlink


2005年11月29日

あんまり強い要望ではないんですけど、StringIO、読み込みのEOFを明示的に
入力できるようだとうれしいです。StriongIOの読み込みは、もとになる文字
列を全部読み込んだら終わりになります。そうではなく、文字列を全部読み込
んだら、ブロックしてほしいんです。もちろん、こんなことが必要になるのは
ごくごく稀で、これがいつもの動作になっても困るんですけど。

どんなときにほしいか。スレッドを使ったテスト。testeeをスレッドで回して
おいて、testerからデータを送り込む。このとき、testeeが勝手に読み終わる
ようだと困るわけです。

class Testee
  def doread
    while (line = $input.gets)
      $output.puts(line)
    end
  end
end

class Tester
  def test_doread
    $input = StringIO.open('hello', 'r+')
    $output = StringIO.open('', 'w')
    Thread.start{Testee.new.doread}
    assert_equal("hello\n", $output.string)
    $input.puts('world')
    assert_equal("hello\nworld\n", $output.string)
    $input.eof = true
  end
end

みたいな感じ? 自分でもよくわかってないで書いてるんですけど。

まぁ、無茶な話ですか。

--

ああ、そうか。上のみたいな用途にはIO#pipeを使うんですね。

class Testee
  def doread
    while (line = $input.gets)
      $output.puts(line)
    end
  end
end

class Tester < Test::Unit::TestCase
  def test_doread
    $input, output = IO.pipe
    input, $output = IO.pipe
    Thread.start{Testee.new.doread}
    output.puts('hello')
    assert_equal("hello\n", input.gets)
    output.puts('world')
    assert_equal("world\n", input.gets)
    $input.close
    output.close
    input.close
    $output.close
  end
end

こうですか。ちょっとややこしいですけど。

--

個々のリファクタリングには当然明白な意図というものがあります。でも本当
は、さらにその上により大きな意図がないとダメなんです。システムの意図と
いうもの。そのシステムの意図のもとに個々のリファクタリングをこなしてい
く。

これは『大きなリファクタリングは小さなリファクタリングの積み重ね』とい
うのとはちょっと違います。システム全体をどういう方向に持っていきたいか
という視点のもとに個々のリファクタリングをこないしていくということです。

ここでいっている『システムの意図』というのは『先払い』とは違います。理
想像といった程度のものです。理想像は現実に合わせて変わります。変わるも
のなのに時間をかけて予想したり、縛られたりするのはバカな話です。

『雀鬼流 勝負牌の選び方』(桜井章一、竹書房)

  遠くを見ながら、身近なことをしっかりとやる。それが麻雀なんだ。

--

Wikiのメタファーとしてはノートが一番近い気がする。でも、それだとあんま
り実装のヒントにならない。

思い浮かんだのが寿司屋。注文を受けて、シャリを握って、ネタを乗せて出す。
お客さんがネタを持ってくるときもある。で、シャリっていうのが見た目 
(HTML) なんだけど。ちょっと直感と逆になるんだけど。でも、大事なのはテ
キストのほうだし、だからテキストがネタということになる。

まぁ、寿司屋に限らず、食い物屋はメタファーになりやすいんだけど。注文を
受けて料理を出すなんていうのは、ほとんどのアプリのメタファーになる。

そういえば『銀河ヒッチハイクガイド』だっけ? レストラン型のコンピュー
タ、あったでしょ?

でも、この寿司屋、バカなんだな。知らないネタは出せない。初めてのネタは
お客さんが持ってこなきゃいけない。で、それを作るほうはもっとバカなわけ
だ。だって、シャリにばっか凝るんだもんな。いや、シャリは基本なんだけど
さ (笑)。

本家Permlink


2005年11月28日

やっぱ和田の本、面白かったです。

『ホップする球は軽い』ってのはよくいわれることで、あの沢村賞の沢村もそ
うだったという話を聞いたことがあります。ヘンな言い方ですけど、そういう
ところなんかも含めて非常に日本的なピッチャーだなと思いましたね。パワー
じゃなくってキレで勝負するタイプ。イチローのピッチャー版みたいな感じ。
でも、イチローと違って親しみが湧きやすいのはいいところ (笑)。そんな和
田がメジャーで通用するかどうか是非見てみたいですね。

でも、この本で面白かったのは、ストレートの秘密じゃなかったんですよ、自
分にとっては。このあたりのことは大体結論が出てるっていうか。球を隠すの
が上手いとか、初速と終速の差がない (つまりバックスピンがかかってる) と
か、そのくらいしかないですから。魔球でも投げてれば別ですけどね。そうし
た、いってみれば技術的な面よりも、和田の精神面の話が面白かったですね。
ほんと、和田の爪の垢でも煎じて飲みたくなるくらい (笑)。結局ありふれた
答えになっちゃうんですけど、適切な目標設定と、それに向かった継続的な努
力ってことなんですね。でも、それがなかなか、ね。

本家Permlink


2005年11月27日

ちょっと乗り遅れちゃったのかな。

『和田の130キロ台はなぜ打ちにくいか』(佐野真、講談社現代新書)

もちろんホークスの和田なわけで。まだ買ってきたばかりでロクスポ読んでな
いんですけど、売れてるんでしょ?、これ。 書泉の2Fじゃ売り切れだったし。
店員さんに聞いたら1Fにあった。

で、1Fでちょっと見たときに、ちょっと匂ったんですね。おいしそうな匂いが。
素材は申し分ないわけで。それがどう料理されてるかが肝心なわけで。これが
Numberみたいなチンケなインタビューとかで終わるんだったら買わなかったわ
けで。(あ、でも、Numberのマリーンズの記事は面白かったですけどね。日本
一になったときのヤツ。)

話が逸れちゃいましたけど、和田の本。巻末に卒論が載ってるんですよ。和田っ
て確か早稲田のスポーツ関係でしたよね。そんときの卒論。本の内容は、和田
の生い立ちをたどりながら、和田の投球メカニクスを解き明かす感じなのかな?

こういうので心配なのが、いわゆる企業秘密ってヤツなわけで。あれもダメ、
これもダメじゃ興覚めってもんです。ジャイアンツにいた西口聖なんか、引退
した今でもボールの握りは企業秘密だっていって明かしませんからね。そのあ
たりを注意しながら読んでみるつもりです。

ま、読み終えてもないのに紹介するのもどうかと思うんですけど、とりあえず。

本家Permlink


2005年11月26日1

http://www.jda.go.jp/JMSDF/

海自のページ、すごいね。1つ上の防衛庁との落差がすごい (笑)。陸自や空自
と比べてもデザインはいい。

海上自衛隊体操、見とくように。

ああ、1年くらい前はダサダサだったんですか。すげー努力したんだな (笑)。

本家Permlink


2005年11月26日

すんません。こないだのzshのプロンプト、間違ってました。どうもエスケープ・シー
ケンスが正しく終わってなかったみたいで。調べなおしたところ:

autoload -U colors
colors
if [[ $TERM = dumb || $TERM = emacs ]] {
  PS1='%~%% '
} else {
  PS1=$'%{\e[37;44m%}%~%%%{\e[0m%} '
}

となりました。

http://nparikh.freeshell.org/unix/prompt.php

ここで教えてもらいました。

いや、間違いに気づきまでは『なんでこんな使いにくい設定がデフォなの? 
アフォ?』とか思ってました。あははは。コマンドが長くなっても行をラップ
しなかったりとかね。

--

c2.comのWikiって、wiki?foobarとかだと何も表示しないんですね。ゴーイン
すぎて笑っちゃいました。

--

http://dictionary.goo.ne.jp/search.php?MT=cohesion&kind=ej&mode=0&base=1&row=0

cohesionに『結束性』という訳が振られてますね。前見たときは【コンピュー
タ】の項目はなかったように覚えてるんですけど。

結束性というのは悪くないですね。粘着性というと、全然ニュアンスが違って
きます。かといって結合性でも、異なるもの同士がくっつくというニュアンス
が出てしまいます。それなら【物】の『凝集力』のほうがいいでしょう。結束
なら、何らかの共通する部分を持つもの同士がくっつくといったニュアンスが
出てきます。凝集も結束も似たようなニュアンスになりますけど、コンピュー
タ用語では結束のほうが一般的なんでしょうか。

本家Permlink


2005年11月25日

http://www.tokyo-np.co.jp/00/detail/20051125/fls_____detail__020.shtml

  和泉さんはプロレスラーとしてもデビューした。

なぁに、かえって以下略

--

へー、assert_diffってオレのしか引っかかんないのか。みんなやってんのか
と思ってた。

まー、しかし、オレもロクなもん作ってねーわな。小物ばっかしだし、かといっ
て使われてるわけでもなし。

--

オブジェクトの配列を正規表現で検索する。原理は単純だ。オブジェクトの配
列を文字列と正規表現に変換できればいい。

class Char
  def initialize(ch)
    @ch = ch
  end

  def to_c
    return @ch
  end
end

class MetaChar
end

class Lparen < MetaChar
  def to_c
    return "("
  end
end

class Rparen < MetaChar
  def to_c
    return ")"
  end
end

class Plus < MetaChar
  def to_c
    return "+"
  end
end

def objects2str(objects)
  return objects.map{|ech| ech.to_c}.join
end

def objects2regexp(objects)
  return nil unless objects || objects.empty?
  buf = ''
  objects.each do |ech|
    if ech.is_a?(MetaChar)
      buf << ech.to_c
    else
      buf << Regexp.quote(ech.to_c)
    end
  end
  return Regexp.compile(buf)
end

haystack = [
  Char.new("b"), Char.new("a"),
  Char.new("n"), Char.new("a"),
  Char.new("n"), Char.new("a"),
  Char.new("s")
]

needle = [
  Lparen.new, Char.new("n"), Char.new("a"), Rparen.new, Plus.new
]

hstr = objects2str(haystack)
regexp = objects2regexp(needle)
match = regexp.match(hstr)
p haystack[(match.begin(0))...(match.end(0))]

漢字を使えば、オブジェクト→文字へのマッピングで文字が足りなくなるとい
うこともまずないだろう。

本家Permlink


2005年11月24日1

クソニーのrootkitの話、今ごろ知りましたよ。まぁ、GateKeeprでクソニーの
評価は地に落ちてるわけですが、その腐り具合が全世界的なものとは思いもし
ませんでしたよ。

GateKpper、Wikipediaに載っちゃってんじゃん。大体、GateKeeperの件で、ク
ソニーは正式な文章出したことがあるのか? 顛末記黙殺するEvil Googleもそ
うだけど、ダンマリ決め込むのが『向こう側』の流儀なのか?

--

たぶん、ニクバ。

本家Permlink


2005年11月24日

これほどEmacsを『使えねぇ!』と思ったことはありません。C-x C-fでファイ
ル開けないんですよ。パスの途中に``~''があるだけで。展開しようとして失
敗してやがるんでしょうけど。

``~''の展開はそこそこ便利なんですけど、こんなんだったらいらないでしょ。
だって``/home/...''に展開するだけでしょ?、フツー。そんなもん、いくら
も手間になんない。

大体、Emacsはパスの途中で``//''があったら、そっから絶対パスが始まるも
んだとして展開するしね。それで十分じゃん。

今``~/test''にいるとするじゃん? で、C-x C-fで``~/test//etc''ってやる
じゃん? そこでTAB叩くじゃん? すると``/etc''に展開されるってこと。

あるのに開けないんじゃ、そりゃバグだわな、エディタとして。

--

libtk-rubyの.debを入れたんですけど、ext/tk/sampleはどこにあるんでしょ
うか? /usr/share/doc/libtk-rubyにはないんですけど。

--

リファラが必要だとか、認証が必要だとか、連番だとか、いろいろあるじゃな
いですか。全部wgetで落とせるんですけど、URLのコピペでヘクったりするの
ヤじゃないですか。

いや、でも、ほんと、Ruby/Tkも捨てたもんじゃないですよ。簡単だし。Winで
もOne-Click Installerなら入ってますしね。

本家Permlink


2005年11月23日

http://cm.bell-labs.com/cm/cs/who/bwk/pascaltools.txt

ぐえ。まさかWeb上に置いてあるなんて思いもしなかった。しかもベル研だし。

--

KensigntonのExpert Mouse。このホイールはいいですね。考えた人、エライ。
それを別にしても、やっぱり使い勝手はいいです。場所取るっていうのはあり
ますけどね。

本家Permlink


2005年11月21日1

OKIのキーボードにはスティック・マウス (っていうの? ThinkPadのアレ) が
ついてるんですけど、それのキャップが削れてきちゃいました。キャップだけ
でも買えたはずなんですけど、どうせならということで。

ちょっと考えて、チョー久しぶりにKensington買いました。Expert Mouse。
ちょっと仕様がわからないところがあって不安だったんですけど、LinuxのXで
も問題なく使えています。

ボールの周りに4つボタンがあって、左下が左クリック、右下が右クリック、
上2つが中クリックに相当するようです。で、ボールの周囲にギザギザになっ
た輪っかがついてるんですけど、これがホイールになってます。つまり中ボタ
ンとホイールが別になってるわけです。

もう何度も書いてますけど、Kensingtonのトラックボールは、Macのころに3つ
ぐらい潰しました。ボールと接するベアリングがサビて使いもんにならなくな
るんですね。使い勝手はすごくいいんですけど、それが唯一にして最大の欠点
でした。それがトラウマになって今じゃ光学式至上主義者です。で、この
Expert Mouseももちろん光学式なわけで、その点は安心です。

なんかパームレストと呼ばれるものがついてくるんですけど、これが結構無理
矢理な作りで (笑)。『入んねぇだろ、これ』ってのを無理矢理ハメるみたい。

--

DVIケーブルも買ってきました。やっぱケーブルがダメだったみたい? でも、
D-SUBでも映らなかったしなぁ。何か自分が勘違いしてたんだろうか。

--

しかし、ケータイ産業も儲かってんなら、もうちょっとどうにかしろよな。歩
きながらケータイ見てるヤツ、ジャマすぎ。音声出せんだから、メールの読み
上げくれぇできっだろ。そうすりゃイヤホンで済むじゃねぇか。でなきゃ、ヘッ
ドセット・ディスプレイとか、もちっと気の利いたメガネっぽいヤツとかあん
だろ? ちゃんと研究費出してんのか? なんなら、歩きながらケータイ見たら、
みんなが大好きな『科料』ってヤツにすりゃ、研究費も捻出できんだろ。でな
きゃ電波使用料じゃなくって、もっとはっきりケータイ税でも導入しろや。通
話料金の5%だろうが10%だろうが、オレはかまわねーからよ。

本家Permlink


2005年11月21日

獲物のほうでタイトルがGuitaPlugとなってますけど、それは向こうの間違い
で、トラックボールを取り上げたかったのに間違いはありません。

ちょっと気になってGuitarPlugっていうのも見てみたんですけど、これ、面白
いですね。写真見ると、ギターに直差しでOKなんでしょ?

http://www.quadelements.com/dvforge/products/guitarplug.html

いってみればPCがアンプ代わりになるわけで。

そういえばここ最近、ギター業界じゃ『アンプ・シミュレータ』っていのが流
行ってるんですってね。でも、どうせデジタル録音して加工しちゃうんなら、
このGuitarPlugのほうがいいかも。

でもMac専用なの? ま、自分は買わないからいいけど。

--

ああ、WORDCHARSっていうのを設定するんですね。Emacsとかbashの動きにこだ
わるんなら:

WORDCHARS='_'

くらいになっちゃいますか。それでも微妙に違ってたりしますけど。

zshではもともとM-fは単語に続く空白も含めちゃうんですね。

% Ia   bc

でM-f押すと:

% a   Ibc

になるってことです。bashとかだと:

$ aI   bc

になります。ま、許容範囲でしょう。

ところで、Googleで``zsh shell''で引くと``Zsh - Linux Shell''って出ます
ね。

本家Permlink


2005年11月20日1

セッタはselfが必須になってたんですね。

class Foo
  def initialize
    @var = nil
  end
  attr_accessor :var

  def doit
    var = 10
  end
end

obj = Foo.new
obj.doit
p obj  #=> #<Foo:0xb7cbac14 @var=nil>

本家Permlink


2005年11月20日

いやはや、またしてもUNIXの知識がないのがバレてしまいました。

user-ja-confが吐き出す.bashrcを利用し、なおかつzshを使いたいという話。
前は『.bash_profileにexec zshを書き込んでおけばいい』と書きました。こ
れ、間違いとはいい切れないんですけど、やっぱ今日では間違いでしょう。

xtermとか立ち上げたときには.bash_profileは素通りです。.bashrcだけが読
み込まれます。ってことは、.bashrcにexec zshを書き込んでおかないとダメ
だってこと。

実際、user_ja_confが吐き出す.bash_profileを見ても、やってることは
.bashrcを読み込んでるだけといっていいくらい。だから、.bashrcの最後で
exec zshやっても問題ないでしょう。

--

manでファイルを直接見るとき、自分は:

$ man -l man.1

とかやってたんですけど、別のやり方もあるんですね:

$ man ./man.1

パスだと分かる形で渡すのもアリみたいです。

あと、--htmlっていうオプションもあるんですね。

$ man --html man

これで$BROWSERのブラウザが立ち上がります。$BROWSERがなければLynxですか。
ブラウザを指定することもできます:

$ man --html="w3m -M" man

とか。ちなみに、w3mの -M オプションはモノクロ出力にするというヤツで、
端末の背景が黒だったりするときに便利です。黒地の上に青い文字は見にくい
ですから。

ちなみに、sidのmanは今ブッ壊れてるみたいで、--htmlが使えません。

--

そういえば、UCB Pascalってなくなっちゃたんですか? OpenBSDにも入ってま
せんし。商用のUNIXにはUCB Pascal派生のPascalコンパイラが含まれてたりと
か?

だとしたら、意外というか残念というか。あれってB.Joy氏とK.Thompson氏が
ハックしたんですよね? そいでもって、それを配布したのがBSDの走りだった
と。

まぁ、何十年も続くプロジェクトのほうが珍しいですか。GNUの代表的なもん
は長く続いてますけど。商用でもOSを除いたらそんなに多くないでしょう。MS 
だったらWordとExcel? VBはQBから名前が変わっちゃいましたしね。Delphiも
TurboPascalから名前変わっちゃったし。Macだったら、まだあればTeachText 
かNotepad? あと大学/研究関係ですか。MIT SchemeとかLOGOとか?

本家Permlink


2005年11月19日

その後のPC。起きてモニタの電源入れたら真っ暗。キーボードを叩いても反応
なし。『信号なし』とモニタにいわれる。DVIからD-SUBに換えてもダメ。

中を開け確認。差しが甘いということはない。

壊れたPCからVGAを移植。D-SUBはOK。でもDVIはダメ。DVIケーブルがダメになっ
たのか。それともモニタがイカれてるのか。VGAを取り換える前にD-SUBがダメ
だったのも勘違いかもしれない。

この週末にでもDVIケーブルを買ってくるつもり。モニタが原因でないことを
祈ろう。

--

zsh、bashとの微妙な違いがなんとももどかしい。とくにM-f, M-b関係の動き。

bashだと:

$ ssh tko@lostway.orgI

とあった場合、M-bを押すと:

$ ssh tko@lostway.Iorg

にカーソルが移る。でも、zshだと:

% ssh Itko@lostway.org

に移る。慣れているせいか、これはひどく不便に感じる。

今のところ、zshでうれしいのは"**"が使えることくらい。『くらい』といっ
ても、これはかなりデカイ。findよりずいぶんと楽になる。

--

Debian。etchからなのかもしれないが、openssh-clientとopenssh-serverに分
かれてて戸惑った。しかし、妥当な措置だとも思う。

GNOMEで困っているのがDebianメニューがなくなったこと。update-menusも効
果なし。krxvt立ち上げるのが面倒で困る。

--

困るといえば、ssh-askpass。みんなどうやってるんだろう。.xsessionの終わ
りに:

eval `ssh-agent`
ssh-add </dev/null

としておいてもダメ。ssh-agentは立ち上がるが、ssh-askpassはシカトされる。

GNOMEのセッション管理でスタートアップ・プログラムにssh-add </dev/null
を入れてもダメ。

もちろん、初っぱなに立ち上がってるkrxvtでssh-add </dev/nullをやれば
問題ないのだが。

やっぱりムトゥ神の本を買うか立ち読みしないとダメか。

--

やはりD-SUBだとフォーカスが甘い。

--

STiPのPascalのコードを見て思うのだが、やはりguard clauseは重要。『出口
はひとつ』というのは相当悪い考え方だ。

コードにおいてはintention revealingが重要。そして重要な意図のひとつに
例外的な事態への対処というものがある。『こうなったらエラーだからもう何
もしませんよ』、『こうなったらループは終わりですよ』といったことだ。
gaurd clauseを用いれば、それをしっかりとコードに表すことができる。

それと例外。Kernighan氏は例外には積極的ではなかったはず。もちろん、こ
のころのPascalには例外はない。しかし、グローバル変数でステータス・コー
ドを管理したり、参照引数でステータス・コードを引き回すよりも、例外を使っ
たほうが見通しが良くなる。

例外というのは、ダメなgotoのように、どこまでスタックが巻き戻されるか分
からない可能性はある。けれども、グローバル変数でステータス・コードを管
理する不透明さと比べれば問題は小さい。

本家Permlink


2005年11月18日

Debianって今じゃオンラインで寄付できるみたいですけど:

http://www.spi-inc.org/donations.en.html

このNetwork for Goodっていうのは日本からも寄付できるんですかね?

ちなみに、今さらいうこともないですけど、SPIっていうのはDebianが寄付を
受け取るための団体です。

--

zsh。もうずいぶん前に『zsh使わなきゃダメだ』みたいなこと書いたんですけ
ど、いまだに使ってなかったりするわけで。非常に面目ないところではあるん
ですが。

ひとつ言い訳させてもらえれば、user-ja-confが吐き出すのは.bashrcだからっ
ていうのがあったんです。

でも、こんなもん、よく考えてみれば、.bash_profileでexec zshしちゃえば
いいってだけの話なんですよね。

具体的には、user-ja-confで作られた~/.bash_profileの最後に:

# ---- language-env end DON'T MODIFY THIS LINE!
exec zsh

を付け加えればいい。これでログインしたときにzshが起動される。これで
user-ja-confで吐き出した.bashrcの設定、つまり環境変数がzshに引き継がれ
ると。

それにしても、最初、EDITOR=viにしてたんで焦りましたよ (笑)。前試したと
きはEDITOR=emacsだったんで気づかなかったんですけどね。

--

そんなわけで、ボチボチ.zshrcを使っていこうかと。端末のシェルは上のでい
いんですけど、EmacsのM-x shellはガンコなことにこれじゃダメ。

(setq explicit-shell-file-name "zsh")

が必要。

それと自分の場合、プロンプトの色が重要になるんですが、Webで調べてみる
と、fg/bgじゃなくってエスケープ・シーケンスでも指定できるみたい。で、
自分はこうしました:

autoload -U colors
colors
if [[ $TERM = dumb || $TERM = emacs ]] {
  PS1='%~%% '
} else {
  PS1=$'\e[37;44m%~%%\e[m '
}

こっちのエスケープ・シーケンスで書くのはあんまり使われてないみたいです
ね。こっちのほうがプロンプトより後ろの色を指定しないで済むからいいと思
うんですけど。端末ソフトの背景の色はいろいろ変わりますから。

上のヤツは.bashrcからパクったヤツなんですけど。そいでもって余計な文字
消して。bashのカラー・プロンプトは次のが見やすいです:

http://www-128.ibm.com/developerworks/library/l-tip-prompt/

自分はサイトごとに色を変えます。プロンプトにサイト名入れてる人いますけ
ど、80桁しかないのにそんな余裕ないです。今どき、カラー・プロンプトも使
えない端末ソフトなんてないでしょうし。

あとは:

bindkey -e
setopt IGNOREEOF

くらししか設定してません。まぁ、ボチボチやってきます。``UNIX USER''で
連載されてた『Zsh マスター』も取ってあります。

--

Array#delete_atがRangeを取らないとは意外でした。

本家Permlink


2005年11月16日

いやー、今年の夏は暑かったねぇ。って、みんな、覚えてる?
オレなんかクーラー入れない主義だからさ。いや、クーラーあるよ。
そらあるよぉ、今どきぃ。
でも、あるんだけど使わないのよ。身体の調子崩しちゃうんだよねぇ。

でさー、PCも一日中立ち上げっぱなしじゃない? だからもー、部屋が灼熱地
獄わなわけさー。
土日なんかそら大変よ。暑くって部屋にいたくない、でも部屋にしかPCはない。
ほんとに日が暮れるのが先か熱中症でオレ倒れるのが先かってくらいっだった
んだから。

もう今年の夏で空冷の限界を知ったね。もう空冷の時代じゃない! これから
は水冷の時代ですよ、奥さん! はい、そこでこれ!

http://www.hercules21.jp/bto-corpo/water.html

なんと、水冷で6万円ちょっと! 他じゃなかなか買えないよぉ、こんな安く
はぁ。

でさー、これ、よく見てくれる? "CPU Sempron 2600+ AMD64"ってなってるじゃ
ない? 実はオレが注文したときはSocket AのただのSempronだったんだよねぇ。
でも届いたのはAMD64のSempronだったわけだこれが。
なんでもSocket Aの水冷ユニットが手に入りにくくなっちゃったらしい。
送られてきたメールに書いていた。

『ウホ!』、そう思うでしょ? 6万ちょっとで水冷、しかもAMD64!

『バインジャーイ!』、フツーそう思うでしょ?

ビミョー。
ぶっちゃけいって、オレは悪い予感のほうが先に立ったね。
だって、Linux入れるんだもん。

大体、AGP積んだSocket 754のマザーなんて見たことある? どう考えたって枯
れてねーじゃん! ヤバイ、ヤバすぎるよぉぉぉ。

はい、ここで一曲聞いてもらいましょう。こどもバンドの『サマータイムブルー
ス』。

・・・

いやー、これから事の顛末を話すわけだけどね。マジでブルースなのよ。あの
暑い夏が憎い!

イヤな予感がしたとはいえ、せっかくのAMD64、やっぱりDebian amd64試した
くなるってもんでしょ。まだ使いもんにならんという話も一部ではあるんだけ
ど、とりあえずsargeもあるしね。いっちょやったるかと。
Debianは累々たる屍の上に成り立つもんであってね。たまには自分もご奉公し
ようじゃないかと。

で、試した。ダメだった。ハイ、オシマイ。
ってそれだけじゃ話になんないんで、もうちょっと話すけどね。

まずsarge-amd64! ベース・インストール終了後の再起動時にUSBキーボード
の認識に失敗! インストール続行不可能!

etch-amd64! インストール終了後、コンソールで作業中いきなりリブート! 
継続的使用は困難と判断!

以上、残念!

こう書くとアッサリしたもんだけどね。その裏にある試行錯誤とか苦悩とか
CD-R焼く間の暇つぶしの空しさとか、そういうのを分かってほしいよなぁ。

はい、ここで一曲聞いてもらいましょう。井上陽水の『人生が二度あれば』。

・・・

AMD64はスッパリあきらめた! 64ビットCPUの夢よ、さようなら! こんにちは、
いつものi386!

というわけで、sarge-i386。
実は最初にこれ試したんだよねぇ。
でもこれはインストールの最中にリブートがかかるという、世にも恐しい体
験を味わった。
まぁ、ハードディスクが動いてなかったんで無事だったんだけどもね。
これがきっかけでAMD64試そうと思った。でも、これがワナ!だったわけだねぇ。

最後! etch-i386のmino.iso! 
これがダメだったらもう後がない。さんざんバカにしてきたヘドラにでも行く
しかない!
頼むよマジでと祈りながらインストール開始。

結果発表! (ドルルルルル)

勝訴!

USBも問題なく認識。リブートもなし。

懸案だったNVIDIA GeForce FX5200もXで起動。これはNVIDIA謹製のドライバを
用いていません。設定も解像度を選んだくらい。画面が多少チラつくけど無視
できないほどじゃない。カーネルは2.6-i386だけど、下手にいじれないので我
慢我慢。

さらに! 調子に乗ってsidに移行! これまた問題なさげ!

ス・バ・ラ・シ・イ!
まさにこれは自分一人の勝利ではなく、Debianの勝利なのであります! 
ありがとう、メンテナのみなさん。ありがとう、Debianスレッドテンプレの人!
ありがとう、気を利かしてAMD64なんか送ってくれちゃったショップの人!

最後はこの曲、スティクスの『ミスター・ロボット』でお別れです・・・


データシート:
CPU           AMD Sempron 2600+ AMD64
CPUクーラー   CoolerMaster AQUAGATE Mini R120
マザーボ−ド  MSI K8MM-V
VGA           GeForce FX5200 DDR 128MB (AGP)
メモリー      1GB(1GBx1) DDR-SDRAM PC2100 NON-ECC
HDD           160GB (ATA100/7200rpm/2MB)

焼いたCD-R:
debian-31r0a-i386-netinst.iso (敗北)
debian-31r0a-amd64-netinst.iso (敗北)
debian-etch-amd64-mini.iso (敗北)
debian-etch-i386-mini.iso (勝利!)

$ uname -a
Linux meisui 2.6.12-1-386 #1 Tue Sep 27 12:41:08 JST 2005 i686 GNU/Linux
$ cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 44
model name      : AMD Sempron(tm) Processor 2600+
stepping        : 2
cpu MHz         : 1600.572
cache size      : 128 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt lm 3dnowext 3dnow pni lahf_lm
bogomips        : 3162.11
$ cat /etc/debian_version
testing/unstable

本家Permlink


2005年11月14日

東スポ。エディ・ゲレーロが亡くなったそうな。ご冥福をお祈りします。

--

それから西日本ボクシング協会の異種格闘技戦に参加した者を永久追放にする
という話。

異種格闘技戦というか、他のプロ格闘技に参加した者というのが正確なところ
なんだろう。こないだのK-1にしても異種格闘技じゃなく、純然たるK-1 ルー
ルだったはず。

ま、細かいことは置いといて。それにしてもバカな決定をしたもんだ。柔道や
相撲にしてもそうだが、こういう閉鎖的な業界は面白くない。

日頃から鍛練している競技とはルールが異なるのだから、負ける可能性が高い
のは当たり前のこと。負けたとして、それを肥やしにして本道に戻るも良し、
さらに深みにハマるのも良しじゃないか。そうした選手の自由を縛って何が面
白い?

--

自分の場合、プロジェクトのディレクトリは大体こんな感じになることが多い
んです。fooというプロジェクトだとして:

~/test/foo
  x.rb
  y.rb
  test/
    t-all.rb
    t-x.rb
    t-y.rb
    data/
      ...

テスト全部を実行するときはt-all.rbを実行するわけです。ほんとはこれなん
かtest/unitでやってほしいんですけど。

で、当然ながら、Emacsではfoo以下のディレクトリのどこのファイルでも開く
わけです。モデル・コードとテスト・コードとで別々にEmacsを立ち上げるこ
ともあるんですけど。そうしたほうがバッファが整理されてて見やすいですか
ら。でも、1つのEmacsでモデルもテストも扱うことも多いわけで。そうすると、
テストが面倒になるんですね。

テストが面倒になるっていうのは、いくつか理由があって。まず前提として、
ウィンドウを切り換えたくないというのが1つ。テスト専用でxtermなりを立ち
上げておくっていうのもアリなんですけど、それだとウィンドウを切り換えな
くっちゃいけない。Emacsの他にもブラウザも立ち上げてますし、他にも端末
ソフト立ち上げますし、思ったウィンドウに切り換えるのが結構手間なんです
ね。

それと同じようにshellモード (M-x shell) も十分じゃない。各Emacsにつき1
つしかshellモードは立ち上げられませんし、テストするにはいちいちcdしな
いといけない。

結局やりたいことは、Emacsでどこのファイルを開いていようが、テストを一
発で実行できるようにすること。テストする度にウィンドウを切り換えたくな
いし、バッファも切り換えたくない。

そこでM-!です。ただ、M-!はバッファのカレント・ディレクトリと結びついて
ますから、そのままじゃダメ。t-all.rbを実行すればいいだけなんですけど、
でも、t-all.rbには依存関係があります。1つ上のディレクトリのスクリプト
をrequireしなきゃいけないんですね。この『1つ上のディレクトリ』っていう
のが厄介で、バッファのカレント・ディレクトリとからんで、コマンド一発っ
てわけにはいきません。長々と絶対パスを指定するのも面倒。

で、結局スクリプトを書くことに。プロジェクトのディレクトリ直下に次のよ
うなスクリプトを用意しました:

#!/usr/bin/env ruby
# project.rb
PROJECT_DIR = File.dirname(__FILE__)
TEST_DIR = PROJECT_DIR + '/test'
TEST_FILE = 't-all.rb'

def test_project(testfile)
  testfile = TEST_FILE unless testfile
  Dir.chdir(TEST_DIR) do
    system("ruby -I.. #{testfile}")
  end
end

test_project(ARGV[0])

これをM-!を実行します。ただ、M-!で実行するときは絶対パスで指定しないと
いけません。

M-! ~/test/foo/project.rb

みたいな感じですね。こうしておけばM-!のヒストリに登録されて、プロジェ
クトのどこのディレクトリにいても、いや、プロジェクト・ディレクトリの外
でもテストを実行できるようになります。

M-! M-p RET

です。これでウィンドウもバッファも切り換えずにテストがほぼ一発で実行で
きるようになった次第です。

本家Permlink


2005年11月13日2

test/unitを実行するのにM-x compileするのは間違い。

M-!でやるほうがいい。

何が違うかというと、M-!はミニバッファに出力する。だから、C-gなんかです
ぐに出力を消せる。

M-x compileっていうのはCなんかだと有効。M-x next-errorで問題の起きた個
所に飛べるから。でも、Rubyだとそれはできないし、そもそもテストで問題が
起きてなかったら静かに消えてほしいものだ。その点、M-x compileは恒常的
なバッファに出力するから、わざわざC-x kしないといけない。*compilation*
バッファ専用のフレームを開けておくやり方もあるんだけど、Xじゃなきゃで
きないし、そうでなくても大きな画面が必要になる。

本家Permlink


2005年11月13日1

おいおい、なんでAdobe Readerがアップデートされただけでシステム再起動し
なきゃいけねぇんだよ。何か勘違いしてんじゃねぇか? Adobeさんよ。

こちとら、『はい、そうですか』っつって落とせるほどPC遊ばしてるわけじゃ
ねぇんだよ。もちっとユーザのこと考えろや。

MSのAPIがダッセーってんならしっかり圧力かけろや。天下のAdobe様だろ?

--

``Software Tools in Pascal''読んでることは書きましたね。そのサンプル・
コードを動かすのにFree Pascal使ってるんです。

.deb化されてるOSSのPascal処理系はいくつかあるんですけど、1つがこのFree
Pascal。それにGNU Pascalもあります。あとp2cというCへのトランスレータも
あるみたいですね。p2cは試したことがないです。

Free Pascalの特徴は、Borland系Pascalへの互換性に重点を置いてるところ。
その逆に、GNU Pascalの特徴はISO Pascalへの互換性に重点を置いてるところ
です。

自分みたいな半端な使い方をするんじゃ、どっちがいいともいえないんですけ
ど。ただ、ドキュメントはFree Pascalのほうが充実してます。といっても、
どちらも肝心のチュートリアルみたいなものはないんですけど。それでも、
GNU Pascalのinfoマニュアルはまだ未整備という観があるのに対して、Free
Pascalのほうはリファレンスはしっかりしてます。

STiPのコードはえらく古くて、Free Pascalの機能を活かせばモダンな書き方
もできるんでしょうけど、とりあえずそれが目的じゃないので。でも、こうし
た古いサンプルをサックリ動かせないのがPascalの困ったところ。C言語は
K&Rが出たころからそう大して変わってませんけど、Pascalは激変してま
すよね。

STiPでは、OS依存の部分はライブラリで隠してるんですけど、それを移植しな
いとFree Pascalで動かないのは当たり前の話で。それをニワカPascalユーザ
の自分がやんなきゃいけないというのは結構辛いもんがあります。

サンプルの中でmessageという手続きが頻出します。これは標準エラー出力に
文字列を出力するというごく単純なものです。でも、このころのPascalには標
準エラー出力というものがなかったらしく、その実装は本で紹介されてません。

Free Pascalのドキュメントを何度も検索してようやくできたのがこれ:

procedure message (msg : string);
begin
    writeln(stderr, msg);
end;

なんのことはない結論なんですけど、これが分かるまでえらい苦労しました。
他にも、text型が本で使われてるUCB PascalとFree Pascalとで微妙に違って
たりとか、いろいろあるんですけど。

標準エラー出力はともかく、ファイル操作で互換性がなくなってるといったこ
とはCじゃちょっと考えられないところです。Pascalの当初の目的は教育用と
いうことだったので、そもそもSTiPのような使い方をすること自体問題だった
ともいえるんでしょうけどね。ただ、この時代は多分、CよりもPascalのほう
が広く使われてたんでしょうね。STiPが出たのが1981年、K&Rが出たのが
1978年ということなんで。このころの3年差は今ほど大きな差じゃないでしょ
う。

--

それから、STiPは#includeを使ってるんです。このころのPascalは分割コンパ
イルができなくって、それはKernighan氏が書いた例の``Why Pascal is Not
My Favorite Porgramming Language''で指摘されてるところです。ちなみに、
この論文はSTiPを出す直前に発表されたものです (正確には発表されなかった
らしいんですけど)。

で、その#includeを処理するプリプロセッサも本の中で作ることになるんです
けど、それが出てくるのは後半のほうなわけで。そこまで待ってらんないです
から、cppを使うことを思い立ちました。生でcpp使った経験がないのでどんな
ものかと思ったんですけど、概ね良好な結果でしたね。ワケワカラン出力され
るときもあるんですけど。

program outer (input, output);
uses unix, sysutils;  { for syslog }
#include "globdefs.p"
#include "prims.p"
#include "utility.p"
#include "archive.p"
begin
    initio;
    archive;
end.

これがarchiveをコンパイルするときに一番外に来るファイルです。で、これ
を:

$ cpp <outer.p

なんてやると:

# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "<stdin>"
program outer (input, output);
uses 1, sysutils; { for syslog }
# 1 "../globdefs.p" 1
{ globdefs (FreePascal) -- gloabl constants, types and variables (p.324) }

const

{ standard file descriptors. subscripts in open, etc. }
...

なんていう出力になります。なんか``#''で始まる余計が行があるのでそれを
削ります:

$ cpp <outer.p | grep -v '^#'
program outer (input, output);
uses 1, sysutils; { for syslog }
{ globdefs (FreePascal) -- gloabl constants, types and variables (p.324) }

const

{ standard file descriptors. subscripts in open, etc. }
...

で、コンパイルに失敗するんで、よく見てみると:

uses 1, sysutils; { for syslog }

なんていう行があります。これはもともと:

uses unix, sysutils;  { for syslog }

という行。なぜかunixが1に置き換えられちゃってます。cppのinfoを読むと、
余計な置換をしてほしくないときには:

$ cpp -ansi <outer.p | grep -v '^#'

とやるんだそうです。ん〜、奥深い。

--

それと、Pascalのコードは当然Emacsで入力してるわけですけど、そのPascal 
モードがまた気に喰わない。タブ幅が3だし、変数や引数のリストをきれいに
そろえようとする。STiPではタブ幅は4ですし、自分もそっちのほうが好みで
す。引数リストをそろえるっていうのは:

i     : integer
state : boolean;

みたいなヤツですね。これ、自分は大嫌いです。やるとしても、せいぜいカッ
コに合わせる程度:

function doit(i : integer;
              state : boolean);

もちろん、これは行を折り返さないといけないときであって、引数を1行に1つ
しか書かないなんてこともやりません。

定数宣言を並べるときとか、そろえたほうが見やすくて抜けを防げるっていう
場合もありますけどね。

何度も書いてますけど、コードは上からシーケンシャルに読むものです。全体
のパッと見の印象は重要じゃありません。きれいきれいにしたいならワープロ
でコードを書いたほうがいいでしょ。そのほうがエディタでゴチャゴチャやる
より全然いいですし、自分は止めませんよ。

で、hookです:

(defun my-pascal-mode-hook ()
  (setq pascal-indent-level 4)
  (setq pascal-auto-lineup nil))
(add-hook 'pascal-mode-hook 'my-pascal-mode-hook)

これでも引数リストをvarがあるかないかで合わせようとするガンコっぷりな
んですけどね。

--

STiPで不満な点の1つは、構造体が思ったほど活用されてないことです。ポイ
ンタが使えないとか、いろいろと制約はあったんでしょうけど、もうちょっと
データ構造をはっきりさせたほうが良かったんじゃないかと思います。

構造体の話にしてもそうですけど、『STiPをモダンな言語で書き直したものが
あったほうがいい』と思う理由がいくつかあります。もう1つの理由がGCです
ね。GCがないと参照変数使いまくりになっちゃって、コードをパッと読んだだ
けじゃどの変数が変わるのか見当がつきません。

もう1つがテスト。こないだも書いたとおり、STiPでもテストの重要性は強調
されてます。でも、それがコードや設計の進め方といったものに反映されては
いません。結局、ビッグバンになっちゃってます。コードをガーッと入力して、
最後にコンパイルして実行するっていう。そうすると、バグが出たときに、ど
こに問題があるのか見つけるのが難しいんですね。本とニラメッコしてプログ
ラムの先頭から1行1行目で確かめるのがオチです。確かにテストまでやると、
紙数が大幅に増えちゃうっていうのは問題なんですけど。

最後に外部ソートのプログラムをRubyで書き直したものを載せておきます。
今じゃUNIXのsortコマンドで必要十分以上なんですけど (確か、内部ソートと
外部ソートを自動的に切り換えてくれるはず)、ちょっと面白い実装になった
んで。

# sort -- external sort of text lines
MAXLINES = 3

class Templine
  @@index = '0'

  def initialize
    @filename = prefix + @@index.succ!
    @input = nil
    @line = nil
  end
  attr_reader :filename, :line

  def prefix
    return 'stemp'
  end

  def open_input
    @input = open(@filename)
  end

  def read_line
    @line = @input.gets
  end

  def close_input
    @input.close
    File.delete(@filename)
  end
end

def divide_into_files(input)
  templines = []
  lines = []
  loop do
    lines.clear
    MAXLINES.times do
      line = input.gets
      break unless line
      lines << line
    end
    break if lines.empty?
    lines.sort!
    templines << Templine.new
    File.open(templines[-1].filename, 'w'){|output| output.write(lines.join)}
  end
  return templines
end

def merge(templines, output)
  loop do
    templines.sort! do |x, y|
      if x.line.nil? && y.line.nil?
        0
      elsif y.line.nil?
        -1
      elsif x.line.nil?
        1
      else
        x.line <=> y.line
      end
    end
    break unless templines[0].line
    output.print(templines[0].line)
    templines[0].read_line
  end
end

templines = divide_into_files($stdin)
templines.each{|ech| ech.open_input}
templines.each{|ech| ech.read_line}
merge(templines, $stdout)
templines.each{|ech| ech.close_input}

本家Permlink


2005年11月13日

いやいや、焦りまくりでしたよ。いや、焦っても何もできないわけで、『あ
ちゃー』としかいえない状況。

何がって、ADSLがつながんなくなっちゃったんですよ。丸1日以上。もうメー
ルもダメ、Webもダメ、なーんもできない。

ほっときゃ直るかと思ってたんですけど全然ダメで。今日サポートに電話した
らアッサリ。こんなんだったら早いとこ電話すりゃよかったですよ。

長いことso-net使ってますけど、こういうトラブルはアナログ接続時代を入れ
ても初めてかも。インターネット始めてからずーっとso-netですからね。

サポートの人に電話で聞いたんですけど、今じゃ50Mで3000円切ってるんですっ
てね。こっちは8Mですよ。そんなに不便に感じてなかったんですけど、これを
機会に変えてみますかね。so-netのディスク・スペース・サービスも使わなく
なったし、そっちの契約もそろそろ切っときますか。

本家Permlink


2005年11月12日

xargsって渡されたコマンドを1回しか呼ばないこともあるんですね。というか、
そっちがデフォルトみたい。

だから:

$ head -1 *

と:

$ ls | xargs head -1

は同じ結果になる (ことが多い)。

どうしても何回も呼び出したいときは:

$ ls | xargs -n 1 head -1

とやる。

そもそも

$ head -1 *

の出力があんなふうになるなんて知りませんでしたよ。

本家Permlink


2005年11月09日1

ぐえ。おざなりとなおざりとじゃ微妙に意味が違うのか。

本家Permlink


2005年11月09日

いやいやいや、買いましたよ、``Oh! SM''、じゃなかった、``OSM''。

ま、ご祝儀買いというやつですな。

それにしてもやっぱり、うなるほど金が余っとるんですな、Googleは。

話をOSMに戻しますけど、やっぱりUNIXっていう言葉にはもう昔ほどの神通力
はなくなってるんでしょうね。まぁ、その神通力自体、なかなかパンピーの手
の届かない、『まだ見ぬ強豪』的な幻想がもたらしたものだったのかもしれま
せんけど。

本家Permlink


2005年11月08日1

パターンというのは、事実を知識化して、さらに体系化することじゃないのか?
パターンを発見するだけではまだ体系化したとはいえない。他のパターンとの
関連を検討して、その位置を決めてはじめて体系化したといえる。

そういう意味では学問そのものだ。WardAndKentがパターンにこだわるのもそ
こに理由があるんじゃないだろうか。

XPももちろんその学問的な文脈の延長上にある。

したがって、我々もまた学究の徒ということになる。日々繰り返される活動の
中から価値あるものを発見し、それを体系化する。繰り返すが、体系化してこ
そはじめて成果といえるものになる。なぜなら、発見で得た知識を体系化した
ものがXPなのであり、そのXPを実践する我々が発見、知識化、そして体系化へ
という活動を怠ることは許されないからだ。

XPではTeach Learningといわれる。まさにXPそのものがTeach Learningであり、
我々は書だけでなく、日々の実践の中からも学ばなければならないのだ。

本家Permlink


2005年11月08日

やべー。いつのまにかフランスで暴動とか起きてるし。断食しすぎ。東スポだ
けじゃ本田ミナコがお亡くなりになったとか、そういったことしか分からない
もんな。デイリーも読んでるんだけど。『甲子園リニューアル計画!』とか、
『来年こそは日本一で晴れてパレードを!』とかばっかだし。

--

ちょっと気が狂って、``Software Tools in Pascal'' (STiP) 読んでるんです
けどね。

これ、日本語訳出てないんですけど。出てるのは``Software Tools'' (邦題
『ソフトウェア作法』) のほうで。

『ソフトウェア作法』って共立でしたっけ? 今でもそれは書店に並んでて、
かなりロングセラーなわけですけど。でも、そっちよりSTiP出すべきでしたね。
STiPが日本で広く読まれてないのはかなりの損失ですよ。さすがにRatforじゃ
ツラすぎますもん。

これ読んで、紛れもなく自分はKernighan's Childだってことを再認識したわ
けですが。まぁ、でも、自分らより上の世代でC/UNIXやってた人なら大抵そう
なんでしょうけど。

ところで、前から『プログラミングの基礎ってナニ?』って悩んでたんですよ
ね。いわゆる逐次実行、分岐、繰り返しといったものや、変数、配列、関数と
いったものが基礎といわれてると思うんですけど。まぁ、それはそれで間違い
ではないんですけど、『ちょっと足りねーんじゃねーの?』って思ってたんで
すね。

で、STiPにその悩みを解決するヒントがあると感じたんです。結局、分岐とか
変数とかは、基礎は基礎なんですけど、基礎というよか初歩なんですね。それ
がなきゃ始まらないけど、それだけじゃどうにもなんないっていうか。

で、その足りないものっていうのは設計の知識なんですね。設計とはどういっ
たことをやることなのかとか、どういう設計がいい設計なのかとか。

こういったことっていうのは、実はまとめて語られることがあんまりないんで
すね。少なくともナントカ入門とかいう本じゃ語られない。語られることがあっ
たとしても、主題じゃなくって文脈の中に埋もれてしまってたりする。で、ナ
ントカ設計入門みたいになると、今度は全然コードが出てこなったりする。そ
れじゃダメなわけで。

設計に関してそれなりにまとめられていて、なおかつ具体的な話もしてる本と
なると、真っ先にあげられるのが``Smalltalk Best Practice Patterns''。やっ
ぱりこれは必読ということになりますね。あと、``Test-Driven
Development''もそれっぽい。まだ読み終えてないんですけど。(『STiPよりそっ
ち先に読め』ってのはナシ (笑))

でも、古典ということであれば、やっぱり``Software Tools in Pascal''とい
うことになるんですよね。

  Yet it is a fundamental principle of testing that you must know in advance what
  answer each test case is supposed to produce. If you don't, you're not testing;
  you're experimenting. So part of the responsibility of writing a program is to
  prepare a comprehensive set of test inputs, and outputs against which to com-
  pare the results of test runs.

これなんか、TDDほどじゃないですけど、『プログラムを書くという中には、
テストのためのデータを用意することも含まれる』っていってるわけで。自分
は『ソフトウェア作法』読んだはずなんですけど、『こんなこと書かれてたの
か』とちょっとビックリしました。

マニュアル・ファーストっていう実践も紹介されています:

  This time we present the manual page before the program, a useful way to
  begin any project -- it encourages us to focus from the start on how the final
  product is going to look to the user. 
  (中略)
  Another advantage of writing the manual page first is that it gives us a pre-
  cise specification of the job to be done.
  (中略)
  Of all the factors (other
  than native ability) known to influence programmer productivity, the single
  most important one is the quality of specification given at the outset -- the
  more precise and unambiguous the better.

あんまり派手に引用できないんで中略だらけになってますけど。これなんかも
マニュアルをユニット・テストに読み換えれば今でも納得できる話ですよね。
もちろん、今でもマニュアル・ファースト自体も有効なんでしょうけど。

ちょっと今、『ソフトウェア作法』引っぱり出してきたんですけど。1991年の
初版31刷です。これは引っ越すときに捨てられなかった一冊です。で、見比べ
ると、結構章立てとかも変わってます。こっちにはマニュアル・ファーストは
紹介されてないみたいですね。

そうそう、『ソフトウェア作法』には『電話テスト』っていう有名な話があり
ますね:

  一般に、(論理式で)怪しいと思ったときは「電話テスト」というのをやって
  みるとよい。論理式を声を出して読みあげたのを耳で聞いて理解できたら、
  その論理式はまずはわかりやすいといってよい。そうでなかったら書き換え
  をすべきだ。

っていう。これはんかも感覚に訴えるプログラミングなわけですよね。これは
STiPでも紹介されてる話です。

まぁ、長々と書いてますけど、でも今さらSTiPを読めとか、日本語訳を出せと
かいうのもアレなわけで。いや、出したほうがいいと確信してますけど。でも、
それよりももっとモダンな本があればいいわけで。なんてったって20年以上前
の本ですからね。かといってSBPPじゃキツい人も多かろうと思うんですよね。
誰か書いてください。いや、自分が知らないだけかもしれませんけど。

--

プログラミングの基礎の話の続きなんですけど、設計に関する話っていうのは、
大まかにいって、原則と姿勢に分けられると思うんですよ。

原則っていうのはonce and only onceだとかlots of little piecesだとか
intention revealing だとか。あと自分で思いつくのはhigh cohesion, loose
couplingとか?

姿勢っていうのは作業方針とか心がけとかですね。test firstとかDRYとか。
擬似コードとかspikeなんかも入れちゃいましょう。

こういう原則と姿勢っていうのがプログラミングの基礎に含まれるんだと。

たとえばの話、こうした原則や姿勢を知らないでコードを書くこともできるわ
けです。でも、それでもって『あいつは基礎ができてる』とはいわれないで
しょ? 

あと、世間では基礎と見なされてるものでも、自分から見れば間違ってるのも
ありますよね。トップダウンとかボトムアップとか、そんなにプログラミング
は単純じゃないですし。ラピッド・プロトタイピングとかも今じゃ捨テ。もち
ろん、フローチャートとかUMLなんかは基礎でも応用でもない。

で、こうした基礎があって、それぞれの分野に関する知識を上乗せしてくもん
でしょう。言語の詳細だとかOSとかフレームワークとか。

本家Permlink


2005年11月04日1

darcs なんですけど、やっぱ強烈っすね。darcs にはリビジョン番号がないわ
けですけど、どうやって前のリビジョン取り出すのかと思ったら、これが検索
なんすね。パッチ名に対する検索。まぁ、他にもタグ使ったりとか、コンテキ
スト・ファイル使うとかもあるんですけど、そんな面倒なことはしないわけで。

自分なんか、パッチ名はコミット・メッセージと同じ程度のもんだと思ってま
したよ。だから long message は全然入れてませんでした。今から考えればマ
ヌケな話なんですけど。CVS のときと同じように ``fix'' だけで済ましちゃっ
たりしてましたよ。そうするともう検索じゃ前のリビジョン取り出せないわけ
で。

でも、パッチ名での検索ってのは実際微妙ですよね。いっつも長々としたこと
書くわけないですし。日時入れとくのが better practice なんすかね。

あと、この特定のリビジョンを取り出すのって、ファイルを指定できないんで
すね。検索ならマッチしたパッチのときのリポジトリ丸ごとになっちゃう。こ
れは結構痛いかも。Emacs VC でいえば、C-u C-x C-q ってたまにやるんです
よね。これは作業ディレクトリの一貫性がなくちゃっうから危険なことは危険
なんですけど。

しばらく使ってみると、やっぱ細かいとこで不満が出るもんですね。こういう
のはカタログには現れにくい点かもしれません。darcs、手軽なのはいいんで
すけどね。

tla arch, monotone, darcs と試して、分散系で残っているのは svk くらい
ですか。なんか CVS に戻っちゃおうかなって気にもちょっとなってるんです
けど、いいかげん (笑)。ま、とりあえず、気が向いたら svk 試してみますか。

本家Permlink


2005年11月04日

vnc2swfってよく使われてるんですね。新山さんの日記読み始めたのは最近で、
いつ作られたか知らないんですけど。ちょっと話題になってなさすぎ。例によっ
て自分が知らなかっただけの気もしますけど。ナントカ大賞とかあげてもいい
んじゃないの?

本家Permlink


2005年11月02日1

どうもファイナライザの呼び出し方が分かりません。

とあるCのライブラリ (何かはヒミチュ) が構造体を勝手に割り当ててよこす
んですけど、例によって、それに対応するメモリ解放ルーチンも用意されてい
ます。で、この解放ルーチンをファイナライザで呼び出したいと。

とりあえずObjectSpaceの挙動を調べてみたんですけど、これは使えませんよ
ね。そもそもCでprocをどう作ればいいかも分かんないんですけど、それはク
ラス・メソッドをMethodオブジェクトにしちゃえば大丈夫そうなんでいいとし
て、ファイナライザが呼び出されたときには肝心なオブジェクトはもういなく
なってます。つまり、Data_Get_Structでも構造体を取り出せなさそう。

class Foo
  def self.callback(id)
    begin
      p ObjectSpace._id2ref(id)
    rescue RangeError => e
      puts e.message
    end
  end

  def initialize
    ObjectSpace.define_finalizer(self, self.class.method(:callback))
  end
end

loop do
  100.times do
    Foo.new
    GC.start
  end
  sleep 0.5
end

やっぱこういうのはプロトコルにするしかないんすかね。もちろん、最初っか
らRuby側には明示的な解放手段も用意するつもりなんですけど。

--

ぐえ。NotImplementedErrorなんてのがあったのか。

--

あ、な〜んだ。Data_Make_Structとかで後始末ルーチンを登録できるのねん。

で、そのルーチンでfreeを呼ぶと。xfreeでも同じなんですかね? xmallocで
割り当てられるからxfreeだとばっかり思ってたんですけど。でも調べてみる
と、freeのほうが段違いに使われてますね。ふ〜んといった感じです。

本家Permlink


2005年11月02日

Debianのeeだけど、中国語はサポートしてるみたいだから、ちょっとパッチを
当てるだけで日本語も大丈夫みたい。でないと、もともと表示は大丈夫なんだ
けど、カーソルの動きがダメ。

--- ee.c	2005/11/02 07:17:03	1.1
+++ ee.c	2005/11/02 07:18:29
@@ -4179,7 +4179,8 @@
 	string = getenv("LANG");
 	if (string != NULL)
 	{
-		if (strcmp(string, "zh_TW.big5") == 0)
+		if (strcmp(string, "zh_TW.big5") == 0
+		    || strcmp(string, "ja_JP.eucJP") == 0)
 		{
 			ee_chinese = TRUE;
 			eightbit = TRUE;

実際、文字コードのことはよく知らないから、これでいいかどうかは分かんな
いんだけど。とりあえずカーソルはまともに動くっぽい。

本家Permlink


2005年11月01日1

--- socket.c.~1.154.~	2005-10-21 15:46:41.000000000 +0900
+++ socket.c	2005-11-01 09:14:06.000000000 +0900
@@ -2142,7 +2142,6 @@
 {
     OpenFile *fptr;
     int fd, n;
-    volatile VALUE tmpaddr;
 
     StringValue(addr);
     addr = rb_str_new4(addr);

--

七

本家Permlink


2005年11月01日

結局、XPというものをどれだけ広く捉えられるかということになると思うんで
すよね。それを単なる開発手法と捉えるのか、それとも組織の在り方として捉
えるのか、もっといえば個人の生き方として捉えるのか。

こう書くと途端にイヤな顔をする人がいそうですけど (笑)。

開発というのは新しい業種です。であるなら、新しい組織論が必要なはずです。
それなのに、製造業なんかの旧来の組織論を無理矢理適用しようとする。そりゃ
失敗するでしょ。

極論すれば、組織論なき開発手法はもうダメでしょう。それはチームを2つに
分けるとかそんな話じゃなくってね。

具体的にいえば、XPには4つの価値と15の原則があるわけですよね。XPE 2ndだ
ともっと増えてるのかな? それっていうのは組織としての価値観を形成して
るわけでしょ? それだけでも1つの組織論といえるじゃないですか。

原則を並べたって:

  1. Rapid feedback
  2. Assume simplicity
  3. Incremental change
  4. Embracing change
  5. Quality work

  6. Teach learning
  7. Small initial investment
  8. Play to win
  9. Concrete experiments
  10. Open, honest communication
  11. Work with people's instincts, not against them
  12. Accepted responsibility
  13. Local adaptation
  14. Travel light
  15. Honest measurement

なわけで、これって別に開発だけに限ったもんじゃないでしょうし、重量級やっ
てる組織でも重要な事柄も多いでしょう。

だから、XPをただの開発手法と考えてるようじゃ、結局は失敗しますよね。

本家Permlink


Copyright © 1905 tko at jitu.org

バカが征く on Rails