/ 最近 .rdf 追記 設定 本棚

脳log[2007-02-09~]



2007年02月09日 (金)

[Vista]メモリ

物理メモリは 512MB+512MBの 1GB。ページファイルのサイズを 0にするとログオンして間もなく新しいプログラムを起動できなくなり、既に起動しているプログラムもやがてメモリ不足でにっちもさっちも行かなくなりフリーズした。起動するプログラムを慎重に選択すればなんとかなるかもしれないし、Vistaのインストール直後に行った環境設定などはページファイル無しで行った。今思えばボタンが反応しないことが多々あった。あれはメモリ不足で新しいプロセスを作成できなかったのだなあ。

ページファイルを初期値1G、最大2Gにしてミュージックプレーヤーとメーラーとエディタとブラウザを起動していると物理ファイルは常に底をつきページファイルが 1100MB。メモリを 1GB+1GBにしたとしても安心できない。*

プロセス数が 64。XPのときは 30前後だったから倍に。自分の名前で起動しているものが 22だからサービスが 40くらい。ここから不必要なサービスをどれだけ止められるのか楽しみ。

* 2007-02-21 追記: タスクマネージャで ページファイル 1100M / 3024M と表示されていたら 100MB程度がスワップしているということだろか。最近の表示は 1690M だから 2GBのメモリを積んだら余裕ができそう。


2007年02月08日 (木)

[] 超妹大戦シスマゲドン (著:古橋秀之)

二巻がもうじき出るが、一巻の宣伝ページを著者のサイトで発見。高橋メソッドだ。

http://www14.plala.or.jp/funore/tmethod/

この人のサイトはトップページに <SCRIPT>タグしか存在しないという面白いことになってて、初めて見たときは笑った。


2007年02月07日 (水)

[Vista] コマンドプロンプトにフォルダをドロップすることはできない。

XPだとダブルクォーテーション付きでパスが入力されたので cd するときに重宝していたのに。(2007-03-13 追記:Shift+右クリックで「パスとしてコピー(&A)」が現れる。埋め合わせのつもりだろうか。コピーされるパスは要不要に関わらずダブルクォーテーションで括られている)

フォルダのコンテクストメニューに Prompt Here を仕込むのはやった。*

HKEY_CURRENT_USER\Software\Classes\Folder\shell
HKEY_CURRENT_USER\Software\Classes\Folder\shell\prompt
HKEY_CURRENT_USER\Software\Classes\Folder\shell\prompt\command

フォルダオプションに「ファイルの種類」タブがなくなって、代わりにコントロールパネルの「既定のプログラム」を使って関連づけを一元管理するつもりらしい。Windows Media Player 11のオプションにも関連づけのタブはなくなっていて、インストール時に「既定のプログラム」を開くだけで済ませていた。

だけど「既定のプログラム」は openコマンドにプログラムを設定することしかできない。新しいコマンドを作成することもコマンドラインオプションを設定することもできない。

環境変数に続いてまたも regeditの出番である。

* 2007-02-08 追記: Shift+右クリックで「コマンド ウィンドウをここで開く(&W)」というメニューが出るので必要なかった。ショートカットのコンテクストメニューには「ファイルの場所を開く(&I)」「フォルダの場所を開く(&I)」というアイテムもあり、MSもなかなかわかっているではないかと評価している。

[Vista] WinHlp32.exeがない。状況依存ヘルプもない。

ふーべーんー。

 2007-03-13 追記:公開された

http://www.microsoft.com/downloads/details.aspx?FamilyID=6ebcfad9-d3f5-4365-8070-334cd175d4bb&DisplayLang=ja

でも、この設定項目はどういう意味だろうか、というときにヘルプを開く手段(右クリック OR ヘルプボタン)が用意されていないことが目立つ。

[Vista]コマンドプロンプトに日本語を入力できない

コンソールIMEのモードを「半A 無」から変更できない。しらみつぶしにキーの組み合わせを試してみたというのに。

 2007-02-21

ATOK 2007を入れたら(入れたからかはわからない)、入力できるようになっていた。

[Firefox][HTML] font-family:fantasy と font-family:cursive でどせいさんフォント

驚いた。Firefoxでブラウズ中に普通のサイトでどせいさんフォントが表示されたから。

そのサイトは font-familyとして fantasyを指定していた。自分はどせいさんフォントをインストールしていた。でも Firefoxが fantasyと cursiveなフォントとして どせいさん を選んだ理由がわからぬ。そんな設定項目があっただろうか。(フォントにそういうメタデータが含まれているのだろうか。プロポーショナルか等幅かをプログラムが見分けられる(はず)のだから不思議はないか)


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専用ルール?

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