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もなかなかわかっているではないかと評価している。
ふーべーんー。
でも、この設定項目はどういう意味だろうか、というときにヘルプを開く手段(右クリック OR ヘルプボタン)が用意されていないことが目立つ。
コンソールIMEのモードを「半A 無」から変更できない。しらみつぶしにキーの組み合わせを試してみたというのに。
ATOK 2007を入れたら(入れたからかはわからない)、入力できるようになっていた。
驚いた。Firefoxでブラウズ中に普通のサイトでどせいさんフォントが表示されたから。
そのサイトは font-familyとして fantasyを指定していた。自分はどせいさんフォントをインストールしていた。でも Firefoxが fantasyと cursiveなフォントとして どせいさん を選んだ理由がわからぬ。そんな設定項目があっただろうか。(フォントにそういうメタデータが含まれているのだろうか。プロポーショナルか等幅かをプログラムが見分けられる(はず)のだから不思議はないか)
SetPointが参照する xmlファイルだとか、Apacheの httpd.confだとか、LHMeltの設定だとか、Program Filesや ProgramDataにあるファイルだけだと思いたいがプログラムとエディタが別のファイルを見ているんじゃないかと思われることがある。試しにファイルを削除してみるとファイルがないとプログラムがいうので同じファイルを読んでいることは確かめられる。ストリームを使っているのだろうか。いったんファイルをデスクトップにコピーしてから開いてみるとプログラムが読んでいた内容がエディタにも表示される。そのままエディタで編集して元の場所に移動するとエディタで編集した内容がプログラムにも反映される。
なんなんだこのわけのわからなさは。ユーザーを赤ん坊か何かだと思ってバカにしすぎじゃないか。ユーザー不在のまま小利口なことはしてくれなくて結構。
イベントビューアに UAC-FileVirtualizationというカテゴリがある。ログを眺めたところ、上で挙げたファイルは仮想ファイルだとか遅延仮想ファイルというものであるらしい。これの目的と実装が知りたい。
権限をもたないユーザー(に実行されたプログラム)が 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ってフォルダを作ってここにインストールすることにしてましたよ。
からくりがわかれば対処もできるけど、プログラムと一緒に自分も騙されてたことに腹が立つ。
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%以上のバックアップは成功する気がするが。
最終更新: 2011-01-06T02:34+0900
マイコンピュータを右クリックしてプロパティを選び、 システムの評価値などが表示される 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のように保護の必要な場所に置くことはできないということだろう。
ダブルクリックも覚束なかった高校三年生のときに Windows98を触ってすぐにのめり込んだのが folder.httの編集。 Windows2000以降は大幅に制限されてしまったが、Windows98では自由にいじってくれという雰囲気があった。
folder.httの編集で HTMLと JScriptを覚えたのだ。
廃れてしまったフォルダのカスタマイズの代わりになる手軽なおもちゃがガジェット。 これは HTMLと JScriptと CSSと XMLから成っている。
ミュート、音量↓、音量↑
に対応するキーボードショートカットが
F8、F9、F10
から
F7、F8、F9
に変更されているような。わけのわからないことをする。
あと mplayer2.exeがなくなってるのに今気付いた。既に XPの入ってたハードディスクはフォーマットして再利用してしまったよ。
(追記) 残っていた。けれど なんとか.ocx に DllなんとかW エントリポイントが存在しないというエラーになる。なんとか.ocxというのが mplayer2.exeの実体でこれが Vistaになって互換性のないものに置き換わってしまった、とか?
http://windowsvista.ms/index.php?%A5%B3%A5%E1%A5%F3%A5%C8%2Fgame
に書かれているように周りのプログラムが ntdll.dllや npggNT.des絡みで落ちる。update.cln(パンヤのアップデートプログラム?)も落ちる。
ゲームはそのまま続けられたり、化けたエラーメッセージを表示して終了したりする。
原因はユーザーにとって一利も存在しない nProtectだろうねえ。一度は nProtectのスキャンが普通に進行してログインまでいったが、大概の場合、nProtectのプログレスバーは一瞬で消えて、その後周りのプログラムが大量死する。その時パンヤ本体も一緒に終了するかどうかは運次第。
ウィンドウ下部の詳細ペインの中の、リストビューの選択状況に応じて更新される、ファイル名、種類、サイズ、更新日時などの動的に変化する文字列部分をクリックしてもウィンドウが前面に移動してこない。きもちわるい。
サイドバーを常に最前面にするほどディスプレイの横幅が余ってるわけではないのでこのショートカットはよく使うだろう。MSもそう思ったからスペースキーを割り当てたのだろう。
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にも対応してるしね)
正式版が存在しないので試せる選択肢は以下の二つ。
実際に採ったのは先の URLからダウンロードした、Vista x64 RTMに収められているドライバと「LEGACY」な nForce4向けに修正された infファイルという選択肢。「LEGACY」とはいえ SATA Onlyで RAIDを構築していたのでこの手が使える。記述を信頼するならドライバは正式なものだし安心できる。
現在は「ディスク ドライブ」として「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ではできないのねん。
beta2も RC1もインストールしたが、毎日使うものなだけに自転車のブレーキレバーの角度のようにちょっとした違いが気になって仕方がない。
不都合な点にはひとまず目をつむって Vistaに期待していることは
なぜだろう。全てエクスプローラの問題だ。
Vistaに移行するついでに 64ビットにも移行することにした。OSのインストール自体は簡単に終わったが 64ビットVista向けのドライバが見つからない。
SN25P(ベアボーン)の発売元の Shuttleが特設ページで Vista用のサウンドドライバをダウンロードできるようにしているが SN25Pのは 32bit版しかない。チップの製造元の VIAのサイトをのぞいてみたがこちらも 32bit Vista用ドライバしか出ていない。
SN25Pは Socket939で CPUが Athlon64だから Shuttleは以前から 32ビット版と 64ビット版の Audio、RAID、Chipsetドライバを用意していた。この、64ビット版 XP向けと思われるオーディオドライバを互換モードでインストールしたら音はなるようになったがコンパネアプリが起動しないので設定の変更ができない。
nVidiaが Vista向けの nForce4ドライバを Beta2と RC1向けにしか出していない。待ってたら出るのだろうか。Vista向けの正式版ドライバは nForce3のしか出ていないようだけど。
1月30日付けで新しいドライバディスクがダウンロード可能になっていて Vista用のドライバも収録されているがこれが 32ビット版のみ。
OEM元の Ralinkのサイトから RT2500の 32ビット版と64ビット版のドライバが一緒に収められたインストーラをダウンロードしてインストール。製品を挿してくれというメッセージのあと散々待たされて一応完了するのだけどまだ使えないみたい。デバイスマネージャからドライバの更新を選んで互換性のあるドライバをコンピュータ内から探して「BUFFALO WLI-U2-KG54 Wireless LAN Adapter」を選んでインストールすると使えるようになる。
せっかくの多ボタンとチルトホイールを生かすためには SetPointが必要。1月29日に 32ビットと64ビットそれぞれの Vista向けの SetPointがリリースされていた。
アプリケーションは 32ビット版をインストールしてもそのまま動く。x86-64の名前が示す通り。dllと exeで32/64ビット版が混在することはできないらしいのでそこらだけ注意すれば良さそう。レンダリングエンジンを GeckoとIEで切り替える Firefoxの拡張があるけど IEが 64ビット版で Firefoxが 32ビット版だから無理とか?
64ビットXPの対応状況を見ると 64ビットアプリの文字入力には使えないような。ATOK 2007は 32/64ビット Vista両対応だって。
活字が語る内容は全て真実だと思っていた。言葉には(唯一絶対の, 定められた)正しい意味があり、それを載せているのが辞書だと思っていた。なんとなれば本や辞書が作られる過程が全く想像できなかったのと見た目の精確さからそういう勘違いをしてしまったのだろう。今だって体裁の整った HTMLメールは企業からのメールだと思いがちで、フィッシングメールではないかと疑うのを忘れてしまいそうになる。
子供には「不思議なこと」が存在しない、というのもある。『ソフィーの世界』の、キッチンで宙に浮かぶママ、というのがそういう話ではなかったか。
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! は同じものだと思っていたが。
'%04d-%02d-%02d'%[2007,12,12] => "2007-12-12"
String#% が呼ばれてるんだよ。
PS1用のコントローラーの DUALSHOCKが、PS2のゲームでも使えることがあるらしい(DUALSHOCK2の機能を使ってない場合?)ので差してみた。
メニューを開く早さが体感 3割増。反応がもっさりしてたのはコントローラーが一因だった。セレクトで地図を開くとき以外*のあらゆる場面でゲームが高速化したみたいにサクサク操作できる。
こちらのとり得る選択肢が充実してきて、強敵に為す術がないということはなくなった。ヘイスト、バブル、ブレイブ、魔防破壊、バーサクなどなど。
ガンビットもそこそこ充実してきて単体で有効な条件だけでなく、一連の条件を設定することも可能になってきた。とはいえ未だにポイゾナもボキャルも自動化できないのは納得できないけど!
覇王の剣をとった後あたりからハマっている。以下に挙げる条件は序盤から変わってないのだけど技や魔法やガンビットや最大MPが充実して行動の幅が広がってきて、「なんとかなる」ことが多くなったのが大きい。
なんといっても、プレイヤーが常に複数の目的を持っているというのが良い。どのモブ、どのボスを倒しに行くのか、どのダンジョンを探索するのか、あるいはストーリーを進めるのか。これらの行動を制限するものは自身の強さのみ。初めて訪れる場所というのは一撃二撃で瀕死にされることもままある。そういうときは一体ずつ集中攻撃して経験値を稼いだり、すこし戻って雑魚狩りで LPを稼いでライセンスを充実させたり、あるいはストーリーを進めて装備を充実させたり。自身の強さと相談して再挑戦する時期を決めるのはプレイヤー自身。そういう自由がある。少し無理をしてぎりぎりの戦闘をこなすのも自由。久しぶりにゲームをしていると感じられる RPG。楽しい。
* セレクトとスタートに関しては DUALSHOCKと DUALSHOCK2に違いはなく、どちらもダメ。どれだけ奥まで押し込ませようとするのだ。ボタンの物理的なフィードバックと電気的なオンオフとの間にズレがあるから違和感を与えるのだよ
二年近くの長い沈黙を破って 2007-01-13にリリースされていた。
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で実現していた。
臭う、臭うぞ。でもここまで。そのうち直るでしょ。
Hikiにはデフォルトで adminという名前の管理ユーザーが一人。Hikiをインストールして FrontPageを表示したら、まず管理者のパスワードを設定するよう促される。
管理画面で edit_user.rbプラグインを有効にするとユーザー名とパスワードの組をいくつでも追加でき、ページの編集を登録ユーザーだけに許すということもできる。必ずしも編集権を登録ユーザーのみに制限する必要はない。
パスワードはなし。名を名乗るだけでなれる。ただし登録ユーザーと同じ名は名乗れない。
掲示板に書き込むときに名前を書くように Wikiを編集するときにも名前を入力できたらな、と思ったので。
パスワード無しの単なる自称なのでなりすましもできるし、しょうもないコメントを(ユーザー名として)入力することもできるけど、貢献してくれた人に名無しでいることを強要するのは間違い。ペンネームでもなんでも名乗る自由と匿名でいる自由が与えられていいと思う。善意の第三者の協力を期待するのなら。
まずローカルで試してからアップロードしたのだがローカルの Apacheが Ruby-1.9.0を呼ぶので、FrontPageの表示からログインまでを可能にするために加えた変更点のリストをメモしておく。
- instance_variables.each do |v| + instance_variables.each do |v| v = v.to_s;
vにシンボルが渡されて、次の行で v.sub!したときにエラーになっていた。
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)] としていたので同じように配列にした。
- Digest::MD5::new( s || '' ).hexdigest + Digest::MD5::hexdigest( s || '' )
リファレンスマニュアルには Digest::MD5.new([str]) とあるが引数の数が 0でないと叱られる。
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の使用は不適切か。
上のエントリで FrontPageの表示とログインまでやったが、差分の表示もおかしかったので Array#to_s らしき部分を join('') に書き換えまくったら直った模様。
'string'.join は存在しなかったので、書き換えてエラーにならないということは考えたとおり Array#to_sだったか、そのコードが実行されてなくて発覚してないが実は間違いだった(実行されたらNoMethodErrorになる)かのどちらか ^_^; こういう実行してみないとわからないところは javascriptと同じでレアなコードパスのデバッグを難しくするね。
以下、リスト。
+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を返すようになった対策。
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
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)か統一しろよ、とセルフツッコミ。
- 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)
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
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
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)
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の設置が一段落したようなのでページの編集に取りかかる。が、こちらもすんなりとはいかない。プラグイン記法でできることが著しく制限されているのだ。
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の方をちょこっと変更してもいいんじゃないか?
{{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
を見て、
というのと同種の嫌悪を感じる。