parameters= に渡す値はすべて自分でクオートしとこう。

libxslt はもともとパラメータの値に XPath そのまんま書けるんだけど、なぜか ruby-xslt の parameters= ではクオートして必ず文字列で渡す。しかしながら、なんかこのクオートの実装が狂ってて、自分でクオート付け足してる癖に Invalid expression とか言い出してくれちゃう。やれやれだぜ!

正確に言うとクオートを付与する段階で、与えた文字列を中途半端に破壊的に変更するらしく、クオーテーションがかたっぽだけ付く。セッションとかで保存させながらのコードでもうハマったハマった。dup してどうにかしたけど、自分でクオートして明示的に文字列にしたほうがよさげ。

ソースは読んでないので間違っているかも。あくまで挙動からの推測

  1. トップ
  2. xslt
  3. ruby-xslt の parameters=
  1. トップ
  2. ruby
  3. ruby-xslt の parameters=

なんか静的に XSLT で変換している /about とかの再構築さえめんどうくさくなってきた。動的にしたいなぁ。

って思って簡単な CMS (といえるものじゃない) を作ったんだけど、なんかいまいち使う気になれない。こうね、IPv4 と IPv6 の違いみたいになっちゃって、ね。要するに互換性がなくてめんどい。もちろんそれだけじゃなくて、URL とかを変えたくないから、mod_rewrite で全て CGI に渡すハメになるんだけど、なんで CGI でウェブサーバを再実装みたいなことをしないといけないんだって感じに。

もうね。例えばこれが自分のサーバーで、lighttpd で動いてて、FastCGI を使えるなら、まだ導入する気にもなれるんだけど、ね。だめね。もっと考えないとね。

  1. トップ
  2. site
  3. なんかもうめんどうくさい

Ajax るようにした。UI がイマイチ。

  • Comments を押したらとりあえず消えて欲しい。
  • 投稿したあとガックンってなるのがちょっとキモイ。

なんかいい方法はないかなぁ。

Opera でおかしい。めんどいので Opera はじく。

なんだか、この今のスタイルがまずだめみたいで、Opera だと挙動不審になる。

クッキーに保存を実装しろといいたい。誰に。俺に。

Ajax のほうのフォームはクッキーに保存するようにした。Singleton Cookie オブジェクト

  1. トップ
  2. js
  3. コメントのポスト方法をちょっと変更
  1. トップ
  2. ajax
  3. コメントのポスト方法をちょっと変更
  1. トップ
  2. site
  3. コメントのポスト方法をちょっと変更
  1. トップ
  2. web
  3. コメントのポスト方法をちょっと変更

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 スクリプト

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

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

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

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

  1. トップ
  2. js
  3. FEEDBRINGER で未読がないフィードを非表示に
  1. トップ
  2. web
  3. FEEDBRINGER で未読がないフィードを非表示に

ユーザーCSSを適用した FEEDBRINGER

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

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

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

  • フォルダを閉じた状態だと、フォルダの次のアイテムのアイコンが乱れる。
  • 擬似フレームのリサイズ不可 (#splitter がキモイので消してある。一時的に stylelish を切ることで対処すべし)
  1. トップ
  2. css
  3. FEEDBRINGER 用 User CSS
  1. トップ
  2. web
  3. FEEDBRINGER 用 User CSS
  1. トップ
  2. net
  3. FEEDBRINGER 用 User CSS

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

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

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

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

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

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

  1. トップ
  2. life
  3. 理路整然とした
  1. トップ
  2. thinking
  3. 理路整然とした
  1. トップ
  2. self
  3. 理路整然とした

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>
  1. トップ
  2. site
  3. Google Adsense / XHTML
  1. トップ
  2. web
  3. Google Adsense / XHTML

何が脆弱って、コンピュータ壊れたら、本気で何もやることがないのだ。今日メイン PC が起動しなくなって絶望した。セーフモードでは起動したので、chkdisk のフラグをフルに立てて再起動して不貞寝したら治ったのでよかったけれど、どうなることかとかなり憂鬱な気分になった。

お金があったら、こういう心配をしなくていいのになぁ。

  1. トップ
  2. js
  3. 脆弱な生活

Ruby の each 系メソッドで一つ気に入らないというか、仕方ないんだけど面倒くさいことがある。なにかっていうと index を使いたければ自分で変数作ってインクリメントしないといけないこと。each だけに関しては each_with_index があるけど、他の Enumerable なメソッドにはない。そんなに必要なわけじゃないし、だいたいは他のもっといい書き方が存在するんだけど、prototype.jseach 系を見てから、ちょっと不便だなぁって思うようになった。

prototype.jseach 系は全て indexitem が両方渡される。でも、受け取る側の関数は仮引数を常に2個書かなくてもいい。ECMAScript は引数の数に無頓着だ。いくら渡しても怒られない。仮引数を書かなくても arguments で参照できる。

対して Ruby の yield はエラーこそ出さない (call は出す) ものの、こういうことすると警告してくれちゃう。別にそれが悪いわけじゃなくて、むしろいいんだけど、っていうか block.arity で場合わけすればいいんだけど。

なにがいいたいかわからんことに。

arity の数で場合わけしたらだめか。[[:a, :b]].each {|a, b|} みたいに使えないもんなぁ。

  1. トップ
  2. ruby
  3. Ruby.each
  1. トップ
  2. js
  3. Ruby.each

そういえば、日経ソフトウェアの 2001-03 (ふるい) のスクリプト特集に Ruby が載ってるんだけど、今さっき読んだら当時さっぱり何言ってるのかわからんことも結構わかるようになったりしてて、なかなか面白い。Perl の記事はわからんけど :(。で、その記事のコラムで、Matz さんが実行速度でPerlを抜きたいって言ってるのが妙に印象に残ってた。そして今日その部分を YARV の記事を読んでて思い出したからこんなことを書いてるわけです。

日経ソフトウェアは2000-06 から 2001-06 までなんとなく買っていた雑誌で、結構お世話になった。扱いが荒いせいかボロボロだったり、コーラ溢して裏表紙が破けていたり、いやそんなのどうでもいい。XSLTDOM もよくよく考えるとこの雑誌で記事を読んだのが最初の出会いであるし、上で書いた Ruby もそうだったりする。

入門書として、いろんな言語がいっぱい載ってるこういう雑誌って結構いい感じ。なんとなくもういいかなって思ったらちょうど一年分だったりして。これ買うのやめてからは一冊もプログラミング関連の本を買ってない (大学の教科書は別として) 。なんかぐーぐる先生とこの雑誌一年分で十分な感じ。そんな感じで今さっき意外と雑誌の情報って死なないんだなぁと思った。

当たり前だけど、雑誌を読んでプログラミングをどうこうしていたのは楽しかったからに他ならず、それから VB をやったり Javascript をやったりして最近やっと形になるようなスクリプトを書けるようになった。今考えれば結構長かったけど、あんまり長いことやってる自覚はない (し、別に実際長いわけではない)。だから俺はプログラミングにおいて何か努力したとかそういうことがない。これから、そういう努力をするハメになるのか、それとも楽しいままプログラミングと付き合って行けるかがよくわからないけど、願わくば楽しいままやっていきたいと思う。言い換えれば、努力なんて一瞬たりともしたくない。

  1. トップ
  2. ruby
  3. Ruby と雑誌と俺

14歳

なんとなく久しぶりにログインしたらサービス期間が終了しています。

やっぱ14歳ぐらいがちょうどいい身長だよなぁ。ポポスカと弓は合う。弓構えると背筋が伸びるのがよいよい。

とりあえずフレンドリストに入ってないギルメンに片っ端から追加リクエストを飛ばした。めんどかった。ギルメンに一括送信とか、ギルドに入ってる人の一覧をゲーム内で見れるようにして欲しい感じ。HTTP との連携は面白いんだけど、もっと何かできそう。もったいない。

  1. トップ
  2. mabinogi
  3. mabinogi, 14さい

検索オーバーレイをクロスブラウザ化しようと思って作業してて、よし IE で確認してみるかって思ったら、そもそも IE だと検索フォームがでてないのに気付いた。そうそう、この CSS 書くときにどうしても IE はちゃんとした位置に出せなかったから消してたのよねー、あははー。ばかかと

  1. トップ
  2. js
  3. 検索おーばーれーいしようと
  1. トップ
  2. site
  3. 検索おーばーれーいしようと
  1. トップ
  2. web
  3. 検索おーばーれーいしようと

整理ついでに prototype.js を使うようにスクリプトを書き換えました。殆どイチから書き直しているのでおかしいかも。

といっても、引き継いだのはスタイルセレクタと検索の UI だけ。あとはそのうち付け足す。

検索の UI はとりあえず IE でもいけそうなところまできた、の、だ、けれど、結果表示が上手く言ってない。文字コードのせいかなぁ。

Opera は調子が悪いので確認してない。

よくつかうめそっど: each, bind。この二つは便利すぎてはなぢでる。foo.each((function (i) { this.bar.push(i) }).bind(this))

IE 対応完了。検索結果を XML で得るとき UTF-8 に変換していなかった。あとは CSS いぢりだけ。CSS いぢるほうが時間かかった。

  1. トップ
  2. js
  3. prototype.js に移行
  1. トップ
  2. web
  3. prototype.js に移行
  1. トップ
  2. site
  3. prototype.js に移行