CGI 設置するのとかめんどいので xpost-del-hatena.user.js, GM スクリプトにした。

はてなの認証方法がややこしいので、はてなをメインにして、del.icio.us をスクリプトで同期するように。新規ブックマーク, 編集, 削除がそれぞれ del.icio.us にも反映される。ただ、編集の場合、del.icio.us で上にあがってしまう問題がある (はてなの編集画面にはポスト時刻が表示されないのでめんどい)。

最初なぜか API 使わないで実装してた。頭が悪い

ちょっと補足します。

Fx 1.5.0.1 + GreaseMonkey 0.6.4 ではとりあえず動いています。中身で無駄に E4X 使っているので、1.5 未満では絶対に動かないです。

ついでに動いてても何も言われません。淡々と del.icio.us に追加されたり削除されたりします。(最初の一回は del.icio.us の API Basic 認証がでます。これには del.icio.us のユーザ名とパスを入れます。)

del.icio.us 側の操作ははてブに反映されません。「はてなをメインにして」はそういう意味です。

  1. トップ
  2. js
  3. はてブと del.icio.us を同時に使うように
  1. トップ
  2. gm
  3. はてブと del.icio.us を同時に使うように
  1. トップ
  2. net
  3. はてブと del.icio.us を同時に使うように
  1. トップ
  2. web
  3. はてブと del.icio.us を同時に使うように

はてダ の2カラムさえなんか邪魔になってきたので ignore-hatena-2c.user.js 書いた。

GM ばっか書きまくり!!

GM の Edit ボタンが効かなかったんだけど、改めて about:config で設定しなおしたら使えるようになった。前より簡単につくれる><

  1. トップ
  2. web
  3. はてダ の2カラムさえ

どうにも使い道が少ない 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 のハンドラぐらいでしか使えなくてなんともかんとも。もちろん生成するのは自由なんだけど……

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

  1. トップ
  2. e4x
  3. てきとう E4X
  1. トップ
  2. js
  3. てきとう E4X

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

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

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

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

  1. トップ
  2. life
  3. けいたいかえた

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 にアレしてコレした的な何か。

  1. トップ
  2. js
  3. flickr で CC じゃない写真を消す GM スクリプト
  1. トップ
  2. gm
  3. flickr で CC じゃない写真を消す GM スクリプト