先日駅で延長コードだけひっかけられて持っていかれたので、仕方なく新しいのを買おうと思った。近くで売ってそうなところを見てみた。唯一あったとこ (ツタヤ) で 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

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

何だか知らないけど 文字列から 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時間と学校

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

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

スキャナ&パーサーだけで力尽きた…… 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

何か Killed って言われるので6時から3時にしてみた。Ruby で日記の XML をセクションごとに HTML にわけるところで Killed。mknmz も中途半端に終わったらしく NMZ.lock2 が残ってた。謎。

  1. トップ
  2. web
  3. CRON で殺される。

img 要素がはみ出したり、Gecko では URI が折り返されなかったりで横スクロールがでるけど確実にうざいので対策。

CSSimg { max-with: 100% }, p, dt, dd, li { overflow: hidden } にしてみた。どんな弊害があるかしら。

と思ったら後者で float したところに流れ込まなくなった。なんでだろう。

float させてる中に画像があると大きさが 0 になっちゃうか。だめだなこりゃ。さくじょー

  1. トップ
  2. web
  3. 横スクロール
  1. トップ
  2. soft
  3. 横スクロール

とりあえずカレントノードとコンテキストノード。

カレントノード = current() で、コンテキストノード = self::node()。カレントノードは XSLT のもの。XPath には current() という関数はないし、そもそも必要ない。

current() が変わるのは xsl:template 又は xsl:for-each。選択 (select) されたノードが current() になる。

self::node() が変わるのは /, [ ]。(別に変わるとは限らない……)

基準点とノードテストがまだあんまり理解できてない……

  1. トップ
  2. web
  3. XSLT と XPath の理解
  1. トップ
  2. xslt
  3. XSLT と XPath の理解

/view-img/2003/ みたいな。

RDF は画像ファイル自身に埋め込んだのを取り出していちいち動的に合成してる。現状では同じディレクトリに samp-meta.rdf があるからそっち直接読んでもいいんだけど……実験ってことで……

合成するとき REXML 使ってるから怪しい XML (名前空間接頭辞が他のファイルと違うとか) があるとたぶんパースエラーになる。稀なケースだし Ruby のライブラリでガッチリキッチリ実装した使いやすいやつを知らないので仕方ない。

ローカル側では RDF を埋め込む (ファイル名に -meta.rdf をつけたやつを突っ込む) ときに画像サイズが一定以上だったらサムネイルを作って、その情報 (foaf:thumbnail) も追加して埋め込む。

サーバー側は同じディレクトリの画像をスキャンして RDF を取り出し、@rdf:about を書き換えて合成。合成したヤツを XSLT エンジンに渡す。あとはまぁ普通に XSLT テンプレの仕事で……

ちなみにファイル名のリストは別に XML 作って渡してる。丁度いい語彙があれば RDFRDF として突っ込んだほうがスマートだけど考えるのが面倒だった。

だいぶソースが汚い。

  1. トップ
  2. sw
  3. 画像をてきとーに一覧表示する。
  1. トップ
  2. web
  3. 画像をてきとーに一覧表示する。
  1. トップ
  2. xslt
  3. 画像をてきとーに一覧表示する。

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 イイ

  1. トップ
  2. xslt
  3. Sablotron にノード集合を渡す。
  1. トップ
  2. web
  3. Sablotron にノード集合を渡す。

メタデータと密着した画像管理システム。例えば複数の画像から一つの画像に合成したら dc:source 使って元の画像の URI を記録しておくとか。ライセンスも画像に一緒に記録しとけば一番いいはず。

更にキーワードとかを書いておけば画像を検索できたりとか。

結局のとこ、Flickr に似たような感じになるわけだけども……

  1. トップ
  2. web
  3. 暇なので最近のめも

動かない。sabcmd は (たぶん) 動いてるけど、Ruby の sablot 作ろうと (ruby extconf.rb で) すると libsablot.a で大量にエラーが出る。検索しても何か妙に情報なし。壮大な勘違いでもしてるんだろうか?

ローカルにこれ入れられないといちいち XREA にうぷしてやらなきゃいけない……嫌だ。wakewakame.

  1. トップ
  2. soft
  3. cygwin sablotron

メタデータを含む画像の例

とりあえず中途半端だけど書いた。画像に含まれる RDF を抽出して表示するだけ。そのうちちゃんと整形させたい。

nulog の画像参照については全部こっちにリンクが張られるようにした。nulog のデータの href とか src はそのままにして、img を含むリンクや、img 単体が存在する場合に view-img を付けてリンクをはる (はりなおす)

URI が微妙だよなぁ……もっといい感じにならないかなぁ。

特定ディレクトリ以下の画像を一覧表示 (サムネイルで。なければない旨の画像? サイズもちゃんと書いておいて条件分岐? 面倒) とかも面白いかなぁ……形にならないとよくわからない。

  1. トップ
  2. web
  3. 画像メタデータを表示

なんかエラーでるので原因を特定すると、foaf:nick に rdf:Alt があるとエラーになる。FOAF Explorer の XSLT を見てみると <xsl:template mode="title" match="*"> というテンプレートの中身が悪さしてる。xsl:choose で選択しているので上のほうに書いてある要素で rdf:Alt を含まなければエラーにならないんじゃないかと思ってやってみたらヒット。foaf:name は書いていなかったので適当に書いておいた。この回避法だと foaf:name を既に書いていてエラーが出る場合無理。あっちの対策を待ちましょうみたいな?

でもこっちで回避するより何かフィードバック送ったほうがいいだろうなぁ。っていっても既に誰か送ってると思うんだけど……むしろエンジンのエラーな気がする。

  1. トップ
  2. web
  3. FOAF Explorer でのエラー
  1. トップ
  2. xslt
  3. FOAF Explorer でのエラー

マジメな実装をするなら name() を select や @test で使う機会はまずないはず。 (もちろん name() をそのまま出力する用途では使うけど) そのかわりにちゃんと namespace-uri()local-name() を使うはずだから。

今まで name() を使うときなんかひっかかりつつ使っていたけどやっと変なことに気付いた。

  1. トップ
  2. web
  3. XSLT での name()
  1. トップ
  2. xslt
  3. XSLT での name()

今まで散々 namazu と書いてきましたが、全部 Namazu の意味です。コマンドラインなんてつかたことない。

  1. トップ
  2. web
  3. Namazu について

tDiary のデータを楽チンにインポートできないかなぁと思ってデータファイル見ていたのだけど、二年前の日記とかキモすぎて段々へこんでくる。だからもうインポートとかできなくていいや……

  1. トップ
  2. life
  3. 日記とか
  1. トップ
  2. self
  3. 日記とか