まず絶対やらないのは body 以下にスクリプトを直接書くこと。つまり onclick とかの属性は書かない。ヘッダの <script type="text/javascript" src=""></script>を書くだけで完結するコードを書く。メッセージを表示させるための領域が欲しかったりしたら DOM で作る。上手くいかなかったら諦める。
忘れそう。模試について
前回(2004-10-10)の全統記述私大を完全に忘れていて受けてないとかいうアフォなことをやったもんで、明日(全統マーク)も忘れそうな勢いだったのを中和しとかないとなぁと。tu-ka 勉強してない人がうける模試ってどういう意味があるんだろう。別に超受けたくねぇよっていう意味じゃないけど、やるなら平日に……
忘れずに行った! オレえらすぎ! そして出席番号をまた間違えた! 前回は届いたけど今回は校外だから届かないかも! 五水井!
現実逃避スクリプト
悪夢が続く
ECMAScript Object.prototype
昨日書いたのは間違いだったっぽい……
function Foo(len) {
this.length = len;
}
Foo.prototype = {
unk : function () {
alert("unk");
}
}
alert(Foo.prototype.constructor); //=> function Object() {}
Object.prototype.bar = function () {alert("bar")}
Array.prototype.baz = function () {alert("baz")}
Foo.prototype.constructor = Array;
alert(Foo.prototype.constructor); //=> function Array() {}
var ifoo = new Foo(3);
ifoo.unk(); //=> unk
ifoo.bar(); //=> bar
ifoo.baz(); //=> ifoo.baz is not a function prototype のプロトタイプを辿っていくのがプロトタイプチェーンじゃないのか……それとも prorotype のプロトタイプというのを勘違いしているんだろうか……
Object.prototype
Object.prototype.foo = function () {alert(this);}
document.foo(); //=> [object HTMLDocument]
alert(document.documentElement.childNodes); //=> [object NodeList]
document.documentElement.childNodes.foo(); //=> Error: (snip).childNodes.foo is not a function. なんでだろう? うーん全部のオブジェクトは Object オブジェクトの仲間(?)なんだよねぇ。 いや、なんで Object.prototype に設定すると他のオブジェクトから呼べるかよくわからないんだけど……プロトタイプ辿ったら Object.prototype にいきつくのかなぁと思いきや document.prototype は undefined だし……
Opera だと [object NodeList] が表示される。Gecko のバグなのかな。
あ、インスタンス化(?)されてるから document.prototype じゃなくて document.constructor.prototype か。それならわかる。いやいやわかんないけど。なんかイメージできない。prototype もオブジェクトであるからコンストラクタがあるはずで、さらには参照している prototype があるかもしれない的? document.constructor.prototype.constructor が [object Object] だからたぶんそれであっているはず……
あぁ。インスタンスってのはやっぱクラスベースに使う用語なんだ……インスタンスとか言い出すと全部インスタンスだよなぁ……
Links の微自動化
Bookmarks Synchronizer で Links ページを半自動的に作ってみるテスツ。ただファイルサイズがでかすぎ (現時点で元の XML ファイルが 115kb) でそれを PHP で動的に変換してるからさぁ大変。
負荷ポインツが増えないことを祈りつつ……それとクライアントサイドスクリプト使っているから(昨日のやつはこれだ!)なんか大変だったら教えてください。
サイズでかくなりすぎたら favicon を同期とるのやめよう。埋め込み……
Script? CSS?
ins, del, blockquote の属性の表示を DOM で行うようにしてみた。でもインライン ins, del には対応してなかったりする……CSS とどっちがいいだろう。スクリプトきっていたら表示されないし、ins や del は CSS でやっても IE 以外は困らないと思うけど、blockquote の cite はいちいちソース開いたりプロパティ開いたりするのが面倒だから DOM で生成したほうが有用に働くんじゃないかなぁと。
ins, del はやっぱ CSS にしとこうかな……インラインに対応するのめんどくさ。
innerHTML on IE
理解力のなさ。
ECMAScript におけるオブジェクトは連想配列 (obj.propertyX == obj["propertyX"]) ってのは分かっていたつもりだったのに Object Initializer Object Initialiser って何だよとか思ってた。よく FF の拡張なんかで見る foobar : function () {} だけど、ちゃんと考えれば連想配列のモンスターバージョンの一部だった……形が変わって完全混乱ですよ。あぁ……
// 普通に見える連想配列
obj = { "key" : "val", "key2" : "val2" };
// 不思議定義に見える連想配列
obj = {
propertyX : "",
foo : function () {
// do foothing
},
bar : function () {
// do barthing
}
}; キーにダブルクオーテーションはあってもなくてもいいらしい。Identifier が指定されたときは StringLiteral に勝手に変換される。そんなわけでオブジェクトのメンバのリストを取得するのと連想配列を順番に取得するのに同じ for ( - in - ) が使えると……
夢
Audioscrobbler Top Artists
now playing に Top Artists 表示してみる。データは Audioscrobbler からひっぱってくる。データの更新は今のところ手動。そんなに更新されないし。一日に一回 cron で動かしてもいいかもしれない。
Top Tracks も表示してみる。ごちゃごちゃしてきた。いらんかもしれない。
ちなみに何故か統計情報を XML やらテキストデータやらで取得できないので普通に正規表現で抜いてくることにしてみた。
ECMAScript でイテレータ
イテレータってのは Ruby の [1, 2, 3].each {|item| puts item } ですけど、ふと思いついたので ECMAScript (Javascript) でイテレータっぽいもの作ってみる。関数もオブジェクトも同じ(() つければ実行できる)らしいので(prototype 型 OOP とかむしろ OOP とかわかんねぇんですが)関数を引数に渡せばいいわけで(ry
function Array_each(func) {
for (var i = 0, len = this.length; i < len; i++) {
func(this[i]);
}
}
Array.prototype.each = Array_each;
[1, 2, 3, 4].each(function (i) {
alert(i);
}); はいはい。誰でもわかりますね。「なんだデキンジャン!」とか喜んだ俺はバカですね。くそ。まぁ美しくはないですけども……
script on IE
IE で script 要素を書くと全くレンダリングされないのだけれど、どうしてだろう? もちろん Gecko と Opera なら大丈夫だし、script 要素を消せば表示される。ためしに XML 宣言, html, head, script, body, h1 要素だけで試したけど表示されなかった。謎すぎ……
ってあー。書く前に散々悩んだのに書いてから気付いた。script 要素の閉じタグがないとだめなんだ……あぁもう
またハング
getElementsByTagName on Gecko
Gecko の getElementsByTagName がおかしいなぁ。document.getElementsByTagName("*") の結果が少ない。具体的には body とその中身が入ってない。html, html/head, html/head/* だけ。おかしい。
そもそも document.documentElement.childNodes に body が含まれていない。DOM 上から抹消されとる。
わかった! document.documentElement.childNodes が実行される時点では DOM に body 以下が読み込まれていないんだ。
はぁ…… Opera は Event.srcElement 持ってるくせして中身がないっぽい。よう知らんけど fromElement がメンバにあるか (in) 調べればいいらしい……クライアントサイドなんて……
Pingback 実装
とりあえず実装してみた。http://lowreal.net/rpc/xmlrpc に ping 送ると表示されるように。実装は Ruby。logs の各日付への ping しか受け付けてない。そのうちそれ以外のリソースにも対応させてみたい。ようは受信したら trackback と同じように書き込めばいいだけだし、この日記のデータは XML だから扱う言語が Ruby だろうが PHP だろうが関係なくてよろしい。XML 操作するのは割と面倒臭いんだけど。
作ってて何となく感じたのは、ちゃんとツールが実装すれば tDiary のリファラのように働くなぁと。トラックバックは明示的にで、ピングバックはそうじゃない感じ。Auto Discovery だったらどっちも大差ないか。
Ruby で作られた blog から Pingback を送るためのモジュールがっ。
しかしデータ直書きの場合はいかにして自動で送ればいいだろう。a 要素抽出してキャッシュ。前回のキャッシュと比較して追加されていたら pingback ってあたりかなぁ……
あぁ……Faults Code って XMLRPC::FaultException.new で作るのか……
自動で Pingback するようにしてみた。'http://' で始まる attribute::href を探して撃つ。撃ったらキャッシュに突っ込む。次から追加されたのだけ撃つ。いちいち全部のファイルをスキャンするのはアレだけど仕方ない。少しずつ更新するの (C-c C-c) に時間がかかるように……
地震・COLD BURN
巻き戻り?
ボーダー。スペース。スタイル。挙動不審。
チマチマスタイルの細部変えてて気持ち悪いかと思いますがご容赦を!
再描画。完全フリーズについて
SP2 入れてからまたウィンドウ最小化したときとかに完全に Windows が応答しなくなるようになった。マウスもキーボードも一切聞かなくなる。本体からピと音が鳴る。あとはもうリセットボタン押すのみ。
前回のときはサムライ消したら直ったから、原因は違うかもしれない。でも症状は全く同じ。っつうか一日に二度も三度も完全にハングされたらやってらんねー。
time.rb タイムゾーン
time.rb が xmlschema でパースしたときタイムゾーンを無視しているみたい。いや、無視じゃなくて Ruby オブジェクトにするとき地方時間になってないのか。
Time.now.xmlschema #=> "2004-10-23T03:27:57+09:00" Time.xmlschema(Time.now.xmlschema) #=> Fri Oct 22 18:28:11 UTC 2004 Time.xmlschema(Time.now.xmlschema).xmlschema #=> "2004-10-22T18:28:25Z"
あらまぁ。
Time がゾーンとマイクロ秒を同時に扱えないのか。何かよくわからない。地方時ってシステムの時計のことなのかな。それ以外の地方はどうやってセットするんだ。てか Time.to_s のフォーマットって読み難い。
TrackBack? Pingback?
何が違うんだろう? XML-RPC かどうかの違い? それだけ?
excerpt がないのと、どんなリソースにでもバックできるってのが Pingback かなぁ。それだけかね。
でも TrackBack よりは送信先の URI が一定で、パラメータ取得するのが容易な Pingback のほうが好きだな。
不正な ping 調べるのが結構面倒だ…… sourceURI に自分のホストを含まず targetURI に自分のホストを含むときに受付ですかね。
Negotiated Script
ネゴシエーションで CGI ファイルが選択されたとき、拡張子無しのファイル名がインタプリタに渡されて っぽい。どうしたらいいかな。いや原因は違うのかもしれない。Script File Not Found!
になる
XREA SUPPORT BOARD で発見 MultiViews設定時のCGIWrap Error
Mozilla Update
update.mozilla.org をセーフリストに入れてるのに .xpi をインスコできない。いみふ。当たり前だけど他のサイトからはできる。HTTPS だから?
それと、mozdev.org はサブドメインに拡張のアレふってるからいちいちセーフリスト加えるのがメンドイ。ワイルドカードとかできないのかなぁ。
REXML, SourceFactory, Element
これ全く使えないんですけれど、何か他にモジュールとか、もしくはバージョン制限とかあるんですかね。
p REXML::Version
#=> "3.1.2" or "2.7.3"
src = REXML::SourceFactory.create_from("<a attr='val'>text<b/></a>")
puts (e = REXML::Element.new(src))
#=> </>
puts REXML::Element.new("child", e)
#=> <child/>
puts e
#=> <><child/></>
puts REXML::Element.new(e)
#=> </> これは 私家版REXML APIリファレンス のやつをそのままコピって実行してみた結果。
自力でエレメンツちまちま追加してくとか DOM 並に面倒臭いのですが!
rexml/element.rb の initialize に Source クラスのインスタンス渡したときの処理が 3.1.2 でも 2.7.3 でも見当たらない。コメントにはちゃんと書いてあるんだけど、未実装なのかな。
それと REXML::Element.new("<ele>") の結果が <<ele>/> なのはどうなのよ。使用できない文字渡されたら例外のほうがいいと思うんだけど。
Document と同じ build メソッドを作ってやればいいのかな。あとで試そう。
module REXML
class Element
def initialize( arg = UNDEFINED, parent=nil, context=nil )
super(parent)
@elements = Elements.new(self)
@attributes = Attributes.new(self)
@context = context
if arg.kind_of? String
self.name = arg
elsif arg.kind_of? Element
self.name = arg.expanded_name
arg.attributes.each_attribute{ |attribute|
@attributes << Attribute.new( attribute )
}
@context = arg.context
elsif arg.kind_of? Source
build arg
self.name = @elements[1].expanded_name
@attributes = @elements[1].attributes
@elements = @elements[1].elements
@children = @children[0].instance_eval("@children")
end
end
private
def build(source)
Parsers::TreeParser.new(source, self).parse
end
end
end
無理やりなんだけどこれでいいのかなぁ。表示的には思い通りだけど何か穴がありそうだ……
テストの終り。寝る。
らいふすたいるおーばー
13時に寝て18時に起き、5時に寝て、7時におきる。何かズレているようで、夜中のほうが頭が回るのです。
昨日は黒板に書いてあったこと勘違いして一科目試験を受けていないし、センター方式とかいうから殆ど選択問題だろうと踏んでた公民が普通に書き問題多杉。その他もろもろいろいろあって、ここ数日は全く運がないようなことに気付きました。気付いたからってどうしようもないんですけど。
Ruby, 羊, くらげRuby, Sheep, Jellyfish
Ruby といえば赤色の宝石で羊。赤色で羊といえば Syrup16g の HELL-SEE のジャケット。Syrup16g のジャケットといえばクラゲ。クラゲは下等生物じゃない。