先日駅で延長コードだけひっかけられて持っていかれたので、仕方なく新しいのを買おうと思った。近くで売ってそうなところを見てみた。唯一あったとこ (ツタヤ) で 760 円だった。ぼったくりだろコレ。オス・メスプラグがそれぞれ 100円 & コード 1m で 760 円もいくわけない……ついでに今まで使っていたやつは前に買ったヘッドフォン (3k ぐらい) についてきたやつ。コードが 760 円もしたら笑える。
延長コード
xyzzy で前の行のインデントを保持して改行する。
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 で再定義。弊害あるかもしれない。
xyzzy ruby-mode
改変版のほうを使っているんだけど、indent-current-buffer とかでインデントしたとき異様に遅い (カーソルが動くのが見える) ……こういうものなのかな。部分的に一括してインデントしたいときは Mark & indent-region してみてる。むー。
てか .lc 消して試してみたら同じ速度だなぁ……バイトコンパイル効いてない? 再ダンプしてなかった。 .lc 消したらむしろありえない。
DNA checksum
DNA をデジタル化して CD か何かに記録するサービスとかやったら面白そうなのに。どっかの研究所で。
ある意味究極の個人情報だから色々めんどくさそ。
むしろ、何かこう、適当にサンプル与えるとどんどんデジタル化する機械って作れないのかな。
XML の属性の名前空間
ここ最近気になっていたのでちゃんと解消しておこう。基礎が出来てなきゃダメダメ。
まず重要なのは、属性にはデフォルトネームスペースが適用されないのにされると勘違いしていたこと。属性と要素では属する 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 を理解していればひっかかりにくい (ひっかかっても直ぐに気付ける) とこだなぁ。
:first-letter & :hover on Gecko
そんなわけでそういう修正をしてみた。
#content .section h2:first-letter {
color: #09f;
}
#content .section h2 a:hover:after {
content: "";
line-height: 0;
} 空文字でも効果があるみたい。ようは content の指定でスタイルの指定しなおし (?) が働けばいいらしい。
line-height: 0 は何か知らないけど高さが変わって、後続するやつが全部ピコピコするのをなくすため。
関係ないけど擬似をずっと模擬って読んでいた。アフォすぎ!
CSS を RDF で
なんていうか頭が悪いネタですよ。css.rdf, この RDF をそれっぽく XHTML に
REXML の謎。
何だか知らないけど 文字列から Source をそれっぽくやるハック が XREA の鯖上ではできない。uninitialized constant REXML::Parsers::TreeParser
というエラーが出てしまう。ローカルだと上手くいくんだけどなぁ……意味わからん。なんでだろう?
ってまさかと思ったら site_ruby に新しい rexml が入ってた。めんどくさ……
build メソッドを Ruby デフォルトについてくるほう (の document.rb) に書き換えた。動いてるもより。これで view-image でファイルリストも RDF として渡すように。RDF to XHTML が汚いけど仕方ない。しばらくやりたくない。
syrup16g DVD?
Ruby における elsif
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
夢。6時間と学校
CSS/Ruby
CSS/Ruby
スキャナ&パーサーだけで力尽きた…… racc css.y
ホントはアクション部分も少し書いたんだけど、どうも上手くいかないので削除って、とりあえず分離させておくことにしてみた。パーサーから構文木作るところって普通はどういう風に実装するだろう。再帰定義の部分で汚くなっちゃうんだよなぁ。スーパー簡単なサンプルが欲しい……
あーあと、Invalid なものが突っ込まれたとき、その部分を無視してパースを続ける、っていうのはどうやって書くんだろう。謎ががががが。
パースエラーは error に還元される。だから、右辺の正しい場所に error を置いとけば無視できると。CSS の ruleset を処理中にパースエラーが起きたら ruleset : error とか書いておけばそこを飛ばして次のやつを探す?みたいな? 適当にやってみよう。
error トークン書くと on_error 呼ばれないのか。なんかどういう風にエラーを処理するのかわからん。
Namazu
CRON で殺される。
何か Killed って言われるので6時から3時にしてみた。Ruby で日記の XML をセクションごとに HTML にわけるところで Killed。mknmz も中途半端に終わったらしく NMZ.lock2 が残ってた。謎。
横スクロール
XSLT と XPath の理解
とりあえずカレントノードとコンテキストノード。
カレントノード = current() で、コンテキストノード = self::node()。カレントノードは XSLT のもの。XPath には current() という関数はないし、そもそも必要ない。
current() が変わるのは xsl:template 又は xsl:for-each。選択 (select) されたノードが current() になる。
self::node() が変わるのは /, [ ]。(別に変わるとは限らない……)
基準点とノードテストがまだあんまり理解できてない……
画像をてきとーに一覧表示する。
/view-img/2003/ みたいな。
RDF は画像ファイル自身に埋め込んだのを取り出していちいち動的に合成してる。現状では同じディレクトリに samp-meta.rdf があるからそっち直接読んでもいいんだけど……実験ってことで……
合成するとき REXML 使ってるから怪しい XML (名前空間接頭辞が他のファイルと違うとか) があるとたぶんパースエラーになる。稀なケースだし Ruby のライブラリでガッチリキッチリ実装した使いやすいやつを知らないので仕方ない。
ローカル側では RDF を埋め込む (ファイル名に -meta.rdf をつけたやつを突っ込む) ときに画像サイズが一定以上だったらサムネイルを作って、その情報 (foaf:thumbnail) も追加して埋め込む。
サーバー側は同じディレクトリの画像をスキャンして RDF を取り出し、@rdf:about を書き換えて合成。合成したヤツを XSLT エンジンに渡す。あとはまぁ普通に XSLT テンプレの仕事で……
ちなみにファイル名のリストは別に XML 作って渡してる。丁度いい語彙があれば RDF に RDF として突っ込んだほうがスマートだけど考えるのが面倒だった。
だいぶソースが汚い。
Sablotron にノード集合を渡す。
XSLT エンジンにノード集合渡したいことが多々あるけど、params にナマの XML を渡しても当たり前にサニタライズされたただの文字列が渡るだけ。じゃあどうすりゃいいねんと諦めていたわけだけど、FOAF Explorer のソース見ててわかった。arguments のほうに XML とか XSLT とか渡すのと同じように渡せばいいんだ。
Sablotron は arguments を内部的に URI として (スキーム arg:) 扱っているから、そっちに適当に渡してやればやりほうだいらしい。エロイ。
$arguments = array( '/_xml' => file_get_contents($xml), '/_xsl' => file_get_contents($xsl), '/foo' => "<test><f>aa</f><f>bb</f></test>" ); $result = xslt_process($xh, 'arg:/_xml', "arg:/_xsl", NULL, $arguments);
で、XSLT 側からは document('arg:/foo') でアクセスできる。結局 <xsl:param name="foo" select="document('arg:/foo')"/> とかやっとけば OK。Sablotron イイ
暇なので最近のめも
cygwin sablotron
動かない。sabcmd は (たぶん) 動いてるけど、Ruby の sablot 作ろうと (ruby extconf.rb で) すると libsablot.a で大量にエラーが出る。検索しても何か妙に情報なし。壮大な勘違いでもしてるんだろうか?
ローカルにこれ入れられないといちいち XREA にうぷしてやらなきゃいけない……嫌だ。wakewakame.
画像メタデータを表示
とりあえず中途半端だけど書いた。画像に含まれる RDF を抽出して表示するだけ。そのうちちゃんと整形させたい。
nulog の画像参照については全部こっちにリンクが張られるようにした。nulog のデータの href とか src はそのままにして、img を含むリンクや、img 単体が存在する場合に view-img を付けてリンクをはる (はりなおす)
URI が微妙だよなぁ……もっといい感じにならないかなぁ。
特定ディレクトリ以下の画像を一覧表示 (サムネイルで。なければない旨の画像? サイズもちゃんと書いておいて条件分岐? 面倒) とかも面白いかなぁ……形にならないとよくわからない。
FOAF Explorer でのエラー
なんかエラーでるので原因を特定すると、foaf:nick に rdf:Alt があるとエラーになる。FOAF Explorer の XSLT を見てみると <xsl:template mode="title" match="*"> というテンプレートの中身が悪さしてる。xsl:choose で選択しているので上のほうに書いてある要素で rdf:Alt を含まなければエラーにならないんじゃないかと思ってやってみたらヒット。foaf:name は書いていなかったので適当に書いておいた。この回避法だと foaf:name を既に書いていてエラーが出る場合無理。あっちの対策を待ちましょうみたいな?
でもこっちで回避するより何かフィードバック送ったほうがいいだろうなぁ。っていっても既に誰か送ってると思うんだけど……むしろエンジンのエラーな気がする。
XSLT での name()
マジメな実装をするなら name() を select や @test で使う機会はまずないはず。 (もちろん name() をそのまま出力する用途では使うけど) そのかわりにちゃんと namespace-uri() と local-name() を使うはずだから。
今まで name() を使うときなんかひっかかりつつ使っていたけどやっと変なことに気付いた。
Namazu について
今まで散々 namazu と書いてきましたが、全部 Namazu の意味です。コマンドラインなんてつかたことない。