例えばこんな、<h1>の中身を<title>の中身と同じにし、かつ日記名部分をトップページへのリンクにする、ヘッダはエラーになる。
<h1> <a href="<%=h @conf.index%>"><%=@conf.html_title%></a> <%=title_tag[/\A<title>#{Regexp.quote h @conf.html_title}(.*?)<\/title>\z/oi, 1]%> </h1>
原因は
#{Regexp.quote h @conf.html_title}
この部分が tdiary.conf読み込み時に展開されてしまうから。
結局
#{'#'}{Regexp.quote h @conf.html_title}
こうなった。
1と 2のコンボで、ヘッダ/フッダに限らず全ての設定が変更できなくなる。他の設定を保存するときでも、ヘッダの保存部分で失敗するから。(結局 tdiary.confの可読性を犠牲にして String#dumpを使用するしかないようだ)
嫌い*だが tDiary本体をいじくるぐらいならしかたがない。今回のケースは結局 #{} を使わない形に書き換えた。無理矢理使っても面倒なだけだったので……。敗北。
<h1> <a href="<%=h @conf.index%>"><%=@conf.html_title%></a> <%=title_tag[Regexp.new('\\A<title>'+Regexp.quote(h( @conf.html_title))+'(.*?)</title>\\z', Regexp::IGNORECASE), 1]%> </h1>
* Regexp.new()のこと。eval()や new Function()と同じくらい嫌い。※new演算子があるのは Rubyではない。
ささいなことなのでここに書くわけだけど、HikiDocと tDiaryの許容する urlの違いから、tDiary同梱の hikidoc.rbの fix_url()が継ぎを当てられた結果、難解なことになっている。
if /:/ =~ uri and %r!\A(https?|ftp|file|mailto):! !~ uri uri elsif %r|://| !~ uri and /\Amailto:/ !~ uri uri.sub(/\A\w+:/, "") else uri end
uri.sub(/\A(?:https?|ftp|file):(?!\/\/)/, "")
上が 2008-03-04現在のコード。下は上と同じ意味になっていると思うが自信が持てない。それもひとえに前者が難解だから……。
下の方のコードはほとんど hikidoc.rb(revision 93, 2008-02-16)のものだ。これを目にしていなかったはずがない。
昨日(3日)の朝に、tDiary本体に migrate機能を付けたと読んだので、一日待って、今日アップデートしたのだけど、tarballは 2日のものだったみたい。(待った意味がない)
どこかから拾ってきたプラグイン以外は、tDiaryを最新のものにして migrate.rbを実行するだけでいいみたい。
カテゴリキャッシュも、プラグインが(confに)保存したデータも、古いキャッシュも migrate.rbが面倒を見てくれる。
最終更新: 2010-03-22T05:44+0900
著者は ActiveScriptRubyの arton氏。
この本が出た当時、Mysterious SyndromeWindows Scripting Host Laboratoryの管理人むたぐち氏が、言語は Rubyであるが、COMや WSHの話題は VBScriptや JScriptと共通だし、他にこんなに突っ込んだ類書もないので、と(言葉と内容は全然違うが)自身の掲示板でおすすめされていたのをずっと覚えている。
タイミングを逸していただけなのだ。
Rubyの名前を初めて目にしたのもこの時だったかもしれない。(「何か」(当時)の名前を目にしたのもこの掲示板が……。美耳いいよね)
あくまで目にしていただけで、初めての CGIプログラムはサンプルの多い Perlで書いたし、すぐに嫌気がさして代わりの言語を探したときに Rubyを"再"発見している。そのときに、WSHに親しんでいたことと ActiveScriptRubyの存在が Ruby採用のきっかけになった、というのは多分にありそう。
思い出深い一冊ということ。この本を通して、気付かないまま Rubyとすれ違っていたのだから。
暴風ガールズファイトの 3巻は出ない。
いったいファミ通編集部は何を考えているのか。
『暴風ガールズファイト』を読んでいないラノベ読者は何を読んでいるのか。
今や読むのが楽しみなラノベとして "文学少女"シリーズと双璧をなすシリーズだったというのに。
理由がわからない。前回の失敗から今日までに、該当しそうな* Windows Updateはないし。
その期間にあったことといえば、再起動時にディスクチェックを強く薦められて
One of your disks needs to be checked for consistency. You may cancel the disk check, but it is strongly recommended that you continue.
Windows will now check the disk.
結果、いくつかのエラーが訂正されたこと。
CHKDSK is recovering lost files.
Correcting errors in the master file table's (MFT) BITMAP attribute.
Correcting errors in the Volume Bitmap.
Windows has made corrections to the file system.
これしかないという気はするが、バックアップが失敗していたのは去年の二月に Vistaをインストールした当初からで、chkdskも今までに何度か実行している。最近になってエラーが発生して訂正されたことがバックアップ成功の理由?
* こういう素人判断が原因の見落としにつながるのだ、と思われる前に書いておくと、「Definition Update for Windows Defender」が 2/22と 2/28にインストールされただけ。
http://sho.tdiary.net/20080222.html#p01
ここで W31SAと D705iμの例が出ていたので、にっくき(笑)ソニーエリクソンではどうなっているのかを紹介。
補足など。
split()の第一パラメータ separatorが空文字列にマッチするかどうかで結果が異なる。
"".split(" ").length; // 1 (空文字列にマッチしないから) "".split("").length; // 0 (空文字列にマッチするので) "".split(/\s+/).length; // 1 (空文字列にマッチしないから) "".split(/^$|\s+/).length; // 0 (空文字列にマッチするので) function getClasses(element) { return element.className.split(/^$|\s+/); }
上の functionでは classNameが空っぽの時には空文字列の要素を作らないが、頭や尻尾に空白が付いていると空文字列の要素が残る (IEを除いて)。事前にトリミングする手間をかけるくらいなら一個二個の空文字列を気にせず(だけど連続する空文字列の要素は気にしてる) className.split(/\s+/) とする方が好みだな。
IE7と Firefox2で異なる。Firefox2の方が正しいが無限ループに陥りやすい。
var re = /\b/g; // 単語境界にマッチする、幅0のメタ文字。 var str = "012 456 89A"; re.lastIndex = 0; for(var i = 0; i !== 5; ++i) { alert("("+ re.exec(str).index +","+ re.lastIndex +")"); // IE7: (0,1) (3,4) (4,5) (7,8) (8,9) ... // Fx2: (0,0) (0,0) (0,0) (0,0) (0,0) ... }
空文字列にマッチしていれば(IE7でスキップされるマッチがでてくる) exec()の前後で lastIndexの値が変わっていなければ(Fx2でのマッチ回数が IE7より増える) indexと lastIndexが同じならば lastIndexを 1インクリメント、としておくとどちらでも間違いが起こらない。
var re = /\b/g; var str = "012 456 89A"; re.lastIndex = 0; for(var i = 0; i !== 5; ++i) { var index = re.exec(str).index; alert("("+ index +","+ re.lastIndex +")"); // IE7: (0,1) (3,4) (4,5) (7,8) (8,9) ... // Fx2: (0,0) (3,3) (4,4) (7,7) (8,8) ... if(index === re.lastIndex) { ++re.lastIndex; } }
ループで
if(index === re.lastIndex) { ++re.lastIndex; }
なんて分岐を増やすより、文字列末尾にマッチする /$/ を例外として*、正規表現から空文字列にマッチする可能性を排除する方が良さそう。
* /$/.exec("str") の後の lastIndexプロパティは IE7、Fx2とも、最後の文字の次を指す。