素通り禁止です>< 必ずゲスブに一言書いてください。ネチケット 2.0 です><
Flickr の Creative Commons を使う理由
自分の写真で CSS 書いても、あんまり面白くない。自分が撮った写真には、自分しかいない。
他人の写真は、少なくとも自分と撮影者の二人が確実にいる。さらに、同じようにその写真をいいと思う人たちにそれぞれがいる。そういうのもあってかで、他人の写真は適度に刺激があって面白いんだと思う。写真って、その人が見ているものを写しているから、他人の視点というのがよくわかる。ただたんに「いい写真だなぁ」と思って、その後自分でその場に居合わせたときどうやって撮るかを比較するっていうのも面白い。
それと写真に直接言葉は書かれていないということ。
写真は曖昧な伝達・表現手段だけど、それゆえに解りあった気分になれる。ひとつの写真を通して、それぞれかなり思うところが違っていても「いい写真だなぁ」と思うところが変わらない。そういうのが重要だと/いいと思うんです。人によって解釈が違う写真 (作品) のほうが、面白い。どの解釈が正しいかなんてチリの価値もないと思う。
あんまり関係ないけど、完全に分かりあう必要性が見出せない。「どこかで分かり合えるはずだ」と思い合って議論をするなら、「どこかで分かり合えるはずだ」っていう部分は共通しているんだから、それでいい感じがする。実際俺はホンモノのちゃんとした、意味のある議論を見たことがないから、議論っていうのがどういうものなのかわからない。でもそれについて、「ホンモノの議論が何か」を議論するつもりはないし、別段わかりたくもない。
話がずれたけど、他人の写真や画像を使って派生物を作るのは面白い。「あーしてみたい」「こーしてみたい」っていうのをできるわけだから、すごくワクワクする。でもこれが All rights reserved なものだと、改変しても公開できなくてつまらない。その「あーしてこーして」っていう欲求よりも、許可をとるっていう行為は遥かに面倒くさい。
そういう面倒くさいうえにつまらない手続きを省いて、純粋に楽しいことをできるから、CC な画像を使ってる。Flickr は Creative Commons 用のページ があって使いやすい。
でもまぁ、途中でライセンスが変わるのが怖くてなんともかんともな感じに今はなっている次第でございます。favorites は増やしているけど!
どの CC が適用されているか一目でわかるようにする
Creative Commons on Flickr
サイトの CSS を一つ前に戻した。とはいえ alternate になっているだけだけれど。
その CSS で使っている画像が All rigthts reserved になっていて、しかも許可をとっていなかったからだ。でもこの写真、もともとは Creative Commons で公開されていたはずなんだよね。いつのまにか All rights reserved になっていることに今日気付いた。(flickr の favorites を整理していた)
こういう場合、俺は派生作品をどう扱えばいいんだろうか。俺は著作権侵害で訴えられる可能性がある?
ここで、例えば訴えられたとき、「俺が見たときは CC でライセンスされていた」と主張しても、確実に証明ができる気がしない。今だって、実は最初から CC じゃなくて、自分の勘違いだったんじゃないか、と自分でも少し思ってしまう。
ライセンス関連の勉強不足のせいか、いまいち途中でライセンスが変わったときの対応方法がわからない。そもそもライセンスを途中で変えていいのかとか、そういうのも含めてよくわからない。厳しいライセンスから緩いライセンスにするのはよさそうだけど、その逆は無理な感じがする。
Flickr の場合、デフォルトのライセンスを設定しておくと、アップロード直後は必ずそのライセンスで一度公開されてしまう。だからもし、デフォルトライセンスに CC をしていたら、少なくとも一瞬はそのライセンスで公開される。
俺の Flickr のデフォルトのライセンスは最初から CC-by だから、途中にあるいくつかの All rights reserved な写真は「あとから変えた」ものになる。だから、一瞬のスキで見た人は俺と同じような思いをしているかもしれない (とはいえ Flickr は何人見たかが表示されるけど)。特別にシビアな理由があってそうなっているわけじゃないから何時でも CC にできるけど、なんか気持ち悪い。
そういう場合は、デフォルトのライセンスを All rights reseved にして、あとから CC に変えないといけないのかな。面倒くさい。Flickr はポスト時にライセンスを指定させるべきで、そのときのデフォルトを設定のデフォルトにすべきなんじゃないかなぁ。緩いライセンスから厳しいライセンスにできないとしたら、だけど、普通に考えるとできるように思えない。(じゃあなんでやってるの、って言われそう)
ライセンスを変えるのは、システム的にはいつでもできる。途中から CC にしようが、All rights reserved になろうが、どうにでもできる。
途中でライセンスを変えられて、権利主張されたら、主張された方はどうしようもないよなぁ。誰が CC で公開していたことを証明してくれるんだろう。定期的に巡回してライセンス表示を確認して、「まだ大丈夫だ」なんてビクビクしながら利用しないといけないんだろうか。
と、一般ピーポーな俺は思ってしまうわけでした。とりあえず完全にライセンスを気にしなくて良い CSS を一枚書かないとなぁ。
CSS をでっちあげた。
今回は他人のものを使わず、安全に作ってみた。
- IE でオーバーレイ検索がダサイ。
日記以外のページの最初の見出しがきもいOpera がおかしい。
何バトンかわからないけど空気が読めないバトン
空気が読めない日記 (mixi) をこたえる。久しぶりにバトンだ。
- 【Q1】今つきあってる人はいる?
- えぇ。もちろん nounai サーバーに、ですけれど。名前は教えませんわ。
- 人じゃなくていいなら Ruby さんとか。
- 【Q2】今好きな人、気になる人はいる?
- BURGER NUDS にでてくる女の子が好きです。nounai。
- まじれすすると、そもそも周りに女の子がいません。最後に女性と話したのはいつかな?
- 【Q3】a:告白した回数 b:告白された回数は?
- {a => 1, b => 0} どういうのをカウントするんだろう? 明確に好きだと言ったことはないと思う。あれ、あった気もする。でもあれはカウントしていいんだろうか。あんまり覚えてないんだけど、っていうか、今まで忘れてたけど、最悪だな。とか、まぁ、キラめく世界。
君の好きなあの娘の 写真はもうここにはない まあでもキラめく世界
一応カウントしといた。ああ - 【Q4】a:振った回数 b:振られた回数は?
- {a => 0, b => 0} これもカウント方法がよくわからない。ある意味常に振られているので b は数え切れないとも言えますが!!
- 【Q5】どんな顔・体の異性が好き?
- 俯いてはにかむ笑顔が似合う子・黒髪 (というより地の色)・肩幅が狭い子。
- 黒髪の美しさに気付くべきなんだ (独り言)
- 【Q6】異性の体で好きな部分は?
- 髪の毛・肌
- 【Q7】昔付き合ってた人と復縁する可能性アル?ナイ?
- nounai の話ですか?
- 【Q8】好きな人ができたらどうやってアタックする?
- 対話
- 「アタック」とか面倒くさいから、対話のなかで「なんかいいなぁ」って思える人がいい。実際そんな人ってもう現れないと思うけどさ。
- 【Q9】今告白されたらOKしちゃう異性、今回りに何人いる?
- だからそもそも(ry
- 【Q10】年上・年下どっちが好き?
- ±2ぐらいがベストだけど、どちらかといえば年上で!
- 【Q11】浮気されたらどうする?
- わからないけど、まぁそんなもんなのかなって思う。でもできれば「そんなもんなのかな」と思わないぐらいの人と付き合いたいものだ。無理だ。
- 【Q 番外】ずばり今年のちょこれいとの数は?
- ちょこれいと? たべたかず? きょうもたべたよ。きのうもたべたよ? せいさんりょうのはなしかなぁ。
- 【Q12】次にまわす人5人
- 回せそうな人がだいたい nounai 系なんですが!!
生まれ変われるなら、可愛い女の子に生まれたい。
textarea の大きさの呪縛から逃れるための GM スクリプト
flickr の textarea がいちいち小さいので作ってみた。textarea の右下のはじっこのほう (謎) をドラッグすると大きさが変わる。
なんで getElementsByTagName を使っていないのかというと、forEach が使いたかったから!! getElementsByTagName が返すのは NodeList であって、Array じゃない。
もうちょいまともにするように修正。
それと「左下」って書いてたのを修正した。ひだりもみぎもわかりませんがなにか?
拡張では Resizeable Textarea 0.1a, Resize textareas to your needs っていうのがあるみたい。ってことを IRC で klm さんに教えてもらった。
ソースの色づけに伴い
コピペのしにくさが激しいので、オリジナルソースへのリンクをつけた。data スキームで飛ばす。
あるいはコピー用の Flash を使ったほうがいいかもしれない。
mabinogi, ポポスカートについて

ポポスカートが好きなんですよ。低価格・高耐久なのに、とても素敵だと思うのですよ。裁縫で作れば防御も稼げるし言うこと無しですよ。防御高いポポスカのために裁縫を7にした感じですよ。メインキャラのポポスカは銘入りですよ。
なんとなくスクリーンショットあさってたらポポスカツーショットが数枚でてきた。

- 少し前のあの世のアルベイ祭壇前にて。一言も喋らず (めんどくさかった) にコミュケーションをとりつつ、とか奇妙なことをやってた。

- 去年の。ポポスカに関しては、実はこの横に写っている人の影響が強く、勝手に自分の中 (とギルドの一部中) で「ポポスカの先駆者」を呼んでいたりしました。やー、作ったポポスカが気に入ったのでずっと着ていたらなんと向こうから話しかけられまして、先駆者きたーっとギルチャで言ったか言わなかったかしました。たまに見かけますが未だにポポスカのようです。
関係ないけど、画像のレイアウトがうまくいかない。IE で float: right はご法度だし、CSS がだんだんスパゲティになってきて !important が多くなってきて萎える。
よく使うジェスチャ・最後の日
これなしで生きていけないジェスチャ
- ← - 戻る
- ↓→ - 現在のタブを閉じる (ウィンドウは閉じないようにカスタマイズ)
- ↑←↑ - 一つ上の階層を開く
- ↑↓ - リロード
思いついたようにときどき壮絶に使いまくるジャスチヤー
- Any Gestures + →↑← - Any Gestures でホバーしたリンクをすべてタブで開く。mixi とか、■ばっかり並んでる絵サイトとかで使いまくる。
このホバーしたリンクを全部開くのは魔法ちっくで好き。こうね、杖をふる的な、ね。
だいじなことを書き忘れていた。ようするに言いたいことはハーマイオニー可愛いよってことで、それ以上でも以下でもない。
何かを書きたい
何かを書きたい。
- 理想の女性像を明確に想像できないことに気付いた。萌える女の子は明確だけど、あぁだめだ自分きもすぎる。
- なにかしら美しいものを見つけたい。
- 目を閉じるととにかく手がある。
- 俺は正常かつこの上なく普通な人間である。
- 日記が日記として機能しなくなるのは悲しいことだ。
- タイミングさえあっていればあとはてきとーでもいい。
- それっぽい口調が重要らしい。
- 名前が重要であって中身は重要じゃない。
- だからそれっぽい口調では書きたくないし、名前もてきとーなままにしておきたい。
- 俺がなぜウェブに日記を書くというキモイ行動をしているかを、誰かは考えない。
- それでいい。余計な分析はいらない。
- 表に出していいものと、出すべきじゃないのがある。
- 分かり合えるかもしれない、ぐらいの状態でコミュニケーションを止めるべき。
- 他人に気を使うのは果てしなく面倒くさい。
- 自分で考えることができる可能性をすべて考慮しても、考慮しすぎるということはない。
- グロゲーと殺人ゲーは苦手。
- 誰か一人でいい。
- まいっか。
- あらゆるやるべきことに対してやる気が起きない。それがかつてやりたいことであったとしても、やるべきことになったとたんやる気が起きなくなる。内容じゃなくて、情況・環境がじゅうようなのだ。
- 別に君に訊いてはいるわけじゃないんだから、わざわざ嫌な顔して答えなくてもいいよ。
- そんなこと、誰も訊いてないよ。
- 余計なことは言わないようにしよう。何度決めたかわからないけど、特に、つまらない話に関しては気をつけよう。
- メレンゲについて何度か書いては消しを繰りかえしているけど、うまく書けない。
- そういえば
地下室で死んだふりしようよ 外は怖いことだらけ
って面白すぎるよなぁ。笑っちゃうよなぁ。このフレーズ大好きなんだけど笑える。日々の唄ってこれだよこれ。これこれ詐欺。 はずかしそうに水たまりをよけながら
よすぎる。ああ。あああ。- Omae Ga Dai-Kirai Da / bloodthirsty butchers
- マナーについて考えようよ。「マナーについて考えようよ」と何かあるごとに言うのが、真にマナーがない。
- お察しください。
- 鯖の金を払ってない。早く払えよ。無駄なことばかり、書きすぎて、腹出てるぜ。そんなこといったって、ケーブル切る気に、なれないなぁ? もうだって、両手は、
- 誰かの言うことを聞きたくないなぁ。
- 知りたくないことを教わるのが好きじゃない。
- だから、ね、あなたに、僕は、何も訊いていないんだよ?
- (a, b) だったらお前らは
- 独学できないやつが何できるっていうんだ。やる気があるなら独学でできるだろ。
- 少し前までは「忙しい」っていう社会人の人は本当に「忙しい」んだと思ってたけど、実際は「忙しい」ぐらい忙しくないってことに気がついた。
- そこでまた、誰かが言うんだよ「社会人の人」っておかしくね、ってね。
- やろうとすれば、いくらでも他人を貶すことができるから、何が本当に悪いのかを見極めたい。そのためにまず、何が良いのかを考えたい。
- ということを力がないうちから言っていると、そもそも生きていけないらしい。つまり、むしろそのことで自分は損害を被るってことさ
- まぁそれでもいいか。いざとなって耐え切れなくなったら死ねばいいのだ。許可はもらったからだいじょうぶ。
- どちらかといえば、理想的に生きていたい。現実的だと、何か得をするんかな?
- 今なら、なんでもできそうだ。忘れないようにしとこう。
- 今日成績通知がくるだろうけど、それの結果が良くても悪くても、先の数日は地獄だ。結果が良かったらクソやりたくない課題をやらないといけないし、悪かったら
- やーほんと、課題をちゃんとこまめに出来る人ってすごいよなぁ。そういうシステムってどうやって得たのかな。「課題ができる」ことじゃなくて「課題が進められる」ことがすごい。すごすぎる。どうやったら手に入ったのかなぁ。セーブしとけばよかった。LV30 飽きてきた。
- 無理さ
成績通知がきたよ
A -> Z
必要なのは技術じゃないってことは分かっているつもりだけど、俺はその必要なものを手に入れるのが嫌なわけで、そのへんどうにかしないといけないんだけど、その辺どうにかすると俺は俺でなくなるわけで、まぁ俺が考えている俺は所詮誰かが作った俺でしかないんだけどさってことを昨日友達の父親の友人の吉弥さんが言ってた。
コミュニケーション能力が必要とか、そういう話だけど、欲しくないのだ。真面目な話を一対一あるいは、一対多でするのがめちゃくちゃ嫌いなのだ。それって楽しくないから。
ネットワークゲームなんかで、ギルド戦について真面目に議論を交わして揉めているのとか、めちゃくちゃ嫌なわけで、悪いわけじゃないんだけど、単純にああいうのを楽しめない。そういうときはログアウトするんだけどっていうか、ギルド戦とか結局嫌で仕方ないからやらなかったんだけど、っていうかホムンクルスをプログラミングしてみたいんだけど、っていうかアカウントないんだけど、っていうか1500円はたけぇよ、いやこんなの関係ないんだけど。
ネットワークゲームなんかは「ゲーム」であるから、嫌ならばログアウトすればいい。でも実際の面を合わせた情況ではそういうわけにはいかない。そういうわけにはいかない。面を合わせて真面目な話というのは、逃げ道 (例えば相手を認める余裕だったり) を確保することすらぎりぎりのラインだから、本当に話たいことなんて、全く伝わりはしない。もともと伝わらないのがさらに伝わらなくなるわけだ。もういい。
例えばどこから沸いてくるかわからない自信とか、昔はモテたんだぜ今の俺は仮の俺だとか、とりあえず批判しとけとか、とりあえず謝っとけとか、とりあえずお前うざいとか、そういうのが苦手なのでコーヒーゼリー食いたい。
ソースの色づけを復活 2
GeSHi - Generic Syntax Highlighter を使うようにした。対応言語が多いことと、シンタックスファイルを増やし易いことがいい感じ。ただし時々 well-formed じゃないエラーがでることがあるっぽい。
.toSource(), forEach, etc
toSource とかはじめて知った。
GreaseMonkey で設定値保存するときはこれ使うといいね! わざわざ JSON 云々のコピペなんてしなくてよさげ。
var foo = new Object;
foo.bar = "test";
foo.baz = "pqpq";
foo.toSource(); //=> '({bar:"test", baz:"pqpq"})'
(new Date).toSource(); //=> (new Date(1142625169156))
(function () { return ""}).toSource(); //=> '(function () { return "";})'
alert.toSource(); //=> 'function alert() {[native code]}'
ていうか、forEach とかあるのね! やべ。
var sum = 0;
[1, 2, 3].forEach(function (item, index, array) {
sum += item;
}, this); // 第二引数は callback 中の this
alert(sum);
同じように (Ruby -> JS) select -> filter, all -> every, map -> map, any -> some が使えるみたいだ。どうせ Fx 用の GM しか書かないから使いまくろう。
ソースの色づけを復活
pre だけ色付けするようにした。
前に Pure JavaScript で色つけていたことがあったけど、あからさまにブラクラだった。で、なんとなく思いついたのでもっかい別の方法で実装してみた。
なんていうか非常にローテクといいますか他力本願な方法でして、PEAR::Text_Hightlighter に Ajax で丸投げというソリューションでございますです。
<?php
header("content-type: text/xml");
require_once 'Text/Highlighter.php';
require_once 'Text/Highlighter/Renderer/Html.php';
$options = array(
'numbers' => HL_NUMBERS_LI,
'tabsize' => 4,
);
$renderer =& new Text_Highlighter_Renderer_HTML($options);
$hl =& Text_Highlighter::factory($_GET["lang"]);
$hl->setRenderer($renderer);
$ret = $hl->highlight($_GET["source"]);
echo '<div xmlns="http://www.w3.org/1999/xhtml">';
echo $ret;
echo '</div>';
?> こんなスクリプト書いたら、あとは JS で pre 要素列挙して投げてあげる。レスポンスを importNode して、pre と置き換える。みたいな。
でもこんなクソ簡単なスクリプトなのに IE ではちゃんとうごかない。importNode がだめなのか、それとも responseXML から importNode ができないのか……謎。
あーHtml.php の &nbsp; は全部 &#160; に置き換えた。DTD がないからエラーになる。
XPath, $X function, NSResolver
JS の XPath なんて書きましたけど、重大なバグがありまして、っていうかなんで気がつかなかったんだろう、えーそれは application/xhtml+xml なページ、すなわち XML として、名前空間をちゃんと扱うページではまともにセレクトできないんですよーははははー、例えばこのサイトとかね。
$X = function (exp, context) {
if (!context) context = document;
var resolver = function (prefix) {
var o = document.createNSResolver(context)(prefix);
return o ? o : (document.contentType == "text/html") ? "" : "http://www.w3.org/1999/xhtml";
}
var exp = document.createExpression(exp, resolver);
var result = exp.evaluate(context, XPathResult.ANY_TYPE, null);
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
result = exp.evaluate(context, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var ret = [];
for (var i = 0, len = result.snapshotLength; i < len ; i++) {
ret.push(result.snapshotItem(i));
}
return ret;
}
}
return null;
}
alert($X("//x:p")); // Array of p elements
alert($X("count(//node())")); // => node number
alert($X("count(//x:body) = 1")); //=> must be true
かなり強引に修正してみた。
XPath で要素を指定するとき x という prefix (上のコードの場合は別になんでもいいんだけど、普通は x とか xhtml とかいうのをつける) を必ずつけるようにしとく。使い勝手が悪くなったけど、仕方ない。prefix がないときは resolver をよんでくれないみたいだ。
そう、で、resolver なんだけど、実はただの関数だった。evaluate は prefix を見つけると、resolver に prefix を渡し、URI を返すように要求する。resolver は prefix に対応する URI を返す。null の場合はエラー, "" の場合は、名前空間が null のものとして扱われるみたい (要追試)。
つまり、上のコードの resolver がやってることは、とりあえず普通の場合のように NSResolver を作って投げてみて、ダメだったら contentType にあわせて名前空間を返してやるっていう、かなり強引な (二回目) 方法なわけです。誰かもっと美しくして!
使い勝手が悪くなったけど
と書いたけど、XSLT で使うような XPath と同じになった。まぁ名前空間を考慮するとこういうことになるっていう名前空間マジックなんだけど、やっぱり面倒くさいよなぁ。
$X("count(//x:body) = 1") を $X("count(//*[local-name() = 'body' and namespace-uri() = "http://www.w3.org/1999/xhtml"]) = 1") みたいに書きたくはないし、HTML なページと XHTML ページとで、同じ XPath を使おうとするとこんなもんになってしまうような気もする。
冷静に考えると x より h のほうがいいや。
Ruby で、Ruby に限らず
やっぱ最初のころは Ruby のブロック引数が全く理解できんかった。yield をよぶとどこに飛ぶか、とか結構悩むと思うんだ。
each の「使い方」を先に覚えて、実行してみてやっとブロック引数の概念が理解できた。んで、「じゃあ自分で書くときはどうするんだ」とかでリファレンスを読むと yield とか書いてあって、でもそれ以上はリファレンス読んでもよく分からなかったから、てきとーにサンプル作ってみてやっと理解した。
それまで書いていたのが PHP とかいう謎言語だったので、Ruby が余計に神がかってみえた。Perl は読めなかったし、Python は知らなかったし。今は Perl とか Python を勉強しようと思っても、必要性が見当たらなくて書けない。所詮「勉強」にすぎなくなるから、やる気があんまり起こらない。しかし Perl はホントに、本当に読めない。map { hoge } hage {} @foobar みたいなのをよく見るけど、どういう仕組みで評価されてるのかよくわからない。
まぁ、とりあえず、自分は実装を触りながらじゃないとぜんぜん理解できない。頭が悪い上に「自分の今考えてること」に対してかなり不安を覚えるので、すぐにコンピュータで実行させて、考えていることがあっているのか間違っているのかを確定させたい。
あんまり頭の中で構造を考えないで、とにかく動かしてみる。一行書いて、p 書いて、実行して、ってのを繰り返す。しかもこれ、未だにこういう感じなのだ。数行書くごとに実行する。とにかく p を書きまくる。んで、暇なときにリファレンスを眺めて、「こういうことができるのか」ってまた書いて実行してみたりする。
だから、何か作ろうとしていないと、そもそもプログラムを書かないからなかなか理解できるようにならない。Perl も書いてみたらわかるかもしれないけど、Perl を使って書きたいものがない。気がつくと面倒くさくて Ruby を使ってる。だめじゃん。
taglibro の今後の予定
たぶんやらないけど、やりたいことを書いとく。
- まず libxml-ruby を捨てて REXML を使う。もともと libxml-ruby を使おうと思ったのは REXML が名前空間をまともに処理してないからだったんだけど、名前空間とかどうでもよくなった。んで、libxml-ruby は Pure Ruby じゃないのでいちいち環境間で面倒くさい。REXML は標準添付だからその辺は心配ない。できるだけ Pure Ruby じゃない外部ライブラリを使わないようにしたい。
- ちゃんとライブラリ化する。
- 公開できるようにする。
Last.fm の他人へのリンクで最近のトラックを表示させる GM スクリプト
例えば Neighbours とか Friends のリンクとか
実装がすごい汚い。
JS の XPath
前々からいちいちあのクソながったらしい evaluate を書くのがだるかったのでちゃんと関数はさむようにした。
大きなバグがあります。詳細はXPath, $X function, NSResolverに書きました。以下のコードは非推奨です。
$X = function (exp, context) {
if (!context) context = document;
var result = document.evaluate(exp, context, null, XPathResult.ANY_TYPE, null);
switch (result.resultType) {
case XPathResult.STRING_TYPE : return result.stringValue;
case XPathResult.NUMBER_TYPE : return result.numberValue;
case XPathResult.BOOLEAN_TYPE: return result.booleanValue;
case XPathResult.UNORDERED_NODE_ITERATOR_TYPE: {
result = document.evaluate(exp, context, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
var ret = [];
for (var i = 0, len = result.snapshotLength; i < len ; i++) {
ret.push(result.snapshotItem(i));
}
return ret;
}
}
return null;
}
alert($X("//p")); // Array of p elements
alert($X("count(//node())")); // => node number
alert($X("count(//body) = 1")); //=> must be true
// Firefox が嫌いになる GM スクリプト
if ($X("contains(string(/), 'Firefox')")) {
alert("I LOVE FIREFOX!");
} これでコピペ地獄から開放される。
簡易ビルダー
まえのとあわせて
$N = function (name, attr, childs) {
var ret = document.createElement(name);
for (k in attr) {
if (!attr.hasOwnProperty(k)) continue;
v = attr[k];
if (k == "class") {
ret.className = v;
} else {
ret.setAttribute(k, v);
}
}
switch (typeof childs) {
case "string": {
ret.appendChild(document.createTextNode(childs));
break;
}
case "object": {
for (var i = 0, len = childs.length; i < len; i++) {
var child = childs[i];
if (typeof child == "string") {
ret.appendChild(document.createTextNode(child));
} else {
ret.appendChild(child);
}
}
break;
}
}
return ret;
}
var pq;
document.body.appendChild($N("div", {}, [
$N("div", {style:"font-weight:bold"}, "foobar"),
$N("div", {}, [
pq = $N("ol")
])
]));
for (var i = 0; i < 10; i++)
pq.appendChild($N("li", {}, "hoge");
var div = $N("div");
みたいなのを使ってる。
innerHTML を使いたくない (application/xhtml+xml では一切使えない) けど、document.createElement の嵐はキモイ。中間とって GreaseMonkey のテンプレート (xyzzy の拡張 lisp を入れてる) にごちゃごちゃ書いてしのいでるます。
scroll イベントが起きたり起きなかったり
GM で window.addEventListener("scroll", fuction (e) {}, false); とかやってみたんだけど、どうもページごとにイベントが発生したりしなかったりする。なんでだろう。全然わからない。
例えばこのサイトだと、日記のページは全てイベントが発生しない。で、/about とか /xbel とかはちゃんと発生する。