/ 最近 .rdf 追記 設定 本棚

脳log[2007-02-06~]



2007年02月06日 (火)

[Vista]設定ファイルの変更がプログラムに反映されないときは

SetPointが参照する xmlファイルだとか、Apacheの httpd.confだとか、LHMeltの設定だとか、Program Filesや ProgramDataにあるファイルだけだと思いたいがプログラムとエディタが別のファイルを見ているんじゃないかと思われることがある。試しにファイルを削除してみるとファイルがないとプログラムがいうので同じファイルを読んでいることは確かめられる。ストリームを使っているのだろうか。いったんファイルをデスクトップにコピーしてから開いてみるとプログラムが読んでいた内容がエディタにも表示される。そのままエディタで編集して元の場所に移動するとエディタで編集した内容がプログラムにも反映される。

なんなんだこのわけのわからなさは。ユーザーを赤ん坊か何かだと思ってバカにしすぎじゃないか。ユーザー不在のまま小利口なことはしてくれなくて結構。

 2007-02-19 追記: UAC-FileVirtualization

イベントビューアに UAC-FileVirtualizationというカテゴリがある。ログを眺めたところ、上で挙げたファイルは仮想ファイルだとか遅延仮想ファイルというものであるらしい。これの目的と実装が知りたい。

 2007-03-12 追記: [単行本] 【最新Windows Vistaプログラミング徹底理解 (SOFTBANK MOOK C MAGAZINE MOOK)】 ソフトバンククリエイティブに答えが。

権限をもたないユーザー(に実行されたプログラム)が Program Filesフォルダや Windowsフォルダ、ProgramDataフォルダやレジストリの HKEY_LOCAL_MACHINEに書き込もうとすると書き込みを拒否される代わりにこっそり C:\Users\<username>\AppData\Local\VirtualStore\Program Filesや HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINEに書き込ませられてるってわけだ。

インストールされたフォルダに設定を書き込むタイプのプログラムを実行するときに、設定が書き込めなくてエラーが発生するだとか、全ユーザーが設定を共有する羽目になるだとかの問題は解決できるだろうね。

でもそんな問題は XPのときからあったわけで。個人的に使用するプログラムや iniファイルを exeと同じフォルダに保存するプログラムは、自分のプロファイルフォルダに Programsってフォルダを作ってここにインストールすることにしてましたよ。

からくりがわかれば対処もできるけど、プログラムと一緒に自分も騙されてたことに腹が立つ。

[Vista]Shift+右クリックで

ファイルのパスをクリップボードにコピーする「パスとしてコピー(&A)」が表示される。

欲しかったのは RunAs なんだけど……。UACを切ってるせいなのか「管理者として実行(&A)...」が機能していない。UACが働いているときは勝手にパスワードを要求してくるから「管理者として実行(&A)...」を選ぶ必要なんてなかったけど、UACが無効になっていて必要とされてる今、機能しないでどうする。ナンセンス極まりなし。

[Vista] ガジェットの並び順、変わりすぎ。

再起動の度に並べ直させられるのかよ。が仕様ですか。

[Vista]標準ユーザーは UACを有効化できないようだ

だったらチェックボックスをチェックしたときなり、OKボタンを押したときなりにリジェクトしなさい。フィードバックを寄越しなさい。


2007年02月04日 (日)

[Vista] 自動バックアップのへっぽこなこと

Cドライブ(システム)と Yドライブ(ユーザープロファイルが一つとその他のファイル)をバックアップしようとした。

ファイルが使用中でアクセスできない、と失敗する。

Yドライブにプロファイルが格納されているユーザーをログオフさせてから再試行すると、以前よりは先に進むが今度は内部エラーで失敗する。

システム上に隠しボリュームがある場合は、バックアップは失敗します。 ボリュームをバックアップする前に、diskpart コマンドを使用して、隠しボリュームの設定を解除してください。

 Vista Beta2 リリースノート 日本語訳 < http://barca.daa.jp/archives/2006/06/vista-beta2.php >

隠しボリュームとはマウントポイントのことかと思い C:\Temp と C:\Backupにマウントしていたボリューム(パーティション)を解除して再試行したがやはり内部エラーで失敗する。

Yドライブをバックアップの対象から外して Cドライブだけをバックアップすることにしてやっと成功。

Cドライブのマウントポイントが悪いのかどうかはわからなかったけど、Yドライブに隠しボリューム(多分マウントポイントのこと)以外の何らかの原因があるとはいえる。

バックアップを作成しておくと特定のファイルの以前のバージョンを復元するという RCSっぽいことができるというので大いに期待していたが期待外れもいいとこ。

失敗するにしても、原因となったファイルのバックアップが作成できないだけならまだいい。失敗すると以降のバックアップが中断されるのでバックアッププロセスの最初の方で失敗すると大部分のファイルのバックアップが作成されずに終わってしまう。

途中で中断しない、あるいは決まった順番で処理しないことで 100%ではなくても 90%以上のバックアップは成功する気がするが。


2007年02月03日 (土)

最終更新: 2011-01-06T02:34+0900

[Vista]標準ユーザーはどうやって環境変数をセットすれば良いのだろう

マイコンピュータを右クリックしてプロパティを選び、 システムの評価値などが表示される Webページ風のウィンドウでシステムの詳細設定というリンクをクリックすると UACのダイアログが表示されてパスワードを要求される。 パスワードを入力すると XPでいう RunAsを実行した状態になるのでシステムの環境変数と、さっき入力したパスワードに対応したユーザーの環境変数の値しか設定できない。

MSが環境変数を設定するための違うルートを用意していない場合*、UACを切るしか方法はない。UACを切ると再起動が必要になるのでやってられない。

一応、regeditで HKEY_CURRENT_USER\Environmentを編集する手があり、再起動するより簡単だが、必ず「レジストリの操作は自己責任で〜云々〜」という枕詞つきで紹介される regeditを持ち出させるようじゃ本末転倒だろう。

プロファイルフォルダを別のハードディスクに移動して元の C:\Users\<USERNAME>フォルダをジャンクション(シンボリックリンクのようなもの)で置き換えるのを妨害するのも UACである。

スタートメニューにある「コマンドプロンプト」というショートカットを「Command Prompt」にリネームしてキーボードで選択しやすくしようとするのを妨害するのも UACの仕業に違いない。

特定の条件でフォルダを移動しようとすると無限再試行ループに突入してしまい、結局コピーしてから元のフォルダを削除するという操作を強いられるのも UACの仕業に違いない。*4

マイコンピュータやユーザーのホームディレクトリで、リストビューの表示形式や、表示カラムや、ソート方法や、グループ化方法をすぐに忘れてしまうのはもちろんエクスプローラの責任だ。Vistaになってもリストビューにまつわるイライラは解消されない。ウィンドウ下部に表示される詳細ペインでファイルのプロパティをダイレクトに編集できるのは便利だけども。

* 2007-02-08 追記: あった。コントロールパネル->ユーザーアカウント

 レジストリで環境変数を編集したあと変更を通知する必要があるらしく、再ログオンしたりしている。これでは、あんまり、簡単じゃない。

 濡れ衣であった。コマンド プロンプトと見えているものはもとより Command Promptという名前であって、見た目をごまかしているのは desktop.iniだった。

*4 追記(2007-02-08): コピーと移動で何が違うって、移動だと所有権がそのままになる。標準ユーザーが所有権を持ったままのファイルを Program Filesのように保護の必要な場所に置くことはできないということだろう。

[Vista]Folder.httの後継はガジェット

ダブルクリックも覚束なかった高校三年生のときに Windows98を触ってすぐにのめり込んだのが folder.httの編集。 Windows2000以降は大幅に制限されてしまったが、Windows98では自由にいじってくれという雰囲気があった。

folder.httの編集で HTMLと JScriptを覚えたのだ。

廃れてしまったフォルダのカスタマイズの代わりになる手軽なおもちゃがガジェット。 これは HTMLと JScriptと CSSと XMLから成っている。

Windows Vistaガジェット入門 (赤坂 玲音, CodeZine)

[Vista] Vistaでなく WMP11のこと

ミュート、音量↓、音量↑

に対応するキーボードショートカットが

F8、F9、F10

から

F7、F8、F9

に変更されているような。わけのわからないことをする。

あと mplayer2.exeがなくなってるのに今気付いた。既に XPの入ってたハードディスクはフォーマットして再利用してしまったよ。

(追記) 残っていた。けれど なんとか.ocx に DllなんとかW エントリポイントが存在しないというエラーになる。なんとか.ocxというのが mplayer2.exeの実体でこれが Vistaになって互換性のないものに置き換わってしまった、とか?

[Vista] Vista x64 と Radeon X700 と スカッとゴルフ パンヤ

http://windowsvista.ms/index.php?%A5%B3%A5%E1%A5%F3%A5%C8%2Fgame

に書かれているように周りのプログラムが ntdll.dllや npggNT.des絡みで落ちる。update.cln(パンヤのアップデートプログラム?)も落ちる。

ゲームはそのまま続けられたり、化けたエラーメッセージを表示して終了したりする。

原因はユーザーにとって一利も存在しない nProtectだろうねえ。一度は nProtectのスキャンが普通に進行してログインまでいったが、大概の場合、nProtectのプログレスバーは一瞬で消えて、その後周りのプログラムが大量死する。その時パンヤ本体も一緒に終了するかどうかは運次第。


2007年02月02日 (金)

[Vista] エクスプローラがクリックしても前面に出てこない

ウィンドウ下部の詳細ペインの中の、リストビューの選択状況に応じて更新される、ファイル名、種類、サイズ、更新日時などの動的に変化する文字列部分をクリックしてもウィンドウが前面に移動してこない。きもちわるい。

[Vista] サイドバーを前面に (Winキー+Space)

サイドバーを常に最前面にするほどディスプレイの横幅が余ってるわけではないのでこのショートカットはよく使うだろう。MSもそう思ったからスペースキーを割り当てたのだろう。

[SN25P][Vista] NVIDIA nForce4 RAID

NVIDIAから Vista向けの nForce4ドライバがいつまでも公開されない。

BIOSで RAIDを ENABLEDにしてそこに空いているハードディスクをつないで Vistaを起動したら「記憶域コントローラ」に「NVIDIA nForce(tm) RAID Class Controller」というドライバが自動でインストールされた。けれどもハードディスクは RAID Array としてではなく単体の製品名で表示されている。

http://www.nforcershq.com/forum/vista-and-nforce4-sataraid-an-installation-guide-vt66299.html

を読むと nForce4には SATA、PATAを混ぜて RAIDを構築できる「LEGACY」なものと SATA Onlyな新しいものがあるらしく、Vista RTM は nForce2、nForce3、nForce4(LEGACY) より新しいチップセットの RAIDなら予めドライバを用意しているらしい。SN25Pのは「LEGACY」であったということだ。Intelバージョンの nForce4なら NOT LEGACY なのかもしれない。(あっちはミラーとストライプに加えて RAID-5にも対応してるしね)

正式版が存在しないので試せる選択肢は以下の二つ。

  • 64ビットXP 向けの RAIDドライバ
  • Vista x64 beta2 向けの RAIDドライバ

実際に採ったのは先の URLからダウンロードした、Vista x64 RTMに収められているドライバと「LEGACY」な nForce4向けに修正された infファイルという選択肢。「LEGACY」とはいえ SATA Onlyで RAIDを構築していたのでこの手が使える。記述を信頼するならドライバは正式なものだし安心できる。

  1. ダウンロードしてきた RARファイルをデスクトップに展開。
  2. デバイス マネージャで、先ほど BIOSで RAIDを ENABLEDにした方の「標準デュアル チャネル PCI IDE コントローラ」を右クリックして「ドライバソフトウェアの更新(&P)...」を選んで、デスクトップに展開した infファイルを読み込む。
  3. 何度か再起動とドライバのインストールが行われる。

現在は「ディスク ドライブ」として「NVIDIA MIRROR 232.88G」が見えている。「記憶域コントローラ」には「NVIDIA nForce(tm) RAID Class Controller」に加えて「NVIDIA nForce4 Serial ATA Controller」が追加されている。

Vista Ultimateならダイナミックディスクに作成できるダイナミックボリュームを使ってミラーリングや RAID-5が行えるのかと思ったら、フォールトトレラントなボリュームは作成できません、だって。Windows 2000ではできたことが XP Professionalや Vista Ultimateではできないのねん。


2007年01月30日 (火)

[SN25P][Vista] びすたん アルティメット 到着

  • Ctrl+Wでエクスプローラが閉じられない。(beta2)
  • Winキー、アプリの頭文字の 2ストロークでよく使うプログラムの起動ができない。
  • Winキー、U、Hの 3ストロークで休止状態に移行できない。

beta2も RC1もインストールしたが、毎日使うものなだけに自転車のブレーキレバーの角度のようにちょっとした違いが気になって仕方がない。

不都合な点にはひとまず目をつむって Vistaに期待していることは

  • 空のNTFSフォルダにマウントされたボリュームに作成されたフォルダを正しくごみ箱に捨てられること。(フォルダがごみ箱に捨てられないから Shift+Delで直接削除している)
  • ジャンクション? シンボリックリンク? リパースポイント? の正しい取り扱い。フォルダのリンク(ショートカットに非ず)を削除するときに中身を削除せずリンクだけを削除すること。リンクにショートカットのような矢印が表示されるようになったのは進歩だけど「アクセスが拒否されました。」って言って開けないのはどうして?ショートカットにも劣るじゃない。ユーザーには触らせないということ?
  • 検索フォルダ。Thunderbirdで便利だった。思えばケータイのデータフォルダだってファイルの種類でフィルタリングしている。

なぜだろう。全てエクスプローラの問題だ。

Vistaに移行するついでに 64ビットにも移行することにした。OSのインストール自体は簡単に終わったが 64ビットVista向けのドライバが見つからない。

 サウンド (VIA Envy24PT)

SN25P(ベアボーン)の発売元の Shuttleが特設ページで Vista用のサウンドドライバをダウンロードできるようにしているが SN25Pのは 32bit版しかない。チップの製造元の VIAのサイトをのぞいてみたがこちらも 32bit Vista用ドライバしか出ていない。

SN25Pは Socket939で CPUが Athlon64だから Shuttleは以前から 32ビット版と 64ビット版の Audio、RAID、Chipsetドライバを用意していた。この、64ビット版 XP向けと思われるオーディオドライバを互換モードでインストールしたら音はなるようになったがコンパネアプリが起動しないので設定の変更ができない。

 チップセット (NVIDIA nForce4 Ultraモドキ)

nVidiaが Vista向けの nForce4ドライバを Beta2と RC1向けにしか出していない。待ってたら出るのだろうか。Vista向けの正式版ドライバは nForce3のしか出ていないようだけど。

 無線LAN (BUFFALO WLI-U2-KG54)

1月30日付けで新しいドライバディスクがダウンロード可能になっていて Vista用のドライバも収録されているがこれが 32ビット版のみ。

OEM元の Ralinkのサイトから RT2500の 32ビット版と64ビット版のドライバが一緒に収められたインストーラをダウンロードしてインストール。製品を挿してくれというメッセージのあと散々待たされて一応完了するのだけどまだ使えないみたい。デバイスマネージャからドライバの更新を選んで互換性のあるドライバをコンピュータ内から探して「BUFFALO WLI-U2-KG54 Wireless LAN Adapter」を選んでインストールすると使えるようになる。

 マウス (Logicool MX610)

せっかくの多ボタンとチルトホイールを生かすためには SetPointが必要。1月29日に 32ビットと64ビットそれぞれの Vista向けの SetPointがリリースされていた。

 Firefoxなど

アプリケーションは 32ビット版をインストールしてもそのまま動く。x86-64の名前が示す通り。dllと exeで32/64ビット版が混在することはできないらしいのでそこらだけ注意すれば良さそう。レンダリングエンジンを GeckoとIEで切り替える Firefoxの拡張があるけど IEが 64ビット版で Firefoxが 32ビット版だから無理とか?

 ATOK 2005

64ビットXPの対応状況を見ると 64ビットアプリの文字入力には使えないような。ATOK 2007は 32/64ビット Vista両対応だって。


2007年01月29日 (月)

出版が神の仕事だった子供の頃

活字が語る内容は全て真実だと思っていた。言葉には(唯一絶対の, 定められた)正しい意味があり、それを載せているのが辞書だと思っていた。なんとなれば本や辞書が作られる過程が全く想像できなかったのと見た目の精確さからそういう勘違いをしてしまったのだろう。今だって体裁の整った HTMLメールは企業からのメールだと思いがちで、フィッシングメールではないかと疑うのを忘れてしまいそうになる。

子供には「不思議なこと」が存在しない、というのもある。『ソフィーの世界』の、キッチンで宙に浮かぶママ、というのがそういう話ではなかったか。

[Ruby] 文字列リテラル連結

irb(main):001:0> RUBY_RELEASE_DATE
=> "2006-12-25"
irb(main):002:0> "aaa"\
irb(main):003:0* "bbb"
=> "aaabbb"
irb(main):004:0> "aaa"\
irb(main):005:0* %[bbb]
NameError: undefined local variable or method `bbb' for main:Object
        from (irb):5

こういうもんなの? "bbb" と %!bbb! は同じものだと思っていたが。

 追記:2007-12-12

'%04d-%02d-%02d'%[2007,12,12]
=> "2007-12-12"

String#% が呼ばれてるんだよ。


2007年01月20日 (土)

[FF12] 5、60時間プレイして (現在、帝国でリーフ集めを終わらせたところ)

前回(1月3日)

 コントローラー

PS1用のコントローラーの DUALSHOCKが、PS2のゲームでも使えることがあるらしい(DUALSHOCK2の機能を使ってない場合?)ので差してみた。

メニューを開く早さが体感 3割増。反応がもっさりしてたのはコントローラーが一因だった。セレクトで地図を開くとき以外*のあらゆる場面でゲームが高速化したみたいにサクサク操作できる。

 戦闘

こちらのとり得る選択肢が充実してきて、強敵に為す術がないということはなくなった。ヘイスト、バブル、ブレイブ、魔防破壊、バーサクなどなど。

ガンビットもそこそこ充実してきて単体で有効な条件だけでなく、一連の条件を設定することも可能になってきた。とはいえ未だにポイゾナもボキャルも自動化できないのは納得できないけど!

 楽しい

覇王の剣をとった後あたりからハマっている。以下に挙げる条件は序盤から変わってないのだけど技や魔法やガンビットや最大MPが充実して行動の幅が広がってきて、「なんとかなる」ことが多くなったのが大きい。

  • 行動範囲の理不尽な制限がない。(カヌー、バギー、チョコボ、船、飛空挺、魔法のじゅうたん、ひょうたん島、イベントをクリアするまで通せんぼなどなど)
  • 本筋から外れると強い敵。敵わなければ強くなってから再挑戦。
  • 本筋から外れなくてもゲージが緑色でプレイヤーを襲ってこない強い敵。
  • 苦労してもぐったダンジョンの奥には報酬。(店で防御力25程度の防具が最高のときに防御力50の防具とか)
  • 雑魚敵を倒す意味。(おたからと LP。LPは敵の強さによらず大抵 1しかもらえないから雑魚を大量に倒すのが効率的)

なんといっても、プレイヤーが常に複数の目的を持っているというのが良い。どのモブ、どのボスを倒しに行くのか、どのダンジョンを探索するのか、あるいはストーリーを進めるのか。これらの行動を制限するものは自身の強さのみ。初めて訪れる場所というのは一撃二撃で瀕死にされることもままある。そういうときは一体ずつ集中攻撃して経験値を稼いだり、すこし戻って雑魚狩りで LPを稼いでライセンスを充実させたり、あるいはストーリーを進めて装備を充実させたり。自身の強さと相談して再挑戦する時期を決めるのはプレイヤー自身。そういう自由がある。少し無理をしてぎりぎりの戦闘をこなすのも自由。久しぶりにゲームをしていると感じられる RPG。楽しい。

* セレクトとスタートに関しては DUALSHOCKと DUALSHOCK2に違いはなく、どちらもダメ。どれだけ奥まで押し込ませようとするのだ。ボタンの物理的なフィードバックと電気的なオンオフとの間にズレがあるから違和感を与えるのだよ

[Ruby][SQLite] sqlite3-ruby-1.2.0リリース

二年近くの長い沈黙を破って 2007-01-13にリリースされていた。

[Ruby] mkmf.rb

空白を含むパスで失敗するのでこのように↓。

 def link_command(ldflags, opt="", libpath=$LIBPATH)
   Config::expand(TRY_LINK.dup,
                  CONFIG.merge('hdrdir' => $hdrdir.quote,
+                              'srcdir' => $srcdir.quote,
                               'src' => CONFTEST_C,
                               'INCFLAGS' => $INCFLAGS,

2007年01月17日 (水)

[IE7][Hiki][HTML] IE7でマウスがおかしい

http://vvvvvv.sakura.ne.jp/ds14050/w/

Internet Explorer 7 で上の Hikiページを表示すると、右上のメニューを除いてテキストを選択することもリンクをクリックすることもできない。キーボードでの操作はできる。

スクリプトは仕込んでない。外部スタイルシートは hiki_base.cssと pain.cssが読み込まれている。 <style>タグが一カ所使われている。HTMLは Anothoer HTML-lintでチェックして対応がとれてないタグは存在しなかった。

(ページのどこでも)ダブルクリックするとまるで見当外れのページ右下の Generated が選択されるからスタイルシートの float辺りがくさい。

pain.cssをみてみると

div.main {
  float:right;
  width: 78%;
}

div.sidebar {
  float:left;
  width: 20%;
(以下略)

という記述があり、サイドバーの表示を floatで実現していた。

臭う、臭うぞ。でもここまで。そのうち直るでしょ。


2007年01月16日 (火)

[Hiki]ユーザー管理

 管理者

Hikiにはデフォルトで adminという名前の管理ユーザーが一人。Hikiをインストールして FrontPageを表示したら、まず管理者のパスワードを設定するよう促される。

 登録ユーザー

管理画面で edit_user.rbプラグインを有効にするとユーザー名とパスワードの組をいくつでも追加でき、ページの編集を登録ユーザーだけに許すということもできる。必ずしも編集権を登録ユーザーのみに制限する必要はない。

 仮ユーザー(仮称) のようなものがあればと思う

パスワードはなし。名を名乗るだけでなれる。ただし登録ユーザーと同じ名は名乗れない。

掲示板に書き込むときに名前を書くように Wikiを編集するときにも名前を入力できたらな、と思ったので。

パスワード無しの単なる自称なのでなりすましもできるし、しょうもないコメントを(ユーザー名として)入力することもできるけど、貢献してくれた人に名無しでいることを強要するのは間違い。ペンネームでもなんでも名乗る自由と匿名でいる自由が与えられていいと思う。善意の第三者の協力を期待するのなら。


2007年01月13日 (土)

[Ruby][Hiki] Hiki-0.8.6のインストロールインストゥール、install。

まずローカルで試してからアップロードしたのだがローカルの Apacheが Ruby-1.9.0を呼ぶので、FrontPageの表示からログインまでを可能にするために加えた変更点のリストをメモしておく。

 hiki/config.rb: Hiki::Config#initialize

-      instance_variables.each do |v|
+      instance_variables.each do |v| v = v.to_s;

vにシンボルが渡されて、次の行で v.sub!したときにエラーになっていた。

 hiki/command.rb: Hiki::Command#cmd_login

          if page && !page.empty?
-           redirect(@cgi, @conf.base_url + @plugin.hiki_url( page ), session_cookie( session.session_id ))
+           redirect(@cgi, @conf.base_url + @plugin.hiki_url( page ), [session_cookie( session.session_id )])
          else
-           redirect(@cgi, @conf.index_url, session_cookie( session.session_id ))
+           redirect(@cgi, @conf.index_url, [session_cookie( session.session_id )])

Cookieが session_id=SESSIONIDの形でなく SESSIONIDと key名なしの状態でブラウザにセットされるからログインに失敗していた。

Hiki::Command#cmd_logoutでは同じ引数を [session_cookie(session_id, -1)] としていたので同じように配列にした。

 hiki/storage.rb: Hiki::HikiDBBase#md5hex

-      Digest::MD5::new( s || '' ).hexdigest
+      Digest::MD5::hexdigest( s || '' )

リファレンスマニュアルには Digest::MD5.new([str]) とあるが引数の数が 0でないと叱られる。

 hiki/db/tmarshal.rb: TMarshal::dump_text

    when Array
-     "[\n"+obj.collect{|x| dump_text(x)+",\n"}.to_s+"]"
+     "[\n"+obj.collect{|x| dump_text(x)}.join(",\n")+"\n]"
    when Hash
-     "{\n"+obj.sort_by{|e| e[0].inspect}.collect{|k,v| "#{dump_text(k)} => #{dump_text(v)},\n"}.to_s+"}"
+     "{\n"+obj.sort_by{|e| e[0].inspect}.collect{|k,v| "#{dump_text(k)} => #{dump_text(v)}"}.join(",\n")+"\n}"

dumpに失敗していた。

原因となった Array#to_sのバージョンによる出力の違い↓。

Ruby-1.8.5p12> [1,2,3].to_s #=> "123"
Ruby-1.9.0 20061205> [1,2,3].to_s #=> "[1, 2, 3]"

リファレンスマニュアルには

to_s
   self.join($,) と同じです。

と書いてあるから to_sで(ある種の) joinを代用していても仕方ない。

と思ったがどちらにしろ Array#to_sの出力は $, に依存するので、後で(loadするときに) evalすることを考えれば今回の to_sの使用は不適切か。

[Ruby][Hiki] 差分の表示

上のエントリで FrontPageの表示とログインまでやったが、差分の表示もおかしかったので Array#to_s らしき部分を join('') に書き換えまくったら直った模様。

'string'.join は存在しなかったので、書き換えてエラーにならないということは考えたとおり Array#to_sだったか、そのコードが実行されてなくて発覚してないが実は間違いだった(実行されたらNoMethodErrorになる)かのどちらか ^_^; こういう実行してみないとわからないところは javascriptと同じでレアなコードパスのデバッグを難しくするね。

以下、リスト。

 style/default/hikidoc.rb: HikiDoc#escape_meta_char

+if(defined? ' '.ord) # Ruby-1.9
   def escape_meta_char( text )
     text.gsub( META_CHAR_RE ) do |s|
+      '&#x%x;' % s[1].ord
+    end
+  end
+else
+  def escape_meta_char( text )
+    text.gsub( META_CHAR_RE ) do |s|
       '&#x%x;' % s[1]
     end
   end
+end

いきなり Array#to_sと関係ないが String#[index] が Integerに代えて一文字の Stringを返すようになった対策。

 hiki/util.rb: Hiki::Util#word_diff

      if digest
-        return View.new( diff, src.encoding, src.eol ).to_html_digest(overriding_tags, false).to_s.gsub( %r|<br />|, '' ).gsub( %r|\n</ins>|, "</ins>\n" )
+        return View.new( diff, src.encoding, src.eol ).to_html_digest(overriding_tags, false).join(\).gsub( %r|<br />|,  ).gsub( %r|\n</ins>|, "</ins>\n" )
      else
-        return View.new( diff, src.encoding, src.eol ).to_html(overriding_tags, false).to_s.gsub( %r|<br />|, '' ).gsub( %r|\n</ins>|, "</ins>\n" )
+        return View.new( diff, src.encoding, src.eol ).to_html(overriding_tags, false).join(\).gsub( %r|<br />|,  ).gsub( %r|\n</ins>|, "</ins>\n" )
      end

 hiki/util.rb: Hiki::Util#word_diff_text

      if digest
-        return View.new( diff, src.encoding, src.eol ).to_wdiff_digest({}, false).join.gsub( %r|\n\+\}|, "+}\n" )
+        return View.new( diff, src.encoding, src.eol ).to_wdiff_digest({}, false).join(nil).gsub( %r|\n\+\}|, "+}\n" )
      else
-        return View.new( diff, src.encoding, src.eol ).to_wdiff({}, false).join.gsub( %r|\n\+\}|, "+}\n" )
+        return View.new( diff, src.encoding, src.eol ).to_wdiff({}, false).join(nil).gsub( %r|\n\+\}|, "+}\n" )
      end

join('')か join(nil)か統一しろよ、とセルフツッコミ。

 hiki/util.rb: Hiki::Util#compare_by_line_word

-          before_change = Document.new(line[1].to_s,
+          before_change = Document.new(line[1].join(''),
                                       doc1.encoding, doc1.eol)
-          after_change  = Document.new(line[2].to_s,
+          after_change  = Document.new(line[2].join(''),
                                       doc2.encoding, doc2.eol)

 hiki/docdiff/view.rb: View#apply_style

       if block_given?
-        source = yield block[1].to_s
-        target = yield block[2].to_s
+        source = yield block[1].to_a.join ''
+        target = yield block[2].to_a.join ''
       else
-        source = block[1].to_s
-        target = block[2].to_s
+        source = block[1].to_a.join ''
+        target = block[2].to_a.join ''
       end

block[i]は nilの可能性があるので to_a.join

 hiki/docdiff/view.rb: View#apply_style_digest

       if block_given?
-        source = yield entry[1].to_s
-        target = yield entry[2].to_s
+        source = yield entry[1].to_a.join ''
+        target = yield entry[2].to_a.join ''
       else
-        source = entry[1].to_s
-        target = entry[2].to_s
+        source = entry[1].to_a.join ''
+        target = entry[2].to_a.join ''
         end
       if  i == 0
         context_pre  = ""  # no pre context for the first entry
       else
-        context_pre  = @difference[i-1][1].to_s.scan(context_pre_pat).to_s
+        context_pre  = @difference[i-1][1].to_a.join('').scan(context_pre_pat).to_s
       end
       if (i + 1) == @difference.size
         context_post = ""  # no post context for the last entry
       else
-        context_post = @difference[i+1][1].to_s.scan(context_post_pat).to_s
+        context_post = @difference[i+1][1].to_a.join('').scan(context_post_pat).to_s
       end

 hiki/docdiff/view.rb: View#source_lines

   def source_lines()
     if @source_lines == nil
-      @source_lines = @difference.collect{|entry| entry[1]}.join.scan_lines(@eol)
+      @source_lines = @difference.collect{|entry| entry[1]}.join(nil).scan_lines(@eol)

 hiki/docdiff/view.rb: View#target_lines

   def target_lines()
     if @target_lines == nil
-      @target_lines = @difference.collect{|entry| entry[2]}.join.scan_lines(@eol)
+      @target_lines = @difference.collect{|entry| entry[2]}.join(nil).scan_lines(@eol)

[Hiki]セキュリティエラー続発

Hikiの設置が一段落したようなのでページの編集に取りかかる。が、こちらもすんなりとはいかない。プラグイン記法でできることが著しく制限されているのだ。

tDiaryは日記の著者を信用している(自分の日記を壊そうとする者はいないので。著者!=管理者となるレンタルサービスでは話が違って、セキュアモードでシステムを守る必要があるが)のに対し、Hikiはページ編集者を全く信用することができない。誰でも書き込めるのが Wikiだから。

そんなわけでセキュリティエラーが続発中。プラグイン記法で許されるのは単一のプラグイン呼び出しだけ。任意の文字列を埋め込むことも、プラグイン呼び出しを連ねることも、Rubyであれやこれやをすることもできない。全てをプラグインの中に閉じこめてしまい、Hikiページではそれを呼び出すしかないわけだ。(プラグインは Hikiの設置者が責任を持っているので信用されている)

{{CGI::escapeHTML @hoge.inspect}}

どころか

 {{CGI::escapeHTML '<abc>'}}

ですら通らないんだから。いやはや全く。

 いやいやいやいや

SecurityError (Insecure: can't intern tainted string)

これは Ruby 1.9.0に固有のエラーじゃまいか。だったら Hikiの方をちょこっと変更してもいいんじゃないか?

[Hiki][Ruby]プラグイン記法

 {{hoge a b 5}}      #=> hoge('a', 'b', 5)
 {{hoge 'a' b(5)}}   #=> hoge('a', 'b', 5)
 {{hoge ,a(, b)(5)}} #=> hoge('a', 'b', 5)
 {{hoge, a, b, 5}}   #=> PluginException('not plugin method: hoge,')
 {{hoge; hage}}      #=> PluginException

文法の緩さとか、一つのメソッドしか呼べないとか、嫌すぎる。

そりゃあ Rubyで

require digest/md5

という風にライブラリ名をクォーテーションで括らずに書けたら楽だなとかは考えるし、Symbolが Stringのサブクラスになったときは

require :sqlite3

が通るのを一番に確認したけど、

defined? printf
alias printg printf

を見て、

  • printfって何?クラスは?
  • printgと printfの間にカンマがないけどどういう文法? alias専用ルール?

というのと同種の嫌悪を感じる。


2007年01月11日 (木)


2007年01月09日 (火)

[BAD BOY]少し冷静になって考える

  • どの道のどの部分を走るか
  • どこに保管するか

車を運転することもある今では、以前みたいに自分の安全を車のドライバー任せにしてしまうことの迷惑さにも頼りなさにも無自覚ではいられない。(無法な運転は怖くてできない。自分にとってもドライバーにとっても怖い)

十分な広さのない歩道は走れないし、かといって車道にも十分な広さがないと身の危険か後続のイライラを感じることになるだろうし。

いざ自転車に乗ろうと思うと走る場所に困る。


2007年01月08日 (月) 成人の日。昔より一週間も早い。海の日をハッピーマンデーの対象にしたのは間違い。あれは 20日、夏休みの始まる前の日であることに意味があったのだから。

[]手袋

スノーボード用の手袋。ボードはやらないが、柔らかいのでスキーにもバイクに乗るときにも使う。

3、4年前に買った手袋が昨日ダメになったための予定外の出費。

インナーとアウターの分かれてない防水手袋は、乱暴に脱いでインナーの指先が裏返ったら終わりなのねん。指先の粘着テープと防水シートが絡んで団子になってもう指が通らない。

[BAD BOY] 買う。今年は買う。

DR250Rを買ったのが 2003年の 5月か 6月。その少し前の 4月か 5月にヤフオクで今乗ってる DRを見つけるまで悩んでたのが、DJEBELを買うか BAD BOYを買うか。(DJEBELは DR250Rの兄弟車で、主なところではタンクの容量とライトが違う)

DRを買ったので BAD BOYを買うお金はなくなったが今なら買える。問題は保管場所と乗る機会。人間は楽な方に流れていきますので、機会が確保できるかどうか。ガソリン高と運動不足が背中を押してくれるはず。なのだが、運動しないからと体脂肪が増えてるわけでもなく*、実のところどちらもあまり気にしていない。どうなる?

もうひとつ購入をためらわせるのが BAD BOYの人気。近所では見たことないのが救い。

自分の持ってる iPodは三世代目だが、当時はまだ猫も杓子も iPodという雰囲気ではなかった、ように思う。仮に今 iPodを持っていなくて携帯音楽プレーヤーを探しているとしたら、iPodを除外して良さそうなのを探した上でやっぱり iPodを買うと思う。バッテリーの保ち以外に勝るものが他のには無いからね。

なんだやっぱり iPodを選ぶんじゃないかと、書いて気付いたので迷わず BAD BOYを買ってこようと思います。BAD BOYの代わりは存在しないので。

* そのからくりは、昔から生活に運動が組み込まれていなくて、運動しないのが常態だからです。