/ 最近 .rdf 追記 設定 本棚

脳log[2008-03-06~]



2008年03月06日 (木) 一日遅れで HUNTER×HUNTERの発売に気付く。考えられないミス。

[tDiary]バッドノウハウ: ヘッダ/フッタに #{} を含めたいときは

例えばこんな、<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読み込み時に展開されてしまうから。

  1. \を使ってエスケープしても \自体が tdiary.conf保存時にエスケープされてしまっているので、tdiary.conf読み込み時にはエスケープの意味が残っていない。
  2. 二度 eRubyスクリプトとして評価されるわけではないので <%%= %> も使えない。

結局

 #{'#'}{Regexp.quote h @conf.html_title}

こうなった。

  1. 設定画面に表示されるヘッダの内容は、#{'#'} が # に展開された後のもの(つまり最初の例と全く同じもの)なので、ヘッダを修正するときは毎回 #{ を #{'#'}{ に書き換えた上で保存する必要がある。(面倒。絶対忘れる)
  2. ヘッダの内容に問題があるときは、正常に送信できたように見えて tdiary.confには保存されていないから、(忘れた頃に)絶対ハマる。
  3.  追記

    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ではない。


2008年03月05日 (水) 奥付のコピーライト表記は著作権者が自由にできるものなのか? ほとんどがローマ字なのでここで読みを調べることが多いのだけど、米澤穂信は漢字そのままだった。森博嗣が MORI Hiroshiだったのは 2008-02-26に書いたが、筒井康隆と清原なつのは ©Mei SEI形式だった。(『家族八景』。ただしこれは出版社が角川だからという可能性が高い)。tDiary-devel MLでは姓と名らしきものに分かれてる人のほとんどが SEI Mei形式だったことに遅ればせながら気付きました。


2008年03月04日 (火) 現在 9F。火トカゲを倒す必要がないことにしばらく気付かなかったよ。

[tDiary] fix_url() @ hikidoc.rb

ささいなことなのでここに書くわけだけど、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現在のコード。下は上と同じ意味になっていると思うが自信が持てない。それもひとえに前者が難解だから……。

 追記@2008-06-06: 何か勘違いしてるな

下の方のコードはほとんど hikidoc.rb(revision 93, 2008-02-16)のものだ。これを目にしていなかったはずがない。

[tDiary] tDiary UTF-8化

昨日(3日)の朝に、tDiary本体に migrate機能を付けたと読んだので、一日待って、今日アップデートしたのだけど、tarballは 2日のものだったみたい。(待った意味がない)

  1. いつも通りローカルの変更をマージ。
  2. 標準添付でない jdate.rbを UTF-8で保存し直し。
  3. tdiary.confを UTF-8で保存し直し。(しなくても動いているがコメントが悪さをしないとも限らない?)
  4. キャッシュ(yyyymm.rb, yyyymm.parser)を削除。(したけど migrate.rbが消してくれるみたい)
  5. misc/migrate.rbを index.rbフォルダに移動して実行。

どこかから拾ってきたプラグイン以外は、tDiaryを最新のものにして migrate.rbを実行するだけでいいみたい。

カテゴリキャッシュも、プラグインが(confに)保存したデータも、古いキャッシュも migrate.rbが面倒を見てくれる。

最終更新: 2010-03-22T05:44+0900

[][][Ruby][単行本] arton【Rubyを256倍使うための本 邪道編】 アスキー

著者は ActiveScriptRubyの arton氏。

この本が出た当時、Mysterious SyndromeWindows Scripting Host Laboratoryの管理人むたぐち氏が、言語は Rubyであるが、COMや WSHの話題は VBScriptや JScriptと共通だし、他にこんなに突っ込んだ類書もないので、と(言葉と内容は全然違うが)自身の掲示板でおすすめされていたのをずっと覚えている。

タイミングを逸していただけなのだ。

Rubyの名前を初めて目にしたのもこの時だったかもしれない。(「何か」(当時)の名前を目にしたのもこの掲示板が……。美耳いいよね)

あくまで目にしていただけで、初めての CGIプログラムはサンプルの多い Perlで書いたし、すぐに嫌気がさして代わりの言語を探したときに Rubyを"再"発見している。そのときに、WSHに親しんでいたことと ActiveScriptRubyの存在が Ruby採用のきっかけになった、というのは多分にありそう。

思い出深い一冊ということ。この本を通して、気付かないまま Rubyとすれ違っていたのだから。


2008年03月03日 (月) (タップするとクリックになる)タッチパッドは文字入力の敵。右の拇指球が頻繁に当たってフォーカスを移動させてしまう。パッドの位置が若干左寄りなのは認めるが、中心が Hと Jの間にあるようではまだまだ > DELLノート。そもそもトラックボールであれば……(パッドに完全に駆逐されてしまったよね。トラックポイントだけがねばってるが)。大体どれだけのフェザータッチを要求するんだ。ポインタを移動させるときだって毎度毎度……。(実験中)。タップの認識は強さでなく離す早さに依っている様子。そんな発想はなかった。(そのことからも)この認識方法はベストではない。


2008年03月02日 (日) 結城さんの『数学ガール』が日坂水柯(めがねのひと)の作画でマンガ化。どうだろう。"ガール"の部分はいいとして、"数学"の部分も満足させてくれるだろうか。


2008年02月29日 (金) 地図が不完全だからと街へ入らせてくれない一階の衛士。「あんた、鬼や」「殺意を感じたで」

> ささはら雑記 : いいお知らせと残念なお知らせ

暴風ガールズファイトの 3巻は出ない

いったいファミ通編集部は何を考えているのか。

『暴風ガールズファイト』を読んでいないラノベ読者は何を読んでいるのか。

今や読むのが楽しみなラノベとして "文学少女"シリーズと双璧をなすシリーズだったというのに。


2008年02月27日 (水) Amazonから Edy 1000円分。メールで「当選」とか目にしても「結局、金払わされるんじゃ」としか思えない罠

[Vista]定期バックアップが初めて正常に終了した

理由がわからない。前回の失敗から今日までに、該当しそうな* 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にインストールされただけ。


2008年02月26日 (火) 名前をローマ字表記にするときに、アルファベットを使う特定の国の慣習に従って姓と名をひっくり返す必要はないと思っていた。大文字を使うことで姓を示す方法を知った。ふと手元の本の奥付を見たら著者のローマ字表記が SEI Meiになっていて、「お、さっそく」「すでに普及しているのか」と思った。出版社は中央公論新社だが著者は森博嗣。……。著者が要望を出した特殊例だった、に 100ガバス。


2008年02月25日 (月) Firebugのプロファイラの時間分解能は Windowsに依存する。普段は 15ms単位だが音楽を再生しながらだと 1ms単位になる。これに関係する話を「NyaRuRuの日記」だったかどこかで読んだ記憶がある。見つけた > http://d.hatena.ne.jp/NyaRuRu/20080123/p1


2008年02月24日 (日)

[W53S] W53Sで、受信したメールの本文をコピーするときは 5ステップ

http://sho.tdiary.net/20080222.html#p01

ここで W31SAと D705iμの例が出ていたので、にっくき(笑)ソニーエリクソンではどうなっているのかを紹介。

  1. メニュー
  2. [7] 本文コピー
  3. (始点を選択)センターキー
  4. (終点を選択)センターキー
  5. 「コピーしました」(タイムアウト付きメッセージ。せっかちな人はセンターキーかクリアキー)

補足など。

  • 送信メールじゃないので切り取りはできません。
  • (始点を選択)、(終点を選択)というのは画面下部のステータスバーに当たる部分に表示されているメッセージ。(ちなみにタイトルバーには「範囲選択」)
  • D705iμで問題にされているタイムアウト付きメッセージは W53Sにも一か所ありました。
  • W31SA < メールの内容をコピーしたい人に対していきなり「範囲指定」を選ばせるのは直観的でないと思う。**4

* 機種でそのように統一されてるだろうから、二回目からはすぐにわかるだろうけど。

 最後にコピーか切り取りかを選ばせることで他の二機種にある「コピーしました」のメッセージが省けている。

 最初のとまどいよりそれ以降の使い勝手の方がずっと大事。

*4 ということは、やっぱり優秀なのか?


2008年02月22日 (金) DSの FF4は敵が強いらしい。キャラに声があるらしい。初めてプレイした FFであり、パラディンになったあたりで中断してしまってもいるので非常に気になる。セガハードに縁がなかったので、PS2で昨日発売になったナイツとか、ゲームが豊作


2008年02月21日 (木) エクスプローラはバカだエクスプローラはバカだエクスプローラはバカだ。desktop.iniは目障りな上に役に立っていない。(C:\Windowsが音楽フォルダって何? 実体のないフォルダ(マイコンピュータ、ごみ箱、デスクトップ、ユーザー)の表示設定も保存して)

[javascript] JavaScriptの、空文字列にまつわる微妙な点 (String.split(), RegExp.lastIndex)

 空文字列を split()

split()の第一パラメータ separatorが空文字列にマッチするかどうかで結果が異なる。

"".split(" ").length;      // 1 (空文字列にマッチしないから)
"".split("").length;       // 0 (空文字列にマッチするので)
"".split(/\s+/).length;    // 1 (空文字列にマッチしないから)
"".split(/^$|\s+/).length; // 0 (空文字列にマッチするので)

function getClasses(element) {
  return element.className.split(/^$|\s+/);
}
 追記@2008-05-28: 空白で始まったり空白で終わるときのことを考えていなかった。

上の functionでは classNameが空っぽの時には空文字列の要素を作らないが、頭や尻尾に空白が付いていると空文字列の要素が残る (IEを除いて)。事前にトリミングする手間をかけるくらいなら一個二個の空文字列を気にせず(だけど連続する空文字列の要素は気にしてる) className.split(/\s+/) とする方が好みだな。

 空文字列にマッチした後の lastIndex

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とも、最後の文字の次を指す。


2008年02月20日 (水) [世界樹の迷宮] 29F到達。全然龍を倒せる気がしないのにレベルは上限の 70。むむむむむ……。明日発売のⅡはまだ不要。