風邪でぼろぼろです。ティッシュが手放せません。 今日は、ティッシュの箱をもって出社。
風邪から復活したのではなく、風邪が復活してしまいました。 鼻水が止らない。
ありがとうございます。 何の関係もないのに1冊いただきました。 Ruby関連の参考URLとして私のページが紹介されています。
MySQLも使ったことないですし、 このページが、一体何の参考になるんでしょうか? 謎です。 本を読めば謎は解けるのか???
まあ、せっかくですので、遠慮なくいただきました。 しかし、こんなことで献本してたら、出版社も大変だなあと思ってしまいました。
『Ruby 雑記帳』にタイトル変えようかな。
ちなみに『Ruby 雑記帳』というタイトルの名付け親(?)は私じゃなくて 多分まつもとさんでしょう。
一週間、ほったらかしにしていたらエラいことになってました。 大爆発です。1日100通だもんなあ。 何か対策しておこうかと考えてます。まとめ送りするとか。
Rubyのスクリプトでメールをサーバーから取り込んでいるのですが ちゃんと全部取り込んでくれました。 偉いぞ、Ruby! 偉いぞ Linux!
Windows 95 だとOSそのものが固まっていたかも知れません (過去に、もっと少ないメール数だったのですが、受信中にWindows 95が固まりました)。
年末年始は off にしておこうかな。
結局よくわからないので、私より詳しい人に質問してみる。
winver
を使えば、ちゃんと 6a と表示されるそうです。
ということでようやく 6a の文字に遭遇できた訳ですが、 どのヴァージョン情報を基準にすればいいのかますますわからなくなりました。 (Build 1381ってのが一番正確?) まあ、今回は、(動作確認テストをするのが目的なので) 本番の環境と同じ表示になったので、良しとします。
Windows NTに Service Pack 6aをあてる。 (なんで今頃? と思われるかも知れませんが、まあいろいろ事情がある訳です。)
起動はちゃんとする模様。 が、起動時の青い画面には、
Build 1381 Service Pack 6
としか表示されないし、 Explorerから「ヘルプ」-「バージョン情報」で表示しても
Service Pack 6
としか表示しない。コマンドプロンプトからver
とやっても
Windows NT Version 4.0
としか表示しない。
Service Pack 6a
と表示しないのは、どっかで失敗したのかしらん。 NTを触り始めて結構時間は経っているのですが、延べ使用時間はかなり短いし、 用途も限定されているため、よくわからんのです。
まだちょっと咳が出る。
Linux と Windows の共存ですが、VMWareという手もあるなあと考えてます。
いや。まだ何をいつ買うのか決めてないんですけど。
午後になってだいぶ楽になる。
テストファーストプログラミングでやっていると、 インスタンス変数の中身がちゃんと意図した値になってるかどうか確認したくなることがあるんです。 インスタンス変数をテストしないとテストしづらい場合もあるんですね。 で、私の場合、どうするかというと
attr_reader
を使う。
ぐっとこらえる。
クラスの構造、インターフェース等を変更してテストしやすくする。
のどれかになります。あまり良い例ではないですが、
class Foo def initialize @bar = [] end def output @bar.each do |b| puts b end end def insert(bar) @bar.push bar end end
というクラスがあったとしましょう。
Foo#output
は、insert
で追加した順番に@bar
の値を出力するという仕様です。
このとき「追加した順番に」出力することをテストしたいんだけどRubyUnitを使ってテストはできません。
(当り前ですが、RubyUnitは万能ではありません。)
でも、何もテストしないよりはましなので、
インスタンス変数の内容が追加した順番になってることぐらいはテストしておこうと思うんです。
def test_bar foo = Foo.new foo.insert(1) foo.insert(2) foo.insert(3) assert_equal([1, 2, 3], foo.bar) end
としたくなるんです。もっとも、こんなことすると、後で、リファクタリングするときに泣く可能性もあります。
こういう場合は、テストしやすいようにクラス構造から見直した方がいいのかも知れません。
(だからこそ、テストしづらいクラスを作ってしまう前に、 「テストファーストでテストを書くべき」というのが、最近の私の考えです。)
やっぱり、ボロボロなのでもう1日休み。 (昨日、休んどけば良かったかも。)
ちょっとましになったので出社するも、 「顔が赤いし、目がぼーっとしてる」 と言われる。
ボロボロなので、もう1日休み。
ボロボロなので、1日休み。
B5サイズ(1.5Kg前後)ってのとA4サイズ(3Kg前後)ってのがあるらしい。 1.5kgをちょっと越えるぐらいのB5の大き目サイズ? でいいかな。画面も12.1型液晶ってのがあるし。
スペック見てたら、Pentium III 600MHz とか、メモリー 64MB とか、HDD 20GB とか... はあ。世の中ってどんどん進んでるんですね。 デスクトップのスペックかと思ってしまいましたですよ。
で、後は、どこのメーカーにしようかなあと悩んでいるのが楽しくて、それで終ってしまう訳ですな。
Windows用にもLinux用にも割り当てないで遊ばせていたHDDの一部をLinuxに割り当てることに。
fdisk /dev/hda
とやってfdiskで残り領域を /dev/hda9 に設定。とりあえずmount
しないと使えないので
mount /dev/hda9 /disk9
としてみたら、エラー。
man mount
で調べて、ファイルシステムのタイプを指定しなきゃいけなかったのだと理解して
mount -t ext2 /dev/hda9 /disk9
やっぱりエラー。 Windows でいう format みたいなことをしないといけなかったかと思い
man format
したら、Tcl の format が出てきてしまった。
仕方が無いので、『Running Linux』で調べてみたら mke2fs
すればいいようだと判明。
『Running Linux』の内容は、結構古い(と思う)ので、
念のため man mke2fs
でコマンドの使い方を確認してから
mke2fs /dev/hda9 2401686
と実行。(第2引数の数字は、fdisk /dev/hda
で "p"
と入力して調べた。)
今度はちゃんとmount
できました。
でもって、/etc/fstab
に
/dev/hda9 /disk9 ext2 defaults 1 2
と追加。再起動してちゃんとmount
されることも確認。
書店で、ちょこっと立ち読みしたら、良さそうな内容だったのでレジに直行。 私としては、珍しく衝動買いに近いです。
あっ。『達人プログラマー』探すの忘れた。
ちょっとノートパソコンが欲しいなあと思い始めた今日この頃。
サブマシンじゃなくて、メインマシンとして使いたい。
Linux と Windows のマルチブート環境にしたい。
ディスプレイが小さいのは嫌。
でも、いざとなったら持ち歩けるぐらいの重さがいい。
てなことを考えつつも、 全くノートパソコンの知識が無い(ほとんど使ったことが無い)ので、ちょっと調査。 (もっとも、最近のデスクトップのパソコンに関する知識もありません。)
SHGetFileInfo
を使う方法もあるみたい。
GetLongPathName
は、Windows 2000 あたりだと使えるみたい。
例えば、
class Foo def bar if @bar < 0 return 0 end @bar end end
なんてクラスがあったとします。
@bar
のテストがしたくなったとしましょう。
RubyUnit側で、@bar
へのアクセッサをダイナミックに定義する場合、そのメソッドの名前を何にすればいいかわからないんです。
bar
という名前で定義するとまずいですよね。
テストのときのクラスとアプリケーションで使う場合のクラスの挙動が違ってきますから。
そういう理由で今のところ何もしてません。
インスタンス変数のテストもしたいという気持ちもわかります。 (多分自分ではそこまでしないでしょうけど。) RubyUnitでどう支援すればいいのかわからないので用意していないだけです。
ということで提案大歓迎。
Windows で短いファイル名から長いファイル名に変換するにはどうすればいいんでしょう?
長いファイル名から短いファイル名に変換するGetShortPathName
というAPIがあります。
この逆は? GetLongPathName
というのは無いみたい。
MFCのソースの中をさまようことしばし。FindFirstFile
が使える模様。
でもって、適当にでっちあげたC++の関数がこちら(Windows 95 + mingw32で確認)。
static string getlongfname( const string & fname, const string & dir ) { string fpath = dir + '\\' + fname; string longname = dir; WIN32_FIND_DATA data; HANDLE h = FindFirstFile(fpath.c_str(), &data); if (h != INVALID_HANDLE_VALUE) { FindClose(h); longname = dir + '\\' + data.cFileName; } return longname; } string getlongpath( const string & path ) { string longpath = path.substr(0, 2); string p; string::size_type lpos = path.find_first_of('\\', 3); string::size_type fpos = 3; while (lpos != string::npos) { p = path.substr(fpos, lpos-fpos); longpath = getlongfname(p, longpath); fpos = lpos + 1; lpos = path.find_first_of('\\', fpos); } p = path.substr(fpos); longpath = getlongfname(p, longpath); return longpath; }
目茶苦茶面倒だし、かなり格好悪い。 もっとスマートなやり方をご存知の方は教えてください。 (リファクタリングしてやってください。)
WM_LBUTTONDBLCLK
を使う方法は結局駄目でした。
やっぱり、Scintilla側で何とかしないと駄目みたいな感じがする。
RubyWinにはエラーのある行でマウスでダブルクリックするとその該当行を表示する機能が昔はありました。 今は、それが動かなくなってます。フォーカスが変わらないんです。 RichEditからScintillaに切り替えてからそうなりました。(←そこまでわかっていて何もしてない。)
そこで、2時間ほど試行錯誤しながら、調べてみました。が、結局わかりませんでした。
Scintillaそのものに手を加えないと駄目かも知れません。
今まで使っていたサブクラス化の方法はやめて、
WM_NOTIFY
とSCI_DOUBLECLICK
を使う方法を試したのですがやっぱり駄目。
Scintillaのソース調べてみたらWM_LBUTTONDBLCLK
を使う方法もありそうです。
次回試してみよう。(←次回っていつ?)
でも駄目な気がするなあ。
講演の最後に今後の展望みたいなものを話しましたが、あれは失敗でした。 「あると役に立つかも知れない機能」が、あの項目の中に含まれていて、 私も「あるといいかも知れない」とか喋ったと思います。 でもXPでは、本当に必要としている機能以外は作らないというルールがあります。
誰にも突っ込まれなかったけど、自己矛盾してることに今日になって気づきました(笑)。
まつもとさんの講演を聴く。 講演が終った後で、インタプリタオブジェクトの件をまつもとさんにお願いする。
やっと、『Programming Ruby』にサインをしてもらう。 これで、Dave, Andy, Matz 3人のサインが揃った貴重な1冊になった。
うーん。相方の本も預かっといてサインしてもらえば良かったなあ。
その後、Ruby関係の人が数人集まってRubyに関する雑談をしているところに加わる。 ごとけんさんとRubyUnitの仕様の件でちょっと話したり。 咳さん、Toshさんらとインストーラとかテストとかいろんな話で盛り上がる。 (実は、これが一番楽しかった。)
Larry Wallの講演を聴いて3日間が終り。 楽しい3日間でした。