2006年 03月 01日

てきとう E4X

どうにも使い道が少ない E4X をちょっとメモる。

基本的に XPath (の省略記法) に似ているので、相違点とかあげつつみたいな。XPathE4X に似せるため省略記法を使います。省略しないと全然違う

var doc = <root>
<foo>hoge</foo>
<bar>huga</bar>
<baz>
<foo name="neko">
<bar>pqpq</bar>
</foo>
</baz>
</root>;
doc.baz..foo
/root/baz//foo
E4X ではルートノードがない。
doc..foo.(@name == "neko")
//foo[@name = 'neko']
E4X では括弧の前にドットがいる。括弧の中は ECMAScript の式そのまま。すなわち or||, and&&
doc.*
/root/*
* はそのままの意味。@* もそのまま書ける。
doc..foo[0]
//foo[1]
数値は普通の ECMAScript 配列とかとと同じように 0 基準。
doc..foo.length()
count(//foo)
XPath の例はどうでもいいけど、数を知りたいときは length() を使う。括弧をつけず length と書くと length 要素を選択しようとするので注意が必要。

for each とかいう構文がある (構文?)

for each (ele in doc.*) {
// hoge
}

XMLList とかいうオブジェクトがある。無名の要素をルートにして作る。ちょっときもい。

// XMLList (DOM の DocumentFragment みたいなの)
var xmlList = <>
<li>1</li>
<li>2</li>
<li>3</li>
</>;
var doc = <root>
<li>999</li>
</root>;
doc.appendChild(xmlList);
doc.toString() //=>
<root>
<li>999</li>
<li>1</li>
<li>2</li>
<li>3</li>
</root>

名前空間

var rssDoc = <rdf:RDF
xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel rdf:about="http://example.com/">
<title>Example</title>
<link>http://example.com/</link>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://example.com/3"/>
<rdf:li rdf:resource="http://example.com/2"/>
<rdf:li rdf:resource="http://example.com/1"/>
</rdf:Seq>
</items>
</channel>
<item rdf:about="http://example.com/3">
<title>ex3</title>
<link>http://example.com/3</link>
<dc:date>2006-03-01T13:52:32+09:00</dc:date>
</item>
<item rdf:about="http://example.com/2">
<title>ex2</title>
<link>http://example.com/2</link>
<dc:date>2006-03-01T13:52:30+09:00</dc:date>
</item>
<item rdf:about="http://example.com/1">
<title>ex1</title>
<link>http://example.com/1</link>
<dc:date>2006-03-01T13:52:24+09:00</dc:date>
</item>
</rdf:RDF>;
var rdf  = new Namespace("http://www.w3.org/1999/02/22-rdf-syntax-ns#");
var rdfs = new Namespace("http://www.w3.org/2000/01/rdf-schema#");
var rss  = new Namespace("http://purl.org/rss/1.0/");
// var dc   = new Namespace("http://purl.org/dc/elements/1.1/");
for each (i in rssDoc.rss::channel.rss::items.rdf::Seq.rdf::li) {
var item = rssDoc.rss::item.(@rdf::about == i.@rdf::resource);
alert(item.rss::title);
}

見ればわかるように Namespace オブジェクト作って :: を解決に使うみたい。使わないなら別に宣言しなくてもいい。あくまで E4X でアクセスするために名前をつける (=変数に代入する) ので、別にどんな名前でもいい。

var h = new Namespace("http://www.w3.org/1999/xhtml");
default xml namespace = h;
var HtmlDoc = <html>
<head>
<title>E4X</title>
</head>
<body>
<h1>for (;;)</h1>
</body>
</html>;

みたいなこともできるみたい。

XPath における following-sibling 軸のようなメソッドはないっぽい?とりあえず眺めてみたらないっぽい。よくわからん。

しかし、GreaseMonkey で E4X を使うにしても、XMLHttpReqeust のハンドラぐらいでしか使えなくてなんともかんとも。もちろん生成するのは自由なんだけど……

@ の働きがいまいちわからない。ちゃんと仕様読もう

2006年 02月 28日

けいたいかえた

そういえばおとといぐらいに携帯変えた。前に解約云々言っていたけれどなかったことに。

別に特別変えたかったわけじゃないのだけれど、二週間に一回ぐらい機種変する?とか親父が聞いてくる (去年ぐらいから) ので変えてみた。俺には基本的にメリットしかないわけで……よくわからん。

前のやつは 4年ぐらい前 J-Phone 時代なやつでして、予測変換さえないおもろい携帯でした。まぁ携帯でメール書かないので困らなかったわけですが。まぁ携帯にメール来ることがないので困らなかったわけですが。まぁ携帯に電話来ることがないので古くても困らなかったわけですが。

友達がいない僕は携帯を連絡手段じゃなくてカメラとして使います。あーあと時計?なんか俺は腕時計つけるのが苦手らしくて、今は腕時計を持っていない。というか同じような理由で靴下も履かなかったんだけど、冬はさむずぎるので履くようにした。意味わからん。

flickr で CC じゃない写真を消す GM スクリプト

ignore-not-cc-photo.user.js

実際は消すんじゃなくて半透明にします。適用先は他の人の写真一覧のページ (/photo/username/)

以下スクリプトの説明

実は Set があるときとないときとで構造化の度合いみたいなのが違っててややこしい。具体的には Set がない人の一覧では div.StreamView 一個に対し、一つの写真と写真の情報が含まれる望ましい構造であるのに対し、Set がある人の一覧では、写真一覧が全部 div.StreamView 一個に含まれている。

ということで、Set がある場合とない場合にわけてる。きもいー。

Set がある場合、div.StreamView 以下の要素を一旦構造化する。

  1. DocumentFragment を作っておく。
  2. div.StreamView 以下列挙してループ
  3. h4 がでてきたら div (class="__GM_Photo") という要素を作る
  4. 他の要素だったら div.__GM_PhotoappendChild (一旦ノードは削除される)
  5. また h4 がでてきたら DocumentFragment に突っ込む
  6. ループ終わったら残ってる div.__GM_PhotoDocumentFragment に突っ込む
  7. div.StreamViewDocumentFragmentappendChild (戻す)

DocumentFragmentDOM における無名ノードみたいなもの。名前そのまんまだけど!!!

appenChild は既に同じドキュメントにあるノードを追加するとき、一旦そのノードを取り除く。すなわち移動したいときはいちいち削除する必要はない。逆にコピーしたいときは cloneNode する必要がある。

そいでもって、Set がない場合は div.StreamView のクラス名に __GM_Photo を追加するだけしとく。

あとは、Set のあるなしに関わらず、CC の画像を含んでいない div.__GM_Photo にアレしてコレした的な何か。

2006年 02月 25日

FEEDBRINGER で未読がないフィードを非表示に

FEEDBRINGER で未読がないフィードを非表示にする GreaseMonkey スクリプト。feedbringer-hide-read.user.js。まぁ誰か作ってるだろうけど……

最近 Sage から FEEDBRINGER に移行したのだけれど、俺はフォルダ分けを全くしない横着ものなので、未読がないフィードが邪魔で未読フィードがどれぐらいあるのかぱっとみわからない。そんなわけで GM

消すだけじゃなくて、トグルできる (Toggle Read Feeds クリック) ので、導入しても弊害は少ないかなと思う。

Bloglinesの「Show only updated feeds」をチェックしてない人が多すぎる を見てからなんとなく考えてた。

FEEDBRINGER 用 User CSS

ユーザーCSSを適用した FEEDBRINGER

feedbringer.css。すごく、きたないです。

/feed にしか適用しません。かなりソースがアレで苦労した。ソースがアレな上に、JS で擬似フレームの大きさを変えているので、そのあたりがかなり汚い……素直にフレーム使ったほうがいい気がする。

いろいろ変更。フォルダの矢印とか。

  • フォルダを閉じた状態だと、フォルダの次のアイテムのアイコンが乱れる。
  • 擬似フレームのリサイズ不可 (#splitter がキモイので消してある。一時的に stylelish を切ることで対処すべし)
2006年 02月 24日

面白いとき

  1. 機能を考える (だるい)
  2. 「これはいいんじゃね!?」と思う (たのしい)
  3. インターフェイス考える (だるい)
  4. はやく動かしたいと思いながら実装する (たのしい)
  5. 追加機能を考える (わりとたのしい)
  6. 2 番目へ

理路整然とした

もっと理路整然と文章書けるようにならないといけないなぁってよく思う。頭悪いんだ。こう、理解できる限界線ってのがイメージとして見えていて、そこらへんを漂う思考っていうのは、もう少しもう少しって思えても全然まとまらない。数学とかやってるとその線が明確に見えてきてすごく嫌な感じ。あの理解できないっていう気持ち悪さはなんともいえない。

落ち着きが足りない、と言われる。

何か伝えようとする努力が足りないんだろうか。どうも書くだけ書いて、これで理解されないならいいやって思うことが多いように感じる。

だからレポートとかってすごく苦手なのですよ。あとで読み返したくないレポートができあがる。思い出したくない何かができあがる。気持ち悪い何かができあがる。

日記だからってのはよくないな。

Google Adsense / XHTML

document.write を使ってるおかげで、application/xhtml+xml だと使えないあの広告コードをどうにかして導入する。

まー Keystone Websites: Making AdSense work with XHTML をまるパクって、/google-adsense.html を作って、あとは object 要素作っといた。

<xsl:template name="adsense">
<div class="google-adsense">
<xsl:choose>
<xsl:when test="$real-flavor = 'html'">
<script type="text/javascript"><xsl:comment><![CDATA[
google_ad_client = "pub-4629424540171624";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text";
google_ad_channel ="";
google_color_border = "000000";
google_color_bg = "F0F0F0";
google_color_link = "0000FF";
google_color_url = "008000";
google_color_text = "000000";
]]></xsl:comment></script>
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
</xsl:when>
<xsl:when test="$real-flavor = 'xhtml'">
<object
width="468"
height="60"
data="/google-adsense.html"
type="text/html"></object>
</xsl:when>
</xsl:choose>
</div>
</xsl:template>