スキャナ&パーサーだけで力尽きた…… racc css.y

ホントはアクション部分も少し書いたんだけど、どうも上手くいかないので削除って、とりあえず分離させておくことにしてみた。パーサーから構文木作るところって普通はどういう風に実装するだろう。再帰定義の部分で汚くなっちゃうんだよなぁ。スーパー簡単なサンプルが欲しい……

あーあと、Invalid なものが突っ込まれたとき、その部分を無視してパースを続ける、っていうのはどうやって書くんだろう。謎ががががが。

パースエラーは error に還元される。だから、右辺の正しい場所に error を置いとけば無視できると。CSS の ruleset を処理中にパースエラーが起きたら ruleset : error とか書いておけばそこを飛ばして次のやつを探す?みたいな? 適当にやってみよう。

error トークン書くと on_error 呼ばれないのか。なんかどういう風にエラーを処理するのかわからん。

  1. トップ
  2. web
  3. CSS/Ruby
  1. トップ
  2. prog
  3. CSS/Ruby

なんだか今度は Done までいかずに死んだらしくインデックスが壊れた (?) らしい。新しいファイルが追加されてなかった。インデックス削除したらなおった。

正確には追加されてるみたいなんだけど、検索すると別の文書がヒットする。ポインタ (?) がズレてる感じ。二回目だ……

  1. トップ
  2. web
  3. Namazu
  1. トップ
  2. soft
  3. Namazu

思いつきでごにょったら Ruby のオブジェクトとして再現できた。めでたしめでたし。んでごちゃってみたけど用途すくな。読み込むだけだからなぁ……

  1. トップ
  2. web
  3. CSS/Ruby
  1. トップ
  2. prog
  3. CSS/Ruby

何だか知らないけど 文字列から Source をそれっぽくやるハック が XREA の鯖上ではできない。uninitialized constant REXML::Parsers::TreeParser というエラーが出てしまう。ローカルだと上手くいくんだけどなぁ……意味わからん。なんでだろう?

ってまさかと思ったら site_ruby に新しい rexml が入ってた。めんどくさ……

build メソッドを Ruby デフォルトについてくるほう (の document.rb) に書き換えた。動いてるもより。これで view-image でファイルリストも RDF として渡すように。RDF to XHTML が汚いけど仕方ない。しばらくやりたくない。

  1. トップ
  2. web
  3. REXML の謎。

Ruby の elsif が嫌い。elsif 書くなら case & when 使う。なんか elsif ってソースのバランスが変。

if a =~ /foo/
# do
elsif a =~ /bar/
# do
elsif a =~ /baz/
# do
end
case
when a =~ /foo/
# do
when a =~ /bar/
# do
when a =~ /baz/
# do
end
  1. トップ
  2. prog
  3. Ruby における elsif

笑っていいとも見てたら寝てて、気付いたら6時。

変な夢を見た。茶色い変態でデブなおっさん。バレーボールが得意で厳つい数学教師。校庭に入る口実を作るためにソフトボールを投げ込む生徒。途中で海を見た気がする。あんまり覚えてない。

  1. トップ
  2. self
  3. 夢。6時間と学校

DNA をデジタル化して CD か何かに記録するサービスとかやったら面白そうなのに。どっかの研究所で。

ある意味究極の個人情報だから色々めんどくさそ。

むしろ、何かこう、適当にサンプル与えるとどんどんデジタル化する機械って作れないのかな。

  1. トップ
  2. web
  3. DNA checksum
  1. トップ
  2. life
  3. DNA checksum

ここ最近気になっていたのでちゃんと解消しておこう。基礎が出来てなきゃダメダメ。

まず重要なのは、属性にはデフォルトネームスペースが適用されないのにされると勘違いしていたこと。属性と要素では属する partition が違う。接頭辞がない属性がよくある (たとえば XHTML とか) せいで完全に勘違い。

同じように見える属性でも厳密には違う場合が存在する。見た目的には接頭辞がついている属性と、付いていない属性では差がある。

<f:foo xmlns:f="http://example.com/foo">
<f:far attr="ex"/>
<b:baz xmlns:b="http://example.com/baz">
<b:bar f:attr="ex"/>
</b:baz>
</f:foo>

この例で attr="ex"f:attr="ex" は属している名前空間は同じにも関わらず展開すると異なる。これも partition の違い。

partition には三つあって、一つは全ての要素が属するとこ。あとは属性の属する partition で、一つはグローバルな属性が属する (上の例では f:attr) とこ、もう一つは要素ごとの別々な属性が属する (上の例で attr) とこ。かなーりややこしい!

partition の種類は三つ。一つは要素が属する partition で、これは特に問題にならないでそのまんま。属性は残りの二つのどちらかに属するんだけどこれが面倒くさい。違いは名前空間にグローバルかローカルか。接頭辞をつける属性は名前空間にグローバル。接頭辞をつけない属性は要素名を経由する (ローカル)。たぶんこれは展開された名前とかを見るとわかりやすいと思う。

<f:far attr="ex"/> の attr="ex"
{http://example.com/foo}far@attr
f:far に属している attr という感じ。 far を経由して認識 (っていうのかな) される。
<b:bar f:attr="ex"/> の f:attr="ex"
{http://example.com/foo}@attr
b:bar は関係なく、名前空間 URI がそのまま属性の名前にくっつく

接頭辞をそのまま名前空間の URI に置き換える (ようは展開することなんだけど) だけでだいぶイメージしやすいと思う。

一般的な XML では (XHTML とかじゃなくて) 普通接頭辞をつけることになりそう? この辺わかってない。むしろ要素ごとに別々の意味をもつ要素を定義できるかっつうとできないような。

バカすぎるスペルミスを修正。

気になっていたことを一つ試したのでメモ。<f:foo f:attr="a1" attr="a2"/> としたときエラーになるか、ということと、実際 XPath からはどちらにもアクセスできるのかということ。結果的にはエラーにならないし、XPath からはどちらにもアクセスできる。f:foo/@f:attr = 'a1', f:foo/@attr = 'a2'

XML Schema についてで なぜ属性宣言を避けるべきか ってのがあった。これは XML 名前空間の partition を理解していればひっかかりにくい (ひっかかっても直ぐに気付ける) とこだなぁ。

  1. トップ
  2. web
  3. XML の属性の名前空間

404 : :first-letter と動的擬似クラス

そんなわけでそういう修正をしてみた。

#content .section h2:first-letter {
color: #09f;
}
#content .section h2 a:hover:after {
content: "";
line-height: 0;
}

空文字でも効果があるみたい。ようは content の指定でスタイルの指定しなおし (?) が働けばいいらしい。

line-height: 0 は何か知らないけど高さが変わって、後続するやつが全部ピコピコするのをなくすため。

関係ないけど擬似ずっと模擬って読んでいた。アフォすぎ!

  1. トップ
  2. web
  3. :first-letter & :hover on Gecko
  1. トップ
  2. soft
  3. :first-letter & :hover on Gecko

先日駅で延長コードだけひっかけられて持っていかれたので、仕方なく新しいのを買おうと思った。近くで売ってそうなところを見てみた。唯一あったとこ (ツタヤ) で 760 円だった。ぼったくりだろコレ。オス・メスプラグがそれぞれ 100円 & コード 1m で 760 円もいくわけない……ついでに今まで使っていたやつは前に買ったヘッドフォン (3k ぐらい) についてきたやつ。コードが 760 円もしたら笑える。

  1. トップ
  2. life
  3. 延長コード

C-RET 前の行でしたあとは、前の行の空白を保持してインデントする。

C-RET (C-j) で前の行のインデントを保持して改行はできるんだけど、タブとスペースが混じっている場合スペースがタブに変わっちゃうのが微妙に困る。 (自分だけで使うなら全く困らないけど、タブ幅が違う環境に持っていくと困る)

; 前の行の空白状態を保持するように。
(defun indent-relative ()
(interactive "*")
(delete-horizontal-spaces)
(insert (save-excursion
(goto-bol)
(skip-chars-backward " \t\n")
(goto-bol)
(looking-at "^[ \t]*")
(buffer-substring (match-beginning 0) (match-end 0)))))

cmds.l に定義されている indent-relative() を .xyzzy か siteinit.l で再定義。弊害あるかもしれない。

  1. トップ
  2. soft
  3. xyzzy で前の行のインデントを保持して改行する。

改変版のほうを使っているんだけど、indent-current-buffer とかでインデントしたとき異様に遅い (カーソルが動くのが見える) ……こういうものなのかな。部分的に一括してインデントしたいときは Mark & indent-region してみてる。むー。

てか .lc 消して試してみたら同じ速度だなぁ……バイトコンパイル効いてない? 再ダンプしてなかった。 .lc 消したらむしろありえない。

  1. トップ
  2. soft
  3. xyzzy ruby-mode

実は既に今年度の授業が全て終了 (3学期は授業がない) して、期末テスト2日分が終わっていたりするわけだけど、期末テストの期間に入ると、既に休みに入った気分になって微妙に困る。あーむしろ英語ライティングで脅されてる (謎) のに何もやらずに試験に臨むとかアホすぎる。そういえば中間でうけそびれたやつって期末でとらないとヤバイんジャマイカ……

いろいろなことがぼーっとしてるせいで遅れてる。遅れてる。願書請求とかやってなかったとか。あぶねー。12月なのに過去もやってねー。

あー XML 名前空間とか試験にでませんか。でも XML 全般が出るなら XML Schema とか、既に古いけど健在な DTD ももっとちゃんとやっとくべきじゃないか。いや待てよ、XSLT もまだしらない要素とか、知っていても使ったことがない要素があるな。そういえば RDF のクラスのヒエラルキーとか理解できてないな。あーこれ冬休み中にやっとく鹿。って、いやだから受験科目じゃありませんから! 残念。

  1. トップ
  2. life
  3. 期末テスト

ちょっと触った感じではいい感じ。ソースがそこそこ綺麗に書ける。大規模になったときはわからないけども。全部オブジェクト、と考えていいのかな。以下 Io (プロトタイプベース) と Ruby (クラスベース) と ECMAScript (プロトタイプベース) のコード片を比べてみる。

foo := Object clone
foo test := method(x,
x
)
write(foo test("test"))
foo = Object.clone
def foo.test(x)
x
end
print(foo.test("test"))
foo = new Object;
foo.test = function (x) {
return x;
};
WScript.Echo(foo.test("test"));

ECMAScript は標準出力の方法を定めていないので、ここでは WSH の cscript から実行していることにしてみる。

パッと見た感じ殆ど同じ。Io の場合、スロットに新しく代入するときは := (=setSlot) で = (=updateSlot) は既に存在するスロットを更新する。updateSlot はチェインを辿って見つけたスロットに代入し、該当するスロットがなければ例外になる。と思う。setSlot はレシーバに新しいスロットを作る。ついでに、Io のトップレベルで使われる関数のように見えるものもメソッドで、このメソッドのレシーバは見えない Lobby というもの。全てメッセージ。素敵だ。Ruby も関数のように見えるものは self を省略しただけ。ただ、Io の場合は他の言語では制御構造に見えるものもメッセージ。if とか for とか while も Lobby のメソッド。素敵すぎ!

上のやつは違うみたいだ。Lobby の proto には Object が入ってるから実際には Object に定義されてるメソッドみたい。リファレンスにも getSlot とかは Object に書いてある。

Ruby はクラスベースだからホントは比べにくいと思うけど、とりあえず特異メソッド定義としてみる。特異メソッドは属するところがそのオブジェクト自身になる (普通のメソッドはそのオブジェクトのクラスに属してる) からちょっとプロトタイプっぽい。foo.clone で特異メソッドも引き継げるしね。

ECMAScipt はソレっぽい。ECMAScript の = は常にレシーバにスロットを作るっぽい。自動的にチェインを辿って該当するスロットに代入する方法はないぽい?

関係ないけど、Io のインタプリタを ck から実行すると、実行が終わったあとに全ての出力がクリアされちゃう。ついでに起動するときになんか表示してる半透明ウィンドウが全部フラッシュする。

放り込んだらそのまま動くとか書いてあったので、Linux Binaries をダウンロードして XREA にうぷろーど&実行権限付与。んで適当に foo.io とか作って実行権限とかやってみたけど必要なライブラリが足りないといわれて動かなかった。無念。

ムカツクから鯖上で build できんのかとやってみたけどリソース制限にひっかかって無理だった。もうめんどい。適当にローカルで弄ってよう。

って。ああああああ。新しい鯖だと動く。 s101 で ioServer を動かしてみたらできた。何も苦労せずにできた。泣けるよ。ひどく泣けるよ。

正規表現が標準で使えないのは痛すぎる。やばすぎる。

  1. トップ
  2. prog
  3. Programming Language Io

io-mode.zip, io-mode.l

簡単そうなので作ってみる。殆ど c-mode のパクりなわけだけど……結局インデントレベル計算するところしか作ってないわけで、そしてそれも括弧しか使わない Io では数えるだけなわけで的な。とはいえアフォだからかなり詰ったんですけども orz

ioServer の Regex て何か変じゃありませんか。nextMatch と firstMatch が全く同じ挙動名気がする。つーかマニュアル書くなら効果的なサンプルと一緒に書いて欲しいなって思う。戻り値も書いてないこと多すぎ。むしろ最初から String replace に正規表現とれるようにしれと。正規表現がデフォで使えないとかキツすぎて死にます。

io-mode readme, iolanguage

  1. トップ
  2. prog
  3. xyzzy io-mode
  1. トップ
  2. soft
  3. xyzzy io-mode

リファレンスを見た限りではメソッドの引数を省略したときの値を指定できないっぽい。ようは可変長変数を使うんだと思うんだけど、これまた長い。んなわけで適当にマクロ化するメソッドを定義しとく。もしかしたらこんなことやらないでももっといい方法があるかもしれない。

/*
pos     : 引数の位置
name    : 代入されるスロットのキー (勝手に初期化)
default : デフォルトの値
*/
Object opt := method(pos, name, default,
if (sender doString("thisMessage argAt(" .. pos .. ")")) then (
sender doString(name .. " := sender doMessage(thisMessage argAt(" .. pos .. "))")
) else (
sender setSlot(name, default)
)
)

んで以下のように使う。

List join := method(
opt(0, "sep", "")
ret := ""
self foreach(index, value,
ret = ret .. value
if (index < self count - 1) then (
ret = ret .. sep
)
)
ret
)
l := List clone push("aaa") push("bbb") push("ccc")
l join(", ") print //=> "aaa, bbb, ccc"
l join print //=> "aaabbbccc"

Ruby の Array#join っぽいことをしてみる。 String join というメソッドがあるけど何かこのメソッドは位置がおかしいし、セパレータを引数にとれない。っぽい というのはデフォルト引数が "" きめうちだから。Io に $, がないから (なくていい) ってことです。あーあと再帰的に join してないや。to_s メソッドとかないからその辺もやってないし。ようは List の中身が String 以外だと例外はきますよと。

どうでもいいけど if を書くときに thenelse を使うのは構造的違和感がある。でも可読性はこっちのほうがいいし、case がないうえに if の引数として書く場合 elseif が書けないからどっちにしろ書くことにはなるんだけど。if の引数に全部書くほうはワンライナー向けかしら。

  1. トップ
  2. prog
  3. iolanguage 引数のデフォルト値

何で Directory が ioServer なのかはとりあえず置いておいて、Directory items が File しか返さない。Returns a list object containing File and Directory objects ですよ。ついでに list object じゃなくて List object だろうとか思ったけど理解できるからとりあえずフットノート。いや英文解釈が間違っているのかもしれないとか思いつつしかし常識的に考えて (まぁたしかに Directory も File ではあるけど) Directory を File として返さないだろうとか、むしろ File としてしか返さなくて File にタイプを識別するメソッドがなかったら使えないよねって思ったから File にそんなメソッドあるのかなって思ったらなかった。そういや File Primitive にはファイルの更新時間を取得するメソッドもない気が。つまるところ今のデフォルトの Io では blosxom クローンは作れないっぽい。

てか Regexp, Directory を IoVM の Primitive に……

  1. トップ
  2. prog
  3. iolanguage Directory items

素朴な疑問にひっかかった。if とか else もメソッドで、引数にメッセージをとるけど、何でこの引数は評価されずに渡されるんだろう。ちょっと解りにくいから実際にコードを書いてみる。

if (Nil) then (
"not print" print
) else (
"print" print
)

この場合もちろん not print は出力されないし、それが願う動作。しかしながら "not print" print も引数だから、メソッドに渡される前に評価されて not print と出力されるんじゃないかと悩んだ。というか正確に言えば if をユーザから定義するときに評価されてしまってハマった。以下にハマったコードを示す

myif := method(test,
ifObj := Object clone
ifObj test := test
ifObj do (
mythen := method(msg,
if (test, sender doMessage(thisMessage argAt(0)))
self
)
myelse := method(msg,
if (test isNil, sender doMessage(thisMessage argAt(0)))
self
)
)
)
myif (Nil) mythen (
"nil" print
) myelse (
"aaa" print
)

これは予想に反して nilnilaaa と出力される。引数が渡される前に評価されしまっているからだ。リファレンス見ててもよくわからないので、適当に書き直していたらできた。書き直した結果を書いてみる。

myif := method(test,
ifObj := Object clone
ifObj test := test
ifObj do (
mythen := method(
if (test, sender doMessage(thisMessage argAt(0)))
self
)
myelse := method(
if (test isNil, sender doMessage(thisMessage argAt(0)))
self
)
)
)

何が変わったかっていうと method の仮引数を書かないようにしただけ。仮引数を書くと評価されてしまうらしい。微妙な罠。プログラミングガイドに明記してもいいじゃん! とはいえこれを踏まえてから読み直すと The thisMessage slot that is preset (see next section) in locals can be used to access the unevaluated argument messages. と書かれていてといっても原文は引用しただけで日本語訳から探した。 (強調はされていない) 頭がよければ thisMessage スロットには未評価なメッセージが入っていて、仮引数を書かなくても呼び出せる。もしかして仮引数を書かなければメッセージは評価されないんじゃないか、なんて推論できる (苦しい) かもしれないけど、俺には無理!

  1. トップ
  2. prog
  3. iolanguage メソッドの引数の評価

飽きるまで Io。

case がないので作ってみる。

簡単なとこばっかやりすぎな気が。super とかの使いどころがわからない。正規表現が微妙な時点で実用性がうっすいんですけど……組み込んで初めて力発揮しそうな。すくなくとも CGI 作るのにはアドオンが弱すぎ。

メッセージ書かない (何もしないと意図する) とエラーになって使えないのでコメンツアウト。邪魔なだけ。

  1. トップ
  2. prog
  3. iolanguage case-when

むー。長く書けば書くほど何やってるか分からなくなるなぁ。Lisp に似てる。なんていうか、コメントが必要な言語だ……

  1. トップ
  2. prog
  3. iolanguage

似たようなバイト配列が同じぐらいの数値になるハッシュ関数がなんとなく欲しいけどどうやればいいかサッパリわからねー。最終的にやりたいことはある文字列から自動的にカラーコードを生成されることなんだけど、まぁそれ自体が目的で何かに使うってわけじゃないわけですけれど……

似たような、っていう条件をとれば 既存の MD5 とかのハッシュ関数使えば超簡単に実装できる。むしろ実装っていうほどのものじゃなくなる。一行で終る。"#%06x" % (Digest::MD5.hexdigest(str).to_i(16) >> 104)

似ている っつうのが抽象的っつうかなんつーか……面倒だからいいか。

  1. トップ
  2. prog
  3. 似たようなのは似たように

やらなければならないことが多すぎだけれど、やらなければいけないことは何時もやりたくないことだ。つまり、さっきまでやりたかったこともやらなければならないことになったらやる気がなくなる。そしてぎりぎりでやる。卒業文集とか完全に忘れてた。卒業できるかわからない (わらい?) のに書いておくとは不思議。

ヒーローが現れるべき状況だけれど実際現れない。脇役さえまだ出てきていない。エキストラが見え隠れするぐらい。

  • ヒーロー
  • 想像力
  • あこがれ
  1. トップ
  2. life
  3. MUST

昨日の cron メールにまた Killed が含まれて (HTML に変換する Ruby スクリプトで) いて、今日の cron メールが来なかった (この時点で謎すぎ)。さらに NMZ.lock2 が残っていた。NMZ.lock2 を削除して手動で cron tab に設定してあるスクリプトを実行してみると、とりあえず成功。まぁ……と予測しつつ一番新しいセクションのタイトル (must) を検索してみるとそのキーワードを全く含んでいないセクションがヒットする。前に起きた検索結果がズレるようなやつと全く同じ現象……仕方ないのでインデックスファイルを全部削除して mknmz やりなおした。何が原因かが全く解らない。

  1. トップ
  2. web
  3. cron & Namazu

"foo#{bar}baz"'foo'+bar+'baz' も同じで、 '+..+'#{..} になっただけなのに何か凄く便利。書きやすいのもあるし、文字列の纏まりがちゃんと引用符で纏まってるのがカッコイイ。

  1. トップ
  2. prog
  3. Ruby の式展開が好き

ポップアップしてみた画像

INTO THE WORLD :: ネタメモ とか見て、あーポップアップさせてーとか思って Javascript でポップアップさせてみた。

でかい画像と小さい画像を XHTML でどう関連付けるか考えたりするのが面倒なので全部でかい画像になってます。ブラウザにリサイズをまかせてます。小さい画像が汚いのはそのせいです。

IE だけ CSS の扱いがおかしいのでダメです。でも Opera と IE の区別がわからんので放置です。IE 知りません。

リサイズイン (っていうの?) ズームインするようにしてみた。リサイズアウト (ってい(ry) ズームアウトもやろうとしたけど Interval の競合?か何かでバグるのでやめた。ブラウザ判定を素直に UserAgent でやるようにした。偽装している人は偽装しているリスクみたいなものがわかっている人だからいいかと思った。MSIE が含まれている場合は処理しない。ただし、Opera が含まれている場合は処理をする。Opera が含まれている場合は画面の描画リフレッシュがおかしいので style.overflow をいちいち更新してる。っていう感じ。

  1. トップ
  2. prog
  3. Album 画像のポップアップ
  1. トップ
  2. web
  3. Album 画像のポップアップ
  1. トップ
  2. music
  3. Album 画像のポップアップ

赤本とスピーカー買いに新宿へ。赤本の値段を 1200 円だと思っていたので困った。

それはいいとして、新宿みたいな人が無駄に多いところは歩くだけでめちゃくちゃ疲れる。歩くのが遅いくせに道をふさいで歩いてるとかはしょっちゅうなわけだけど、まぁとにかくドコにいてもタバコかしょんべんの臭いしかしないというナニ。歩きタバコでもしてるのかと思って回りを見回してもパッっと見吸ってる人がいない。町に染み付いたにおいなのかなんなのか。

  1. トップ
  2. life
  3. 新宿

UA 文字列を Javascript から得るにあたり検索をかけてみたのだけど、UA 文字列にある文字列 (eg. “MSIE”) があるか調べるときに String.prototype.indexOf の結果が -1 であるかを調べているのが多かった。これはやっぱ String.prototype.match だと遅いとかそういう問題があるからなのだろうか……なんかダサいので今回自分は String.prototype.match を使ったけど、どうなんだろ。

if (navigator.userAgent.indexOf("MSIE") != -1)
// do something for MSIE
if (navigator.userAgent.match(/MSIE/))
// do something for MSIE

さらに && とか使おうとすると演算子の優先順位 (よく忘れる) とか考えることになって面倒臭い……

  1. トップ
  2. prog
  3. ua.indexOf("MSIE") != -1 ?
  1. トップ
  2. web
  3. ua.indexOf("MSIE") != -1 ?

pre に現れるコードを Javascript で着色 (Javascript でやってるのはマークアップ) してみる。重い?

少し前からこれがやってみたかったので class 属性に使用してる言語を書いていたりした。言語ごとにトークンを使いわけたようと思ってたわけだけど、実際そこまでやるのってどうなのよ、とか思い始めた。そのうちやってみて、いけそうだったら採用してみよう。

現状でもかなり重い気が……長くとれるトークンを増やせば (ループ量が減って) 軽くなるかもしれないけど微妙。実際一文字ずつループまわしてるからなぁ。やりすぎか。

Ruby と ECMAScript は別のトークンテーブル使うようにしてみた。別にパースしてるわけじゃない (スキャンだけ) なので微妙にアレな状況が既にいくつか思いつくわけですが……例えば式展開の引数で括ってるクオーテーションつかっちゃうとかが絶対おかしくなる。

それとループ回数を減らすために /[a-z][a-z0-9]*/i は identifer ってことにしてスキップしてる。

Lisp と XML もすっごい適当に加えた。

サンプル 重いので移した。

正規表現はブラウザ毎の違いが殆どない気もする。気付いてないだけかもしれないけど。

FF で右クリックから View Selection Source すると内部 DOM の内容もソースとして出てくるのが役に立った……

そもそもスキャナの実装が激しく間違ってたので修正。根本的な部分を変えたのでバグがあるかもしれない。

  1. トップ
  2. prog
  3. code をクライアント側で着色
  1. トップ
  2. web
  3. code をクライアント側で着色

Audioscrobbler で最近 Recent Tracks に聞いてない曲が混ざることがある。バンプ が車輪の唄のシングルカットしてたなんてそもそも知らないのに、それのカップリングのやつが Recent Tracks に混ざっていたりする。

無作為に混ざっているわけじゃないらしく?同じアーティスト聞いてると混ざるみたい?

  1. トップ
  2. web
  3. Audioscrobbler で他人のやつ混ざる

コードに色づけ Firefox でしか試してません。Opera ではもしかしたら動くかもしれないけれど、IE では絶対動きません。コアな部分 (つまりコードをマークアップするとこ) はブラウザにあんまり依存しないみたいなので、ブックマークレット化する部分をクロスブラウザすれば OK だけど面倒臭い。

  1. ブックマークレット起動
  2. 色づけしたいテキストをクリック (カーソルが I ビームになるとこ)
  3. プロンプトに使用するシンタックスを入力。

ECMAScript, Ruby, Lisp, XML, CSS, PHP, Io, Perl が適当に色づけ可能だと思うけど Perl はよく知らないし、Lisp はそもそもキーワード的なものがないので微妙。Javascript も JScript も ActionScript でも ECMAScript のスーパーセットである限りは ECMAScript でそこそこ色づけできるはず。HTMLXML でソレっぽくなるはず。

このスクリプトは少なくともコード部だけは独立してマークアップされてる必要があります。

<p>ほげほげ</p>
<pre>code</pre>
<span>code</span>
<code>code</code>
<p class="foo">code</p>

上のは OK. 下のは NG

<p>ほげ<em>ほげ</em>うげ
code</p>

子要素を持った要素は無理 (テキストノードに兄弟要素があるとダメ) ってことっす。

巨大なコードをやると死ぬかも。でも俺は謝らない。

Opera で一応動くように修正。リンクに %22 とか含まないようにしたのと、中途半端な IE 対策 (コピペなので) を削除。

  1. トップ
  2. prog
  3. コードに色をつける bookmarkletcode coloring bookmarklet
  1. トップ
  2. web
  3. コードに色をつける bookmarkletcode coloring bookmarklet

昨日は12時ぐらいから18時ぐらいまで寝てた。日の光が気持ちよすぎた。それだけ寝てもまだ眠い。やりたくないことが多いときは眠くなる。現実逃避。

夢。見た夢。書こうと思ってたのに忘れてた。そして忘れた。そんなにいい夢じゃなかった。

  1. トップ
  2. life
  3. 寝すぎでも寝よう

Trackback URI がコピーしやすい用に Trackback URI (本体のほう) をクリックするとプロンプトに URI 表示するようにしてみた。まぁ Trackback 自体殆ど来ないし、来まくっても困るんですけど……コメントとか削除するシステム作ってないので手動削除だし。

  1. トップ
  2. web
  3. Trackback URI の UI
  1. トップ
  2. prog
  3. Trackback URI の UI

SWAN SONG (ART-SCHOOL) を聞いてて音量あげようとおもってキーボードに手を伸ばしたときにデジャヴ。部屋は机の上の蛍光灯だけ。もう眠い。でも寝たらネタが思いつかない。ネタ?

  1. トップ
  2. life
  3. デジャヴ

病院の中の温泉。海の中の温泉。ボーイ。話すのが遅い。小学生。写真。制服。小説を書く体育教師。

  1. トップ
  2. self
  3. 夢・温泉めぐり

アルバム画像の下にアルバムの情報を表示するようになった

opacity とか使ってる。IE はそもそも無理ですよ。Opera は特に対策しなくてもそのままいけたっぽい。

かなり微妙と思われるのは、ブラウザデフォルトのツールチップを消すために title 属性とかを DOM から消しちゃってるところ。そういう系ブラウザが Javascript をどの程度解釈するかよくわからないけど、もしかしたら結構アレすぎるんじゃないかとか思ったりもする。どうなんだろ。

ブラウザのツールチップを消す方法が他に思いつかないんだよなぁ……stopPropagation とかでもしかしたら?とか思ったらできなかった。切ない。

前回に続き例の画像のジャケットがアートなのはアートのジャケットは全体的に好きっつうかかっこいから。それ関係で amazon に Requiem for Innocence のジャケット画像 (が中でも一番好き) がないのがすげーアレなんですけど。

  1. トップ
  2. web
  3. Album 画像のポプアプの続き
  1. トップ
  2. music
  3. Album 画像のポプアプの続き

村。人たくさん。復讐。「何であっちには誰もいないんだ?」。葬儀屋。学校。階段。スキー。

  1. トップ
  2. self
  3. 夢。葬儀屋

デフォルトスタイルシートをクリスマス風に。クリスマスだから何だっつう勢いプラス赤と緑かpgrみたいな……

  1. トップ
  2. web
  3. クリスマス風に

前回 (2004-12-01) と全く同じ。

  1. Cron のメールが来ない。
  2. 前日のメールには Killed が含まれてる (でも見る限り Namazu ではなくて、変換している Ruby スクリプトが殺されてる)
  3. NMZ.lock2 が残っている。
  4. NMZ.lock2 を削除して mknmz すると検索結果がズレる。
  5. インデックスファイル全削除で対処。
  • なぜ Kill されるのか。
  • なぜ NMZ.lock2 が残るのか。
  • なぜ検索結果がズレるのか。

わかんねーw

  1. トップ
  2. web
  3. Namazu Cron

IE でもぐにゅーんってなるようにした。情報はでない。高さが auto だから計算できない。その代わり title 属性は削除しない。

とりあえず Gecko と IE で動いて、Opera で確認したらダメ。仕方ないのでブラウザ振り分けコードがいっぱいちらばってる。うぜー

問題点は position: relative なのに、元の位置で大きさが反映されちゃうことだったわけ (後続する要素がズレる) なので、相殺 margin 仕掛けて解決した。relative である限りは margin しかけようが何しようがいいはず (たぶん) だけど、Opera (7.6 preview) だと崩れましたみたいな。

  1. トップ
  2. web
  3. Album 画像のぽぷあぷの続き IE
  1. トップ
  2. music
  3. Album 画像のぽぷあぷの続き IE

#blosxom にてちょっと kyo さん と話していて、うんちゃら (いきさつ説明するのが面倒になった) いろいろカコイイジャケを見せてもらったりしてみて、カコイイジャケ紹介する blog とかないの?とか。んでとりあえず自分用にアレなのを作ってみるかって感じ。かなぁ。

ジャケ買い? 自分持ってないっつうか聞いたことないのもあるけど、ジャケット見るのはタダっつうかカッコイイジャケットは晒しといたほうがいいんジャマイカって感じで (むしろ教えてもらったのとかメモっとくためなんだけども) とりあえず作ってみた。中間ファイルは普通に XML。 追加するスクリプトが汚すぎ (とりあえず動け的) なのでそのうち直したい。直したい。いつ?

ちなみにヤバ気なのは This May Be the Year I Disappear / Recover, Green Mind / Dinosaur Jr., フェイクファー / スピッツ。女の子ばっかですねとか言わない。

  1. トップ
  2. music
  3. ジャケ買い?。
  1. トップ
  2. web
  3. ジャケ買い?。

最初の頃だいぶ適当でここら辺の考えが甘かったわけで、オリジナルを保持することを考えなきゃなぁとか思った。今のところホワイトスペースで段落の区切りになっているけど、やっぱ一行ずつ l 要素とかソレっぽいのでマークアップして突っ込んだほうがいい。XHTML にするときは <span class="l">一行分</span> みたいにして display: block な感じ。むーできればはやくやったほうがいいだろうなぁ……

  1. 本体の XSLT の修正。
  2. 現在の XML を l 使う形式に変換する XSLT の作成・検証
  3. スクリプトの若干の修正

ついでに URL にもリンク晴れるようにしたほうがいいか。使えるタグ制限とか上手くできないかなぁ。

  1. トップ
  2. web
  3. コメントの XML

画像のナニがアレとかでと、規約読み直したらアソシエイト参加できそうジャマイカ的なので、amazon から画像ひっぱってるところ (現状 /jacket, /playing) はアソシエイト ID くっつけるようにしたので、そういうのウゼーよって人はてきとうにコピペすると良いと思います。謎すぎるなコレ。

  1. トップ
  2. web
  3. Amazon

正確にはまだ試験休みなのはいいとして、ここ数日ずっとハイテンション。ちょっと怖い。ずっとは続かない。

とにかく想像力を失くさないようにしようと思う。とりもどせない。既にあんまり無いところが厳しい! 経験的想像力 (?) は外をもっと歩いたり、憂鬱さの沢山味わわないとダメだから難しい。早く気付くべきだね。想像力について。

去年の自分のサイトを見てみたら今よりもっとすごく糞だった。おととしの見たらヤバすぎた。しかも XHTML とか、その他関連技術が自分の中である程度マトモになりはじめたのは今年だった。なんかもう学び始めてから二・三年たっている気がする。この一年はすごく長かったみたいだ。それと日記に書く文章が無駄に長くなったりもしてる。過去の日記とか読むのは微妙に辛い (わらい) けど面白いもんだ。ウェブに公開しちゃうと自分で捨てちゃったやつまで残っていて笑える。消してくれ!とか思う。どうでもいいな。

  1. トップ
  2. life
  3. 生活 of winter vacation

狂人日記 とか、ネット上にも載ってる各種インタビューとかで木下氏が ASIAN KUNG-FU GENERATION がどうとかっていう話が結構出てきて微妙に驚いた。意外だった。むしろ嫌いな系統だと思ってた。

どうでもよすぎてセクション切るか迷ったけど一応記録。

あーあと、LOST IN THE AIR っていうアルバムが出るらしくて楽しみだ。でも二月は永遠に来て欲しくないな。

  1. トップ
  2. music
  3. アート & ASIAN (ry

冬に想像する夏は素敵だと思う。その、夏の中にいるときとは違って、木の緑色だったり、いろんなもんの青さだったり、その他キラキラしたものしか浮かばないからいい。まーようは夏が涼しければいいんです。だよね?

つまりこういう幸せな世の中 (こう表現しざるをえないっていうかそうしないとアレ) では冬が一番素敵な季節なんですよ。秋とか春とか夏は花粉症 (ブタクサ, 杉, イネ) もあるしねー。

  1. トップ
  2. life
  3. 冬における夏
  1. トップ
  2. imagination
  3. 冬における夏

っていう感じでループさせて15枚セレクトを作ってみる。コメント書くのめっちゃ苦手だ(w

もうちょいページ自体どういう風にするかを考え中。

  1. トップ
  2. music
  3. Jackets 15
  1. トップ
  2. art
  3. Jackets 15

daimas の日記サンズを解雇になった田臥は、五十嵐くんに似てる気がするのだが間違ってる? ってのを、ミカン食ってるとき不意に見て鼻水でた。似てる。特にヒゲが。ヒゲ。

  1. トップ
  2. music
  3. 田臥 || 五十嵐

注意 これは間違ってるかもしれない。実際に実装を使って確かめたわけじゃない。今はめんどくさくて確かめたくないので覚書的なもの。

変数バインドエレメント (xsl:param, xsl:variable) では select でノードセット格納するときと、子要素にテンプレートを書いてごちゃるのとでは違うらしい。後者は結果ツリーフラグメント (Result Tree Fragment) になる。これはルートノードを含む。(select の場合でもルートノードを含むように選択すればルートノードは含まれる。例えば document() を単体で使えば必ずルートノードがノードセットの入る)

<xsl:variable name="foo" select="/bar"/>
<xsl:apply-templates select="$foo"/>
<xsl:variable name="foo">
<xsl:copy-of select="/bar"/>
</xsl:variable>
<xsl:apply-templates select="$foo"/>

前者の場合、ルートノードを含まないノードセットなので、無限ループに陥らずにちゃんとなる。後者の書き方によって $foo に格納されるのは結果ツリーフラグメントで、結果ツリーフラグメントはルートノードを含むので、(現在適用しているスタイルシートの match="/" にマッチして) 無限ループ。

結果ツリーフラグメントをノードセットと混同するとエラい目にあう。例えば Mozilla がクラッシュしたりとか。

  • 結果ツリーフラグメントは、結果ツリーの断片 (フラグメント) を表す。結果ツリーフラグメントは、ルートノードを1つだけ含むノード集合と同様に扱われる。
  • 変数バインドエレメントが select アトリビュートを持たず、コンテンツが空でない場合 (つまり、変数バインドエレメントが1つまたは複数の子ノードを持っている場合)、変数バインドエレメントのコンテンツが変数の値になる。変数バインドエレメントのコンテンツはテンプレートであり、このテンプレートをインスタンス化すると、変数の値が得られる。この値は結果ツリーフラグメントであり、このフラグメントはテンプレートをインスタンス化して生成した一連のノードを子に持つルートノードを1つだけを含むノード集合と同等である。

あっていれば xsl:param にノード集合を渡す。 はノード集合ではなく正確には結果ツリーフラグメントだ。まぁ扱い方的はあまり変わらないけれど……

ってことは <xsl:param name="ggg" select="'unke'"/><xsl:param name="ggg">unke</xsl:param> は違うんだ。実際これらを <xsl:value-of select="$ggg"/> とかやると文字列に変換されるので同じように見えるだけか。この場合前者の方が変換がなくてほんの少し高速かな。

  1. トップ
  2. web
  3. 結果ツリーフラグメント
  1. トップ
  2. xslt
  3. 結果ツリーフラグメント
  1. トップ
  2. xml
  3. 結果ツリーフラグメント

XPathXPath という名前だけでも誤解を招く。Path というだけにディレクトリパスとかを連想する。まぁ、ディレクトリパスとは類似点が多い。UNIX ファイルシステムにおけるルートディレクトリ (名前ナシ) と、ルートノード (展開された名前ナシ) とか、それに省略形による表記を使うとパット見ディレクトリを特定するためのディレクトリパスとなんら変わらない。‘/’ を区切りに使うのが紛らわしい。カレントディレクトリXSLT における カレントノード を混同しやすい。XPath にはカレントノードなんてものはない。コンテキストノード。

XPath は文字列とか数値も表現しえるので、ただたんにどっかのノードを特定する言語ではない。(とはいえ W3C 仕様書には XPath は、XML ドキュメントの一部をアドレッシングするための言語であり とか書いてあって紛らわしい)

だめだもう寝る。

  1. トップ
  2. xpath
  3. XPath の紛らわしさ
  1. トップ
  2. web
  3. XPath の紛らわしさ
  1. トップ
  2. xml
  3. XPath の紛らわしさ

IE (Gecko, Opera, etc) を無視するのと、音声ブラウザを無視するのはおなじ。

  1. トップ
  2. web
  3. IE

ネームスペース宣言の集合は、式が現れるアトリビュートを持つエレメントのスコープに含まれるものと同じである。この集合には、XML ネームスペース勧告 (XML Namespaces Recommendation) [XML Names] が必要とする、暗黙的に示されたプレフィックス xml の宣言も含まれる。デフォルトのネームスペース (xmlns を用いて宣言されたもの) は、この集合の一部ではない。 とか書いてあったりする。ソースツリーのデフォルトネームスペース URI が null (特に名前空間を全く宣言していない場合とか) 以外の時は絶対にプリフィックス無しではマッチとかしない。

<foo>
<bar>baz</bar>
</foo>

この場合に string(/foo/bar) = 'baz' は true。

<foo xmlns="http://foo/">
<bar>baz</bar>
</foo>

この場合は string(/foo/bar) = 'baz' は false。/foo/bar は何も選択しない。例え XSLT 側のデフォルト名前空間が http://foo/ であっても何も選択されないxmlns:f="http://foo/" とかやって /f:foo/f:bar ってやらなきゃいけない。

で、困るっていうかよくわからんのはソースツリーのデフォルトネームスペースと結果ツリーのデフォルトネームスペースを同じにしたいときなんですよと。必然的に xmlns:f="http://foo/"xmlns="http://foo/" とか (順番も重要) やるわけですよ。exclude-result-prefixes="f" とかやるわけですよ。そうすると仕様書的に正しいかはよくわからないけど Sablotron の場合はどっちとも (xmlns, xmlns:f) 消えるんですよ (msxsl では大丈夫)。で、どうすんねんと哀さんと話していた次第(謎

xsl:namespace-alias とか利用すんのかなぁと思っていくつかソレっぽく書いてみたけどダメだった……なんかセオリー的なやり方ってないのかな。

  1. トップ
  2. web
  3. XSLT の XPath の
  1. トップ
  2. xml
  3. XSLT の XPath の
  1. トップ
  2. xslt
  3. XSLT の XPath の
  1. トップ
  2. xpath
  3. XSLT の XPath の

XSLT では属性ノードとその親ノード (要素) との関係は片方向……属性ノード側からは @attr[. = ../../@attr] (省略しない場合: attribute::attr[self::node() = parent::node()/parent::node()/attribute::attr])) とかいう風に親がちゃんと親に見える (っておかしいな) けど、その親からは (attribute:: としているように) 軸が違う。ここで親から child::attr とアクセスできたら困るわけだけど、ややこしい。どうも俺は属性を子ノード的にイメージしていて attribute っていう軸がイメージしにくい。

DOM の場合は属性に親ノードはなく (parentNode は null) ownerElement に親要素が入ってる。軸が完全に分離してるっつうのかなぁ。DOM だとあんまり混乱しない。ただのプロパティでしかないからかなぁ。

XSLT の場合も DOM っぽい考え方をすればいい気がするのでちゃんと書いて、どこがどう違うかを考えてみてる。軸をプロパティと考えればいいの鴨。

// わけわかんコードだ(w
contextNode = current();
with (contextNode) {
contextNode = child["*"];
with (contextNode) {
contextNode = attribute["attr"];
with (contextNode) {
text();
}
}
}
  1. トップ
  2. xslt
  3. XSLT と DOM との相違
  1. トップ
  2. dom
  3. XSLT と DOM との相違
  1. トップ
  2. xml
  3. XSLT と DOM との相違
  1. トップ
  2. xpath
  3. XSLT と DOM との相違

またメールが来なくなっていたので確認。インデクシングされていない。NMZ.lock2 は最初なかったのに、CGI 経由で実行したらNMZ.lock2 が残っていますというエラーとともに出来た。自分で作って自分でえらー吐いてるのか……?

仕方ないのでまたインデックス全部削除。

  1. トップ
  2. web
  3. Namazu Cron

汎用っぽいテンプレ作っていたら、XSLT だけで一行ごとに l 要素とかソレっぽいのでマークアップできることに気付いた……っていうかアレだ。

<xsl:template name="split">
<xsl:param name="value"/>
<xsl:param name="splitter"/>
<xsl:param name="element-name" select="'t:item'"/>
<xsl:choose>
<xsl:when test="contains($value, $splitter)">
<xsl:element name="{$element-name}">
<xsl:value-of select="substring-before($value, $splitter)"/>
</xsl:element>
<xsl:call-template name="split">
<xsl:with-param name="value" select="substring-after($value, $splitter)"/>
<xsl:with-param name="splitter" select="$splitter"/>
<xsl:with-param name="element-name" select="$element-name"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:element name="{$element-name}">
<xsl:value-of select="$value"/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:call-template name="split">
<xsl:with-param name="value" select="'aaa#x0a;bbbb#x0a;cccc#x0a;z'"/>
<xsl:with-param name="splitter" select="'#x0a;'"/>
<xsl:with-param name="element-name" select="'l'"/>
</xsl:call-template>

正規表現使いたい……

  1. トップ
  2. xslt
  3. XSLT で行をマークあっぴ
  1. トップ
  2. xml
  3. XSLT で行をマークあっぴ

Opera 7.54 でコードが途中まで消えるっつう指摘を受けたので、navigator.userAgent.match(/Opera/) && navigator.userAgent.match(/7\.54/) が真だったら色づけしないようにした。消えるのは致命的杉。

たぶんドキュメントフラグメントに大量にノード突っ込んで既存のノードと置き換える部分が原因で最初のほうがレンダリングされなくなるんだと思うけどよくわからない。リロードするたびに消える範囲が変わる;

  1. トップ
  2. web
  3. Opera で色づけ

25 日終わったからもとのスタイルに戻したよ。

クリスマスにまず損しない (金は減るけど) 投資 (謎) して、ドレぐらい返ってくるかなぁ、とか思ってみたけど損しない分しか返ってこなかった。残念。まぁ全然いいんだけどももももも。

もっと寒いスタイル作りたいなぁ。モニターに息吹きかけると白くなるぐらい寒いスタイルシート書きたいなぁ。スポットライトと観覧車ってとこかなぁ。遊園地って人が多くて好きじゃないけど、観覧車っつう言葉の響きは好きだ。母親の実家に行く途中古ぼけた遊園地があって、その中に観覧車があるんだけど、幼稚園生のときその観覧車が動いているかどうかを何故か毎回確かめてた。この前通りかかったとき遊園地自体が潰れてた。ついでにもう通りかかることもなさそうだ。

まーとにかく Helvetica ってフォントの名前だよね。

  1. トップ
  2. web
  3. もういくつ寝ると
  1. トップ
  2. life
  3. もういくつ寝ると

  • 日記データの名前空間が適当すぎる。ほぼ XHTML で書いている本文も XHTML の空間じゃない。作ってるときは名前空間いちいち書くのが面倒だったらからそうしたんだけど、今になってみるとキモい。
  • 変換用のデフォルトテンプレートあたりがちょっと気持ち悪い。統一感がないのでもうちょっと blosxom 的にしたい。
  • 設定が .inc とかに入っていて気持ち悪い。スキン的な設定はスクリプトから完全に分離すべき。
  • 本体とは違う (スキン) けど abbr 要素とかを補完する辞書の語彙がやっぱ微妙に気持ち悪いのでスキーマをちゃんと定義しておきたい。一番めんどい

Taglibro を少し作り直そうと思い始めたわけだけど、実際日記本文に使う空間を何にするかとかで悩んでる。今は殆ど XHTML 1.0 と同じだけど、ホントにコレでいいかなぁとか何とか、だからといって XHTML 2.0 はまだ勧告されていないし、XML Schema の場所も決まっていない (TBD) ……一応どっちでもいけるようにはしてみてるけど、実際書くのはどっちかだし。

それと、できるだけ自然に書くため (つまりミスタイプを少なくするため) 名前空間接頭辞をできるだけ付けない様にしたい。ということはデフォルト名前空間を多用する (セクションごとに名前空間書く) ことになるけど、XML Shema の仕様を眺めてみる限り、実態参照の宣言方法がない。というか DTD でいうところの内部サブセットをどうやってやればいいか分からない……名前空間を省略したいだけの参照をスキーマで宣言するのはおかしいから内部サブセット的なものが必要。実態参照だけ DTD 使うのがいいかなとか思ったけど Validator がエラー出す (DTD で要素が宣言されていないよ!っていう) のでダメっぽい。併用すること自体アレだし……

  1. トップ
  2. web
  3. 日記の名前空間
  1. トップ
  2. xml
  3. 日記の名前空間

書こうと思ったんだけどうまく説明できない。たぶん前にも少し見たことがある。

坂がある。高床式の木で出来た小屋が沢山ある。そこに行くために坂がある。木で出来た少し大きめの小屋がある。坂の下には近代的でかなり大きい (とはいえ面積が広いだけで高さはそんなでもない) 建物がある。建物の一階部分はまるまる外で、グレイッシュレッドの柱がたくさん立ってる。二階以上の部分の壁の色はクリームホワイト。たくさん白いテーブルがある。料理が置いてある。人がいっぱいいる。顔見知りばっかりだ。

いくつかやること (忘れた) があった。不安がいくつかありつつもやることは無事に終わった。やることは大き目の小屋で行った。

他には、ロッカー、携帯電話、パーカーぐらい。

  1. トップ
  2. self
  3. 夢、坂、広場

XML は中間データとして使うようにしてみる。もちろんデータを XML で書いてもいいし、てきとーにデータベースから XML 生成するような実装をすればデータベースを元データとして使えるように。

例えば XMLDB みたいなクラス作っといて、get_latest_xml($num), get_month_xml($year, $month) みたいなメソッドを実装 (できればインターフェイスだけ定義したクラスを作っておきたいけど PHP4 じゃ無理くさい) しとく。それぞれのメソッドは決まった XML を返す。

スクリプトは設定に応じてどのクラスを使うかを決めてインスタンス化&メッセージを投げて XML を得る。あとはそいつを XSLT エンジンに丸投げして、結果を設定した Content-type で出力。

別に PHP でなくてもいいんだけど、Ruby は三郎拡張がローカルで動かないから……

  1. トップ
  2. web
  3. 日記スクリプト思考
  1. トップ
  2. prog
  3. 日記スクリプト思考

新しくするスクリプトではカテゴリではなくてタグという形にしてみる。そもそもカテゴリ的な使い方 (ツリー構造) で使っていないのでそのまま要素を tag 要素にするだけ。

理由は、カテゴリのツリー構造を表現するのが面倒くさいし、実際のところカテゴリのツリー構造ってあんまり上手くいかなかったりするから。

  1. トップ
  2. web
  3. カテゴリ? タグ?
  1. トップ
  2. prog
  3. カテゴリ? タグ?

なにやらeval('$db = new ' . $config->dbclass . '($config, $lang, $tags);');$db = new $config->dbclass($config, $lang, $tags); は同じっぽい。もちろん $config->dbclass はただの文字列。ナンダコレ。

それと $ext = $node->get_elements_by_tagname("extension")[0]->get_content(); がパースエラーって何よ。前にも書いた気がする。

$ext = $node->get_elements_by_tagname("extension");
$ext = $ext[0]->get_content();

上記のようにしないとダメ。

書いてて途中で PHP 捨て実行のために sablot/Ruby とか sablotron を一からやりなおしたりした。まー無理だったわけですが orz

つまり、PHP では汚いコードを心置きなく書けるわけです。あら素敵?

PHP でコードを書く理由って Sablot と mod_php のためだけなんだよね。ホント。関数の命名規則もバラバラだし、謎が多い。

  1. トップ
  2. prog
  3. PHP わけわからん。UNKE PHP

ある関数の比較

function _load_flavors() {
$xns = $this->_xpc->xpath_eval("/config:config/config:flavors/config:flavor");
foreach ($xns->nodeset as $node) {
$ext = $node->get_elements_by_tagname("extension");
$ext = $ext[0]->get_content();
$content_type =$node->get_elements_by_tagname("content-type");
$content_type = $content_type[0]->get_content();
$this->flavor[$ext] = $content_type;
}
$this->default_flavor = $this->_xpc->xpath_eval_expression("string(/config:config/config:flavors/@default)");
$this->default_flavor = $this->default_flavor->value;
}
private
def load_flavors
@flavors = {}
@doc.elements.each("/config/flavors/flavor") do |ele|
@flavors[ele.text("extension")] = ele.text("content-type")
end
@default_flavor = @doc.root.elements["flavors"].attributes["default"]
end

でもここで使ってる Ruby の REXML というパーサは名前空間をあんまり (ほとんど?) 考慮してない (だから接頭辞がついてない。読み込んでいるドキュメントはデフォルト名前空間でやっていて接頭辞がないから) REXMLXPath とか使えるしイケてるけど、やっぱ微妙な部分がいくつかあるわけです。

PHP は書いた気になれる。んで後から読むと読み難い。実際には一回の代入が二行になっていたりするから。だからといって一行に纏めても読み難い。

PHP4 には例外もない。5 からあるけど、5 でやっと?みたいな勢い。

  1. トップ
  2. prog
  3. Ruby or PHP

同一文書のフラグメントへのリンクにホバーした画像

同一文書のフラグメントへのリンクでプレビュー、とか……邪魔か便利かのぎりぎり狭間ぐらいなのでまだ適用はしてない。微妙。

適当に書いて動作したのは Opera, Gecko だけ……IE は何故か動かない。でも Opera は動的なレンダリングが苦手 (糞遅い) のでハズしてみてみた。

DOM の Range とか使ってみちゃう?とか思ってたけど IE では見事に実装されていないみたいなので普通に cloneNode() して CSSoverflow あたりで適当に表示制限。まぁ結局 IE で動いてないわけですが!

なんかの勘違いだったもよりで、IE でも正常に動作してた。キャッシュか何か読んでたカナ。

スタイルを書き換えて適用してみた。このセクションの画像とは違う。スモールスクリーンモード (謎)

Opera (7.6 preview) でもう一回試してみたら割りと普通になってたので適用してみる。

ただ、ネゴシエーションされたファイルの扱いが違うので Opera では一部プレビューされない。Opera は href="" というリンクのときネゴシエートされた後のファイル名を使うのでうまく処理できない。ぶっちゃけどうにもできないので仕様。

  1. トップ
  2. web
  3. フラグメントプレビュー

今年アレだったやつを列挙。

  • Blues Drive Monster / the pillows
  • エコー / BURGER NUDS
  • 斜陽 / ART-SCHOOL
  • SENTIMENTAL GIRL'S VIOLENT JOKE / NUMBER GIRL

この中からさらに一つに絞るなら Blues Drive Monster 。

  1. トップ
  2. music
  3. 2004.fpl

2004年12月の指向性メモ で言及されてるのを読んでもう一度仕様書を読み直してみる。

Variables introduce an additional data-type into the expression language. This additional data type is called result tree fragment. A variable may be bound to a result tree fragment instead of one of the four basic XPath data-types (string, number, boolean, node-set). A result tree fragment represents a fragment of the result tree. A result tree fragment is treated equivalently to a node-set that contains just a single root node. However, the operations permitted on a result tree fragment are a subset of those permitted on a node-set. An operation is permitted on a result tree fragment only if that operation would be permitted on a string (the operation on the string may involve first converting the string to a number or boolean). In particular, it is not permitted to use the /, //, and [] operators on result tree fragments. When a permitted operation is performed on a result tree fragment, it is performed exactly as it would be on the equivalent node-set.

強調した部分が重要らしい。最初の強調がややこしい。原文引用なのは訳文がまたさらにややこしいから (謎)

結果ツリーフラグメントに使える操作はノード集合の一部 (最初の強調) でその許される操作ってのは文字列にできるやつだけ (二つ目の強調)。あとはその後に書いてある通り、/ とかの演算子は使えない。

結局、結果ツリーフラグメントが格納されている $rtf がある場合において <xsl:apply-templates select="$rtf/child::node()"/>XSLT1.0 的にはエラーらしい。

そんなこんなで、XSLT1.0 でマトモな変換を書こうとするとかなり冗長なことをせざるを得ない状況が生まれるみたいです。めんどくさー

関係ないけど、どういう経緯でこういう制限がついたんだろう。

  1. トップ
  2. web
  3. 結果ツリーフラグメントの誤解
  1. トップ
  2. xslt
  3. 結果ツリーフラグメントの誤解

今年は (前にも書いたけど) 異様に長く感じる一年だった。IRC#汚れの巣 に突っ込んだのも、ヘッドフォン娘のアレ を書いたのも、去年かそれより前に感じる。それぐらい長く感じた。でも長く感じる割に起きている時間が少なかった気もする。殆ど寝てた。

この一年で何が変わったのか。少し技術と知識は向上しただろうけど、基本的なところでは何が変わったかよくわからない。諦めがはやくなったぐらいか。あとは常に身近な誰か (自分も含めて) が死ぬような予感がつきまとって気持ち悪かった。

キーワード。想像力とうさんくささ。とにかく頑張れなんて言葉をたやすく言わない。気付くと嫌いな言葉がいっぱいある。軽くどうでもいいけど困るのは自分だからなっていうフレーズはうさんくささがレベル最高ぐらいある気が。

とりあえず卒業はできそうでなにより。その後どうなるかはわからんわけだけど?

  1. トップ
  2. life
  3. 2004 として
  1. トップ
  2. self
  3. 2004 として