そうか。CR + LFはまずいのか。
そういえば、昔、何かのソースをコンパイルしたときに
行末が \
でコンパイルできず、一生懸命 LF になおした記憶があります。
(あれ? Cygwinにはd2u
とu2d
が用意されてますね。これ、最初からあったのかな?)
Win32OLEも修正しておきます。
今まで発覚しなかったのは、行末に\
が来てなかったから。
安直にWindowsだからCR + LFでいいやと思っていました。
しかし、コンパイルできなかった経験をもちながら、自分で、 その経験を活かしきれていないのが情けないです。
試してみましたが、 gcc 2.95.3 だと大丈夫に思えます。
やっと読了。初心者向けに丁寧にわかりやすく書かれています。 いかにも教科書という感じです。
読み始めました。 語り口がなめらかですんなり読めます。 あまりにすんなり読めてしまうので、読んだあと、何も残らないのではないかと心配。
RDoc Valpha-9 には、
--diagram
というオプションがあります。
このオプションを指定するとクラスとモジュールのダイアグラムを生成してくれます。
ただし、ダイアグラムを生成するには、
Graphvizのdot
というツール(コマンド)が
必要です。
残念ながら、私の環境では、Tcl/Tkのヴァージョンが古かったので、素直にコンパイルできませんでした。
(Graphvizのコンパイルには Tcl/Tk 8.3 が必要です。)
結局、エラーの出るtkspline.c を空っぽにして、強引にコンパイルを通してdot
コマンドを作りました。
このようにいい加減に作ったdot
なのですが、
コアダンプすることもなくrdoc
から使うことができました。
だ円と文字の位置が多少ずれていますが、それなりにダイアグラム(PNGファイル)を生成しました。
(位置がずれるのは、強引にコンパイルを通したからかも知れません。)
各クラスは楕円で表現され、親クラスから派生クラスに向かって矢印も描かれています。
昨日の件は、タイプライブラリでないと失敗することがあります。
そこで、公式には
WIN32OLE.const_load(ole [,class]) ole は WIN32OLEオブジェクト、もしくはタイプライブラリ名 class は、モジュールもしくはクラス を指定する。
とします。
ところで、タイプライブラリから得られるITypeInfoインターフェースを手掛りに OLEの世界をあれこれさまよい歩くといろいろ情報を得ることができます。 この辺をあれこれいじってみようかと思っています。
今のWIN32OLE#ole_methods
などを使ってもメソッドの情報を得ることができます。
ですがOLEサーバーを起動しないといけないのが面倒なのです。
ということでタイプライブラリ経由でも得られるようにしてみようと思います。
GPLファイルを含めた。COPYINGファイルやCOPYING.jaファイルも含める必要があるのだろうか? ライセンス難しい。 私を訴えなければ、煮るなり、焼くなり好きにしてくれていいというのが本音。 他は変わってないので、rubyunit-0.5.4-01 です。
結局、タイプライブラリでもProgIDでも良いようにした。
module Office end WIN32OLE.const_load('Microsoft Office 9 Object Library', Office) puts Office::MsoGradientVertical
でも
module Office end WIN32OLE.const_load('OfficeCompatible.Application', Office) puts Office::MsoGradientVertical
でもOK。そろそろroughに入れる準備を始めよう。
ole_method_help
もちょっと修正。
require 'win32ole' excel = WIN32OLE.new('Excel.Application') excel.visible = true book = excel.workbooks.add info = book.ole_method_help('SaveAs') puts info['name'] params = info['params'] params.each do |param| print " ", param['name'] print " = ", param['default'] if param['default'] print "(" print param['type'] print ",IN" if param["in"] print ",OUT" if param["out"] print ",OPTIONAL" if param["optional"] puts ")" end
を実行すると次のような結果が得られます。
SaveAs Filename(VARIANT,IN,OPTIONAL) FileFormat(VARIANT,IN,OPTIONAL) Password(VARIANT,IN,OPTIONAL) WriteResPassword(VARIANT,IN,OPTIONAL) ReadOnlyRecommended(VARIANT,IN,OPTIONAL) CreateBackup(VARIANT,IN,OPTIONAL) AccessMode = 1(USERDEFINED,IN,OPTIONAL) ConflictResolution(VARIANT,IN,OPTIONAL) AddToMru(VARIANT,IN,OPTIONAL) TextCodepage(VARIANT,IN,OPTIONAL) TextVisualLayout(VARIANT,IN,OPTIONAL)
返事は書いたが、送信するのを忘れてた。
急に[ruby-list:30413]から始まるスレッドで言及されているWin32OLEの弱点に 対応しようという気持ちが強くなったので調べてみた。(私は気まぐれ。) [ruby-list:30420]によれば、Perlではできるそうなので、例によってPerlのOLEを調べる。 調べる。調べる...。
Registoryの中身を探しまくるのかあ。はあ...。
適当にプログラムを書いて試してみると、タイプライブラリのフルパスがわかれば、
LoadTypeLibEx
でITypeLibポインタが得られることがわかった。 ここまでくればwin32ole.cの
ole_const_load
を呼べばおしまい。
そこで、
WIN32OLE.const_load の第一引数は、WIN32OLEオブジェクトかタイプライブラリのフルパスを指定する
ということにしようかと思った。
でもそうすると環境によってフルパスは代わってくるので嬉しくない。 例えば私の環境では、[ruby-list:30420]で言及されている MSO9.DLL のフルパスは
C:\msoffice2000\Office\MSO9.DLL
になっている。
これをそのまま、WIN32OLE.const_load
の第一引数に指定しているスクリプトは、
私の環境では動くけど、他の環境では動かない。
やっぱり、
WIN32OLE.const_load の第一引数は、WIN32OLEオブジェクトかProgIDを指定する。
ぐらいにしないと使えない。
そこで、基本に戻って『Inside OLE』を読んでみる。
ProgIDからCLSIDに変換する。(変換したCLSIDを{<CLSID>}とする。)
RegistoryのHKEY_CLASSES_ROOT\CLSID\{<CLSID>}\TypeLibの値{<LIBID>}を探す。
HKEY_CLASSES_ROOT\TypeLib\{<LIBID>}の下を探す。
この手順でフルパスを見つけられるように読み取れるのだけど、 私の環境のRegistoryには(2)のTypeLibのサブキーが見当たらない。 代わりに
InprocServer32
というサブキーがあって、フルパスが入っている。 これをあてにしてもいいんだろうか?
ところで、[ruby-list:30420]によるとPerlでは
"Microsoft Office"
を指定すればいいらしい。 Perlは、この文字列から、RegistoryのHKEY_CLASSES_ROOT\TypeLibの下をぐるぐるさまよって、 "Microsoft Office" にマッチする
"Microsoft Office 9 Object Library"
を値にもつ
HKEY_CLASSES_ROOT\TypeLib\{<LIBID>}
にたどりついて、フルパスを手に入れているみたいだ。
WIN32OLE.const_loadの第一引数は、WIN32OLEオブジェクトか、タイプライブラリ名を指定する
というのがいいかも知れない。 さすがに
"Microsoft Office"
だけでいいってのはやり過ぎな気がするので、そこまでサポートするかどうかわからないけど。
のことを聞かれてもよくわからないので、ruby-talkで質問してみたらどうかと返事を書いておいた。
今回は、RDOCのコメント部分の話です。
rdoc
に処理させたくない部分は
#--
で始めます。
# この行は Foo クラスの説明の行です。 # この行は2行目ですが、rdocの処理結果では1行になります。 # # 1行空けて書き始めると改行されます。 #-- # ここから先の行はrdocでは無視されます。 # この行も無視されてしまいます。 class Foo
の場合には、Fooの説明は
この行は Foo クラスの説明の行です。この行は2行目ですが、rdocの処理結果では1行になります。 1行空けて書き始めると改行されます。
となります。
rdocに処理させたい部分を再開するには
#++
で始めます。
# この行は Foo クラスの説明の行です。 # この行は2行目ですが、rdocの処理結果では1行になります。 # # 1行空けて書き始めると改行されます。 #-- # ここから先の行はrdocでは無視されます。 # この行も無視されてしまいます。 #++ # この行からまた、Fooの説明になります class Foo
とすると、Fooの説明は
この行は Foo クラスの説明の行です。この行は2行目ですが、rdocの処理結果では1行になります。 1行空けて書き始めると改行されます。この行からまた、Fooの説明になります。
となります。
この行は Foo クラスの説明の行です。この行は2行目ですが、rdocの処理結果では1行になります。 1行空けて書き始めると改行されます。 この行からまた、Fooの説明になります。
としたい場合には、
# この行は Foo クラスの説明の行です。 # この行は2行目ですが、rdocの処理結果では1行になります。 # # 1行空けて書き始めると改行されます。 #-- # ここから先の行はrdocでは無視されます。 # この行も無視されてしまいます。 #++ # # この行からまた、Fooの説明になります class Foo
としなくてはいけません。
「ハニーポットを利用したネットワークの危機管理」 を「ハーボットを利用したネットワークの危機管理」と読み間違えた。
ふと思って、Googleで、「雑記帳」を検索してみたら ここのトップページが最初にきた。
「本(『Rubyを256倍使うための本 極道編』のことです。)を出版したそうですね。」
「ええ。そうなんです。」
「写真集出したって聞いたんですけど。」
「・・・」
良く考えたら、
ruby -w で起動してもRubyUnit側ではWarningが出ない。
ことをテストで書いておけばいいことに気づいた。
CVSの最新版では
rdoc --template kilmer
として作られるHTMLファイルのスタイルの方がソースも見やすくて良さそうです。
さて、RDOCの続きです。
rdoc
はRD形式のドキュメント(=begin
と=end
で
囲まれた埋め込みドキュメント)を無視します。
RDOCは1つ以上の # で始めます。
# この行は Foo クラスの説明の行です。 # この行は2行目ですが、rdocの処理結果では1行になります。 # # 1行空けて書き始めると改行されます。 class Foo def initialize(val) ...(以下略)
とするとFoo
クラスの説明が
この行は Foo クラスの説明の行です。この行は2行目ですが、rdocの処理結果では1行になります。 1行空けて書き始めると改行されます。
となります。
Foo
はちゃんと、rdoc
が出力するFoo.html
へのリンクになっています。
素晴しい。
途中の空行の#を省略することはできません。
# この行は Foo クラスの説明の行です。 # この行は2行目ですが、rdocの処理結果では1行になります。 # 1行空けて書き始めると改行されます。 class Foo
とすると rdocは Fooの説明として
1行空けて書き始めると改行されます。
と最後の1行だけを出力します。
また、RDOCは、RDのように左端から始める必要はなく、コードのインデントと揃えて書くことができます。
module Bar # この行は Foo クラスの説明の行です。 # この行は2行目ですが、rdocの処理結果では1行になります。 # # 1行空けて書き始めると改行されます。 class Foo
先頭を'#'で始めなくてはならないのは、RDと比べて面倒かも知れません。
ですが、RDの=begin
、=end
のように左端から始める必要はありません。
コメントとコードのインデントをそろえることができます。
コードと交えて書く場合の可読性という点で
インデントを揃えることができる分、RDOCの方にアドバンテージがあるように思います。
逆に純粋なドキュメントであれば、"#" を書く必要が無いRDの方が向いていると思います。 現にこのページはRDで書いてます。 RDOCを使おうとは(今のところ)思いません。
バージョンアップ。
ruby -w
で起動したときにRubyUnit側でWarningが出ないように。
RubyUnitのテストスクリプトはruby -w
で実行するようにしましょう。> 自分。
dependファイルを修正しただけのヴァージョンアップ。 なので、0.3.3-01です。
alsa-driver-0.5.12a.tar.bz2
alsa-lib-0.5.10b.tar.bz2
alsa-utils-0.5.10.tar.bz2
をダウンロードします。
それぞれrpmパッケージを作れるようになっているので、 パッケージを作ってインストールします。
tar Ixvf alsa-driver-0.5.12a.tar.bz2 mv alsa-driver-0.5.12a/ alsa-driver cd alsa-driver/ ./configure cd utils ./buildrpm rpm -ivh /usr/src/redhat/RPMS/i386/alsa-driver-0.5.12a-1.i386.rpm cd .. ./snddevices tar Ixvf alsa-lib-0.5.10b.tar.bz2 mv alsa-lib-0.5.10b alsa-lib cd alsa-lib ./configure cd utils ./buildrpm rpm -ivh /usr/src/redhat/RPMS/i386/alsa-lib-0.5.10b-1.i386.rpm tar Ixvf alsa-utils-0.5.10.tar.bz2 mv alsa-utils-0.5.10 alsa-utils cd alsa-utils ./configure cd utils ./buildrpm rpm -ivh /usr/src/redhat/RPMS/i386/alsa-utils-0.5.10-1.i386.rpm
あとは、/etc/conf.modules です。 (ThinkPad i1620 のサウンドチップは CS4281 です。)
# ALSA alias char-major-116 snd alias snd-card-0 snd-card-cs4281 alias char-major-14 soundcore alias sound-slot-0 snd-card-0 alias sound-service-0-0 snd-mixer-oss alias sound-service-0-1 snd-seq-oss alias sound-service-0-3 snd-pcm-oss alias sound-service-0-8 snd-seq-oss alias sound-service-0-12 snd-pcm-oss options snd snd_major=116 snd_cards_limit=1 snd_device_mode=0666 snd_device_gid=0 snd_device_uid=0 options snd-card-cs4281 snd_index=0 snd_id=CARD_0 snd_playback_bufsize=128 snd_capture_bufsize=128
手動でALSA driverをロードします。
/etc/rc.d/init.d/alsasound start
alsamixer
でMuteの設定を解除して、音量も設定しておきます。
play /usr/share/sounds/phone.wav
で電話のベル音が聞こえればOKです。 あとは前と比べて安定しているかどうかが問題です。
ひょっとしてVMWare上のWindows2000でも音が鳴るかと思って調べてみました。 おおっ! ちゃんとVMWareのConfigurationの項目にsoundがあるじゃないですか。 (私が今まで知らなかっただけですね。) ということで
device に /dev/dsp を指定 (最初から /dev/dsp になっていた) Start Connected にチェック
してInstallボタンを押します。 あとは、Windows2000を立ち上げて
Sound Blaster 16
のドライバを組み込めばおしまい。 (コントロールパネルからハードウェアのインストールかなんかで Windows 2000が(見事に騙されて?)自動認識します)。 Windows 標準に含まれているwavファイルなんかで音が鳴ることを確認できました。 VMWareすごいです。 (まあ、音楽などちゃんと聞けるのかどうかは、もうちょっと試してみないとわかりませんけど。)
さらに続きです。
rdoc --title 'Class Browser of Foo' foo.rb
と実行するとタイトルが「Class Browser of Foo」となります。 デフォルトは、「RDoc Documentation」 です。
rdoc --fmt
で出力フォーマッタを指定することができます。 現状でサポートしているのは、デフォルトのHTMLのみです。
もちろん、自分専用のフォーマッタmyfmt
を作ることも可能です。
作成するために最低必要なことは、次の通り。
rdoc/generators ディレクトリに myfmt_generator.rb
というファイルを用意する。
module Generators 内にMYFMTGenerator
クラスをmyfmt_generator.rb
で定義する。
module Generators class MYFMTGenerator end end
MYFMTGenerator#generate(info, options)
メソッドを定義する。
module Generators class MYFMTGenerator def generate(info, options) end end end
さて、問題はgenerateメソッドの中身なのですが...
MYFMTGenerator
の第2引数は、rdoc
のコマンドライン引数のオプションの情報が含まれた
Options
クラスのインスタンスです。
第1引数info
にはrdoc
がファイルをパーズした情報がすべて入っています。
何か出力する物をつくってみようということで、今回はこんなものを作ってみました。
module Generators class MYFMTGenerator def initialize @listed = [] end def list_m(c) @listed.push c.full_name puts c.full_name c.each_method do |m| doprint=false print "line(#{m.token_stream.first.line_no}-#{m.token_stream.last.line_no}): " m.token_stream.each do |t| if t.text == 'def' doprint = true elsif t.text == "\n" && doprint break end print t.text if doprint end puts "" end c.each_classmodule do |cc| if !@listed.include?(cc.full_name) list_m(cc) @listed.push cc.full_name end end end def generate(info, options) info.each do |i| i.each_classmodule do |c| if !@listed.include?(c.full_name) list_m(c) end end end end end end
実行するとこんな感じです。
$ rdoc --fmt myfmt foo.rb foo.rb: c... Generating MYFMT... Foo line(2-4): def initialize(val) line(5-7): def method_foo1 line(8-10): def method_foo2
いや。まあ。大した意味は無いんですが...
かなりいい加減なのでバグもあるでしょう。
賢い使い方でも無いでしょう。
(第1引数のinfo
の中身をまだ完全に把握してません。)
まあ、フォーマッタの定義例の1つということです。
次回こそ、RDOCの書き方を調べようかと思ってます。
ちょっとALSAに再挑戦しようと思って Googleで
ThinkPad i1620 Linux alsa
と入力して検索したら、自分のページが最初に見つかった。 しかも、不安定だからアンインストールしたというものです。 うーむ。頼れるのは自分だけってことですか? (←そんなことはありません。)
RDOCの書き方の前にもう少し使い方を調べてみることにします。
全く意味は無いのですが、次のようなFoo
を定義したfoo.rb
を用意します。
class Foo def initialize(val) @val = val end def method_foo1 puts method_foo2 end def method_foo2 @val *= 2 end private :method_foo2 end
ここで、
rdoc foo.rb
と実行すると foo.rb
を元にしてHTMLのドキュメントをdoc
ディレクトリに作ってくれます。
ドキュメントからは
foo.rb
で定義されているのは、Foo
クラスであること。
Foo.new
は、1つの引数val
を取ること。
Foo
のpublic instance method がmethod_foo1
であること。
などがわかります。
また、メソッド単位にHTMLファイルを生成していて、 そのHTMLファイルから
Foo#method_foo1
の定義そのもの
Foo#method_foo1
が定義されているのがfoo.rb
の5行目であること。
などがわかるようになっています。
デフォルトでは、ドキュメントとして生成するのはpublic methodだけですが
--all
を指定することで、private method の情報も生成してくれます。
rdoc --all foo.rb
またドキュメントを生成するディレクトリを指定したい場合には
--op
を使います。
rdoc --op foodoc foo.rb
--main
を指定することで、最初に表示したい内容を指定することができます。
例えば、
rdoc --main Foo foo.rb
とすれば、index.htmlをブラウザで開いたときに最初に表示されるのは、Foo
クラスの情報になります。
私は、RDやRDのフォーマッタである RDtool と似たようなものかと思っていましたがちょっと違うようです。 RDOC形式のドキュメントが無くても、 それなりにドキュメントを生成してくれます。 まだアルファバージョンの段階ですが、使えるのではないでしょうか。
なお、ソースのパーザには、RDtoolが 利用しているRaccではなく、 rtags.rb, irbのruby-lex.rb ruby-token.rbをベースにしたものを使っているようです。
私には、『ホッグ連続殺人』を引き合いに出すほどの傑作とは思えません。 クリスティーは読んでないのでそれをどうこう言うつもりはありません。 でも、ブランドと肩を並べる作品とは思えないです。
どういう訳か、ストーリーがすんなり頭に入ってきませんでした。 そのために作者の企みにも、スムーズにひっかからなかったんじゃないかと思います。 期待しすぎたのかも知れません。
RubyUnit と Win32OLE の両方。
rdocはJavaでいうJavaDocのような、Rubyのドキュメントシステムだそうです。
まずはインストール。rdoc
ディレクトリで
ruby install.rb
と実行すれば、インストールできます。インストールが終わったら
rdoc
と実行します。
これで rdoc
ディレクトリに doc
ディレクトリができます。
doc/index.html
をブラウザで表示してみましょう。
w3m
より、Mozzila
の方がいいでしょう。
(多分、IEとかNetscapeとかでもいいと思います。)
クラスブラウザというか、Smalltalkの環境というか、なんかそんな感じの画面が出てきます。
こんなものができるとは予想してなかったので、正直びっくりしました。
(JavaDocを知ってる人は驚かないんでしょうね。)
まだアルファヴァージョンですが、いい感じです。
今回は、以下の環境で確認しました。
OS: Vine Linux 2.1.5 Ruby: 1.7.2 (2002-01-10) Mozzila 0.9.6
cvs checkout
したので、引き続きcvs update
で追いかけることにしました。
rdocで何ができるのか感じはつかめたので、次回はRDOCの書き方を調べてみます。
いつの間にか0.2.4がリリースされていました。 0.2.2と0.2.3には気付きませんでした。 今日まで
w3m -v
で表示されていたのは、
0.2.1-inu-1.4-img-1.11
です。
「なんだ、そのヴァージョンは?
cvs update
することにしたんじゃなかったのか!?」
というツッコミもあることでしょう。
正確には、そのツッコミは正しくありません。
cvs update -d -P
としていました。 そうですね。すいません。何の言い訳にもなっていません。 0.2.2と0.2.3はあきらめ、ついでに0.2.4もスキップして、ヴァージョンは
0.2.4+cvs-1.207
と表示するようにしました。
それから、イメージのインライン表示機能は、ほとんど使わないので インライン表示のためのパッチをあてることはやめにしました。
最後まで、『ミラマル』の正体には気づきませんでした。 作者が作者なだけに、 私なりに注意しながら『ミラマル』の正体をあれこれ考えながら、読んでいたのですが、 正体は、見破れませんでした。 もう一つの仕掛けの方も、わかってから もう一度読み返してみるとちゃんと伏線が張ってあるのがわかります。 さすがです。
待ち時間は少なくなりました。
『Rubyを256倍使うための本 界道編』 (永井秀利)
お約束。
『XP エクストリーム・プログラミング実践記』 (ジェームズ・ニューカーク+ロバート・C・マーティン)
あっ。あのロバート・C・マーティンですか???
『ピープルウェア第2版』(トム・デマルコ/ティモシー・リスター)
話題の本なので。
『騙し絵の檻』 (ジル・マゴーン)
解説を読みました。大丈夫ですか? こんなに誉めて。 こちらは期待しながら読みますよ。 期待が大きい分、できがそこそこぐらいでは、私は納得しませんよ。
今、気がついたんですが、多分、この本は解説から読んじゃいけなかったんじゃないかと思います。 ネタバレになっているんじゃないかと思います。
Unix Magazine
高林さんの横着プログラミングを立ち読み。 私もChangeLog方式を実践してみようかな。
LaTeX2e 美文書作成入門 (奥村晴彦)
これが最新版の本なのかどうか確信が持てなかったので。
Linux Magazine
2001年12月現在のCygwinがCD-ROMに収録されているのに魅かれて買おうかと思ったのだけど、 結局インストールしないだろうと思ってやめた。 例によって立ち読みはまつもとさんの記事。
UNIX User
Ruby特集らしいので、探したのですが、探し方が悪かったのか見つけられませんでした。
正月ボケです。アホです。 ゲストOS(Windows 2000)からSambaでホストOS側をマウントしてれば、 ホストOS側も被害にあうことに気づきました。 (←みんなそんなことには、最初から気づいてます。)
ええ。お察しのとおりです。 つい、いつもの癖で
Samba起動
VMWare起動
Windows 2000起動
としてました。 もちろん、Sambaは一例に過ぎず、 何らかの形で、ゲストOSからホストOSが見えると、まずいことはあるでしょう。 そこで、昨日の疑問は、
ゲストOSからはホストOSを見えない状態にした上で、 VMWareを越えてホストOSであるLinuxまで 破壊するようなゲストOS上のウィルスは存在するか?
ということになります。
1.7 (1.8)では、STR2CSTRはobsolete APIなんだそうです。
ln -s /dev/sr0 cdrom
は
ln -s /dev/scd0 cdrom
とするという記述も見かけたのだけど、本来はどっちを使うべき? /etc/conf.modules で alias scd0 sr_mod としてるから /dev/scd0でも良いと理解すればよい? (←誰に聞いてるんですか。←もう少し勉強しましょう。)
それからCD-ROMのmountの件は、他人には意味不明だったので、
/etc/fstab
の記述を追記。
gcombustを使うのはあきらめます。GUI難しいです。 どこへ何を入力すればいいのか、全くわかりません。
とりあえず、この問題は解決した。 が、ruby-listで教えてもらった方法([ruby-list:33184])で 回避する新しいバージョンを近いうちにリリースする予定。
のファイルが添付されているらしきメールを受信する。 ウィルスなのかどうか、はっきりしない。 だが、VMWare の Windows 2000には、ウィルスチェッカをインストールしていない。 Linux 側からは、VMWare上のWindows 2000は単なるファイルとして見える。 そこでWindows 2000 用に作っているディレクトリをまるごと、Linux側で
cp -rp win2000 win2000sv
とする。(Windows 2000まるごとバックアップですな。)
その後VMWareから Windows 2000を起動して思いきって添付ファイルを開いてみた。 Bitmapは普通のファイルっぽかったが、Excelは開けなかった。 (←結局ウィルスかどうかわからんじゃないか。)
あとは、
rm -rf win2000 mv win2000sv win2000
としておく。(Windows 2000まるごとリストアですな。)
VMWareを越えてホストOSであるLinuxまで破壊するようなゲストOS上のウィルスってあるんだろうか。 (という一沫の不安があるので、私は責任を持てません。皆さん、絶対マネしないように。)
ThinkPad i1620 + ウルトラベースX2 で CD-R, CD-RWが使えたので、設定メモ。
CD-RW書き込み用ソフトcdrecordをインストール。
VinePlusのcdrecord-1.9-0vl3.i386.rpmをダウンロードして
rpm -Uvh cdrecord-1.9-0vl3.i386.rpm
と実行。
ウルトラベースX2のCD-RWは、普通のIDE(ATAPI)接続なので、CD-RWを利用するために SCSIとして認識させる。
/etc/lilo.conf
の変更
/dev/hdc が CD-RWなので、hdcはSCSIとして認識させるために/etc/lilo.confを修正。 (私の環境では、元々、append="apm=on" だったので hdc=ide-scsi を追加した。 必要なのは、hdc=ide-scsiだけ。)
append="apm=on hdc=ide-scsi"
/sbin/lilo
/etc/conf.modules
に追加
# ATAPI CD-RW alias scsi_hostadapter ide-scsi alias block-major-11 ide-scsi options ide-cd ignore=hdc alias scd0 sr_mod pre-install sg modprobe ide-scsi pre-install sr_mod modprobe ide-scsi
/etc/rc.d/rc.local
に追加
modprobe ide-scsi
再起動
dmesg
を実行して次のような行が表示されればOK。
scsi0 : SCSI host adapter emulation for IDE ATAPI devices scsi : 1 host. Vendor: MATSHITA Model: UJDA310 Rev: 3.53 Type: CD-ROM ANSI SCSI revision: 02 Detected scsi CD-ROM sr0 at scsi0, channel 0, id 0, lun 0 sr0: scsi3-mmc drive: 20x/20x writer cd/rw xa/form2 cdda tray
cdrecord -scanbus
でも認識できるかどうか確認しておく。
CD-RWに書き込む
書き込みたいファイルを一時作業領域(/tmp/work)にコピー
ここでは、dir-to-writeディレクトリをまるごとCD-RWに書き込みたいとする。
mkdir /tmp/work cp -rp dir-to-write /tmp/work
ISO9660のイメージファイルを作成。
mkhybrid -r -J -o /tmp/cd.iso /tmp/work
(別にやらなくてもいいけど、) cd.isoの中身は、mount すれば確認できる。
mkdir /mnt/cdiso mount -o loop /tmp/cd.iso /mnt/cdiso
CD-RWへ書き込む
cdrecord dev=0,0 speed=2 -v /tmp/cd.iso
CD-RWの内容を消す
cdrecord dev=0,0 -v blank=fast
CD-RWの内容を確認する
/dev/cdrom
のシンボリックリンクを変更する。
cd /dev rm cdrom ln -s /dev/scd0 cdrom
CDROM としてmountする。
/etc/fstabに
/dev/cdrom /mnt/cdrom iso9660 noauto,owner,ro 0 0
と書いてあるので mount /mnt/cdrom
で良い。
WebのCD-RWに関する情報に感謝。それが無ければ私には設定できなかったでしょう。
VinePlusのxcdroast もインストールしてみたのだけど、何か設定が足りないのか、 起動するといきなりXごと落ちてしまう。 代わりにgcombustなら使えるかも。 コンパイルして起動してみただけだが、Xは落ちなかった。 (実際の書き込みはしてません。)
もっとも、フロントエンドツールは使わないで、 自分専用のスクリプトを作って間に合わせてしまいそうな気がする。 (フロントエンドツールはどこに何を入力すれば良いのかよくわからない。) バックアップで使うにはその程度で十分。
いろいろ調べているうちに honeybeeさん経由で はがき宛名印刷を 見つけたのでインストール。印刷用psファイルができることを確認(←多分、使わないだろうけど)。
honeybeeさんのところでは 他にもいろいろ「Linuxで年賀状」関連情報(?)が入手できます。
エラーが発生するというので、調査。 エラーになるというサンプルスクリプトをあったのだが再現できず。 相手の環境を詳しく知るため
ruby -v
の結果を送ってもらうことにした。
だったが、休暇の人が多く、閑散としていた。
「がんばれ日本 - 2002年日本のITを変える50人」の中に Rubyの作者としてまつもとさんが登場していた。
ありがとうございます。 やはり、マジックの道具として 使うという話だったんですね。 確かにこの本でないとマジックはできません。 (もうちょっと突込んだ内容を書こうかと思ったのですが、 下手に書くとネタがバレてしまいそうな気がするのでやめます。)
使ってないですが、 junit.extensions packageの中の TestSetupクラスを使えば、1回だけのsetUpと1回だけのtearDownができます。 擬似コードだとこんな感じです。
public class MyTestCase extends TestCase { ... } public class MyTestSetup extends TestSetup { public void setUp() { /* only once setUp */ } public void tearDown() { /* only once tearDown */ } } TestSuite suite = new TestSuite(MyTestCase); MyTestSetup mytest = new MyTestSetup(suite); TestRunner.run(mytest);
私はこの方法は好きじゃないです。 MyTestCase と MyTestSetup で情報を共有できないからです。
ふと、Linuxで年賀状を作るのに、 みんなどうやって作っているのだろうと思い、調べてみた。 ふーむ。TeXを使うというのが王道みたいだ。 (←年賀状だけは、Windowsという人も多いみたい。) 試しに自分の環境で動くかと思って、
\documentstyle{jarticle} \begin{document} 日本語のテスト This is English. \end{document}
という内容のtest.texファイルを作って、
platex test.tex xdvi test.dvi
とやると、それなりに表示された。 ここまでは、良かったのだが、
dvips test.dvi gv test.ps
とやると文字化けした。
gs test.ps
とやっても日本語が化けた。 原因がわからなくて、あれこれ調べていたら、
Vine Linux で、2.1から2.1.5にアップグレードした場合にxdviがおかしくなることがある。 TTF-alias-1.0-1をインストールしなおすと直る。
というのを見つけたので、もしかして、gv, gs でも効果あるかと思い
rpm -e TTF-alias-1.0-1 rpm -i TTF-alias-1.0-1.noarch.rpm
してみたけど変化なし。
さらに調べてみたら、
LANG=ja
でないと文字化けするというのを見つけた。結局、これが原因だった。
ここまで、たどり着くのにえらく時間がかかってしまった。
(/usr/share/ghostscript/5.50/vflib/kconfig-basic.ps
などのファイルもいじったりして回り道をしていた。)
ということで、やっと、(知らない間に)TeXが使える環境が整っているらしいことが判明したのだが、 以前、tgifでも似たような問題で悩んだことがあったと思う。 年が明けたのに進歩してない。
やっぱり、いい加減なパッチは、 単にコンパイルを通すだけのいい加減なものなのだった。 detach や attach がまともに動かない。
なるほど。
mount -s
が必要だったんですね。
ありがとうございます。
うー。知らんかった。テレビ見逃した。 特番でどういう風に『しあわせの書』が取り上げられた のかすっごく気になってます。 どなたか特番をご覧になった方は、 こっそりメールで教えてください。
ちなみに泡坂妻夫は好きな作家なので、ちゃんとこの本が最初に出版されたときに読んでます。 残念ながら、本自体は、どっか行っちゃって手元にはありません。
えーと、番組がどれか、明記されてませんが、 『しあわせの書』と「大晦日のテレビ朝日の特番」と12月31日の新聞の番組表から考えて、 「ビートたけしの世界はこうしてダマされた!?...」だと決めてかかってます。
あっ。昨日で終わったんだな。