d:id:quaa

[Opera]点滅をなんとかしてほしい
Sat, Feb 9, 2008 3:00 AM

現行のOpera 9.50のベータ版、スナップショット版はページの一部がチカチカ点滅することがあるのでとてもうっとうしい。どのようになるのかはOpera 9.5 Beta Other Known Issues - Scratchpad Wiki Labs - Free wikis from Wikiaという文書からリンクされていた動画を見てもらえばわかるが、1つの要素全体が色調反転、元に戻るをずっと繰り返し、スクロールしても画面上の同じ位置にその効果が残ることがあるというものだ。動画ではページを戻っても残っているように見受けられる(カーソルが右から左にさっと動いた後にページが変わっているので)。

点滅するのは終点アンカーになった要素がほとんどなので*1、これは終点アンカーの要素がどこなのかをユーザがスクロール量でしか認識できないのは問題があると考えて新しく導入したものなのだろうかと好意的に解釈してみたりはしたが、何にしろあんな、発生条件も止める手段もよくわからない、場合によっては画面全体に効果が及ぶような点滅を見せられ続けたら健康を害するのは間違いないことだ。その内健康被害による訴訟が起こるだろう。株式公開している桶屋を調べなければならない。

あー

公式フォーラムのトピックもあった。長い間見かけてるとほんとに新機能なんじゃないかと心配になってくる。あんな新機能いやだなぁ。要素の枠を3回程度点滅させるくらいならまだいいけど…

*1:ページを戻ったときに始点アンカーやフォームボタンが点滅することもあるがまれである

[はてな]はてなダイアリーのその場編集とdatetime
Wed, Feb 6, 2008 3:00 AM

追記とか削除を示したいときに、以前の「日記を書く」だとins要素とかdel要素にdatetime属性つくのにその場編集の「日記を書く」とか「編集」だとdatetime属性つかないのがちょっとやだなー

ついきてすと

[JavaScript][DOM][XPath]汎用的なXPathEvaluator
Wed, Feb 6, 2008 3:00 AM

Opera(9.50 Alpha 1以降)でもコンストラクタとして使えることを最近知った。これってDocumentからではない汎用的なXPathEvaluatorが使えるということですよね!わー

汎用的なXPathEvaluatorだとevaluateメソッドでコンテキストノードを指定するときにノードがどの文書に属するか考えなくてもよくなる*1。あとXPathEvaluatorからつくるXPathExpressionも同じことが言える。わー

何かFirefoxはほんとに独自実装多くてあれやな!いろんな意味でポストIEやな!

*1:DOM3 XPathの仕様ではDocumentであるXPathEvaluatorのevaluateは指定したコンテキストノードのownerDocumentが自身と違うものだとWRONG_DOCUMENT_ERRを投げる

はてなダイアリーでも絵が描けるようになったらしい
Sat, Feb 2, 2008 3:00 AM

f:id:quaa:20080202093837p:image

お絵かき!

[opera]build 9770
Sat, Feb 2, 2008 3:00 AM

::selection擬似要素のサポート(指定できるのはcolorとbackground-colorだけなのでまだ十分じゃないけど。あ、outlineとかcursorはオプションだから十分って言ってもいいのか…)。ユーザCSSで勝手に自分の好きな色にするんだ!もちろん!importantつきでだ!

で::selectionが一応サポートされたからgetComputedStyle(elem, "selection")はどうなんかなーと思って試してみたけど9.50 Alpha 1からgetComputedStyleで擬似要素用のCSSStyleDeclarationを取ること自体出来なくなってる…?

<!DOCTYPE HTML>
<html><head><title>getComputedStyle(elem, pseudoElt)</title>
<style type="text/css">

  body { color: black; }
  body::after { content: "after"; color: blue; }

</style></head>
<body onload="
  alert(getComputedStyle(document.body, 'after').color);
  alert(getComputedStyle(document.body, ':after').color);
  alert(getComputedStyle(document.body, '::after').color);

"></body></html>

こんな感じで::after擬似要素で試すと、9.24はCSSで指定した色は'after'のときに取得できるけど9.50 Alpha 1とかはどれでも取得できない(擬似要素指定しなかったときと同じ)。Moz系は'::after'みたいにコロン付けないとダメだから合わせるようにしたのかと思ったけど違うみたい。

あとこれ試してて気づいたんだけどbuild 9755からCSSStyleDeclarationが持つプロパティが大分変わってた(SVG由来のプロパティ名がアンダースコア区切りからキャメルケースに変わったりベンダ拡張やら由来のプロパティが追加されたりしてる)。

最初の段落以外9770の話じゃなかった

そういえば何でgetClientRectsとgetBoundingClientRectを今週サポートしたって書いてるんだろう。9.50 Beta 1からあるのに。

[HTML]言語タグの検証
Sat, Jan 26, 2008 3:00 AM

そういえばHTML 5の仕様書につけられてる言語タグの形式間違ってた("en-GB-Hixie"の"Hixie"は明らかに私用タグなのに"x-"がついてなかった)からちょっと気になってたんだけどいつの間にか直ってた。もしかしてと思ってhttp://validator.nu/で間違った形式の言語タグで言語指定したHTML文書を検証かけたらエラー出してくれた。

[HTML]HTML 5の要素の種類とか内容モデル
Sat, Jan 26, 2008 3:00 AM

久しぶりに仕様見に行ったら前ちょっと見て何となく覚えた気になってた要素の種類とか内容モデルあたりのところが別物になってた…。

自分が前に見たときはインラインレベル要素とブロックレベル要素の混在禁止の例外みたいな感じでStructured inline-level elementとかいう用語があって、例えばli要素は子にブロックレベルとインラインレベルの要素を同時には持てないけど、ulとかの要素はブロックレベル要素ともStructured inline-level elementともしてあるから

<ul>
  <li>a
    <ul><li>b</li></ul>

  </li>
</ul>

みたいにli要素が普通のテキストとかインラインレベル要素とul要素を同時に子に持つときは内側のul要素をインラインレベル要素として扱うよこれで辻褄合わすよ!みたいな感じに(多分)なってたと思う。

でも最近の仕様だともうインラインレベルとかいう用語自体なくなってて、インラインレベルだったもの(最近の用語だとPhrasing contentとかそういうやつ)をブロックレベルだったもの(最近の用語だとProse content)ともして、普通のテキストをPhrasing conetnt(結局Prose contentでもある)としてるから内容モデルがProse contentになってるものはほとんど何でも入れてOKだよ!インラインレベルとかブロックレベルとか混在とか知らないよ!みたいな感じに(多分)なってる。

何でこんなTransitionalみたいなのに変わったんだろう?p要素にul要素とか入れられなくなってるし。

参考

  • HTML 5 (W3CのWorking Draft。2008-01-22版)
  • HTML 5 (WHATWGの"Call For Comments"。2007-10-26版)

いつの間にかはてなダイアリー市民権を剥奪されていた
Thu, Jan 17, 2008 3:00 AM

とりあえずOperaでもはてなハイクの入力欄を伸縮できるようになるかもしれないUserJSのコードを置いておくんだぜ。

//==UserScript==
// @name (hatena.haiku.resizer-fix.js ?)
// @include http://h.hatena.ne.jp/*
//==/UserScript==

opera.addEventListener("BeforeScript", function(e){
  var script = e.element;
  if (script.src == "http://h.hatena.ne.jp/js/Hatena/Haiku.js") {

    script.text = script.text.replace(
      "if (!window.opera) this.setResizer();", "this.setResizer();");
  }
}, false);

はてな対Operaの戦いはまだはじまったばかりだっ―!

[opera]画面をつかんでスクロール
Mon, Dec 10, 2007 3:00 AM

opera:config#UserPrefs|ScrollIsPanとかアクションのOverride Scroll Is Panとかで切り替えなくてもCtrl+Alt+ドラッグでスクロール(Drag to scroll)できることに気づいた。

[opera]バグ報告 (build 9681)
Sat, Dec 1, 2007 3:00 AM

今回のビルドでも直ってないのを報告してみただぜ。のバグ(仕様違反)のメモだだぜ。

DOM XPathで属性同士の比較に失敗する

条件
  • ある2つの属性を持つ要素を複数持つ文書内
  • XPath式を評価して複数ノードを返すメソッド(例えばdocument.evaluateやMSXML由来のselectNodes)でその2つの属性を比較するXPath式(.//*[@title != @class]など)を評価
状況

2つの属性を持つ要素中、2つ目以降の要素は属性の比較がすべて真とみなされて結果に追加される(amachangさんのXPathのテストではこのせいで.//*[@title != @class]の結果に@title = @classであるはずのh1, h2, h3, h4が追加されてしまうためNGになる)。

回避
  • XPath式内の属性を自分で文字列値や数値などに変換する(.//*[string(@title) != @class]など)

DOM XPathのevaluateメソッドで返されるXPathResultのresultTypeと実際の型が違う

条件
  • 例えばdocument.evaluateの4つ目の引数をSTRING_TYPEにして呼び出すか、BOOLEAN_TYPEにして呼び出す
状況

resultTypeはSTRING_TYPEを指定した場合にBOOLEAN_TYPE、BOOLEAN_TYPEを指定した場合にSTRING_TYPEになる(実際の型は指定した型と同じ)。

ANY_TYPEを指定した場合も結果がSTRING_TYPEとBOOLEAN_TYPEとして判定されたときにresultTypeと実際の型が違っているため、ANY_TYPEを指定して型に合わせて使用できるメソッドを呼ぶようなコード(cho45さんの$Xでtypeを特に指定せず$X("string(/)")などとした場合など)だとTYPE_ERRになる。

getElementByIdでCommentノードを取得できる

cobodoさんの2007-11-09 - blob globから。勝手に報告。

条件
  • id属性を持ち、直下にコメントがあるHTMLの要素(<p id="p"><!--c--></p>など)を持つHTML(text/htmlとして認識されている)の文書内
  • getElementByIdの引数をその要素の子のコメントの内容と同じ文字列にする(上記例の場合"c")
状況

Elementしか返さないはずのgetElementByIdがCommentを返す。

回避
  • 文書をXHTML/XML(*/xml, */*+xml)として認識させる (現実的な回避策ではないけど)

ほえほえ

なんかそんな感じですだぜ。既出かどうかはわかんないだだだだ

kuruman 2007年11月25日

ほーこくした

livedoor クリップ - 2007-11-09 - blob glob

ほーこく済みだった!

Tue, Nov 27, 2007 3:00 AM

Operaのバグ報告ウィザードからのバグ報告は出来ればしたいけど見つけたバグが既出かどうかはっきりわからないので面倒だ。それと1手で再現・表現できるものも3手以上で表現しろと言う*1ので面倒だ。結局まだ1回も報告したことがない(英語でしか報告できなかったときに知らずに日本語で送ってしまったのを入れれば1回だけど)。ただ気づいたバグを報告してなくてもそれなりの期間で直ってることが多い。万一たまたまここを見て代わりに報告してくれた人がいたとしたら申し訳ないなぁ。

想像上の存在にすぎない

ところで最近のビルドはXPath/DOM XPathあたりが不安定な気がする。build 9665(win)だとXPathResultのresultTypeがおかしかったり(STRING_TYPEとBOOLEAN_TYPEが入れ替わってる。javascript:alert(document.evaluate("string('test')", document, null, XPathResult.STRING_TYPE, null).resultType == XPathResult.BOOLEAN_TYPE)true)、属性値の比較がまだ微妙だったり(amachangさんのXPathのテスト.//*[@title != @class]がNGになる。.//*[@title != string(@class)]みたいに属性のどっちか、もしくは両方を自分で文字列値か数値に変換しとくとOKになる)。…。

*1:1. このJavaScriptコードを 2. アドレス欄に入れて 3. Enterか何かを押して実行してくださいみたいに書けばいいのかなー

[css]@charsetでは単引用符が使えないらしい
Tue, Nov 20, 2007 3:00 AM

@charset規則の書き方 (メモランダム)から。

そうなのかー。でもそうするとAppendix G(CR, 2007-07-19)の文法の定義と食い違いがあるような。今の定義だと単引用符使える(@charset 'UTF-8';とか)しあと「@charset」は小文字で書けって書いてあるけど大文字も使える(@cHaRsET "UTF-8";とか)し。

わからないので調べた。

文法の方が間違いで、文法で大文字でもいけるようになってる問題は直すけど単引用符でいけるようになってる問題は直さないってことのよう、な、気がする。

[opera]build 9656(win)
Sat, Nov 17, 2007 3:00 AM

XPathのid関数のバグなおった。ただhigeorangeさんとこで知ったのだけど属性値の比較に失敗するようになってるみたい。XSLTのdocument関数。MathML。CSS3 Color (HSL)。のサポート。?。やら。

[opera][javascript][DOM]createHTMLDocument
Sat, Nov 17, 2007 3:00 AM

ひー><

var htmldoc = document.implementation.createHTMLDocument("document title");
alert(htmldoc); //[object HTMLDocument]
//<?xml version="1.0"?><html><head><title>document title</title></head><body/></html>

alert((new XMLSerializer()).serializeToString(htmldoc));

javascript:(function(){var htmldoc = document.implementation.createHTMLDocument("document title");alert(htmldoc);alert((new XMLSerializer()).serializeToString(htmldoc));})();

なけてきました

Opera 8 で実装されたようです。 (名無しさん)

[3]Java の世界でも CR 以来実装されている模様。 (名無しさん)

[4]WebKit と KHTML にもある模様。 (名無しさん)

[5]されども Gecko にはない。 (名無しさん)

no title

書き直した

東シナ海へ行くつもりじゃなかった
Sun, Nov 11, 2007 3:00 AM

もー最近日記書きすぎや…

[opera][javascript][DOM]Opera用のAutoPagerizeでXPath式にid()を使えるようにする試み(3)
Sun, Nov 11, 2007 3:00 AM

一応解決編。

問題を整理すると

Opera(現行の9.50 Weekly Buildでも)には表示中のDocument以外のDocument(DOMParserで生成したものやXMLHttpRequestで取得したものなど)に対してDOM XPathでXPath式を評価させるときXPathのid関数の走査対象が表示中のDocument内になるバグがあるため、Opera用のAutopagerizeでは次の問題がある。

  • SITEINFOのnextLinkでid関数を使用した場合、上記バグによって取得できるURLが1回目と2回目以降で同じものになってしまい、2ページ目以降はページを取得することが出来なくなる (AutopagerizeではリクエストするURLと直前にリクエストしたURLが同じ場合はリクエストをかけないようにしている)
  • SITEINFOのpageElementでid関数を使用した場合、上記バグによって本来動的に取得したDocumentから取得されるべきページ片(ノード)を今表示しているDocumentから取得してしまい、次のページ片を挿入することが出来なくなる (表示中のページ片が再挿入される(移動する)だけになる)

SITEINFOのinsertBeforeは表示中のDocumentに対してXPath式を評価するのでバグによる影響はない。

解決方法

Operaがバグを直す。またはAutoPager.prototype.requestLoad内でpageとurlを取得する直前に表示するDocumentを一時的に変更して、取得後に元に戻すようにする。OperaにはsetDocumentという独自拡張?があるので次のように変更出来る(2007/11/02 11:00版で。切り替えに時間がかかったりするのでどうしてもid関数使いたい人向けか)。

var doc = document.documentElement.ownerDocument; //documentを迂回して保持
setDocument(htmlDoc); //切り替え
var page = getElementsByXPath(this.info.pageElement, htmlDoc);

var url = this.getNextURL(this.info.nextLink, htmlDoc);
setDocument(doc); //戻す
--- AutoPagerize_opera.js.orig	2007-11-10 23:57:44.281250000 +0900
+++ AutoPagerize_opera.js	2007-11-11 00:03:18.703125000 +0900
@@ -588,8 +588,11 @@

         var htmlDoc = createHTMLDocumentByString(t);
         log('resopnse document: '+htmlDoc);
         try {
+            var doc = document.documentElement.ownerDocument;
+            setDocument(htmlDoc);
             var page = getElementsByXPath(this.info.pageElement, htmlDoc);
             var url = this.getNextURL(this.info.nextLink, htmlDoc);
+            setDocument(doc);
 			if(!!this.info.incremental){
 				var exp = new RegExp(this.info.incremental.nextMatch,'i');
 				var _m = this.info.incremental.nextLink;

うーん9.2xだとやっぱだめかも…?微妙な感じ

[opera][javascript][DOM]Opera+DOM XPathでXPathのid関数が使えるときの条件
Thu, Nov 8, 2007 3:00 AM

またいろいろ調べてたんだけど、Opera+DOM XPathでXPathのid関数が使えるときの条件て簡単に整理すれば*1

  • 取得したい要素がHTMLElementでid属性がある
  • 取得したい要素がSVGElementでid属性がある
  • XMLな(application/xmlとかで提供される)文書で、取得したい要素に属性があってその属性がDTDでID型として定義されている
  • XMLな文書で、取得したい要素にxml:id属性がある

のどれか(まだあるかもしれないけど今のとこ自分で確認できたのはこのくらい)で、動的に生成したDocumentからid関数使って要素を取得しようとすると失敗するのは単にバグってだけの話だったのか…。呼び出しといて間違った情報提供するとか最低>< id:os0xさんすみません…

んあーいろいろ訂正しないとだめだ。これでまた間違ってたら泣くなぁ

*1:DTDが読まれる条件とかDTDでID型の属性が複数定義されたときの挙動とかDOMインタフェースの継承がどうのとかHTMLElementとして認識される条件とかを言わずに単純化すれば

[opera][XML]DTDの外部サブセットを読む
Thu, Nov 8, 2007 3:00 AM

Comparison of layout engines (XML) - Wikipedia, the free encyclopediaに9.0からオプションでDTDの外部サブセットも読めるぜ(同一ドメイン内だけだけどな)的なことが(たぶん)書いてあって、opera:config#UserPrefs|XMLLoadExternalEntitiesにチェック入れ直して試してみたらできた。ずっとDTDの内部サブセットで定義した外部実体だけを読めるようにする設定なんだと思ってた…

サンプル

script.xml
<?xml version="1.0"?>
<!DOCTYPE script SYSTEM "script.dtd">

<script test="a"></script>
script.dtd
<!ELEMENT script (#PCDATA)>

<!ATTLIST script
  xmlns   CDATA #FIXED "http://www.w3.org/1999/xhtml"
  test    ID    #IMPLIED>

<!ENTITY content SYSTEM "script.txt">
script.txt
alert("namespace: " + document.getElementById("a").namespaceURI)

手順

  1. opera:config#UserPrefs|XMLLoadExternalEntitiesにチェックを入れる。
  2. script.xmlを開く

とalertでnamespace: http://www.w3.org/1999/xhtmlと表示される。

[opera][javascript][DOM]DOMParserのパースエラーがFirefox互換になってた
Tue, Nov 6, 2007 3:00 AM

今日書こうと思ってたのに何か間違えて消しちゃったー。前はLSExceptionだったけどいつの間にか(build 95**(試した結果のメモも消えた)あたり)でFirefox互換のXMLになってた。doc.documentElement.localName == "parsererror"とかやらないと失敗してるかわからなくてめんどいし前のOperaのためにはtry - catchで例外補足もしなくちゃだめになってめんどいなーということを書いてた気がする。

Tue, Nov 6, 2007 3:00 AM

そういえば

たとえば「http://www.example.com/path/to/12345.html」というurlで、数字の部分は任意な数字にmatchさせたい場合は

http://www\.example\.com/path/to/[0-9]+\.html$

という正規表現を使う。[0-9]は\dという指定も出来るので

http://www\.example\.com/path/to/\d+\.html$

でもOk。

void GraphicWizardsLair( void ); // シェルで使う「*.jpg」みたいなglobと、PerlやJavaScript等で使う「.+¥.jpg$」という正規表現は全く別物だけど、混同されている気がした

最初この下の奴マッチするんかやーと思ったけどAutopagerizeのSITEINFOはtextarea(というかHTML内)に書かれてるから文字列リテラルみたいにバックスラッシュ2つ書かなくてもバックスラッシュ残るし正規表現リテラルじゃないからスラッシュをエスケープする必要もないんだなーへぇーと思ったのを思い出した!

だからWikiのSITEINFOをローカルのSITEINFOに持ってこないと駄目なとき(OperaとかOperaとかな)は普通にコピペする(だけじゃないか。引用符付けないと)と動かなかったりマッチするものが変わるやつがあるわけなんだけど。文字列リテラルの"\d"はバックスラッシュ消されてただのd("0".match("\d") == null; "d".match("\d")[0] == "d"; "0".match("\\d")[0] == "0")だし"\."は一文字マッチ("a".match("\.")[0] == "a"; "a".match("\\.") == null)だし。

[opera][javascript][DOM]XPathのid関数で文書を越えて要素を取得できる
Tue, Nov 6, 2007 3:00 AM

id関数まわりは怪しい…。バグレポートって手順じゃなくてサンプルコードそのまま貼り付けてもいいのかな。既出ネタな気もするなー。

サンプル

<!DOCTYPE html><html><head><title>id() test</title></head><body>

<p id="aaa">a</p><script></script></body></html>

結果

Firefox 2.0.0.9
null
Safari 3.0.3
null
Opera 9.23
[object HTMLParagraphElement]
Opera 9.50 build 9624
[object HTMLParagraphElement]

あーhttp://d.hatena.ne.jp/quaa/20070806#p1のコードで要素が取れなかったのもこのバグ関連のせいかー。XPathのid関数経由だと動的に生成したDocument内で使用されるID値が全部元の文書のものにされるも元の文書の要素しかとれない*1!静的な文書ならただのDocument(9.50 Alpha 1以降はXMLDocumentだ)として認識されてても要素の名前空間がXHTMLかSVGのそれならid関数で普通に取れたよ…

*1:がっかり感を強調してあらわしてみた!

[opera][javascript][DOM]OperaでのXPathのid関数の件
Mon, Nov 5, 2007 3:00 AM

キッスブログ (Xiss Blog) - アリゾナではもう働きたくない社長の blog - xpath_function_id*XPath id() 関数を使った高速化*1id:os0xさん(IDコール!IDコール!)のブックマークコメントを見ました。

Operaで http://d.hatena.ne.jp/quaa/20070607#p1 が修正されたらid使うんだけどね。9.5で直ってないかなぁ。こっちだった http://d.hatena.ne.jp/quaa/20070806#p1 Safariもだめなのかな。

http://b.hatena.ne.jp/os0x/20071105#bookmark-6401535

Operaでevaluateで指定するXPath式にid関数使うとTYPE_ERRになる(ときがある)件は9.50 Alpha 1で修正されました。HTMLDocumentじゃないDocumentではevaluateのときに(X)HTMLの要素のid属性をID型の属性として認識しない件はDTDの内部サブセットである要素の属性をID型として宣言すれば、その要素についてはid関数を使って取得することができるようです(外部だと駄目)。これは9.2xなんかでも可能でした。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE test [<!ATTLIST test id ID #IMPLIED>]>
<test id="aaa">

<script xmlns="http://www.w3.org/1999/xhtml" type="application/javascript"><![CDATA[
  //9.5以前のOperaのために"/."
  alert(document.evaluate('id("aaa")/.',document,null,9,null).singleNodeValue); //[object Element]

]]></script>
</test>

なので内部サブセット内で属性宣言がされていない文書でも動的にDocumentTypeを生成して追加すればid関数が使えるんじゃないかと思ったんですが、DocumentTypeのinternalSubsetは読み取り専用なので書き換えは駄目、DOMParserから動的に生成しようとすると内部サブセットでの定義が消されて駄目、という…

var doc = (new DOMParser()).parseFromString(
  '<!DOCTYPE test [<!ATTLIST test id ID #IMPLIED>]><test id="aaa"/>',"application/xml");

alert(doc.evaluate('id("aaa")/.',doc,null,9,null).singleNodeValue); //とれない!
alert((new XMLSerializer()).serializeToString(doc));})(); //定義が消える…

javascript:(function(){var doc=(new DOMParser()).parseFromString('<!DOCTYPE test [<!ATTLIST test id ID #IMPLIED>]><test id="aaa"/>',"application/xml");alert(doc.evaluate('id("aaa")/.',doc,null,9,null).singleNodeValue);alert((new XMLSerializer()).serializeToString(doc));})()

うーん…

*1//div[@id='hoge']/pの省略しない書き方は/descendant-or-self::node()/child::div[attribute::id='hoge']/child::pじゃないですか?

[opera][javascript][DOM]Entityノードを取得
Sat, Oct 27, 2007 3:00 AM

OperaだとXML(*/xml, */*+xml)な文書限定でEntityノードを取得できるんですね。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE script [
  <!ENTITY test "test entity!">
  <!ELEMENT script (#PCDATA)>

  <!ATTLIST script
    xmlns CDATA #IMPLIED>
]>
<script xmlns="http://www.w3.org/1999/xhtml"><![CDATA[

  try {
    alert(document.doctype.entities["test"].textContent); //test entity!
    //定義済みのやつ
    alert(document.doctype.entities["apos"].textContent); //'
  } catch (e) {
    alert("実体値の取得に失敗したー");

  }
]]></script>

XMLなXHTML文書だといっぱい取れる!

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">

<head><title>一般実体を取得してみるよ</title>
<script type="application/javascript"><![CDATA[
document.addEventListener("load", function(){
  var entities = document.doctype.entities;

  var result = document.createElement("ul");
  for (var i = 0, l = entities.length, ent, item; i < l; i++) {
    ent = entities[i];
    item = result.appendChild(document.createElement("li"));
    item.textContent = "<!ENTITY " + ent.nodeName + "\""+ ent.textContent +"\">";

  }
  document.body.appendChild(result);
}, false);
]]></script></head><body><h1>一般実体を取得してみるよ</h1></body></html>

取得できるEntityノードの数はOperaのインストールディレクトリにあるhtml40_entities.dtdの内容と内部DTDサブセットの内容による(amp, lt, gt, apos, quoteは宣言されてなくても定義される*1。html40_entities.dtdの内容を完全に空にしてからXHTMLの文書型宣言がされたXMLな文書を開くと読み込みが終わらなくなる?)。text/htmlの文書でもdocument.doctype.entitiesは取得できたけど長さは0だった。

そういえばOpera 9.50 beta 1が出ましたね!

EntityとかDocumentTypeとかは拡張インタフェースだって忘れてたせいでちょっと不正確な感じになってる…。CDATASection, DocumentType, Notation, Entity, EntityReference, ProcessingInstructionはXMLのための拡張インタフェースなのでHTML実装がこれらを持つ必要はない。

あとついでにもうちょっとOperaについてめもめも。外部実体を読み込む設定(opera:config#UserPrefs|XMLLoadExternalEntities)を有効にすると外部実体を読み込めるようになるのでDOMから外部実体の内容を取得できる。この設定は結構前からあった記憶があるからEntityらへんも結構前からあったのかもしれない(調べてない)。DTDの内部サブセット(Operaは外部サブセットは読まない)に記法宣言がある文書では、document.doctype.notationsから辿っていってNotationノードが取れたりも。

Sat, Oct 27, 2007 3:00 AM

空を自由に飛びたいな
「はい、クーポンマガジンのホットペッパーよ」

Ruby de html5lib(パース)
Sat, Oct 27, 2007 3:00 AM

Rubyの方のhtml5lib(0.10.0)のパーサもさわってみたくなりません?まあ…Rubyもよくわかんないですが…(じゃあ何がわかるの?って声が脳内で聞こえる…)

何かRubyの方は使い方の情報が見つからないけどこんな感じで使えるらしい。

require 'rubygems'

require 'html5'

doc = HTML5.parse('')
puts doc.class #REXML::Document
doc.write #<html><head/><body/></html>

これだとHTMLParserでパースされてREXMLのDocumentで結果が返ってくる。Rubyの方のパーサはいまのところHTMLParserしかなさげ。

Hpricotを使わせてみたり(REXMLとHpricotとSimpleTreeというので結果を返せる)

require 'rubygems'
require 'html5'

require 'html5/treebuilders/hpricot'
include HTML5

parser = HTMLParser.new({'tree'=>TreeBuilders['hpricot']})

#頑張って補完してくれる
parser.parse('<p class="test">a<p>b<p class="test">c').search('body > p.test') do |e|
  puts e.inner_text #aとcが

end

html5libのパーサさん
Sat, Oct 27, 2007 3:00 AM

html5lib(0.10.0)のパーサがタグをどう補完するのか気になりませんか?

気になったので試してみたよ(Pythonよくわかんないけど)

# -*- coding: utf-8 -*-

from html5lib import *

def parse(parser, source):
    try:
        return parser.parse(source).toxml()
    except Exception, e:
        return "error(%s)" % e


def test(parsers, source):
    print "\n\"%s\":" % source
    for label, parser in parsers.iteritems():
        print "  %-5s: %s" % (label, parse(parser, source))

parsers = {"XML":XMLParser(), "XHTML":XHTMLParser(), "HTML":HTMLParser()}


#いろいろとアレげなHTML
test(parsers, "")
test(parsers, "<p<p>")
test(parsers, "<title><p>")
test(parsers, "<title//<p>")
test(parsers, "<title></title><p>")
test(parsers, "<meta><img><p>")
test(parsers, "<table><tr><td>a</table>")
test(parsers, "<input text>")
test(parsers, "<i>nya<b>nya</i>nya</b>")

こんなかんじになった

"":
  XML  : error(list index out of range)
  XHTML: <html xmlns="http://www.w3.org/1999/xhtml"><head/><body/></html>
  HTML : <html><head/><body/></html>

"<p<p>":
  XML  : <p<p/>
  XHTML: <html xmlns="http://www.w3.org/1999/xhtml"><head/><body><p<p/></body></html>

  HTML : <html><head/><body><p<p/></body></html>

"<title><p>":
  XML  : <title><p/></title>

  XHTML: <html xmlns="http://www.w3.org/1999/xhtml"><head><title>&lt;p&gt;</title></head><body/></html>
  HTML : <html><head><title>&lt;p&gt;</title></head><body/></html>

"<title//<p>":
  XML  : <title <p=""/>
  XHTML: <html xmlns="http://www.w3.org/1999/xhtml"><head><title <p=""/></head><body/></html>

  HTML : <html><head><title <p=""/></head><body/></html>

"<title></title><p>":
  XML  : <title/><p/>

  XHTML: <html xmlns="http://www.w3.org/1999/xhtml"><head><title></title></head><body><p/></body></html>
  HTML : <html><head><title/></head><body><p/></body></html>

"<meta><img><p>":
  XML  : <meta><img><p/></img></meta>
  XHTML: <html xmlns="http://www.w3.org/1999/xhtml"><head><meta/></head><body><img/><p/></body></html>

  HTML : <html><head><meta/></head><body><img/><p/></body></html>

"<table><tr><td>a</table>":
  XML  : <table><tr><td>a</td></tr></table>

  XHTML: <html xmlns="http://www.w3.org/1999/xhtml"><head/><body><table><tbody><tr><td>a</td></tr></tbody></table></body></html>

  HTML : <html><head/><body><table><tbody><tr><td>a</td></tr></tbody></table></body></html>

"<input text>":
  XML  : <input text=""/>
  XHTML: <html xmlns="http://www.w3.org/1999/xhtml"><head/><body><input text=""/></body></html>
  HTML : <html><head/><body><input text=""/></body></html>

"<i>nya<b>nya</i>nya</b>":
  XML  : <i>nya<b>nya</b></i>nya
  XHTML: <html xmlns="http://www.w3.org/1999/xhtml"><head/><body><i>nya<b>nya</b></i><b>nya</b></body></html>

  HTML : <html><head/><body><i>nya<b>nya</b></i><b>nya</b></body></html>

  • XMLParserでも結構補完してくれる
  • XHTMLParserとHTMLParserだと結構HTMLの構造を考えつつ頑張って補完してくれる
  • 短縮タグはHTMLParserでもだめそげ?

さんこう

Widgets 1.0 (WD, 2007-10-13)
Thu, Oct 18, 2007 3:00 AM

Widgets 1.0の新しいワーキングドラフトが出てたんですね。

ぼんやり眺めた感じだとconfig.xmlがかなり変わった?名前空間(http://www.w3.org/ns/widgets)がついて、いままで要素だったものが属性に変わってたり(widthとheightがwidget要素の属性になったりとか)、名前が変わったり(widgetnameがtitleになったりとか)してる。

最初に開かれるファイルとしてHTML(index.html)以外の形式(XHTML, XML, SVG)もいけるようになってたり。widget要素にstart属性があってそれで指定するのかと思ったんだけど、start要素のsrc属性から最初に開かれるファイルを見つけるように書いてある?とこ(4.5)もあってよくわからない。最後のほうにあるRelax NGの短縮記法のやつとかみるとwidget要素のstart属性しかないみたいなんだけど…。

それ以外だとXML署名で電子署名ができたりも。あと今回の拡張子は.wgtだ。拡張子はころころ変わるなぁ。W3Cに提案される前から考えると.wdgt, .zip, .widgetときて.wgtだったかな

Wed, Oct 17, 2007 3:00 AM

なんかその場編集でも見出しのアスタリスクをどうしても書いてしまう

DHTMLビヘイビアと言ったらいいのかHTCと言ったらいいのかよくわからないのですが
Wed, Oct 17, 2007 3:00 AM

今までDHTMLビヘイビアというやつとは(というかIEの拡張とは)遊んだことがないので知識がないのですが、こいつは

  • 要素に対するメソッドの定義 (public:method要素で)
  • 要素に対するプロパティの定義 (public:property要素で)
  • 要素に対するイベント型の定義 (public:event要素で)
  • 要素に対するイベントハンドラの追加 (public:attach要素で。attachEvent)
  • 要素の定義 (要素の名前を設定したpublic:component要素でいろんな定義を括って。要素を使うときはそれを使う文書でXML名前空間の宣言(かそれみたいなもの)とimport処理命令っていうものを書いて使う)

というのができるんですか。それとelement.currentStyleなんかを参照(IEでstyle系のオブジェクトはIEがネイティブサポートできないプロパティと値のセットをそのまま(きゃめるけーすに変換したりしないで、for-inで列挙できない形で)保持してる)してあれこれすればIEが対応できないCSSプロパティに対応させたりもできて、CSSの内容を解析していろいろすることで擬似クラスに無理矢理対応させたりもできると。だからIEが対応できないCSSのプロパティとか動的擬似クラスとかに対応させたりDOM(CoreとかHTMLとかあたり)のメソッドとかに対応させたりできるわけなんですね。Adobe SVG Viewerのために<?import namespace="svg" implementation="#AdobeSVG"?>とか書いたりもするんですね。おもろいなぁ。

ところでタグの省略とXML名前空間の混在とかXML名前空間の宣言が<html xmlns:MyNS>みたいなので良かったりするのは何かもうどこか一回りしてニヤニヤしてしまいませんか。

Sat, Oct 13, 2007 3:00 AM

その場編集機能のテストついで2書く日記。これって2個目のやつは1個目のやつの前にくるのかな。次にくるのかな

なんだかぼくもHTCがやりたくなってきましたよ!いろんなブラウザと仲良くしたいよ!。昔のW3CのHTCのNote(の訳のサンプル)みてためしにHTCのルート要素をHTML要素にしてxmlns:PUBLIC="なんたら"("urn:HTMLComponent"とか空とか)ってして動かそうとしてみたら全然動かなくてこまった。xmlns属性見てるのか見てないのかどっちだろう。

というかあのサンプル全然あかんやんヽ(`Д´)ノ getElementsByTagNameがgetElementsByTagnameになってたり、いろいろ直さないと(いとしのIEで)うごかないよ!

昔のNoteなんか参考にしてないでそこらへんにあるちょーすげーすてきで実用的なやつとMSDNを参考にせーよってことだなー。

Sat, Oct 13, 2007 3:00 AM

その場編集機能のテストついでに書く日記。これってプレビュー機能つかないのかな。登録して間違ってたりしたらまた開いてすぐ直せ!ってことかな

新しいガンダムのアニメをはじめて見た(でも中身全然ちゃんと見てなかった。いつの間にか終わってた)んだけどEDがバックホーンでふいた。でも好きそうな感じのやつだった。おいさんあの枠の主題歌取るのってSony Musicのひとだけだと思ってたよ。なんかバックホーンってときどきびっくりするようなタイアップするときあるよなぁ。コーンフレークのCMにコバルトブルーとか。

OPも好きそうな感じのやつだった。あーいう感じの曲聴くといつもなぜかMOON CHILDのESCAPEを思い出す脳だ。

[javascript][SVG]SVGをJavaScriptやらでPNGにしたい
Mon, Oct 1, 2007 3:00 AM

でっきるっかなでっきるっかな

  1. svg(SVGSVGElement)をXMLSerializerのserializeToStringかなんかで文字列化
  2. 文字列をencodeURIComponentでパーセントエンコーディング
  3. 文字列の最初に"data:image/svg+xml,"をつけてimg(HTMLImageElement)のsrcにつっこんでSVGを読み込ませる
  4. 読み込めたらimgをcanvasの2DコンテキストにdrawImageでimgをつっこむ
  5. canvasでtoDataURL()

こんな感じでやったらできんかなーと思ってOperaの9.50(build 9562)でやってみたんだけどだめだった。imgにSVGを読み込ませると読み込めてるはずなのにloadイベントじゃなくてerrorイベントが発生する。なんで!。文書内にimgをつっこんでみると表示はできるから表示できるんだったらdrawImageもできるんじゃないかと思ってdrawImageしてみたらセキュリティエラーになった。あー違うなloadイベントはちゃんと発生してて、data URIのSVG読み込ませたimgをdrawImageした時点でerrorイベントが発生する(あとエラーコンソールにセキュリティエラーが通知される)。data URIじゃない普通のSVGファイルを読み込ませたimgの場合はerrorイベントは発生しない。でも普通のSVGファイルの場合もdata URIは取れない?

こういう風に書いてみたんだけど…だめかな?違うブラウザでも試したいけど「SVGをimgで表示」の時点でもうIEもFirefoxもOpera 9.2xもSafariもあかんぽいからなぁ。

function svgToPngDataURI(svg, callback){

  var NS_XHTML = "http://www.w3.org/1999/xhtml";
  var canvas = document.createElementNS(NS_XHTML, "canvas");
  canvas.width = svg.width.animVal.value; //svg.getTrait("width");
  canvas.height = svg.height.animVal.value; //svg.getTrait("height");

  var ctx = canvas.getContext("2d");

  var data = (new XMLSerializer()).serializeToString(svg);
  var img = document.createElementNS(NS_XHTML, "img");

  img.addEventListener("load", function(event){

    ctx.drawImage(img, 0, 0);
    callback(canvas.toDataURL());
  }, false);
  img.addEventListener("error", function(event){
    alert("えらー");
  }, false);
  img.src = "data:image/svg+xml," + encodeURIComponent(data);

}

//document.addEventListener("load", function(){
window.addEventListener("load", function(){
  svgToPngDataURI(document.getElementById("testsvg"), alert);

}, false);

[opera][DOM]ElementTraversalやら
Tue, Sep 18, 2007 3:00 AM

Opera 9.50 Alpha 1の「SVG Tiny 1.2の部分的サポート」っていうのがわからなかった(というかSVGがわからない!)んだけどMicro DOM(uDOM)のElementTraversalやらTraitAccessなんかが使えるみたい。ElementTraversalのはElementが持つようになってるからHTMLElementでもElementTraversalのプロパティが使える(Web API WGがつくってる方にあるchildElementCountはなかった)。

TraitAccessの最初の方見てるとデフォルト値がある属性は属性が設定されてないときはデフォルト値が使われるようなことが書いてある気がするんだけど、getTraitとかしても属性をあらかじめ設定しておかないとデフォルト値がある属性のときでもundefindが返ってくる。よくわからないので今度。

[opera][メモ]Opera 9.50 Alpha 1
Tue, Sep 4, 2007 3:00 AM

きた!

チェンジログおおすぎる!

大きい変更とか既報のはいろんな人が書いているものをありがたく読ませてもらえばいいか(Opera 9.23からOpera 9.5 Alpha 1への感覚的な変更点の紹介 (kuruman.org > Kuruman Memo)とか)。ほかのチェンジログのきになるところをちょっとずつメモしよう。

メモ整理しなおしta

メモは明示せずに増えたり減ったり直したりする、って書くの忘れた

CSS周り。

  • :-o-prefocus擬似クラス
    • Opera初の独自擬似クラス?空間ナビゲーションでフォーム部品上にフォーカスされてる(部品の周りに枠線が付いてる、ほんとのフォーカスの一歩手前の)要素にマッチ
  • -o-language-string(n)
    • content: -o-language-string(言語ファイルの番号)、で言語ファイルに書かれた文字列を内容にできる(ユーザスタイルのtoc.cssとかにある)
  • -o-table-baseline
    • abbr{ display:inline-table; -o-table-baseline:2 } abbr:before{ content:attr(title); display:table-row }、でtitle属性値をルビ風に表示してもともとのabbr要素の内容をベースラインにしたり
  • background-imageとlist-style-imageでSVG
    • background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg"><rect rx="10" width="100%" height="100%" fill="orange"/></svg>')、で伸縮可能な角丸を背景にしたり
    • 画像置換も角丸もOpera(だけ)ならかんたん!!って力説しtない
  • チェンジログからリンクされてるCSS3.infoのセレクタのデモ試してセレクタ全部サポートしたのかと勘違いしたけど::selection擬似要素はまだサポートしてない。CSS3.infoのデモはすべてのセレクタをテストしてない(CSS Selectors testsuite - CSS3 . info)

JavaScript/DOM。

  • Node.compareDocumentPosition
  • {Document,Element}.getElementsByClassName
    • 生きてない(静的)。配列で指定はできるみたい
  • SVGとXHTML以外のXML文書でXMLDocumentが使われる
    • SVGとXHTMLを除くのはクロスブラウザなのか?勘違いしそう
  • document.moveFocus{left,right,up,down}
    • JavaScriptから空間ナビゲーション。leftとかrightの最初の文字は小文字じゃなくて大文字

Event周り。

  • Trigger an onload event for images set to display:none
  • No longer share events between the Window and Document objects
  • No longer capture load events if listener is attached to the window and fire capturing events at target
    • window.addEventListener("load", listener, true)としてもloadイベントを捕獲しない
  • PluginInitialized User JS event

そのた。

  • Allow cascading dialog.ini files
    • profileフォルダ直下にdialog.iniをつくっておいて、そのファイル内でほかの設定ファイルのようにセクション単位で上書き…はできてなかった!デフォルトのdialog.iniの内容全部コピーしてきて書き換えないとだめみたい(コピーしてきてないセクションのダイアログがでてこなくなる…)?調べ中
  • delay, X where X is milliseconds.
    • delay, 1000 & go to page, "javascript:alert(1)"ってやると1秒経った後にalertが出る

[HTML]script要素の内容の終了(HTML 4.01)
Sun, Sep 2, 2007 3:00 AM

あるところでHTML 4.01のscript要素の終了タグ開始区切り子(ETAGO, </)のエスケープについての話を見かけて思ったんだけど、このうちのどれがvalidかっていうのはぱっと見わからないよなー(俺はわからない)。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">

<html><head><title>script要素内にa開始タグ</title>
<script type="text/javascript">alert("<a>")</script>

</head><body><p>a</p></body></html>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>script要素内にa開始タグと「&#60;</title>

<script type="text/javascript">alert("<a><")</script>
</head><body><p>a</p></body></html>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>script要素内にa開始タグと「&#60;/」</title>
<script type="text/javascript">alert("<a></")</script>

</head><body><p>a</p></body></html>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>script要素内にa開始タグと「&#60;/a」</title>

<script type="text/javascript">alert("<a></a")</script>
</head><body><p>a</p></body></html>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html><head><title>script要素内にa開始タグと「&#60;/a&#62;</title>
<script type="text/javascript">alert("<a></a>")</script>

</head><body><p>a</p></body></html>

ぱっと見じゃなかったら1番目と2番目がvalidで4番目と5番目がinvalidっていうのはわかる*1んだけど、3番目がわからない。仕様書見てもわからない(というか見てわからなくなったから書いてるんだけど)。

で、いろいろ調べてるうちにばけらさんの「CDATA 中の ETAGO」@水無月ばけらのえび日記にたどりついて気づいたんだけど、HTML 4.01の6.2(SGML basic types)(6.2の邦訳)とHTML 4.01のB.3.2(Specifying non-HTML data)(B.3.2の邦訳)は書いてることが微妙に違って6.2は内容がETAGOで終わるって書いてあるけどB.3.2はETAGOと名前開始文字で終わるって書いてある。

6.2だとETAGOのみで終了タグを表現できることになるしB.3.2だとばけらさんが書いてるように空タグがあるのでおかしい?上に書いた3番目のHTMLは6.2を信じるとinvalidだしB.3.2を信じるとvalidだ。SGMLからみるとvalidだと思う。W3CのValidatorを信じるとvalid。でも6.2はnormativeだから…あーどういうこと?結局よくわからない。

*1:1番目と2番目は内容全部がCDATAだからOKだけど、4番目と5番目はaの終了タグだけタグとして認識される

[javascript][DOM]はずふぃーちゃーてすと
Wed, Aug 29, 2007 3:00 AM

"XHTML"とか"XMLVersion"とか、抜けてる項目に気づいたので直してたらほかの仕様の機能名も入れたくなったのでいろいろ調べて入れてみた!hasFeatureで調べる機能名っていっぱいあるんだねー。増やしすぎたから調べたいとこだけ調べられるようにしたけど機能名とバージョンの組み合わせがほんとにあってるのか怪しいー

ブラウザ/テストぜんぶ(versionなし含む)DOM(versionありだけ)SVG(versionありだけ)
IE 72 / 274 1 / 36 0 / 101
Firefox 2.0.0.6 92 / 274 16 / 36 31 / 101
Opera 9.23 150 / 27419 / 36 56 / 101
Safari 3.0.3(beta)104 / 27419 / 36 34 / 101

自己申告制なので当てにならないところもあるけどIEはひどいNA

  • 機能名"XHTML"のバージョン"2.0"がfalseなのでDOM 2全部trueじゃなかったOpera
    • "XML""2.0""HTML""2.0"がtrueならtrueでいいらしいのでtrueにするといいと思うよ
  • 機能名"Core"のバージョン"1.0"は定義されてないので入れない
    • IE/Firefox/Operaはfalse, Safariはtrue
  • 機能名"LS-Load"/"LS-Save"("LS"に変更された), "VAL-DOC"("Validation"に変更された)は入れない

Sun, Aug 26, 2007 3:00 AM

俺はCSSのspecificityを「詳細度」って呼んでる*1けどほかのひとは何て呼んでるのかなー、と思って人力検索でアンケートとってみたんだけど「訳さずそのまま呼ぶ」が「その他」認定されてぽいんとげったーにやられちゃった感が。。上限150じゃあかんよなぁ。上限増やしてダミー項目つくったりしないと。いっそのことはてすたアンケートに持ってくとか?

あ、いまさらいうのもなんですが、以前はてなポイントくださったかたありがとうございました!

*1:最初に見た訳語がそれだったから。あと「固有性」より漢字の見た目が好き

[opera][javascript][DOM]Operaでwindow.addEventListenerがdocument.addEventListenerななぞ (”DOM 0”イベントハンドラ登録の場合)
Fri, Aug 10, 2007 3:00 AM

http://d.hatena.ne.jp/quaa/20070809#p1の続き!

Opera(9.22)でwindowにonなんとかでイベントハンドラつけた場合はthiswindowになるからそっちの場合はwindow/document別なのかと思ってたけど、windowにonなんとかでイベントハンドラつけるときもそのままdocumentに行ってた。

window.onclick=function(){alert(this)};
alert(window.onclick == document.onclick); //true

//でもこの後クリックするとalertで"[object Window]"が出てくる
  • javascript:window.onclick=function(){alert(this)};alert(window.onclick==document.onclick);void 0
  • javascript:window.onclick=document.onclick=undefined (イベントハンドラ消すとき用)

で、windowにイベントハンドラをつけたあとにdocumentに同じイベント型のイベントハンドラつけるとdocumentにつけた方のイベントハンドラしか動作しなくなる。

window.onclick=function(){alert("window")}; //この後クリックするとalertで"window"が出てくる
document.onclick=function(){alert("document")}; //この後クリックするとalertで"document"のみ出てくる

document.onclick=null; //この後クリックすると何も起こらない
alert(window.onclick) //関数が出てくる (同期的ではないみたい)

OperaではWindowは擬似的なEventTargetで、Windowに登録しようとしたイベントハンドラ/イベントリスナはすべてアクティブなDocumentに送られるってことかな。

ということは

多分Operaはわざとそうしてるんだろう。一番妥当そうなOperaの主張(予想)は

  1. Window(window)はW3C DOMによってEventTargetとして定義されていないのでWindowをEventTargetとして認めていない
  2. が、他のメジャーなブラウザはそれを認めているし、多くのWebサイト作成者もその振舞いに沿ってコードを書いている
  3. それに対応しないとユーザにとって不利益になるので仕方なく擬似的に対応している

ってとこ?Window Object 1.0(Editor’s Draft 01 May 2006 - 3. Events)とかHTML 5(Working Draft 10 August 2007 - 4.9.5.3 Events and the Window object)はWindowもイベントフローに追加しろって言ってる(みたいだ)から変わってくるかもしれないけど。

ちなみにOperaの7系には試した限り(7.11, 7.50)ではDocumentにaddEventListenerはあるけどWindowにはaddEventListenerはないみたい。

[opera][javascript][DOM]Operaでwindow.addEventListenerがdocument.addEventListenerななぞ
Thu, Aug 9, 2007 3:00 AM

Opera(9.22)でwindow.addEventListenerに関数をイベントリスナとして与えておいて呼び出されたときにthisの値調べたら予想(window)に反してwindow.documentになった*1ので、ためしにこうしてみた!

var listener = function(){ alert(this) };
window.addEventListener("click", listener, false); //windowにつけて

document.removeEventListener("click", listener, false); //documentで消す?
//でクリック

javascript:(function(){var listener=function(){alert(this)};window.addEventListener("click",listener,false);document.removeEventListener("click",listener,false);})();

何も出てこなくなった…

*1:全部のイベント型は調べてないけどキーボードイベントもマウスイベントもHTMLイベントもMutationイベントもそうみたい。えーと、なに調べたっけ?とりあえずload, click, mousemove, keypress, keydown, keyup, resize, DOMNodeInsertedを確か調べたよ

[firefox][javascript][DOM]
Tue, Aug 7, 2007 3:00 AM

そういえば前にiframeでHTMLDocument取ってたときFirefox 2はadoptNodeできないけど違う文書のノード突っ込んでもエラーにならないからそのまま突っ込めみたいなこと言ってたけどimportNode使えば仕様通りに突っ込めるよなーとおmあれ?importNodeに指定したノードと返ってくるノードのownerDocument同じままだな

javascript:(function(){alert(document.implementation.createDocument("","",null).importNode(document.body,false).ownerDocument===document.body.ownerDocument);})();

Firefox 2.0.0.6
true
Opera 9.22
false
Safari 3.0.3 beta
false
Firefox 3(Gran Paradiso) Alpha 7
false

こっちも3だと修正されてるのか…MDCのimportNodeのとこにそんな感じのことが書いてある。

Document Object Model FAQってのがあるんだね。全然知らなかった。

[opera][javascript][DOM]Opera用のAutoPagerizeでXPath式にid()を使えるようにする試み(2) / HTMLDocumentを生成する試み(3)
Tue, Aug 7, 2007 3:00 AM

だめだー。

iframe要素のcontentDocument

(Firefoxで)HTMLDocumentを生成する試み(2)と同じ。

var ifr = document.createElement("iframe");
document.body.appendChild(ifr);
//ifr.contentDocumentだとiframeを取り除いた後でただのObjectになるときがある?
var newdoc = ifr.contentDocument.documentElement.ownerDocument;
ifr.parentNode.removeChild(ifr);
//略
  • 一応できるけどいろいろ読み込まれたり実行されたりする
  • iframeを取り除くとevaluateのときにRESOURCE_UNAVAILABLE_ERR(こんなのはじめてみた…)になる

window.open()で開いた新しいウィンドウのdocument

window.open().documentもHTMLDocumentだ。でも一瞬でもウィンドウ開くのがうっとうしい。

var newwin = window.open();
//newwin.documentだとウィンドウ閉じた時にただのObjectになる
var newdoc = newwin.document.documentElement.ownerDocument;
newwin.close();
//略
  • RangeつくってcreateContextualFragmentしてもDocumentFragmentが返ってこない
  • ウィンドウ閉じるとevaluateのときにRESOURCE_UNAVAILABLE_ERRになる

iframeの方法もwindow.open()の方法もローカルでやるとセキュリティエラーになる?

ほかの(HTMLDocument生成する時点でもうだめなやつ)

DocumentをXSLTProcessorで無理矢理HTMLDocumentにする

(Firefoxで)HTMLDocumentを生成する試み(1)と同じ。OperaだとHTMLDocumentにならないんだった…

cloneNode
var newdoc = document.cloneNode(false);
//略
  • Operaはサポートしてない
Documentのopen()

HTML5のドラフトにDOMImplementationのcreateDocumentでつくったやつはXMLのDocumentだけどそれopen()するとHTMLDocumentになるぜてきなことが書いてある気がする(2.1 Documents (HTML5 Working Draft - 4 August 2007))。でもOperaのDocumentに今のところopenはない。

あー

あと何があるかなぁ。OperaでもXSLTProcessorでHTMLDocument生成できれば害がなくていいんだけど。というか何で普通にHTMLDocument生成する方法がないんだろう。

[opera][javascript][DOM]Opera用のAutoPagerizeでXPath式にid()を使えるようにしたいのだけど
Mon, Aug 6, 2007 3:00 AM

何で使えないのかいろいろ試してみて、OperaはHTMLDocumentじゃないDocumentではevaluateのときに(X)HTMLの要素のid属性をID型の属性として認識しないみたいだってことがわかった(getElementByIdの場合は認識してる…)。

var doc = document.implementation.createDocument(
  "http://www.w3.org/1999/xhtml","html",null); //XHTMLのHTML要素をルートに持つDocumentをつくる

doc.documentElement.id="test"; //HTML要素にidをつける
alert(doc.evaluate("id('test')/.",doc,null,9,null).singleNodeValue); //取得

javascript:(function(){var doc=document.implementation.createDocument("http://www.w3.org/1999/xhtml","html",null);doc.documentElement.id="test";alert(doc.evaluate("id('test')/.",doc,null,9,null).singleNodeValue);})();

上のをFirefox(2.0.0.6)とOpera(9.22)で動かしてみると、FirefoxではHTMLHtmlElementが取れるけどOperaではnullになる(あ、Safari(3.0.3 beta)でもnullだなー)。

だからAutoPagerizeのcreateHTMLDocumentByStringのなかでDocumentの代わりにHTMLDocumentをつくって返せばいいと思ったのだけど、その先で問題が出たりしてうまくいかない…

(続くかも)

[XPath]text/htmlのXHTMLでlang()
Sun, Aug 5, 2007 3:00 AM

lang()はxml:lang(http://www.w3.org/XML/1998/namespaceのlang)属性の値を見るので名前空間がサポートされていない状況では使えない。text/htmlの文書の場合はFirefox(2.0.0.6)でもOpera(9.22)でもSafari(3.0.3 beta)でもXML名前空間をサポートしていない。つまりtext/htmlではlang()は使えない。んー

text/htmlでlang()に相当する式を書くとしたら、例えば言語が英語な要素を全部取得するとしたらXPath 1.0だとこんな感じになるのかな*1

*/xml, application/xhtml+xmlのXHTML
descendant::*[lang('en')]
text/htmlのXHTML
descendant::*[(ancestor-or-self::*/@*[translate(name(),'XMLANG','xmlang')='xml:lang'])[position()=last() and (translate(string(),'EN','en')='en' or translate(substring-before(string(),'-'),'EN','en')='en')]]

うえぇぇ

  1. 名前空間サポートしてないので@xml:langて指定しても取れない(resolverがちゃんとURIを返せても無駄)
  2. Firefoxはtext/htmlのときname()を呼び出すと大文字で返ってくるけどOperaとSafariは小文字で返ってくるのでtranslate()で全部小文字にする
  3. xml:lang属性は継承されるので祖先のxml:lang属性も見て直近のxml:lang属性を対象にする
  4. lang()は大文字小文字は区別しないのでこれも小文字にする
  5. lang()はprimary-tag(en-usのときのen)だけ考慮する(正確さを落としてよければstarts-with()でやってもいいね)

*1:今回はlang()に相当する式を書くのが目的なので(X)HTMLのlang属性は見ない

[opera]昨日気づいたウィジェットのこと
Thu, Aug 2, 2007 3:00 AM

ウィジェットの確認するのがめんどい…
一回config.xmlをOperaにドロップしたあとは、修正したらリロードするだけでいいよ
メインファイルがindex.html固定だからContent-Typeがtext/html扱いになってXHTMLで名前空間が機能しないのがやだ
index.htmlのbody要素内にobject要素(type属性値がapplication/xhtml+xml、data属性値がXHTMLファイルのURI)だけ置けばいいよ
ウィジェット内でのみ、ある設定を有効/無効にしたいよ
ウィジェット内でのみ、は無理だけどlocalhostのサイト別設定がウィジェットにも効くのでそれで代用すればいいよ

ちょっと考えればわかりそうなことを気づかないことでこんなにも不便な日々を過ごすことになるのか!とおもった。特に修正したらリロードするだけでいいっていうのはユーザスタイルシートが普通に更新できることを知ったときのようなだつりょくかんが…。Operaにconfig.xmlドロップするたびにそのときのデータがwidgetsディレクトリ内に保管されるっておもいこんでてクロスドメインなXMLHttpRequest使うときは毎回修正するたびにドロップしてたよーおー

Tue, Jul 24, 2007 3:00 AM

自分でもXPath用のオブジェクトか何か(Operaウィジェットで使えればいいやつ)を書いてみようと思ったのだけど、なんかXPathってどういう風にでも被せられそうな感じがしたのでいろいろ考えた

ふつうの

xpeval(expr, resolver, context); //評価した結果を返す
//Object#evalな感じとか

context.xpeval(expr, resolver); //評価した結果を返す
Node.xpeval(context, expr, resolver); //評価した結果を返す(prototype拡張しない方)

RegExp風

//コンストラクタ内でevaluator.createExpression(expr, resolver)する
//flagsで"g"(global)つけるとすべて選択、"i"(ignoreNamespace)つけると名前空間無視
var x = new XPathExp(expr, resolver, flags, evaluator/*=document*/);

x.exec(context); //評価して見つかったノードを持つArrayを返す

x.test(context); //評価した結果のBooleanを返す

context.xpmatch(x); //評価して見つかったノードを持つArrayを返す
Node.xpmatch(context, x); //評価して見つかったノードを持つArrayを返す(prototype拡張しない方)

ノード集合なArray風

var x = new XPathArray(nodes); //ノードの入ったArrayかNodeListを入れる

x.push(node); //ノードを追加していったり
x.concat(otherx); //他のXPathArrayと合体させたり

x.select(predexpr, resolver); //x内の全てのノードで"self::node()["+predexpr+"]"を評価して
                              //合致したノード全てを持つ新しいXPathArrayを返す

x.evaluate(expr, resolver); //x内の全てのノードでexprを評価して

                            //見つかったノード全てを持つ新しいXPathArrayを返す
x.evaluate(expr, resolver, callback); //見つかったノード全てに処理をかける

XPathArrayでもXPathNodeSetでも何でもいいんだけど

ファイルパス風

RubyのPathnameな感じ

var x = new XPathname(context, resolver);
x.children(); //Arrayを返す。child::node()を評価するのと同じ
x.children(nodetest); //Arrayを返す。"child::"+nodetestを評価するのと同じ
x.children(nodetest, callback); //見つかったノード全てに処理をかける
//あとdescendantsとancestorsもいるかもいらないかも

x.glob(expr); //exprを評価して見つかったノード全てを持つArrayを返す
x.glob(expr, callback); //見つかったノード全てに処理をかける

x.parent(); //parent::node()をコンテキストノードにした新しいXPathnameオブジェクトを返す
x.cd(expr); //見つかったノードをコンテキストノードにした新しいXPathnameオブジェクトを返す
//cdかaddか

x.toString(); //コンテキストノードを指定できるXPath式(String)を返す(prefixはresolver依存)

うー。どうしよう

[opera][javascript]setDocument
Sun, Jul 22, 2007 3:00 AM

setDocumentっていうのを使うとページの表示をいまのDocument(window.document)から別のDocumentに切り替えられるみたい(Operaのみの独自拡張?)。MDCにあるwindowのクロスリファレンス見ると8.0のときには既にあったらしい。たまたま入ってた7.5にはなかった。

//Documentをどこかから読み込んだり適当につくったり
var nd = (new DOMParser()).parseFromString(
['<html xmlns="http://www.w3.org/1999/xhtml">',
'<head><title>test</title></head>',

'<body>',
'<h1>test</h1>',
'</body>',
'</html>'].join("\n"),

"text/xml");

//切り替え
setDocument(nd);

へぇー。でも一回切り替えるとwindow.documentは切り替えたDocumentになってもともとのDocumentはどこかにいってしまうので戻せなくなる。なので迂回して参照しておいて戻してみる。

var od = document.documentElement.ownerDocument; //迂回

var nd = (new DOMParser()).parseFromString(
['<html xmlns="http://www.w3.org/1999/xhtml">',
'<head><title>test</title></head>',

'<body>',
'<h1>test</h1>',
'</body>',
'</html>'].join("\n"),

"text/xml");

setDocument(nd);
alert("もどすよ(もとのDocumentが大きい場合はちょっと時間がかかる)");
setDocument(od);

確認用bookmarklet(Operaのみ)。

javascript:(function(){var od=document.documentElement.ownerDocument,nd=(new DOMParser).parseFromString('<html xmlns="http://www.w3.org/1999/xhtml"><head><title>test</title></head><body><h1>test</h1></body></html>',"text/xml"),s=setDocument;s(nd);alert("もどすよ(もとのDocumentが大きい場合はちょっと時間がかかる)");s(od);})();

[opera][javascript]selectNodesが返すもの
Sun, Jul 22, 2007 3:00 AM

Opera*1のselectNodesで返ってくるのちゃんとしたNodeListじゃなかった。instanceofしてみるとfalseになるし生きてない。死んでる…!

var nodes = document.body.selectNodes("descendant::p[@class]"); //てきとーにせんたく

alert(nodes); //[object NodeList]
alert(nodes instanceof NodeList); //false
alert(nodes.length);
nodes[0].parentNode.removeChild(nodes[0]); //ひとつけしてみる

alert(nodes.length); //かわらない!

むむっむ。あーでも死んでるのはMSXMLでも一緒みたい?

selectNodes/selectSingleNodeはDocumentFragmentとかでも使えるのはいいんだけど名前空間URI解決するやつが見つからないのがだめだー。

*1:いま9.22

[HTML]要素型、要素、タグ、内容
Sun, Jul 15, 2007 3:00 AM

私は h1 要素、または、hn 要素という表記を、普通はしません。 H1 というタグと、その要素は区別されるもので、次の用例では <h1> がタグ、Weblog という「言葉」(文章もあり得る)が要素です。 したがって、h1 要素というのは、常識的には Weblog という言葉(=要素)を指します。

<h1>Weblog</h1>
タグと要素 - Weblog

<h1>Weblog</h1>」の「Weblog」部分は要素の内容であって要素はタグと内容(と属性)を含むものだと思うので(http://www1.u-netsurf.ne.jp/~7l1rll/SGMLsec6_0.html#3とかhttp://www.w3.org/TR/2006/REC-xml-20060816/#sec-logical-structあたり)、「Weblog」部分=要素*というのは違和感があるなぁ。

H1 は「形式」であって「内容」ではない。 ところが h1 要素と書くと、両者の区別が不明瞭になります*というのも。形式*なら「h1要素型」、実体なら「h1要素」、内容なら状況にあわせて「h1要素の内容」「h1要素型の内容(内容モデル)」と書けばいいと思う。てそんなん三宅さんが知らんはずないよなぁ…

[はてな]はてなスターのアイコンを消す
Wed, Jul 11, 2007 3:00 AM

span.hatena-star-comment-container,

span.hatena-star-star-container {
  display: none !important;
}

まーこんなとこまで来て星つけてく人はよっぽどいねーわな。

javascript:(function(n){var s="";if(typeof window.XMLSerializer!="undefined")s=(new XMLSerializer).serializeToString(n);else if("outerHTML"in n)s=n.outerHTML;alert(s.replace(/>/g,">\n"));})(document.getElementsByTagName("h3")[0]);

もうちょっと巡回するべきだったよ…

不評度がすごい。

何かIEでは消せないらしいのでhttp://s.hatena.ne.jp/js/HatenaStar.jsを見たらclass属性をsetAttribute("class", ...)でつけてた。道理で消えないわけだ…。h3 span消して必要なのだけ出すのはめんどいのでHatenaStar.js書いてる人が気づくまで待つか。

あまりにもかわいそうすぎるので消すのはやめておこう…

hatenaStar.js書いてるの近藤さんやないですか!!

Tue, Jul 10, 2007 3:00 AM

Folderの7 SOULを手に入れたぞ><

7 SOUL

変声期真っ只中のときのだから声の変わりようが楽しめていいなぁ。あとさりげなくI WANT YOU BACKのスクラッチがRIP SLYMEのFUMIYAだったりBOHEMIAN RHAPSODYのラップが童子-Tだったりするな。

I WANT YOU BACK(http://www.youtube.com/watch?v=fkg5QqO7GW0)。kawaii!

D

Everlasting Love(http://www.youtube.com/watch?v=iqoUNe6nwOc)

D

アルバムはもう両方あるからシングルがほしいなー

[はてな][userjs]はてなブックマークを掲示板に仕立てるUserJS(Greasemonkeyスクリプト)
Sun, Jul 8, 2007 3:00 AM

前書いたのを動くように書き直し。説明も書き直すことにした。前「一行掲示板」て書いてたけど一行ちゃうやん、二行やんということに一年越しに気づいた。

これはなに?

f:id:quaa:20070708190524p:image

はてなブックマークのエントリページを掲示板に仕立てるUserJS。

  • 空のコメントを削除
  • コメントを昇順に
  • コメントの日付の横に時間(hh:mm:ss)を追加
  • どこかの掲示板のような見た目に

無言ブクマばっかりあるコメント欄で、数少ないコメントをさっと読みたいときとかコメントが白熱(長文ばっかり)していて読みづらいときにちょっと便利かもしれない。

使い方

  1. エントリページを開く
  2. 「このエントリーをブックマークしているユーザー」の辺りにできたボタンを押す。

確認したブラウザ

  • Opera 9.21
  • Firefox 2.0.0.4

履歴

  • 2007-07-08
    • 書き直した
    • はてなブックマークの仕様変更に対応
  • 2006-08-01
    • 書き直した
  • 2006-06-03
  • 2006-06-01
    • つくった

[javascript][DOM][メモ]JavaScriptでDOM 3 Load and Saveを使うメモ
Fri, Jul 6, 2007 3:00 AM

DOM 3 Load and Save(以下DOM LS)の使い方を一からメモ…(忘れないために、というかすでに忘れたので思い出すために)。メモは増えたり減ったり直したりする。JavaScriptらへんでは今のところ実装数が少ない(というかOperaしか知らない)上にDOMParserとかXMLSerializer、XMLHttpRequestが普及しているので、JavaScriptらへんではDOM LSが普及するまでには相当な時間が必要になるか、もしくはまったく普及しないかもしれない。

準備

DOM LSが使用できるかどうかをdocument.implementation.hasFeature("LS", "3.0")を呼び出して確認すること。使用できる場合はこれはtrueを返す。DOM LSを使用できる環境でも非同期読み込みは使用できないかもしれないので、非同期読み込みを使用する場合はdocument.implementation.hasFeature("LS-Async", "3.0")を呼び出して確認すること。

document.implementationを何回も使うことになる場合は、面倒なのでdocument.implementationを最初に変数に入れておくと良い。

読み込み (Load)

文字列のパース
var di = document.implementation; //LSInputなどをつくるこうじょう
var xmlstr = '<?xml version="1.0"?><test>test</test>';

var input = di.createLSInput(); //LSInputをつくる
input.stringData = xmlstr; //データをつける
var parser = di.createLSParser(
  DOMImplementationLS.MODE_SYNCHRONOUS, null); //同期LSParserをつくる
var newdoc = parser.parse(input); //パース

DOMImplementationLS.MODE_SYNCHRONOUSは長いけど結局のところ1のこと。非同期のLSParserをつくるDOMImplementationLS.MODE_ASYNCHRONOUSは2。DOMParserと違う点はいろいろな設定(LSParser#domConfig.setParameter)ができること、フィルタリングができることなど。

次の例はフィルタ(LSParserFilterに相当するもの)を使ってある要素を除外したDocumentノードを生成する。これはファイルの読み込みのときでも使用できる。

var di = document.implementation;
var xmlstr = '<?xml version="1.0"?><test><del>del</del>test</test>';

var input = di.createLSInput();
input.stringData = xmlstr;
var parser = di.createLSParser(
  DOMImplementationLS.MODE_SYNCHRONOUS, null);
//フィルタの設定
parser.filter = {
  startElement: function(n) {

    //del要素とその子孫要素を許可しない
    if (n.localName == "del") return LSParserFilter.FILTER_REJECT;
    //それ以外の要素は許可する
    else return LSParserFilter.FILTER_ACCEPT;
  }

};

//パース。del要素とその子孫を持たないDocument
var newdoc = parser.parse(input);

次の例はLSParser#parseWithContextを使ってbody要素内の子要素をパースした結果のノードに置き換える。これもファイルの読み込みのときでも使用できる。

var di = document.implementation;

var frgstr = '<div>test</div>'; //XML片
var input = di.createLSInput();
input.stringData = frgstr;
var parser = di.createLSParser(
  DOMImplementationLS.MODE_SYNCHRONOUS, null);
parser.parseWithContext(
  input, document.body, LSParser.ACTION_REPLACE_CHILDREN); //パース+アクション

パースする文字列はXMLの断片でなければならない(XML宣言などを含めないようにする)。

parseWithContextは5つのアクションをとることができる。コンテキストノードの子要素をパース結果で置き換える(ACTION_REPLACE_CHILDREN)ほかにはパース結果をコンテキストノードの子要素として追加(ACTION_APPEND_AS_CHILDREN)、パース結果をコンテキストノードの前に挿入(ACTION_INSERT_BEFORE)、パース結果をコンテキストノードの後ろに挿入(ACTION_INSERT_AFTER)、コンテキストノードをパース結果で置き換える(ACTION_REPLACE)ことができる。

ファイルの読み込み(同期)
var di = document.implementation;
var path = "test.xml";

var parser = di.createLSParser(
  DOMImplementationLS.MODE_SYNCHRONOUS, null);
var newdoc = parser.parseURI(path); //ファイルの読み込み

これは次の例の簡略化された方法。

var di = document.implementation;

var path = "test.xml";
var input = di.createLSInput();
input.systemId = path;
var parser = di.createLSParser(
  DOMImplementationLS.MODE_SYNCHRONOUS, null);
var newdoc = parser.parse(input);

昔の仕様(ドラフト)ではDocumentLSというインタフェースが定義されていて、DocumentLSインタフェースを実装するものはloadメソッドを使用して文書を読み込むこと、またasyncプロパティで読み込みを同期にするか非同期にするかを設定することができた。これはFirefoxやOpera(9.0beta2以上)などで使用することができる。IEでもDOMDocumentから同様のAPIを使用できる(…というか昔の仕様がIE由来なのか)

var di = document.implementation;
var path = "test.xml";
//Documentをつくる
//IEの場合var newdoc = new ActiveXObject("Msxml2.DOMDocument.6.0");など

var newdoc = di.createDocument("", "", null);
newdoc.async = false; //同期に設定
newdoc.load(path); //ファイルの読み込み
ファイルの読み込み(非同期)
function loaded(event) {
  var newdoc = event.newDocument; //ファイル内容を読み込んだDocument

  //何か処理
}
var di = document.implementation;
var path = "test.xml";
var parser = di.createLSParser(
  DOMImplementationLS.MODE_ASYNCHRONOUS, null);

//"load"イベントが発生した時のためのイベントリスナの追加
parser.addEventListener("load", loaded, false);
parser.parseURI(path);

LSParserはEventTargetで、有効なイベントは読み込みが完了した際に発生する"load"イベント(LSLoadEvent)、読み込みの進捗を通知する"progress"イベント(LSProgressEvent)の2つ。"progress"イベントがいつ発生するかは実装依存で、全く発生しないかもしれない。

文字列のパースとか、同期のところでメモしたLSInputでのファイル読み込みの場合やDocumentLS#loadの場合も非同期で読み込むことができる。

保存 (Save)

少なくともブラウザ上で、通常の権限で動くJavaScriptでファイル保存なんかができるようになることはないと思う。文字列にすることはできる。

DOMノードの文字列化
var di = document.implementation;
var serializer = di.createLSSerializer(); //LSSerializerをつくる
var xmlstr = serializer.writeToString(document); //documentのシリアライズ

XMLSerializerと違う点は、LSParser同様いろいろな設定(LSSerializer#domConfig.setParameter)ができることとフィルタリングができることなど。

次の設定の例は整形表示を有効にする。

var di = document.implementation;
var serializer = di.createLSSerializer();
//LSSerializer用の設定用オブジェクト(DOMConfiguration)

var sconfig = serializer.domConfig;
//設定が可能か確認
if (sconfig.canSetParameter("format-pretty-print", true)) {
  sconfig.setParameter("format-pretty-print", true); //整形表示を有効に

}
var xmlstr = serializer.writeToString(document);

DOMConfigurationインタフェースについてはDOM 3 Coreの仕様書を見ること。DOMConfiguration#setParameterは2つの例外(設定しようとしているパラメタが見つからない場合に発生するNOT_FOUND_ERRとその設定をサポートしていない場合に発生するNOT_SUPPORTED_ERR)を発生させることがあるので、設定する前にまずDOMConfiguration#canSetParameterでその設定が可能か確かめること。DOMConfiguration#parameterNamesが設定可能なパラメタのリストになっているけど、このリストに含まれているからといって必ずしも設定が可能ではないことに注意すること(trueに設定することはできてもfalseにはできない、など)。

参考

またこんど

  • エラーハンドラとか

変えたところ

  • DOMConfiguration関連のメモとかの追加、DOMノードの文字列化の例の変更 (2007-07-07)

[firefox]Firefoxのなんとかキーワード
Sat, Jun 30, 2007 3:00 AM

スマートキーワードなのかカスタムキーワードなのかブックマーク・キーワードなのか、わけがわからない。正式な名称を知りたい。ただいろいろ見てみると説明が微妙に違っているのでもしかしたら別のものかもしれないという気がしてきた。

どれが正解?どれも正解じゃない?

[opera][javascript][DOM]Operaでevaluateで指定するXPath式にid関数使うとTYPE_ERRになる(ときがある)らしい
Thu, Jun 7, 2007 3:00 AM

new function(){this.id=’gnarl’} - Operaとfirefoxでxpathの挙動が違うよ!誰のせい?誰のせい?から。全然知らなかったしid関数使ってたけど遭遇したことなかったから調べてみた。

例外の発生する条件?

調べた限りだとXPath式がid関数のみで構成されてる場合で、かつevaluateに指定したResultTypeANY_UNORDERED_NODE_TYPEFIRST_ORDERED_NODE_TYPE(singleNodeValueを使用できるResultType)のときになるみたい。

  • id("hoge")だとだめだけどself::node()使ってid("hoge")/self::node()(id("hoge")/.)とかにすると例外なしで通る
  • メディアタイプ(text/html, application/xhtml+xml)変えても変化ない
  • DTDつけたり外したりしても変化ない

回避策をかんがえる

  • OperaではORDERED_NODE_SNAPSHOT_TYPEsnapshotItem(0)とかを使うようにする
  • どうしてもFIRST_ORDERED_NODE_TYPE/ANY_UNORDERED_NODE_TYPEでやりたい場合はid関数のみの式を指定しないようにする。id("hoge")ならid("hoge")/.にしてごまかす

ようにすればいいかなあ

んーとつまり?

こんなかんじだ(コメントで書いてある結果はOpera 9.21のやつ。Firefox 2.0.0.4だと全部まる。7がORDERED_NODE_SNAPSHOT_TYPE、8がANY_UNORDERED_NODE_TYPE、9がFIRST_ORDERED_NODE_TYPE)。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><title></title></head><body>
<div id="hoge"></div>

<script type="text/javascript">
function xtest(expr, type){
  try {

    return document.evaluate(expr, document, null, type, null);
  } catch (e) {

    return e;
  }
}

alert(xtest('id("hoge")', 8));   /* XPathException(TYPE_ERR) */

alert(xtest('id("hoge")', 9));   /* XPathException(TYPE_ERR) */
alert(xtest('id("hoge")', 7));   /* XPathResult(OK)。snapshotItem(0)でノードを取る */

alert(xtest('id("hoge")/.', 8)); /* XPathResult(OK)。singleNodeValueでノードを取る */
alert(xtest('id("hoge")/.', 9)); /* XPathResult(OK)。singleNodeValueでノードを取る */

</script>
</body></html>

selectSingleNodeselectNodesのことを思い出したのでそれでもやってみたけどselectSingleNodeの場合はid関数のみだとやっぱりTYPE_ERRになる。selectNodesだとちゃんとNodeListが取れる。

[opera]「「進む」と「戻る」を左手用に設定」して右手で使うひと
Wed, Jun 6, 2007 3:00 AM

左手用のロッカージェスチャーを右手で使うのがいい感じ

http://www.opera-wiki.com/index.php?%E7%AA%81%E7%84%B6%21%21%E3%82%A2%E3%83%B3%E3%82%B1%E3%83%BC%E3%83%88%21%21

こんなことやるの自分くらいだろうと思ってたから同じことやってる人を偶然見つけてびっくりした。進むより戻るのほうが圧倒的に使う頻度高いのに、右押しながら左押すのって左押しながら右押すのと比べてすごい押しづらいんだよなー。俺他の指と比べて右手の中指から後ろの筋力がたぶんかなりない(親指から順に曲げてくと中指のところで半端に全部曲がる)から余計そう感じるんだけど…。これはOpera使いはじめたときからずっと変わんないなぁ。

あとはFlash上でも気にせずに戻れるっていうめりっとが…(それはmiya2000さんのflash 上でマウスジェスチャーできるようにする user.js入れればいいよね)(たぶんそうやね。今からいれてみる)(今からかい)

あ、ちなみにアンケートはフリップバック・ロッカージェスチャー(右押しながら左とか)*Z・Xキー*にいれたよ。

[opera][javascript]Operaと$X
Mon, Jun 4, 2007 3:00 AM

$X(http://lowreal.net/logs/2006/03/16/1)はすごい便利だけどOpera*1だとXPath式にprefix入れるとエラーになるからなんとかしてみたかった。

  1. document.createNSResolver(context)(prefix)のところでこける
    • document.createNSResolver(context).lookupNamespaceURI(prefix)に変えれば通る
  2. document.contentTypeはGeckoの拡張プロパティでOperaは今のところサポートしてないからtext/htmlでもそうじゃなくてもXPathNSResolverで解決できないprefixの名前空間URI"http://www.w3.org/1999/xhtml"になっちゃって、text/htmlの(X)HTMLの場合要素が取得できない。でも別の方法でtext/html(っぽい)かどうかを判別して振り分けても、resolverが空文字列を返しちゃうとprefixに対応したURIを適切に返せないってことでNAMESPACE_ERRになる*2
    • text/htmlの文書の場合、XPath式内のprefixを取り除く?
      • 正規表現がうまいことかけません><。。

text/htmlの文書ではXPath式でprefix使わないようにするのがふつうの対処法な気がする…

function $X (exp, context) {
  if (!context) context = document;
  var resolver = function (prefix) {

    var o = document.createNSResolver(context).lookupNamespaceURI(prefix);
    return o || "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;

}

上のほうちょっと変えてみた。

resolver指定できるようにと、document(window.document)じゃないXMLHttpRequestとかでとってきたDocument内の要素をコンテキストノードにして検索できるようにしたい気もする

function $X (exp, context, resolver) {
  if (!context) context = document;
  if (!resolver) resolver = function (prefix) {

    var o = doc.createNSResolver(context).lookupNamespaceURI(prefix);
    return o || "http://www.w3.org/1999/xhtml";
  }
  var doc = context.ownerDocument || context;
  var exp = doc.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;

}

*1:いま9.21。バージョン書いとかないとあとで検索して見つけた時に困ることにきづいた

*2http://www.w3.org/TR/2004/NOTE-DOM-Level-3-XPath-20040226/xpath.html#XPathEvaluator-createExpressionらへん

最小のXHTML 1.0?
Wed, May 23, 2007 3:00 AM

ついでに最小のXHTML 1.0も考えてみよう。

  1. XML宣言は条件付で省略できるので省略
    • UTF-8かUTF-16で書かれる場合と上位のプロトコルで符号化方式が示される場合に省略できる
  2. 文書型宣言を書く
  3. ルート要素(html)を書く
  4. htmlの内容モデル((head, body))に合わせてheadとbodyを書く
  5. headの内容モデルは(%head.misc;, ((title, %head.misc;, (base, %head.misc;)?) | (base, %head.misc;, (title, %head.misc;))))。titleを内容にすれば条件を満たすのでtitleを書く
  6. titleの内容モデルは#PCDATAなので内容は何も書かない
  7. bodyの内容モデルは%Block;。%Block;は"(%block; | form | %misc;)*"なので内容は何も書かない
  8. これまでに出てきたすべての要素に必須な属性はないので属性は何も書かない
    • html要素のxmlns属性は#FIXED("http://www.w3.org/1999/xhtml"で固定される)。xml:lang, lang属性は#IMPLIED(省略可)
  9. XMLでは単に内容を持たない要素の場合でも/>で閉じることはできるのでそれで閉じる

で、

  • UTF-8かUTF-16で書かれるか上位のプロトコルで符号化方式が示される
  • このXHTMLファイルと同階層にaって名前のXHTML 1.0 Strict DTDと同内容のDTDファイルが存在する

っていう条件付で、こうなった。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "a"><html><head><title/></head><body/></html>

W3CのValidatorはThis Page Is Tentatively Valid XHTML 1.0 Strictって言ってくる。XML宣言がないからみたいだ。

もっと短くする方法を知ってる人は教えてください(HTML 4.01の方も)。

先にDTD見てそれで判断してたけどxmlns属性必須だ。

The root element of the document must contain an xmlns declaration for the XHTML namespace [XMLNS]. The namespace for XHTML is defined to be http://www.w3.org/1999/xhtml.

http://www.w3.org/TR/2002/REC-xhtml1-20020801/#strict
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"a"><html xmlns="http://www.w3.org/1999/xhtml"><head><title/></head><body/></html>

一気に長くなっちゃうな…。でもW3CのValidatorに通るならいいじゃん、ってなるとこれでも良くなっちゃうもんな。

<!DOCTYPE a PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "a"><a/>

これは…

参考

最小のHTML 4.01?
Wed, May 23, 2007 3:00 AM

最小のHTML 4.01について一から考えてみることにした…けど間違ってるかも。

  1. HTML 4.01として認められるために文書型宣言をつける
    • TransitionalよりStrictの公開識別子の文字列の方が短いのでStrictにする
      • TransitionalだとBODYの内容モデルが(%flow;)*だからBODYは内容なしでいいけど"Transitional"が長すぎ
    • システム識別子は省略できる(システム識別子は,公開識別子及びその他の情報からシステムが補充できるのであれば,省略してもよい*)ので省略する
      • XMLはだめ (文法上、公開識別子書く場合システム識別子書かないとだめ)
  2. HTML 4.01はタグの省略ができる(SGML宣言でOMITTAG YESになってるから)ので極力省略する
    • HTML, HEAD, BODYは開始タグと終了タグ両方省略できるので省略
  3. TITLEは必須 (HEADの内容モデルが(TITLE & BASE?)で、TITLEはタグの省略不可)なので書く
    • TITLEの内容モデルは#PCDATAだから内容なしでいい (内容字句“#PCDATA”には,出現標識repが付けてあるものとして扱う*。rep = 任意選択の反復(0回以上)*)
  4. BODYの内容モデルは(%block;|SCRIPT)+ +(INS|DEL)なので何か書く
    • BODYの内容モデルに含まれる要素型で一番名前が短いのはPなのでPを書く
      • Pの内容モデルも#PCDATAだから内容なしでいい
  5. HTML 4.01は短縮タグ機構が使える(SGML宣言でSHORTTAG YESになってるから)ので極力短縮する
    • 空終了タグかNET可能開始タグが使えそう
      • 開始タグ+空終了タグ(<title></>)よりNET可能開始タグ+NET(<title//)の方が短いのでNET可能開始タグ+NETを使う

こうなった。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"><title//<p//

なんか…大変だ……。ちゃんとThis Page Is Valid HTML 4.01 Strict!って言ってくれるW3CのValidatorすごい。

satoshiiさんが以前書いていた。→ http://www.satoshii.org/markup/notes/2002/06#day11-2 / pは終了タグ省略可。

http://b.hatena.ne.jp/kits/20070523#bookmark-4791550

あ、そうか、Pの終了タグ省略可なのすっかり忘れてた(というかsatoshiiさんの書いたやつ見たことあったのに全然覚えてなかった…)。

あとPUBLICと公開識別子の間の空白削れそう、と思ってやってみたらW3CのValidatorにThis Page Is Valid (no Doctype found)!って言われたのと根拠になるものが見つからなかった(探しなおしたら普通にJIS X 4151:1992の文書型宣言のとこにあった)からやめたんだけど、satoshiiさんの書いたのは削った形だった。

外部識別子     = (“SYSTEM”| (“PUBLIC”, ps+, 公開識別子)),
http://www1.u-netsurf.ne.jp/~7l1rll/SGMLsec9_0.html#ex73

ps+(psには空白文字が含まれる)だから削れないんじゃないかな…?

satoshiiさんからコメントを頂きました!

http://www1.u-netsurf.ne.jp/~7l1rll/SGMLsec9_0.html#ex65
> psは,文脈上必すであっても,区切り子又は他のpsに隣接していて省略してもあいまいさを生じないのであれば,省略してもよい。
です。

http://d.hatena.ne.jp/quaa/20070523#c1182868569

見落としすぎた…。公開識別子の始まりはlit(")/lita(')だから省略していいのですね…!

参考

[opera]opera:configでmarqueeの動きを止める
Mon, May 14, 2007 3:00 AM

opera:config#UserPrefs|MaxMarqueeLoops(初期値-1)を0にするとmarquee要素のループが止まるみたい。昔のOpera確認したら9.00正式版(build 8502)のopera:configにもあった(8系はopera:configなくて調べるのめんどかったから試してない)。ただ止まるのは止まるんだけど移動し始めの所で止まってて文字がほんの少ししか見えない。

まあmarqueeのあるページなんてめったに遭遇しないからいいけどなー。marqueeも止めたいしちゃんと文字も見たいんだったらOperaの場合ユーザスタイルシートつくってmarquee{ display: block }って書いとけば止まるよ(OperaのmarqueeWCSS(WAP CSS)のdisplay: -wap-marqueeで動いてるから。marquee以外の要素でdisplay: -wap-marqueeが指定されてるページがもしあったらサイト別設定で個別にユーザスタイルシートつくってdisplay: blockするとかblinkKiller2.jsを使うとか。一番いいのは静かにそのページから立ち去ることだ!)。

でも何か公式のopera:config(opera6.ini)の資料に書いてない設定あるよなあ。これもそうだし、あと見つけたやつだとopera:config#UserPrefs|ScriptSpoofとかopera:config#UserPrefs|WidgetTabとか。Script SpoofはUA偽装だった(opera:config#UserAgent|SpoofUserAgentIDと多分違いはあるんだろうけど試した限りでは同じだった)。Widget Tabは何?

Text::Hatena 0.20と遊ぶよ(2)
Sat, May 12, 2007 3:00 AM

書いたddが複数っていうかdt/ddが1対1のペアじゃなくても書ける定義リスト記法はこんな感じかなー

#!/usr/local/bin/perl

use strict;

use warnings;

{
  package MyParser;
  use base qw(Text::Hatena);

  __PACKAGE__->syntax(q{
    block     : m_dl

    block     : h5        | h4  | blockquote | dl    | list
              | super_pre | pre | table      | cdata | p

    m_dl      : m_dl_item(s)
    m_dl_item : m_dt(s) m_dd(s)
    m_dt      : /\\n:(?!:)/ inline(s)

    m_dd      : "\n::" inline(s)
  });

  sub m_dl {
    my $class = shift;
    my $items = shift->{items};
    my $item = $class->expand($items->[0]);
    return "<dl>\n$item</dl>\n";
  }


  sub m_dl_item {
    my $class = shift;
    my $items = shift->{items};
    my $dt = $class->expand($items->[0]);
    my $dd = $class->expand($items->[1]);
    return "$dt$dd";
  }


  sub m_dt {
    my $class = shift;
    my $items = shift->{items};
    my $item = $class->expand($items->[1]);
    return "<dt>$item</dt>\n";
  }


  sub m_dd {
    my $class = shift;
    my $items = shift->{items};
    my $item = $class->expand($items->[1]);
    return "<dd>$item</dd>\n";
  }
}


my $text = <<EOM;
*test1
:dt1
::dd11
::dd12
:dt2

::dd21

*test2
:dt1
:dt2
::dd1+2
EOM

print MyParser->parse($text);

<div class="section">
<h3>test1</h3>
<dl>
<dt>dt1</dt>

<dd>dd11</dd>
<dd>dd12</dd>
<dt>dt2</dt>
<dd>dd21</dd>

</dl>
</div>
<div class="section">
<h3>test2</h3>

<dl>
<dt>dt1</dt>
<dt>dt2</dt>
<dd>dd1+2</dd>

</dl>
</div>

Text::HatenaのベースになってるParse::RecDescentっていうやつのドキュメントの訳(http://perldoc.jp/docs/modules/Parse-RecDescent-1.94/RecDescent.pod)があったのでよかった。

hrは構造を分離する要素だったか
Fri, May 11, 2007 3:00 AM

構造を分離するっていうか文章を区切るの方がいいかー。

HTML 2.0

The <HR> element is a divider between sections of text; typically a
full width horizontal rule or equivalent graphic.
5.9. Horizontal Rule: HR

<HR>要素は文の区切りとなるもので、一般的には幅いっぱいの水平線か同等の形象で表示されます。

http://hp.vector.co.jp/authors/VA014833/RFC1866SJ/5.html#HR

文章を区切る

HTML 3.0

The <HR> element is used for horizontal rules that act as dividers between sections. TheSRC attribute can be used to designate a custom graphic, otherwise subclass HR with the CLASS attribute and specify the appropriate rendering with an associated style sheet.

http://www.w3.org/MarkUp/html3/rules.html

文章を区切る

HTML 3.2

Horizontal rules may be used to indicate a change in topic. In a speech based user agent, the rule could be rendered as a pause.

http://www.w3.org/TR/REC-html32.html#hr

水平線は、話題の転換を示すために用いてよい。スピーチベースのユーザエージェントでは、たとえばポーズ(一時停止)として実行できるであろう。

http://www.doraneko.org/webauth/html32/19970114/Overview.html#hr

文章を区切る

HTML 4.0, 4.01 / XHTML 1.0, 1.1 / XHTML M12N 1.0, 1.1(プレゼンテーションモジュール)

(4.0と4.01はhrの説明の文面がまったく同じだから同じ。XHTML1.0はHTML4.01をXML適合として再定形化したやつで要素の説明はHTML4.01で定義されたものを使ってるから同じ。XHTML M12Nのモジュールの各要素の説明はHTML4.01で定義されたものを使ってて、hrが属するプレゼンテーションモジュールは特に説明が上書きされてないから同じ。XHTML1.1はXHTML M12Nを使ってるから同じ。あとXHTML Basic 1.0, 1.1はプレゼンテーションモジュール入ってない)

The HR element causes a horizontal rule to be rendered by visual user agents.

The amount of vertical space inserted between a rule and the content that surrounds it depends on the user agent.

15.3 Rules: the HR element

HR要素があると、視覚系ユーザエージェントは罫線をレンダリングする。

罫線とその周囲のコンテンツの間に挿入される垂直方向の空間の分量は、ユーザエージェント依存である。

http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/present/graphics.html#edef-HR

文章を区切らない




↑hr!

昔は構造を分離するやつだったらしい。

あとみんなだいすきsuikawiki(http://suika.fam.cx/~wakaba/-temp/wiki/wiki?hr)。あれ?最初にここを見ればよかった…。

Modularization of XHTML / XHTML Modularizationの略記をXHTMLMODじゃなくてXHTML M12Nに修正したよ

Fri, May 11, 2007 3:00 AM

perlは俺と相性が悪いっていうか俺の頼みの綱であるところのgoogleさんと相性が悪いのでだめだなあ。$@ perlとか入れても教えてくれないもの。


アスキーアート使うのがちょっと楽しくなってきた…。そういえばアスキーアートをabbrでマーク付けしてる人って何でそうしてるんだろう(WAIにあるらしいね(http://www.w3.org/TR/WCAG10-HTML-TECHS/#ascii-art))。アスキーアートのテキストは語なの?(あれ、でも語っていうのはabbrであることと関係あるのか?でも関係なかったら<abbr title="..."><img src="..." /></abbr>とかでもよくないか?でもimgはaltが必須か)っていうか省略形なの?

適切なのが見つからないのでさっきはspanでマーク付けしておいたんだ。


でもとはてながおおい


でもdivとspanって大分重要な要素だよなあ。HTMLの要素型だけで満足できる人(ちょっと前までの俺のこと)はそうじゃないかも。意味づけはできない(classとかは保守性なんかが上がるくらいで意味がつけられるわけじゃないよね)けど構造はきちんと明示できる。

構造化+id, classつけるとCSSでもJavaScript/DOMでもXPathとかXPointerとかでも扱いやすい(っていってもXPointer使ったことないけどなー。あとXPointerなんかほとんどXPathじゃん。そういえばちょっと前にどら猫さんとこの邦訳ひととおり読んだあとに古いやつの訳だったのに気づいたのは内緒だ。XPointer的に考えるとhnにidつけても#xpointer(id("hnについたid"))だけだと参照できるのhnの要素だけだからそうするとコンテナ的なもの、XHTML 2.0だとsectionみたいなのにidつける必要があるんだろうなーと思った)。

XHTMLだと名前空間とかちゃんとすれば俺要素でも登場させればいいけど厳密適合なXHTML文書じゃなくなるしXHTML 1.0/1.1のDTDつけてたらそれにも違反する…よね?

SuikaWiki(の名無しさん)から反応が!

>>17 厳密適合文書でなくなるから使わないというのはなんとも後ろ向きな。 厳密適合文書だと何がうれしいの?

http://suika.fam.cx/~wakaba/-temp/wiki/wiki?%B8%B7%CC%A9%C5%AC%B9%E7XHTML%CA%B8%BD%F1#anchor-17

厳密適合文書だと仕様書の提供するDTDそのままで妥当性検証できるからうれしい…

後ろ向きだー。あと読み返すと文章おかしい。XHTML 1.0/1.1の厳密適合の条件には仕様書が提供するDTDを含めてそのDTDの制約を満たすことが含まれてるのに「厳密適合なXHTML文書じゃなくなるしXHTML 1.0/1.1のDTDつけてたら違反する」って書いてる。


hrをseparatorに変えたら「意味的に構造を分離できます!」っていうのは何か詐欺みたいな理屈だなあとちょっと思ったんだけど(違うか。horizontal ruleって名前がまずいから名前を変えるだけで、昔から意味的に構造を分離する要素として使われてたのかな(あとで昔のHTMLの仕様書とか見よう。でも構造化文書なのに構造で区切らないのがなんかなあ。見た(d:id:quaa:20070511#p3)。説明としてはそうみたい。階層構造じゃ分離できない位置で分離したいときに必要になるかもなあ)、でもhr使う。いひひ。今月からの俺のテーマは臨機応変なんだー(だから気分でめっちゃマーク付けしたり全然マーク付けしなかったりするんだー。言い訳だー)。


なんかhr使うとcho45さんぽい。あと「ねむい」とか書くと。さとうさん大好きか。大好きだけど。というかCSSコニュ(コニュて)らへんの人は皆もれなく「俺の師匠=大好き」ってことになってます(あとOpera(俺等)らへんの人も。Kurumaさんとかちょうだいすきやん)。きもい。

後で読み返したらうわー…てなるに10円


関係ないけどもごもごが気になる。かわいくていいなあ。


なんかとりとめのないのがいっぱい書けた。何気なく耳掻きしたらでかいのが!みたいな。今日の日記は長いなあ。

ねるよ! ノシ

Text::Hatena 0.20と遊ぶよ
Fri, May 11, 2007 3:00 AM

はてな記法+俺記法で書いたメモをblosxomかなんかでHTMLにして見れたらええなあと思ったのでText::Hatenaを弄ろうしたんだけど

スーパーpreがスーパーじゃなかった…

sub super_pre {
    my $class = shift;
    my $items = shift->{items};
    my $filter = $1 || ''; # todo

    my $texts = $class->expand($items->[1]);
    return "<pre>\n$texts</pre>\n";
}

http://search.cpan.org/src/JKONDO/Text-Hatena-0.20/lib/Text/Hatena.pm

(´・ω・`)*1。<とか>を実体参照にしてくれない。CPANのとこみたら前のバージョンとコードが全然違ってた。なんか「拡張しやすく書き直してやったんだから自分で拡張しろやぼけー」*2ってことらしい(言ってないことを読み取るマン!)?

こんなん?

#!/usr/local/bin/perl
#0.20のスーパーpreでもHTMLでの特殊な文字とかを実体参照にしてもらうようにするよ

use strict;
use warnings;

{
  package MyParser;
  use base qw(Text::Hatena);


  sub super_pre {
    my $class = shift;
    my $items = shift->{items};
    my $texts = _format_plain($class->expand($items->[1]));
    return "<pre>\n$texts</pre>\n";
  }

  #0.16のText::Hatena::SuperpreNodeから持ってきてちょっと変えただけ

  sub _format_plain {
    my $s = shift;
    $s =~ s/\&/\&#38;/g;
    $s =~ s/</\&#60;/g;
    $s =~ s/>/\&#62;/g;
    $s =~ s/"/\&#34;/g;
    $s =~ s/\'/\&#39;/g;
    $s =~ s/\\/\&#92;/g;
    return $s;
  }
}


my $text = <<T;
 >||
  ^ ------ ^ 
 / <|>  <|> \

<      ^     >
 ||<
T

print MyParser->parse($text);

できたー(スーパーpreの中でスーパーpreの記号使ったら何か変なことなったので>||と||<の記号の前にスペース空けてあるよ)。

新しいルールの追加?

元からあるルールの変更はできるのわかったけど新しいルールを追加したいときはどうやればいいのかがわかんない。ふつうに__PACKAGE__->syntaxっていうやつに新しいルールを追加して同じ名前のメソッドをつくるだけだと働いてくれない…

google|つ http://blog.so-net.ne.jp/rainyday/2007-04-29

blockのとこにも追加しないとだめなのか。etherさんありがとう。googleさんありがとう。じゃあ#ノート的なもの、って書いたら<p class="note">ノート的なもの</p>ってなるようにしてみよう。

#!/usr/local/bin/perl
#行頭に#つけたところをclass="note"ってついたp要素にしてもらうようにするよ

use strict;

use warnings;

#0.20のpのところ見てちょっと変えただけ
{
  package MyParser;
  use base qw(Text::Hatena);

  __PACKAGE__->syntax(q(

    block      : h5        | h4  | blockquote | dl    | list
               | super_pre | pre | table      | cdata
               | p_note    | p
    p_note     : ...!p_terminal "\n#" inline(s?)
 ));

  sub p_note {
    my $class = shift;
    my $items = shift->{items};
    my $inlines = $class->expand($items->[2]);
    return $inlines ? qq|<p class="note">$inlines</p>\n| : "\n";
  }
}


my $text = <<T;
*test
#test
T

print MyParser->parse($text);

これが…

<div class="section">
<h3>test</h3>
<p class="note">test</p>

</div>

なんかできた!でもほぼ丸写しだ。意味がわかってないぜ。

blockに必要なもの全部書くの忘れててリストとかの変換がちゃんと動いてなかったから直したー。

*1:あ、ごめん全然わかってないのに知ったふりした

*2http://use.perl.org/~jkondo/journal/32524

[opera]Operaのcanvas, XMLHttpRequest, SVGサポート
Mon, Apr 30, 2007 3:00 AM

OperaのcanvasとXMLHttpRequestとSVGのサポート一覧表がいつのまにか出来てた!

いつから?

XMLHttpRequestの表見てあれっと思ったんだけどoverrideMimeTypeは仕様に組み込まれてないんだねー。

Sat, Apr 7, 2007 3:00 AM

今年の教科書の中に「10日でおぼえるXML入門教室 第2版(urn:isbn:9784798104874)」っていうのがあったのでぱらぱら読んだのだけどこれは大丈夫な本なのかなあ。

XML Schemaとかはよく知らない(じゃあ他のをちゃんと知ってるかっていったら知らないけど)のだけどXSLTのxsl:outputのmethod属性値の説明で注釈も何もなしにデフォルトは"html"(p.27)って書いてあったり*1とか、XSLTのサンプルがすごい冗長だったり*2とか、W3C DOMのgetElementsByTagNameとMSXMLのselectNodesでのXPath式を比べた説明でxPath式の「//」演算子と似ていますが、xPath式が「//」の左側である程度対象を絞り込むことができるのに対し、getElementsByTagNameメソッドはすべてのXML文書を参照しますので、負荷はより高いと言えます(P.130)って書いてあったり*3とか、JavaScript(って書いてあるけどJScriptだ)の説明のひとつで比較式で「=」を使用した場合、式はかならずtrueを返します(P.221)って書いてあったり*4する。あとXML名前空間の説明が全体的に接頭辞主体だ。

何かすっかり粗探しモードでいやだ。やめよう。

*1:いくつかの条件を満たせば"html"だけどそれ以外は"xml"だ

*2:属性値テンプレートが説明にも出てこなかったり組み込みテンプレートルールの一部(テキストノードのテキストをコピーするやつ)を同じ内容で再定義してたり(P.73)

*3:getElementsByTagNameはElementインタフェースでも使えるからある程度対象を絞り込める。あと「A//B (引用元の文脈では//は相対ロケーションパスの//なので。両方なるべく同じ条件にするためにAで選択されるのは1つの要素ノードを選択するノード集合とした場合)」とA.getElementsByTagName("B")だと「A//B」の方が(Aを選択した次にAの子孫の全ノードとAを選択するから)探索範囲が大分広い

*4:EcmaScript(3rd Edition)で単純代入は右辺を評価した結果を返すし、実際この本が対象にしてるIE6のJScriptでもそうだ

「これ以上サイト制作者の自己満足に付き合うな」
Sun, Apr 1, 2007 3:00 AM

ふと「これ以上サイト制作者の自己満足に付き合うな」ってフレーズを思いついたけどこれって「あなたの方でウェブをコントロール出来る」と半分は同じだ。でも強い調子で言ったほうがひっかかりが強いよね。「これ以上サイト制作者の自己満足に付き合うな、あなたの方でウェブをコントロールしよう!」とかか!

いろいろ融通の利くブラウザはサイトの不親切さ(あと相性悪いとかそもそも対象ユーザじゃないとか)からくる不満を解消しますよーてところでもっと攻めてけばいいんじゃないかなあ。俺だったら小さすぎる文字サイズいやとか、目の痛くなる配色いやとか、使わないのに無駄に幅取るサイドバーいやとか、利便性に全く関係しないスクリプト動いてるのいやとか、意図せずに違うタブとかウィンドウで開かれるページいやとか、そういう。でも本当に重要なことは選択肢を与えずに知らない間に使わせておくことだけどなー

[opera][SVG]
Thu, Mar 22, 2007 3:00 AM

animate要素とかでアニメーションのリピート回数が不定になってる要素があるSVGファイルをOperaで見るとCPU使用率が跳ね上がらん?

data:application/svg+xml,
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg xmlns="http://www.w3.org/2000/svg">
  <rect width="20" height="20" x="20" y="20" fill="navy">

    <animateTransform attributeName="transform" type="rotate"
      values="0 30 30; 360 30 30" dur="1s" repeatCount="indefinite"/>

  </rect>
</svg>

(Operaの人はdata:〜のところから選択して「URLへ移動」すればすぐ確認できるよ。普通に保存して表示するなら1行目は削るのだよ)

こんな感じで単に正方形がくるくるーって回るだけのやつでもうちのやつだと一気に100%になる。でも100%なのにそんなに重い感じじゃなくて他のタブとか他のアプリケーションが被さったりしてその要素が隠れた状態になるとすぐ減る。んー

[opera][javascript][DOM]createElementで生成したElementに対してもnamespaceURIとlocalNameが設定される (Opera 9.10)
Wed, Mar 21, 2007 3:00 AM

createElementNSじゃなくてcreateElementで要素を生成した場合はnamespaceURIlocalNamenullじゃないとなぁ。

OperaだとcreateElementで生成した要素に対して適当(よくない意味の方。documentのデフォルト名前空間のURIか、Content-Typeかファイルの拡張子から判断してるぽい)にnamespaceURIと、あとlocalName(createElementの引数tagName)が設定される。FirefoxだとcreateElementで生成した要素のnamespaceURIは確認したらnullだったからいいのかなーと思ったらlocalNameの方はnullじゃなかった(Operaと同じ)。

サンプル(SVG *1 )
<?xml version="1.0"?>

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" onload="_onload()">

  <script type="application/javascript"><![CDATA[
    function _onload(){
      var rect = document.createElement("rect");
      alert([rect.namespaceURI, rect.localName]);

    }
  ]]></script>
</svg>
アラート内容 (Opera 9.10)
http://www.w3.org/2000/svg, rect
アラート内容 (Firefox 2.0.0.3)
null, rect

仕様

DOM2 CoreDOM2 Core邦訳(www.y-adagio.com)から。

localName of type DOMString, readonly, introduced in DOM Level 2
Returns the local part of the qualified name of this node. For nodes of any type other than ELEMENT_NODE and ATTRIBUTE_NODE and nodes created with a DOM Level 1 method, such as createElement from the Document interface, this is always null.
namespaceURI of type DOMString, readonly, introduced in DOM Level 2
The namespace URI of this node, or null if it is unspecified. This is not a computed value that is the result of a namespace lookup based on an examination of the namespace declarations in scope. It is merely the namespace URI given at creation time. For nodes of any type other than ELEMENT_NODE and ATTRIBUTE_NODE and nodes created with a DOM Level 1 method, such as createElement from the Document interface, this is always null.
Document Object Model (DOM) Level 2 Core Specification - 1.2. Fundamental Interfaces - Interface Node
DOMStringlocalName,読取り専用,DOM水準2で導入
このノードの 修飾された名前 の局所部分を返す。 ELEMENT_NODE及びATTRIBUTE_NODE以外の任意の型のノード,及びDocumentインタフェースからのcreateElementといったDOM水準1のメソッドを用いて生成されたノードに対しては,これは,常に,nullとする
DOMStringnamespaceURI,読取り専用,DOM水準2で導入
このノードの 名前空間URI,又はそれが指定されていない場合には,null。 これは,有効範囲の中にある名前空間宣言の検査に基づく名前空間検索の結果である計算された値ではなく,単に,作成時に与えられた名前空間URIとする。 ELEMENT_NODE及びATTRIBUTE_NODE以外の任意の型のノード,及びDocumentインタフェースからのcreateElementといったDOM水準1メソッドを用いて作成されたノードに対しては,常に,nullとする
文書オブジェクトモデル(DOM)水準2 コア規定 - 1.2 基礎インタフェース - インタフェース Node

DOM3 Coreも同じ(http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-1950641247)。

*1SVGじゃなくてもXHTMLでいいんだけどたまたまちょっと遊ぼーとしてたので

Wed, Mar 21, 2007 3:00 AM

敬体は疲れるなあ…

[opera]TextノードをDOMツリーから取り除いたとき、first-letter擬似要素内の文字として扱われている文字だけ残る
Thu, Mar 8, 2007 3:00 AM

テストページつくってみました。Opera のバグレポートガイドライン英語でご記入ください。他の言語で寄せられたバグレポートは通常お受けできませんOpera バグトラッキングシステム、と書いてあったのでバグレポート送るのは止めました。英語なんか見たことも聞いたこともない。

[opera][userjs][メモ]「文字上でキャレット」のUserJSについてのメモ
Mon, Mar 5, 2007 3:00 AM

で挙げられているスクリプトの不具合についてちょっと考えてみようかな、と思ったんですがいい解決案が思いつきませんでした…。メモだけ書いて誰かが改良スクリプトを書いてくれるのを待ちます。

パソコン遊戯で挙げられている描画が変わる不具合について

チーム俺等 - takeopera - マウスカーソルでも書かれていますがある要素とテキストの間にspanがはさまれることによってCSSの適用が変わるせいですね。

  • パソコン遊戯内で見出し要素の font-weight: bold を無効にしてしまう*のはパソコン遊戯のCSSで全称セレクタにfont-weight: normalが指定されているため(見出し要素のfont-weightによってboldで描画されるはずだったテキストが見出し要素とテキストの間にはさまれたspanによってnormalに戻る)
  • スラッシュドット内で見出し要素の色を変えてしまう*のはdiv.article div.title span, div.article div.title span a { color: #8DC7C0;}*という規則のため(スクリプトを使うとh3周辺の構造がdiv.article > div.title > h3 > span > (text)になる)

メモランダムの場合はよくわかりませんでした。不思議。ただ、単純に文字列の親要素のカーソルをキャレットに変えるだけだと親要素のdisplayblockだったりした場合に文字列の上じゃなくてもカーソルが変わるので微妙なところ。

スクリプトの処理について

  • var body = document.getElementsByTagName("BODY");if(!body) return;では意味がない(bodyが必ずNodeListになるため)
  • 2回もwhile回さなくても1回でまとめられると思う
  • カーソルをキャレットにするTextノードを振り分けるために、Textノードが見つかったらその都度見つかったTextノードからルートまでにbadな要素(scriptなど)がないか調べるようになっているので構造の深いところにTextノードがあると時間がかかりそう(そもそもNodeIterator自体あまり速くない)

document.addEventListener("mousemove",「カーソルの下にTextノードがあればbodyのcursorをtextに、なければnormalに」,true)とかどうかなあ。微妙か。

mousemoveじゃなくてmouseoverでした。しかもcursorもnormalじゃなくてauto…。昨日寝る前は

document.addEventListener("mouseover", function(event){
  if (event.target.nodeType == Node.TEXT_NODE) document.body.style.cursor = "text";
  else document.body.style.cursor = "auto";

}, true);

みたいな感じでもしかしたら出来ないかなあと思ってみたんですがマウスイベントでは目標ノード型になるのはElementノードのみ(http://www.w3.org/TR/2006/WD-DOM-Level-3-Events-20060413/events.html#Events-EventTypes-complete。DOM 2 Eventsではイベントの目標ノード型について言及がありませんがOperaやFirefoxの実装もElementのみ)なのでevent.targetTextノードになることは絶対ないですよね。だめすぎる…。

元スクリプトがspanのスタイルを極力無効化するように修正されていました。まあ普通そうか。first-letter擬似要素の不具合はどうもOperaのバグのようです。後で書くかもしれませんが、簡単に書けばfirst-letter擬似要素にスタイル指定のある要素の最初の子であるTextノードをremoveChildなど(元スクリプトの場合appendChild)で取り除くと、first-letter擬似要素内の文字として扱われる文字だけが取り除かれずに残ってしまいます(とりあえず9.10のみで確認)。

[opera]build 8732
Sat, Mar 3, 2007 3:00 AM

新機能の追加ということで入れてみました。詳しい解説などは以下で。

新機能のSpeed Dialですが、ニックネームを多用しているのであんまり使用頻度は高くならない気がしました。見た目は素敵ですが実用性があるかというと今のところはどうかなあ、という感じ。切り替えボタンを設けて、裏面(見せ方として裏面)にTop 10*1のページを表示(Speed Dialのパネルは9つしかないのでTop 9ですが)したりすれば面白い、かな…。今後のWeekly Buildに期待します。

それよりもスタートバーがなくなったのが非常に残念です。常時表示するツールバーをアドレスバーだけにして、アドレスバーにメニューバーのサブメニューとアドレス欄、スタートバーに時々使うボタンなんかを押入れのごとく放り込んでいた(ひどいときは4列くらい)身としては特に辛い。スタートバーは出し入れ可能なツールバーとしてはビューバーと、よく行くページのブックマークなどを置いておく場所としては今回のSpeed Dialと機能が競合しているので削除もわからないではないですが、スタートバーはビューバーと比べてアドレス欄からフォーカスが外れれば隠れます(隠すという行動をわざわざ取る必要がない)し、Speed Dialと比べてブックマーク以外の様々なものを置けるので、正式版では残しておいてほしいところです。横幅がアドレス欄に依存するのは欠点ですけどね。

ユーザスタイルシートの内容というか方向性がちょっと変わった(フロートの無効化などの単機能なスタイルが増えた)のは良いですね。デザインを大幅に変えたいという欲求よりはフォントファミリだけ無効化したい、とかpre要素のoverflowだけvisible強制にしたい、とかそういったピンポイントな欲求が起こる方が多いですし、ユーザスタイルシートはUserJSと違って切り替えが簡単(UserJSも簡単に切り替えできるようなUIが提供されればいいのですが)ですし。そのうちページ上のコンテキストメニュー(Document Popup Menu)にスタイル用のメニュー(Style Menu)がサブメニューとしてデフォルトで入ったりするかもしれないですね。そしてそのうちユーザXSLとか…いやそれよりは先にデフォルトスタイルをユーザがGUIでもっと自由に変更できるように考えてほしいですが。とりあえず今あるフォント設定や色の設定を作成者スタイルより優先する設定項目が必要だと思います。

*1:星マークのあれです。履歴から頻繁に訪れるページをランク付けし、最も頻繁に訪れていると思われるページを10個リストアップするものですね

はてな動物園
Tue, Feb 27, 2007 3:00 AM

フォトライフのRSSモジュールで動物園つくって和むぜと思ってつくったけどフォトライフのサムネイルが思いのほか小さくてあんまり和めない上に久しぶりに拡大ポップアップしてみたのに楽しめなかった…

牛肉いれてみた

[ぶくまくまー]
Thu, Feb 22, 2007 3:00 AM

どうせお前らはあれだろ、ソーシャルブックマークとかのタグ式ブックマークで最初カテゴリ的なタグしかつけてなくて後で読み返したくなったときに目的のものに全然辿り着けなくて挙句の果てに「ブックマークに入ってるのはわかってるからまた今度でいいよね」って言い始めちゃって、全然読み返さなくなっていく内に「あれ、俺何でブックマークしてるんだろう」って気になってきて反省して今度はブックマークするページの本文中にある単語を元にたくさんタグ付けしてみたりするんだけど、どんどんタグクラウドが肥大化してブックマークのページの表示が遅くなってきてることにいらっとして、でもよく考えたらタグクラウドほとんど利用してないことに気付いて「タグクラウドなんかいらねえ!」ってユーザスタイルでタグクラウド消してみたら案外表示とか速くなってこれで安心だね熊井ちゃん、って言ってる内に「タグ=後で検索しそうな単語」としても捉えればいいことにやっと気づいて検索しそうだと思う単語を考えてタグ付けしてみたりするんだけど、検索しそうな単語と実際検索する単語が結構違うから読み返した後に実際に検索した単語でタグ付けし直してみたりもして、そうこうしてる内にふと「何をブックマークしてたか忘れるから時々はタグクラウド見て思い出してみたりしたほうがいいかも」と思って今日久しぶりにユーザスタイル外してタグクラウドを見てみたらものすごい肥大化してて引いたりするんだろう?

でもタグクラウドが肥大化するからタグ抑えるっていうのは違うよなあ

[javascript][firefox]iframeを使ったwell-formedじゃないHTML文字列のパースとかHTMLDocumentの生成
Fri, Feb 9, 2007 3:00 AM

http://d.hatena.ne.jp/quaa/20060824#p1の続きー。NSRangecreateContextualFragmentでパースしたやつはよく確認したらhtml要素だけじゃなくてhead要素とbody要素も除去されてた(それらの子孫要素は除去されない。cho45さんのinnerHTMLの方法も同じ?)ので他の方法を考えてみた。

var url = ""; //何かwell-formedじゃなさそうなページのURL
GM_xmlhttpRequest({
  method: "GET",
  url: url,
  onload: function(req){

    var ifr = document.createElement("iframe");
    ifr.src = "data:text/html," + encodeURIComponent(req.responseText);
    ifr.style.display = "none";
    ifr.addEventListener("load", function(){

      var newdoc = ifr.contentDocument;
      GM_log(newdoc.toString()); //"[object XPCNativeWrapper [object HTMLDocument]]"
      GM_log((new XMLSerializer()).serializeToString(newdoc)); //HTML確認

      this.removeEventListener("load", arguments.callee, false);
      this.parentNode.removeChild(this);
    }, false);
    document.body.appendChild(ifr);
  }

});

iframesrc属性にresponseTextをdata URLで突っ込んでcontentDocumentとる。html要素とか除去されない代わりに絶対URIで指定されてるスクリプトとかべた書きされてるスクリプトが実行されるので突っ込む前にsrc属性とか今度は自分でいろいろ取り除かないといけない羽目になる。めんどいしあまり使いたくない。

あとhttp://labs.cybozu.co.jp/blog/kazuho/archives/2006/10/japanize_071.phpMozilla Firefox において、 style="display:none" に設定された iframe では DOMContentLoaded イベントが発生しないようですKazuho@Cybozu Labs: Japanize 拡張機能 0.7.1 リリースのおしらせって書いてあったから最初displayの値変えずに普通にやってみたんだけど普通にやっても発生しない?

HTMLDocumentの生成

XSLTProcessorでやらなくてもiframedocument内に追加するだけでcontentDocumentHTMLDocumentになってた。

var xser = new XMLSerializer();

var ifr = document.createElement("iframe");
document.body.appendChild(ifr); //追加しないとcontentDocumentはnull

var newdoc = ifr.contentDocument;
ifr.parentNode.removeChild(ifr); //一回追加したら取り除いていい

GM_log(newdoc.toString()); //"[object XPCNativeWrapper [object HTMLDocument]]"
GM_log(xser.serializeToString(newdoc)); //"<HTML><HEAD/><BODY/></HTML>"

newdoc.body.appendChild(newdoc.createElement("p"));
GM_log(xser.serializeToString(newdoc)); //"<HTML><HEAD/><BODY><P/></BODY></HTML>"

でも結局前の方法でもHTMLDocument生成しなくても元のdocumentから生成したRange(NSRange)で普通にcreateContextualFragment呼び出して、返ってきたDocumentFragmentadoptNode使ってownerDocument好きなのに変えて、その好きなのに突っ込めばよかった(Firefox 2だとadoptNodeNS_ERROR_NOT_IMPLEMENTEDになるけど実装不備があるからそのまま突っ込める)んだからHTMLDocument生成する必要はなかった。

うーん

何か変な知識ばっかり増えてないか?

Fri, Feb 9, 2007 3:00 AM

きたーけどtitle属性自動取得か…。前に書いた案単独でアイデアに上げようかなあ。アナウンスされてないだけで出来るのかも!と思ってやってみたけどだめだった。

あーあと定義リスト記法の拡張案もあるんだー。これが、

:用語1
::用語1の説明1
::用語1の説明2
:用語2
::用語2の説明1

こうなる感じの。

<dl>
 <dt>用語1</dt>
  <dd>用語1の説明1</dd>
  <dd>用語1の説明2</dd>

 <dt>用語2</dt>
  <dd>用語2の説明1</dd>
</dl>

うあ、編集画面開きなおすと自分で書いた実体参照が元の文字に置き換わる!なんだこれ!

おー

[opera]ユーザスタイルシートの更新
Wed, Feb 7, 2007 3:00 AM

Operaであるユーザスタイルシートの内容を一部変更して確認するときにユーザスタイルシートを最新の状態に更新する方法って再起動するかサイト別設定でユーザスタイルシートのファイル変えるしかないってずっと思ってたんだけど、Reload stylesheetsっていうアクションで普通にユーザスタイルシート更新できるみたい。

Also, I'm finding that I have to re add the stylesheet into the site preferences every time I make a change to it. Otherwise it keeps using the old one. Is there a reason for that??

*

There is a command in Opera called "reload stylesheets" that will reload all user stylesheets. I have a keyboard shortcut (which I got from Moose, though I put mine on a different key) set to "Reload stylesheets & Refresh display" (without the quotes of course), which will check the updated stylesheet and reload the page from cache. It's a lot more convenient than opening up the site prefs dialog

*

だって(っていってもほとんどわかってないわけだが!。つまり、えーと、Reload stylesheets & Refresh displayをキーボードショートカットに仕込めばユーザスタイルシートも全部更新されるしページもキャッシュから更新されるから便利なんだよ)。わかってよかったけど今までの無駄な待ち時間を思うと悲しくなるなあ。

[css]body要素にline-heightを指定するのが駄目な理由について教えてほしい
Mon, Feb 5, 2007 3:00 AM

body要素にline-height指定するのに疑問符つけてる人が3人くらい居たんだけど本気でわからないので誰か教えてくれる優しい方はいないかなあ。余白の計算*?とか…。

あんまり教えて君でもあれなのでちゃんと仕様見た(よく考えたら俺CSSの仕様あんまりじっくり読んだことないな。まったくだめだな)んだけどCSS2(の邦訳)の9.4.2 行内フォーマット化文脈だと行ボックスの幅は,包含ブロックによって決定される。行ボックスの高さは,行の高さの計算で与えられる規則によって決定される。行ボックスは,含まれるボックスすべてに対して十分な高さをもつとする。Visual formatting modelでしょ、で同じくCSS2(の邦訳)の10.8 行の高さの算出('line-height'特性及び'vertical-align'特性)の説明が

内容が行内レベル要素から構成されるブロックレベル要素においてこの特性が設定され場合,この特性は,各々の生成された行内ボックスの最小の高さを指定する。

この特性が行内レベル要素で設定される場合,この特性は,その要素が生成する各ボックスの正確な高さを指定する。ただし置換行内要素は例外であって,その場合には,ボックスの高さは,'height'特性によって提供される。

Visual formatting model details

だから別にbody要素からline-heightの値継承してきても問題が起こるケースが…あ、<length>と<percentage>での計算値の継承のこと(line-height の値には単位なしが良いとされる理由line-height プロパティに関する簡単なまとめ)かな?でもCSS(スタイルシート)でbodyに設定しておくと便利な5つのポイントのサンプルのline-heightの値は<number>だし、疑問符つけてる人が皆line-heightを<length>か<percentage>で指定してるってことはないだろうしなあ。…もしかしたらあるのかな。

googleさんに聞いてみたらCSSの実際のところ - line-heightを教えてくれたんだけどこれのサンプルのline-heightの指定値も<length>なんだよなあ。バグだし。コメント書いてた人のメールアドレス探して見つけられたら直接聞くべきかなあ。あ、一応書いとくとCSS(スタイルシート)でbodyに設定しておくと便利な5つのポイントを推奨とか擁護とかするつもりは全然ないよ。

やっぱメールはめんどいからやめよう。あと引用したコメントのURLを間違えてたので直したよ(でもコメント修正したみたい。結局余白の計算って何だったんだろう…)。

Sun, Feb 4, 2007 3:00 AM

思えば叶うんだよなぁ。人は簡単には死ねないけど、死にたいって思い続けていれば死ねるもんだ。

死にたいってことを人に漏らすのはその時点でもう死ぬことに結構強い願望(願望っていうと違う気がするけど。問題解決のための選択肢が死ぬことだけになっていく感覚というか、死ぬことが最善だと本気で思う気持ちだろうか)があるわけで、弱い願望なら心配させたり馬鹿にされたりするのがわかってるから言わないと思うんだよ。心配してもらいたいだけなら別だけど。

でも君、この文章を読んでる君が誰かから本気で(冗談にカモフラージュしてるかもしれないね)「死にたい」って言葉が聞けるならまだ、そいつは自分の死の問題に対して他人が介入することを許している、望んでる部分が少しはあるだろうし、死にてえ、死にてえ、って言いながら自分が死ねるように気持ちを固めてる段階だからまだ取り返しがつく状態なんだと思う。それが進むと誰にもわかってもらえないことをわかってきて、誰かにわかってもらうことを諦めるようになるからそういうサインを出すこともしなくなるし。わかってもらえないことをわかっていて、信念もないのになおわかってもらおうと行動する奴はほとんどいないだろ?もし君が「自分はそうだ」っていうなら、ほかのことに時間を割くことを薦めるよ。

死ぬ、死ぬ、っていう奴に限って、必ず、自殺するっていう言葉はキャッチーだけど、事実じゃない。俺死ななかったし。同じように死ぬ、死ぬ、という奴に限って、本当に死んだりはしないというのも事実じゃない、と思う。確認してないし出来ればしたくないけど。しかし死ぬ、死ぬ、という奴に限って、本当に死んだりはしないみたいな言葉って何でそんなに使われるんだろう。よっぽど無神経じゃなければ言ったりしないと思うんだけどね。ましてや「死にたい」って言ってる奴とか、何とか踏みとどまれた奴に向けては。

[firefox]マーカーワンクリックで選択
Sun, Feb 4, 2007 3:00 AM

Firefoxでulとかのリストのマーカーをクリックするとそのリストの内容が選択できることにさっき気づいた。コピーするとマーカーらしきものも一緒についてくる。入れ子になったリストの親のliのマーカーをクリックしてコピーしたらクリップボードに子要素のulとかが字下げされた感じでテキストが入ってくる。えーと例えば

  • オムレツのつくりかた
    1. たまごをとく
    2. いろいろいれる
      • しお
      • こしょう
      • ぎゅうにゅう
    3. 以下略

こんなリストで「オムレツのつくりかた」のそばにあるマーカーをクリックしてコピーするとクリップボードの中身が

    *  オムレツのつくりかた
         1. たまごをとく
         2. いろいろいれる
                o しお
                o こしょう
                o ぎゅうにゅう
         3. 以下略

こうなる。知らなかったー。すごいなあ。いいなあ。CSSdisplaylist-itemにしてlist-style-typeでマーカーを出現させるようにした要素ならulとかolじゃなくてもマーカーワンクリックで選択できるみたい。

あ、卵といてからいろいろ入れたら混ざらないじゃん。

Wed, Jan 24, 2007 3:00 AM

Firefoxは正規表現の\d\uFF10(0)〜\uFF19(9)もマッチするみたい(どっかでそんなこと書いてあるページあったような)。折り返しもされないし(Firefoxは全角英数字を半角英数字と同じように扱う:メモランダム)、そういうもんなんかなあ。

あとnazonoDiary - compareDocumentPositioncompareDocumentPositioncontainsを知ったのでつかおーと思ったんだけどa.compareDocumentPosition(b)はaからみたaとbの関係じゃなくてbからみたaとbの関係だってことに気づくのに30分くらいかかった。ところでnazonoDiaryのDOCUMENT_POSITION_CONTAINSDOCUMENT_POSITION_CONTAINED_BYの説明逆じゃないかなあ。http://72.5.124.55/j2se/1.5.0/ja/docs/ja/guide/plugin/dom/org/w3c/dom/Node.htmlのDocumentPosition定数群の説明の「参照ノード」がaで「ノード」がbだから、DOCUMENT_POSITION_CONTAINSbはaの祖先*DOCUMENT_POSITION_CONTAINED_BYbはaの子孫*だと思うのだけど…

[userjs]自ニュFのコメントのポップアップする.user.js
Wed, Jan 24, 2007 3:00 AM

自動ニュース作成Fのコメント欄で下の方のコメントに上の方のレス番書いてあると上の方のコメントまで行ってまた戻っての繰り返しでマウスのホイールが壊れそうになるので「>#1」とか書いてあるところにカーソル合わせるとその番号のコメントの内容をツールチップぽいやつでポップアップするのをつくった。あとUserJSつくりたくなったからつくった。速度とか長さとかあんまり関係なしに書きたいように書いたらすごい長くなった。やばい。

できること

  • レス番号にカーソル合わせるとその番号の内容をツールチップぽいやつで出す
  • コメントの左についてるIDにカーソル合わせるとそのIDのすべての発言をツールチップぽいやつで出す
  • ニュー作のIDをハイライトする

あとなんか適当なもの

IDにカーソル合わせたところ
f:id:quaa:20070124194543p:image
ツールチップぽいやつについて
  • ツールチップぽいやつの表示元(レス番号とかID)かツールチップぽいやつ自身からマウスが外れると消える
  • ツールチップぽいやつの表示元をクリックしても消える
  • ツールチップぽいやつはクリックしても消えない(コピーとかしたいから)

できないこと

  • ツールチップ内のレス番号からまたツールチップを出す
  • コメントに書いてあるIDからツールチップを出す

必要になったらつくる

動作確認したやつ

  • Opera 9.10
  • Firefox 2.0.0.1 (Greasemonkey 0.6.6)

スクリプトの最初らへんに書いてある条件を全部クリアできるブラウザなら多分使える?

妖怪人間ガールズ
Sun, Jan 21, 2007 3:00 AM

いろいろとぴったりすぎ><

Sat, Jan 20, 2007 3:00 AM

何の要素が使ってあるかとか自分が見たい属性値(blockquotecite/titleとかins/delcite/title/datetimeとかhnのidとか)がすぐわかるようなブラウザのデフォルトスタイルに近いCSSをつくってユーザスタイルシートにしたいなーとずっと思っててつくってるんだけど(d:id:quaa:20060610#p1がきっかけになってるからもう7ヶ月くらいかかってる…。つくってる途中のをこの日記で使うようにしてるからinherit効かないIEだとemとかvarがそのまま斜体になったりキーワードが目にうるさかったりするけどそんなにこの日記見る人居ないだろうしあんまり害もないから無視してる)ぱっと見ですぐ何の要素かわかる自然なスタイルがあんまり思いつかない。見出しが何レベルかとかフレーズ要素とか。

あとcodeだけ、sampだけを子供に含むpre(<pre><code> ...code... </code></pre>みたいにpre内全体をcodeとかsampが囲んでるとき)だけ枠線とcodesampに対応した背景色つけてそれ以外のprefont-familymonospaceにするだけにしたいんだけどCSS3のセレクタでもそういうのだけにマッチするのがないからどうしようもない。「Fを子供に含むE」ってセレクタだけでもあっていいと思うんだけど…

しかしストリクターとかいうやつには一生かかってもなれないだろうなあ。フレーズ要素いっぱい使ってるサイト(というかページ)があんまり見つからないからこの日記でいっぱい使うようにしてるんだけどはてな記法+xyzzyで「リージョン・セレクションををタグで囲む」使っててもめんどいもん。そういえばいままでabbracronym全然使ってなかった。あれtitle属性つけるのめんどすぎる。別に必須じゃないからつけなくてもいいのか。というか別に手作業でやらなくてもいいじゃん。馬鹿か。なんだと。もー。

Sat, Jan 20, 2007 3:00 AM

  • カテゴリもタイトルもつけたいときだけつけることにした
    • 自分で参照する可能性があるかもと思ったやつはちゃんとつける、かも
    • もし君がこの日記のタイトルついてないものをあらゆる手段で参照するとき、タイトルは勝手につけてもよい(MAY)、とか
  • 三点リーダをドット3つ(...)から&#8230;(…)にした
    • あんまり深い意味なかったから
  • テンション高くするのとかちょっと飽きた

[近況]睡眠時間が変
Thu, Jan 18, 2007 3:00 AM

正月休みに完全に昼夜逆転してたせいで何か睡眠時間がおかしなことになってる。先週から今週にかけてが特にひどい...

ようびねたじかんおきたじかんすいみん
金-土22:306:007時間半
日-月10:302:3016時間
5:007:002時間
火-水18:305:0010時間半

なにこれ!

[javascript][DOM]違うDocumentからつくられたノードをappendChildしても例外が発生しない(Firefox2.0.0.1, Opera9.10)
Tue, Jan 16, 2007 3:00 AM

というバグを昨日知った。

//javascript:
(function(){

var di = document.implementation;
var doc1 = di.createDocument(null,"root1",null);
var doc2 = di.createDocument(null,"root2",null);

var doc1elm = doc1.createElement("doc1elm");
doc2.documentElement.appendChild(doc1elm); /* 仕様(DOM 1, DOM 2/3 Core)通りならここで例外(WRONG_DOCUMENT_ERR) */
if (di.hasFeature("LS", "3.0")) alert(di.createLSSerializer().writeToString(doc2));
else if (typeof XMLSerializer == "function") alert((new XMLSerializer()).serializeToString(doc2));

else alert(doc2.documentElement.outerHTML);
})();

Firefox(2.0.0.1)とOpera(9.10)だと何事もなくdoc1で生成したElementをdoc2に挿入してdoc2の内容(<root2><doc1elm/></root2>)を表示する。IE(6。7入れるのめんどい)はdocument.implementation.createDocument使えないからこのコードだとテストできないけどdoc1doc2new ActiveXObject("Msxml2.DOMDocument")とかiframeつくってdocument.frames[document.frames.length-1].documentとかdocumentとかにしてやるとappendChildした時点でちゃんとエラー吐く(エラー内容はdoc1doc2の内容によって何かいろいろ?)。IEだけちゃんとしてるってめずらしいなあ。

FirefoxはbugzillaにBug 47903で報告(7年前!)されてて修正されるらしい。さっきGran Paradiso Alpha 2 pre(Gecko 1.9a2pre? Fx 3a2pre?)入れて試したらちゃんとNS_ERROR_DOM_WRONG_DOCUMENT_ERR返してきた。そういえばGecko 1.9だとloadイベントのキャプチャの問題とかも修正されてるらしい(http://developer.mozilla.org/ja/docs/Gecko_1.9_Changes_affecting_websites。EventTargetに直接イベントが送られたときにそのEventTargetについたキャプチャ用イベントリスナが誤発動する問題とかは直ってるのかな)。Operaはmy.opera.comのフォーラムとか探してみたけどよくわかんなかった。

Operaのそれっぽいのみつけた。

Hallvordさんがhttp://my.opera.com/hallvors/blog/show.dml/429702で言うには(多くのWeb制作者が仕様に沿わないFirefoxの振る舞いに沿ってコードを書くので、appendChildしてWRONG_DOCUMENT_ERRになるコードがある場合)OperaはadoptNodeをそれとなく呼び出してるらしい。Firefoxがバグを直したら多くのWeb制作者もバグを直すだろうから仕様に沿った振る舞いに戻すつもりだよみたいなことも言ってる(と思う)。ためしに8.54で最初につくったサンプルのコードをtry - catchしてmessage出したらちゃんとWRONG_DOCUMENT_ERR出てきた(9.00ではエラーなしで普通に通ったので9からFirefoxに合わせてるみたい)。それならエラーコンソールに警告メッセージくらい出してほしかったんだけどなー。

Hallvordさんの文章を引用しておきます!

2) Throwing WRONG_DOCUMENT_ERR on cross-document node usage

If a node created in one document is appended to another document, the standard clearly states that a WRONG_DOCUMENT_ERR should be thrown. Firefox doesn't, and sites taking the Firefox behaviour for granted and breaking in Opera included Blogger.com's rich text editor.

Opera will start to call adoptNode implicitly. I'm not sure what way the standard will go - nobody seems to intend to push for a change here. According to their bug report, Mozilla intends to fix it (which is great!) and as soon as they do and websites fix their coding errors, we can revert to spec-compatible mode. Meanwhile, we are not going to live with sites being broken in Opera due to Firefox's bugs.

When specs and implementations clash - miscoded - by Hallvord R. M. Steen

[javascript]OPML1.0→XHTML1.1へんかんき
Tue, Jan 9, 2007 3:00 AM

-o-linkつかえへんからもうbookmarkletでなんとかしたった!

javascript:(function(rttag,str){var d=document,de=d.documentElement;if(de.tagName!=rttag)return;var sp=new XSLTProcessor();sp.importStylesheet((new DOMParser()).parseFromString(str,'text/xml'));var df=sp.transformToFragment(d,d);d.removeChild(de);d.appendChild(df);})('opml','<s:stylesheet version="1.0" xmlns:s="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"><s:output method="xml" version="1.0"/><s:template match="/opml"><html><head><title><s:value-of select="head/title"/></title></head><body><h1><s:value-of select="head/title"/></h1><ul><s:apply-templates select="body"/></ul></body></html></s:template><s:template match="outline"><li><s:choose><s:when test="@url or @htmlUrl or @xmlUrl"><a><s:attribute name="href"><s:choose><s:when test="@url"><s:value-of select="@url"/></s:when><s:when test="@htmlUrl"><s:value-of select="@htmlUrl"/></s:when><s:otherwise><s:value-of select="@xmlUrl"/></s:otherwise></s:choose></s:attribute><s:value-of select="@text|@title"/></a><s:if test="(@url or @htmlUrl) and @xmlUrl"> (<a href="{@xmlUrl}">Feed</a>)</s:if></s:when><s:otherwise><s:value-of select="@text|@title"/></s:otherwise></s:choose><s:if test="@description"> - <s:value-of select="@description"/></s:if><s:if test="child::outline"><ul><s:apply-templates/></ul></s:if></li></s:template></s:stylesheet>');

なげー。長すぎるからスーパーpre記法してからプレビュー中にソース開いてpre外して自動リンクとか注釈手動で無効化して再挿入とか。ひどい。一応opera.pushXSLTransformじゃなくてXSLTProcessorにしたからOpera(9以上)でもFirefoxでも使えるよ。俺のほかに必要な人が居るのか知らんけど。はてなRSSとかlivedoor Readerとかである人が公開してるフィード一覧のOPMLがXSL変換されるかその人が公開してる全部のフィードの一覧が見れる(X)HTMLのページがあるんなら俺もほぼいらんけどなー

XSLTの部分ちょっと変えたー(短くするためにXML宣言とかoutput要素のdoctype-public属性とdoctype-system属性消したり<s:value-of select="@url|@htmlUrl|@xmlUrl"/>が横着すぎだから変えたりとか。text/title属性のはどっちか一つになるか両方あっても同じ属性値のことが多いから変えなかった)

[opera][css]-o-linkがXMLでちゃんと使えなくなってる
Mon, Jan 8, 2007 3:00 AM

OPML用のユーザCSSをつくってたときにバージョン9.10で-o-linkが上手いこと機能してくれなかったのでいろいろ試してたんだけど、何でかXHTMLの名前空間に属する属性でしか値がattr(X)-o-linkが適用されないようになってた。

XML
<?xml version="1.0"?>
<?xml-stylesheet href="test.css" type="text/css"?>

<root xmlns:h="http://www.w3.org/1999/xhtml">
  <test ref="http://example.com/">test1</test>
  <test h:ref="http://example.com/">test2</test>

</root>
CSS(test.css)
*|test {
  color: blue;
  content: attr(ref);
  -o-link: attr(ref);
  -o-link-source: current;

}

XMLとCSSがこんな感じのとき、color: bluecontent: attr(ref)は両方の要素に適用されるけど9系では2番目のtest要素しかアンカーにならない(9系より前のバージョンだと両方の要素ともアンカーになる)。どうにかしてXHTMLの名前空間に属してない要素と属性でもアンカーにできないかなーと思っていろいろやったけど全然できない。あれー

メモ:9.10で他に試したこと

-o-linkの値を文字列にする(-o-link: "http://example.com/")

両方の要素ともアンカーになる。でも固定じゃ意味がないんだ。

attr()にいろいろする
  • 全ての名前空間を指定する接頭辞を明示する(-o-link: attr(*|ref))
  • attr()に第二引数入れる(-o-link: attr(ref, url))

http://www.w3.org/TR/2006/WD-css3-values-20060919#attribute見てやってみたけど構文エラーになる。

CSSのデフォルトの名前空間を変える
  • 空文字列にする(@namespace "")
  • XHTMLのものにする(@namespace "http://www.w3.org/1999/xhtml")
  • 1番目のtest要素のref属性に適当な名前空間URI「http://example.com/foo」を与えてCSSのデフォルト名前空間を同じURI(@namespace "http://example.com/foo")にする

XHTMLのものにした場合は2番目のtest要素だけアンカーになる。それ以外は両方の要素とも、color: bluecontent: attr(ref)は適用されるけど-o-linkは適用されない(アンカーにならない)。

[javascript][DOM]DOMのレベルに合わせてノード探索した方がいいよなーと思った
Fri, Dec 29, 2006 3:00 AM

一律getElementsByTagNameで回して条件判定して...ってよりはDOM XPathをサポートしてたらevaluateで、DOM TraversalをサポートしてたらNodeIteratorとかTreeWalkerで回すとかにした方がやっぱいいよなーと思ったので試しにgetElementsByClassName風のもの(class名入れるとそのclass名持ってる要素群(NodeListじゃなくてArrayだけど)が返ってくるようなやつ)をevaluate/NodeIterator/getElementsByTagNameで書いてみたけど時間測ったらgetElementsByTagNameのでもまあまあ速かった。

こんなん。

function gcls(classname, tagname, context_node) {
  context_node = context_node || document;
  tagname = tagname || "*";
  var ret = [];
  var di = document.implementation;
  var match_rule = new RegExp("\\b" + classname + "\\b");

  //DOM XPath

  if (di && di.hasFeature("XPath", "3.0")) {
    var expr = "descendant::"+ tagname +"[contains(@class, '" + classname  + "')]";
    var result = document.evaluate(expr, context_node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var i = 0, node; node = result.snapshotItem(i); i++) {

      if (match_rule.test(node.className)) ret[ret.length] = node;
    }
  }
  //DOM Traversal

  else if (di && di.hasFeature("Traversal", "2.0")) {
    var all = (tagname == "*");
    if (!all && document.documentElement.tagName != "html"/*lower*/) tagname = tagname.toUpperCase();
    var filter = {

      acceptNode: function(node){
        if ((all || tagname == node.tagName) && match_rule.test(node.className)) return NodeFilter.FILTER_ACCEPT;
        else return NodeFilter.FILTER_SKIP;
      }

    };
    var iter = document.createNodeIterator(context_node, NodeFilter.SHOW_ELEMENT, filter, false);
    while (ret[ret.length] = iter.nextNode());
    ret.pop();
  }

  //DOM Core
  else {
    var nodes = context_node.getElementsByTagName(tagname);
    for (var i = 0, node; node = nodes[i]; i++) {

      if (match_rule.test(node.className)) ret[ret.length] = node;
    }
  }
  return ret;

}

というかNodeIteratorのやつがめちゃくちゃ遅い。Opera(9.10/8.54)だとそこそこの要素数でもgetElementsByTagNameのやつの5倍くらい遅いのに要素数増える毎に他のやつと比べてどんどん遅くなってく。Firefox(2.0)はNodeIteratorはサポートしてないみたいだからTreeWalkerでもやってみたけどやっぱ同じくらい遅い。nextNodeする度に次の許可されるノードまで毎回acceptNode呼び出して調べなきゃだめだから早くはいかんのかなー。コードが微妙ってのもあるかもしれないけど... evaluateのやつはそこそこの要素数だとgetElementsByTagNameのとそんなに変わらないけど探索する要素数がすごいいっぱいあると早い。でもDOM XPath今のところWorking Group Notes。

あーおもしろそうだけど勧告前、待てどくらせど勧告前、勧告されてもサポートない、見渡すかぎりの独自拡張とくりゃあこちとらwebせいさくにたいするやるきががたおちだぜー

今回の場合だと文書に変更加えずにそのままElementノードを配列に放り込むんだからDOM XPathのはOREDERED_NODE_SNAPSHOT_TYPEじゃなくてORDERED_NODE_ITERATOR_TYPEでいいやん、と思ってやってみたけど速さ同じくらいだった。

ORDERED_NODE_ITERATOR_TYPEのはこんなん。

/*略*/

  if (di && di.hasFeature("XPath", "3.0")) {
    var expr = "descendant::"+ tagname +"[contains(@class, '" + classname  + "')]";
    var result = document.evaluate(expr, context_node, null, XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    while (node = result.iterateNext()) {

      if (match_rule.test(node.className)) ret[ret.length] = node;
    }
  }
/*略*/

XPath 2.0(XQuery 1.0 and XPath 2.0 Functions and Operators)だと正規表現があるらしいけどDOM 3 XPathで使うXPath 1.0にはないからevaluateした後にさらに条件判別がいるのがやだなあ。

[HTML][javascript]script要素処理後のDTD不適合
Wed, Dec 27, 2006 3:00 AM

HTML 4.01仕様書(18.2.4)HTML documents are constrained to conform to the HTML DTD both before and after processing any SCRIPT elements.Scripts in HTML documents - 18.2.4(HTML文書は、どのSCRIPT要素の処理前も処理後も、HTML DTDに適合するよう制約される。Scripts in HTML documents (ja) - 18.2.4 文書の動的変更)と言っている。

ulの要素宣言はこう(ul要素は一つ以上のli要素を含む)。

<!ELEMENT UL - - (LI)+                 -- unordered list -->

だからスクリプトでul要素を生成・そのまま単体で文書ツリーに挿入して、あとでやるつもりでもその中にli要素ひとつも入れずにscript要素を終わらせていたらだめ、とか例えば何かの検索結果を動的にul/ol要素とli要素で表現するときに、検索結果が0だったらだめ、ということに昨日気づいた。両方知ってたことなのに...

でも、あるscript要素内にイベントでの処理が入ってるときはいつがそのscript要素の処理後なんだろう。あとSCRIPT要素のってことはscript要素外の、イベント属性での処理のときはinvalidになってもいいのかな(多分だめだろうけど書いてないので良いように読める)。というか何で仕様つくった人達はわざわざどのSCRIPT要素の処理前も処理後も、って書いたんだろう。仕様策定時に動的変更の手段がdocument.writeしかなかったのかなーと思ったけどDOM1の仕様策定も同時期だしむしろ勧告の時期だけ見たらDOM1の方が早いし。んー

[はてな]はてなダイアリーでCSSのインポート
Sun, Dec 24, 2006 3:00 AM

最近気づいたんだけどはてなダイアリーでもCSSのインポートできるんだね。いろいろ制限あるから出来ないもんだと思ってた。

スタイルシート内に @i(mport)? (url)?(...)という指定がある場合、

  1. urlで指定されたCSSファイルの取得に成功し
  2. urlで指定されたファイルのcontent-typeが「text/css」の場合で
  3. import回数が10回以内の場合

には、そのファイルの内容をヘッダ内に挿入します。

なお、この機能ははてなアンテナで当初利用可能であった@import機能からの移行をスムーズに行うための措置であり、ページの表示速度も遅くなるため、利用されないことを推奨します。

はてなダイアリーのヘルプ - はてなダイアリーXSS対策

あれ、積極的に使おうかと思ったのに...

[TV]M-1グランプリ2006
Sun, Dec 24, 2006 3:00 AM

何か全体的に煮え切らない感じだった中でチュートリアル(の徳井)が光ってた。一回目はフットボールアワーが俺は一番好きだったけど二回目は誰が見てもチュートリアルだったと思う。M-1ではキャラクターを作り込めてて勢いのある感じだと強いんかなー。岩尾はちょっと叫びすぎだったけど。変ホ長調は期待しすぎてあれってなったけど本気なのかネタなのかわからなくなる空気を出せるのはすごい。アマチュアで決勝まで行ったのもすごい。

あーあと毎回思うんだけど何で漫才中にカメラ固定しないんだろう。笑おうと思って見てるのに審査員の渋い顔とかいるかいらんのかわからんゲストとか見せられてもどうすれば!ってなる。いろんなとこにカメラ振るから二回目のチュートリアルの敬礼撮れてなかったし。あと確か最初のM-1でもキングコングのツッコミかわすやつ撮れてなかったよなあ。もうちょっと考えてほしいなー。

[HTTP][opera]Operaの「サーバへの最大接続数」はPipeliningの最大リクエスト数なのか
Thu, Dec 21, 2006 3:00 AM

RFC2616(主に邦訳の8)とか読んでみて、狐の王国 最大接続数を増やして速くなったと喜ぶ人々、再びを読み返したらいろいろ疑問が出てきた(Pipeliningの説明とか)んだけど、一個だけこの記事を見たときからずっと気になってるのが

それから、pipeliningに関しては、

  • pipeliningは1つの接続で複数のリクエストをやりとりするための手順
  • かといってたくさんのリクエストを投げればその分ポートの占有時間も長くなるから迷惑なのは同じ
  • だいたい4〜8程度にしておくのが無難。Firefoxは4、Operaは8がデフォルト。
狐の王国 最大接続数を増やして速くなったと喜ぶ人々、再び

Operaの「サーバへの最大接続数」*1は本当にPipeliningの最大リクエスト数なのか?ということだ。何で「接続数」が「リクエスト数」と一緒になるのかがわからない。「接続(コネクション)」と「リクエスト」は別(接続してからリクエスト送るらしいし。あとRFC2616の1.3見ても全く違う)のものじゃないのだろうか。あとOperaの(opera:configもしくはopera6.ini)の資料の説明ではHow many connections to allow to the same serverOpera’s Settings File Explained(同一サーバーに対して許容する最大のコネクション数Opera6.ini の設定)とある。多分FirefoxでOperaの「サーバへの最大接続数」と同じなのは「network.http.pipelining.maxrequests」じゃなくて「network.http.max-connections-per-server」で、Operaの「サーバへの最大接続数」はPipeliningの最大リクエスト数とは関係ないと思うんだけど。

*1:opera:config#Performance|MaxConnectionsServer。opera:config, opera6.iniの設定でデフォルト8なのは確かこれしかなかったと思う

[opera]Opera 9.10出たー
Mon, Dec 18, 2006 3:00 AM

ダウンロード
http://www.opera.com/download/
変更履歴(windows用)
http://www.opera.com/docs/changelogs/windows/910/

一番大きい変更はフィッシング防止機能だけど、ページ内検索のハイライトの色をopera6.ini/opera:configで変えられるようになった(opera:config#Colors|HighlightedBackgroundとか)のが地味に嬉しい。

あ、そういえばbrのクラッシュするやつ直ってないな。やっぱり伝わらなかったんだろうなあ...

[opera]OperaのSet alignmentとは
Thu, Dec 7, 2006 3:00 AM

よく番号とか忘れるので書いとくことにしたんだ

OperaのSet alignmentとは、ツールバー等の配置を変えるアクション(マウスジェスチャやキーボードショートカット、ボタンなどで使用するコマンド)のこと。Set alignment, "配置を変えたいもの", 番号で配置を変えることができる。

番号と意味

番号意味
0表示しない
1左に表示
2上に表示
3右に表示
4下に表示
5浮動表示(パネルのみ)
6前(前が0だったら0の前)の配置*1

配置を変えられるもの

  • Browser Toolbar(メインバー)
  • Document Toolbar(アドレスバー)
  • Document View Toolbar(ビューバー)
  • Pagebar(ページバー)
  • Site Navigation Toolbar(ナビゲーションバー)
  • Personalbar(パーソナルバー)
  • Status Toolbar(ステータスバー)
  • Hotlist(パネル)
  • Hotlist Panel Selector(パネルセレクタ)
  • その他いろいろ?(Bookmarks Full Toolbar(ブックマークマネージャのツールバー)とかは設定からしか出来ないぽい)

アクションに仕込むとき、アルファベットは大文字でも小文字でも良い。

パネルセレクタを前回の配置で表示/非表示に切り替える。

Set alignment, "Hotlist Panel Selector", 6 | Set alignment, "Hotlist Panel Selector", 0

*1:toolbar.iniのOld visible alignment

[_]温泉卵は時間かかる割に腹ふくれないからだめだ
Tue, Dec 5, 2006 3:00 AM

温泉たまご器 たま5ちゃん

こんなようなお湯入れて待つだけで温泉卵ができる!まあすごい器が家にあるんですけどね。最初はまあすごく温泉卵出来るから「まあすごい!毎日温泉卵ね!」とか言ってたんですけど、いかんせん待ち時間が長い。まあ温泉卵って料理上しょうがないんですけど1〜4個で15、6分くらいなんですよ。だから腹減ったっつって、でも言っても料理なんてほとんど出来ないから温泉卵活用する時ってハンバーグとかカルボナーラとかになんかじゃ決してなくて、ラーメンつくったときとか、何か肉とか焼いて丼ものっぽくしてみたぜなときとかそのくらいなんですけどね、そうすると普段調理終わるまで5〜6分とかなのにその温泉卵のプロセスが入ることによって確実に15分以上待たないといけなくなるんですよ。単体で食べるにしてもそんな待つなら他のもん食うわって感じになっちゃうんですよ。腹減ってるから。あとお湯なかったら沸かさないとだめだし。

でね、あとね、これ温泉卵最大5個同時につくれるようになってるんですけど、正直一度にそんなに温泉卵いらない。いままでに一度に2個しかつくったことない。ここでいっぱいつくれるのは別にいいことなんじゃないのってそこのお前は思っちゃうかもしれないですけど、容器が5個用につくってあるからね、1個つくるとき「あれ?これお湯無駄じゃね?」ってなっちゃうんですよ。1個つくるのに「お湯:たまごの2/3程度」ってなってるからね、それならもっと容器の幅狭いほうがお湯少なくてすむんじゃないのかと。

3分くらいでできればお湯なんかなんぼでも出すんだけどなあ。

[web]一般的なブラウザの機能としてブラウザに持っておいて欲しいと思うもの
Sun, Dec 3, 2006 3:00 AM

  • head要素内のメタ情報の表示
    • link要素によるナビゲーション
    • meta要素その他によるメタ情報の表示
  • blockquoteのcite/title属性の情報表示

これだけはもうすぐにでも入れて欲しい。CSSで、JavaScriptで、っていうのじゃなくて。実装方法は画像のプロパティみたいなやつとか、サイドバーとか、何でもいいからさ。

まっとうなやりかたでHTML文書を書いてなお「引用元が表示されていないから引用の明示とはいえない」とか「ナビゲーションが表示されていない。アクセシビリティについて配慮が足らない」とか、何で言われなきゃならないんだろうって思う。そういう言い争いを見かける度に。冗長にしたくないけどブラウザ(まあ特にIEなんだけど)が表示してくれないから妥協して書き足すっていうのはね、少なくとも俺にとっては全く気持ちの良くないことなんだよ。

最終的にはブラウザの都合に合わせてHTML文書等々を書くことがなくなればいいなあと、きちんと標準仕様に沿ってつくられたものが非難されるようなことがなくなるようになればいいのにな、と思うけどね。難しいよね。まだ勧告されてないものを使っている場合は別だけど。

[_]
Sun, Dec 3, 2006 3:00 AM

ネガティブなこと書くと絶対後で読み返したときヴァーてなるよね。大体において。

[_]いやになる
Sun, Dec 3, 2006 3:00 AM

自分から人を傷つける、傷つける可能性のある時って自分も相応に傷つく状況にできなきゃフェアじゃないと思ってはいる(だから1対Nの対立構図で俺がN側に入ることはあまりしたくない。人数に差がありすぎればなおさら)んだけど出来てないときがあるのでだめだ。発言の公平さをアピールする目的で(割ってはいるとすぐ多数派の誰かが「お前あいつ/あいつ等のこと好きだから擁護するんだろ」とか言うし。別に好きじゃねえっつうの。俺はお前らの振る舞いの方が大のつくほど嫌いなんだよ)対立する両方を非難しようとすると、同じ分非難しても少数派の方が相対的に受けるダメージが大きくなるのもあって間接的に多数派に加担する格好になるときとか。

そんな感じで一人ヘコんだりするんだけど、まあそれをアピールする俺は品性が下劣だわな。あと「ヒーロー気取り」とか「正義漢ぶって」とか思われるかもしれないけどね、俺からすりゃあ多数派の方がよっぽど腐った正義感を発揮しているよ。大体において。

[firefox][javascript]Greasemonkeyスクリプト上でのDOMノードのinstanceof
Sun, Nov 19, 2006 3:00 AM

Greasemonkeyスクリプト上でdocument instanceof Documentとかがtrueにならない(Firefox 2.0 + Greasemonkey 0.6.6.20061017.0)。何でだろう。

(function(){
  //全部false
  GM_log("document instanceof Node: " + (document instanceof Node));
  GM_log("document instanceof Document: " + (document instanceof Document));
  GM_log("document instanceof HTMLDocument: " + (document instanceof HTMLDocument));
  GM_log("document instanceof XMLDocument: " + (document instanceof XMLDocument));

  GM_log("unsafeWindow.document instanceof Node: " + (unsafeWindow.document instanceof Node));
  GM_log("unsafeWindow.document instanceof Document: " + (unsafeWindow.document instanceof Document));
  GM_log("unsafeWindow.document instanceof HTMLDocument: " + (unsafeWindow.document instanceof HTMLDocument));
  GM_log("unsafeWindow.document instanceof XMLDocument: " + (unsafeWindow.document instanceof XMLDocument));

  GM_log("document.wrappedJSObject instanceof Node: " + (document.wrappedJSObject instanceof Node));
  GM_log("document.wrappedJSObject instanceof Document: " + (document.wrappedJSObject instanceof Document));
  GM_log("document.wrappedJSObject instanceof HTMLDocument: " + (document.wrappedJSObject instanceof HTMLDocument));
  GM_log("document.wrappedJSObject instanceof XMLDocument: " + (document.wrappedJSObject instanceof XMLDocument));
})();

document.contentTypeで判別するにしてもcontentTypeはFirefoxのDocumentの拡張プロパティだからOperaと一緒のスクリプト使いまわしたいときに煩雑になるし(DocumentかどうかだけならnodeTypeでいいけど)、あとif(node instanceof HTMLAnchorElement) 〜とかをif(node.nodeName.toUpperCase() == "A") 〜みたいにするのがやだ...

わかった!右辺のDocumentとかのほうもXPCNativeWrapperっていうのがかぶせてあるからそっちのをwrappedJSObjectで外してやらないとだめなんだ!

左辺の方はやらなくてもいいみたい?

(function(){
  //true
  GM_log("document instanceof Node.wrappedJSObject: " + (document instanceof Node.wrappedJSObject));
  GM_log("document instanceof Document.wrappedJSObject: " + (document instanceof Document.wrappedJSObject));
  GM_log("document instanceof HTMLDocument.wrappedJSObject: " + (document instanceof HTMLDocument.wrappedJSObject));
  //XMLDocumentだったらtrue
  GM_log("document instanceof XMLDocument.wrappedJSObject: " + (document instanceof XMLDocument.wrappedJSObject));
})();

わあ。ってことはOperaとFirefoxでスクリプト使いまわすには、instanceofはこんな感じでやらないとだめなのかー

var d = HTMLDocument.wrappedJSObject || HTMLDocument;
if (document instanceof d) {
//〜
}
さんこう
ぽりぴぃすらいと - userscriptからのObjectのClassへのアクセス

あ、そういえばOperaにXMLDocumentないや。スクリプト使いまわしたいって言ったのに。というかDOM自体にXMLDocumentインタフェースないや...

[opera][DOM][javascript]Operaがキャプチャありのloadイベントリスナを何回も実行するのは仕様通りの動作
Tue, Nov 7, 2006 3:00 AM

がんばって読んでみた限りだと、document(とかwindow)で「キャプチャあり(addEventListenerの第三引数をtrue)」でloadイベントリスナを登録する、ってことは画像とかのloadイベント*1を捕獲するということなんだから、そのdocumentのloadイベントリスナが(1回しか実行されないだろう、という考えに反して、画像とかのloadイベントの回数分)たくさん実行されるのは仕様通りの動作だよ、Gecko(Firefox)とかSafariの実装が変だよ、ということらしい。あー。そりゃそうだ。でloadイベントはclickイベントとかと違ってイベントバブル動作はしないイベント型だからキャプチャなしの場合は実行が一回ってことか。

タイトルが変だったから変えたー。

*1:DOM 2 Eventsのload(HTML Eventsのload)イベントは文書、frameset要素、object要素の読み込み完了で、DOM 3 Events 20060413版のload(Eventsのload)イベントは文書と文書中のあらゆるリソース(画像、外部スタイルシート、外部スクリプトなど)の読み込み完了で発生する

[opera] Kuruman Memo > 2006 > 11 > 04 > br要素の実装”>Operaの内容生成の処理がおかしい
Tue, Nov 7, 2006 3:00 AM

br要素の実装関連でいろいろ試してたらOperaが落ちるケースに遭遇したからテストつくってバグレポート送ってみた。日本語で。...伝わるんかなあ。

あー他の人に試してもらってないや。通りすがりの人暇やったらテストページでOperaが落ちるかどうか試してくれんかな?

話変わるけどgetComputedStyleの第二引数(擬似要素のやつ)て文字列にコロン含めるか含めないかどっちが正しいんだろうねー。Operaだと含めないようにしなきゃだめだしFirefoxだと含めないとだめだし...仕様に実例が書いてあったらよかったんだけど。

[近況][firefox]今日はマイクロサマリジェネレータで遊んだ
Wed, Nov 1, 2006 3:00 AM

マイクロサマリジェネレータでなんかできないかなあて考えてて、WWWCの更新チェック用のmeta要素のcontent属性をもとに「更新日時 - サイト名」みたいな感じで表示させて、ブックマークの管理画面で並び替えて更新日時順に見れれば便利かなーと思ったけど、WWWC用のmeta要素つけてるとこがそんなに見つからなかったからちえりコマンド(ちえりっていうイラストサイト用の巡回ロボットのために更新情報を知らせるやつらしい)をもとに「【更新日時】サイト名【更新内容】」みたいに表示させるやつをつくってみた。つくってみたんだけど、ためしに更新リストから何個かブックマークしたのを1つのフォルダに入れて、ブックマークの管理画面でそのフォルダ内のブックマーク一覧を表示させて名前順で並び替えしようとしたらブックマークじゃなくて左ペインのフォルダの並びが替わったのでなえた。

あとwikipedia(ja)の「今日は何の日」を表示させるやつもつくってみた。今日はトルコ革命でオスマン帝国が廃絶したんだぜ...

[opera][javascript][DOM][メモ]Opera 9.02 × LSSerializer.domConfig.canSetParameter
Fri, Oct 27, 2006 3:00 AM

一応trueだけ。

実行文(lssdc = document.implementation.createLSSerializer().domConfig))返り値
lssdc.canSetParameter(canonical-form, true)false
lssdc.canSetParameter(cdata-sections, true)true
lssdc.canSetParameter(check-character-normalization, true)false
lssdc.canSetParameter(comments, true)true
lssdc.canSetParameter(datatype-normalization, true)false
lssdc.canSetParameter(element-content-whitespace, true)true
lssdc.canSetParameter(entities, true)false
lssdc.canSetParameter(infoset, true)false
lssdc.canSetParameter(namespaces, true)true
lssdc.canSetParameter(namespace-declarations, true)true
lssdc.canSetParameter(normalize-characters, true)false
lssdc.canSetParameter(split-cdata-sections, true)false
lssdc.canSetParameter(validate, true)false
lssdc.canSetParameter(validate-if-schema, true)false
lssdc.canSetParameter(well-formed, true)true
lssdc.canSetParameter(canonical-form, true)false
lssdc.canSetParameter(discard-default-content, true)true
lssdc.canSetParameter(format-pretty-print, true)true
lssdc.canSetParameter(ignore-unknown-character-denormalizations, true)true
lssdc.canSetParameter(normalize-characters, true)false
lssdc.canSetParameter(xml-declaration, true)true

[opera][userjs]HTMLの動的ソースを表示するbookmarkletで表示するソースをきれいにとか
Fri, Oct 27, 2006 3:00 AM

d:id:quaa:20060307#p2さん、OperaだったらXMLSerializerより断然DOM Load and SaveのLSSerializerの方がよいですよ。domConfigでいろいろ設定できるんだけど、"format-pretty-print"をtrueに設定すると、きれいに改行とか字下げとかしてくれますよ。おすすめです!

javascript:(function(){var lss=document.implementation.createLSSerializer(),s;lss.domConfig.setParameter("format-pretty-print",true);s="<pre>"+lss.writeToString(document).replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\n\s*\n/g, "\n")+"</pre>";with(window.open().document){write(s);close()}})()

"format-pretty-print"をtrueに設定すると空行が増えるので取り除いています。これの変換形式は実装依存らしいのでしょうがないです。あ、ここでやるとstyle要素内の<!のところが切り離されていますね...何だろう!

...何か半年前とやってることほとんど変わってないな。進歩がないというか。

余談

get-selection-source.jsのXMLSerializerのとこもdomConfigのsetParameterで"format-pretty-print"をtrueにしたLSSerializerにすると一行でみょーんってなったりしなくてすむね。もともとEnterでwrap切り替えできるけど。

312行目くらいの

code = parse((new XMLSerializer()).serializeToString(node));

をこんな感じで

//code = parse((new XMLSerializer()).serializeToString(node));
var lss = document.implementation.createLSSerializer();
lss.domConfig.setParameter("format-pretty-print", true);
code = parse(lss.writeToString(node).replace(/\n\s*\n/g, "\n"));

全体の内部ソース表示するのもbookmarkletじゃなくてget-selection-source.jsのコードの必要なところだけ持ってきてつくりかえれば色付けもされてきれいかも。全体のソース色付けすることになるから重そう。

あー

余談の方が長ーい。あとCanonical XML形式で書き出す"canonical-form"は今のOperaじゃtrueにできなーい

[_]今日のひとりぶれすと:たぎんぐ
Sun, Oct 22, 2006 3:00 AM

タグ付けがいまだにうまいことできない。たとえばDOM 2 Rangeについて書いてあるページをブックマークするとき*1 *2[DOM][2][Range]にするか[DOM][DOM2][Range]にするか[DOMRange](2は捨てる)にするかで悩んだり。いまのところ暫定的に[DOM][2][Range]なんだけどそうするとそれに[Firefox]とかついちゃった場合にはDOM 2でもFirefox 2でもひっかかるという問題が発生するわけで、もしFirefoxとDOM 2 CSSについて書いてあるページだったらDOM 2 CSSでもFirefox 2でも、関係ない(なくはないけど)CSS 2でもひっかかるというひどい状況が発生するわけで。整理できてないやんと。馬鹿やんと。

[DOM][DOM2][Range]かなあ、でもすまーとじゃない気がするなあ、とか[DOMRange]かなあ、でもDOMの一覧もDOM 2の一覧もDOM Rangeの一覧も見たかったりするしなあ、とか考えるとだんだん面倒になってくる。あれだ、タグが全部グローバルだからだめなんじゃないかなー。[DOM]がタグじゃなくてグループとしてくくれて、「このグループのみ」ってオプションでタグの絞込みができるなら[[DOM]][level2][Range]とか?いや

[[DOM]]
├[level2]
└[Range]
[[何か他のグループ]]
└[何か他のタグ]

こんな感じでつけられれば俺は満足できる...?むー。どうやってタグつけるのさ。XML名前空間みたいに[DOM:level2][DOM:Range]とかやってコロンの左側(ぷれふぃっくす)がグループになるような感じ?なんかHTMLからXHTMLへの移行みたいな話だな。

なんか考えが自分のタグ付け方法からシステムのほうへそれてくのでおわり。みんなどういうルールでタグ付けしてんのかな。

*1:たいていそういうときはあとで検索するためにそのページに書かれている主なメソッド名とかも一緒につけるけど。メソッド名とかの方が具体的だしあとで思いつきやすいから

*2:この例だと共感が得られにくいな!

[opera][userjs]opera:drivesにいろいろ機能をつけるやつ
Sun, Oct 15, 2006 3:00 AM

opera:drivesにインクリメンタル検索ボックスをくっつけるやつopera:drivesのテーブルをソート可能にするやつをあわせたやつを全体的に書き直したんだけど履歴とかを書いておくところがないことに気づいたのでここに書いておきますね!

まだ機能が2つしかないのでopera:drivesにいろいろ機能をつける「予定」のやつ。

対象

  • Opera 8.5以上(今のところ)

このスクリプトを入れて出来ること

  • 表示しているフォルダ内のインクリメンタル検索(普通・正規表現)
  • 表示しているフォルダ内のファイル・フォルダのソート(昇順・降順)。「ファイル名」とか「ファイルタイプ」とか書いてあるところを選択(クリックかEnter)するとその列を基準にソートする

履歴

2006-10-15
全体的に書き直した
設定つけた(検索のon/off(od_config.searchableをtrueかfalse), ソートのon/off(od_config.sortableをtrueかfalse), 検索のデフォルトのタイプを正規表現のか普通のかに切り替え(od_config.search_regexpをtrueかfalse))
インクリメンタル検索の対象をa要素のhref属性値からtd要素のinnerTextに変えた
2006-10-14
つくった

おぺらーではいすぺっくぴーしーのひとはこれ入れるなら一緒にtemp_hさんのthumbnailer2.js(opera:drivesを画像ビューア化するやつ。芦塚さんが上げてくれてます!)も一緒に入れるといいんじゃないかな。今のOperaだと動かない(フォルダとかのアイコンがimg要素からCSSのbackground-imageプロパティで表示されるようになったせい。9正式版からかな?)ので

var old_icon = this.anch.getElementsByTagName('IMG')[0];
this.anch.replaceChild(c, old_icon);

ってなってるところを

//var old_icon = this.anch.getElementsByTagName('IMG')[0];
//this.anch.replaceChild(c, old_icon);
this.anch.insertBefore(c, this.anch.firstChild);

こうすると動くよ。

[opera][userjs]opera:drivesのテーブルをソート可能にするやつ
Sat, Oct 14, 2006 3:00 AM

使用頻度のとても低いopera:drivesに無駄に機能をつけて遊ぼう計画!

opera:drivesの列の見出しを選択(クリック/Enter)すると昇順になったり降順になったり。ちょこっといじれば8.5以前でも動かせるかもしれないけどそこまでサポートするのはどうかなあと思った。最新バージョンへのアップグレードを阻害しそう。といいつつやっぱりめんどいのでした。

if (location.href.match(/^file:\/\/localhost\/.*\/$/)) {
  document.addEventListener("load", function(){
    var table = document.getElementsByTagName("table")[0];
    var head;
    if (window.opera.version() > 9){
      head = table.rows[0].getElementsByTagName("th");
    } else if (window.opera.version() > 8.5) {
      head = table.rows[0].getElementsByTagName("td");
    } else {
      return;
    }
    
    var ascchar = "\u2191";
    var descchar = "\u2193";

    var sortODTable = function(cellidx, asc){
      var arr = new Array();
      for (var i = 1, len = table.rows.length; i < len; i++) {
        arr.push(table.rows[i]);
      }

      arr.sort(function(a, b){
        var aa = a.cells(cellidx).innerText.toLowerCase();
        var bb = b.cells(cellidx).innerText.toLowerCase();

        if (aa == bb) return 0;
        else if (aa < bb) return -1;
        return 1;
      });

      if (asc) {
        head[cellidx].lastChild.nodeValue = ascchar;
      } else {
        arr.reverse();
        head[cellidx].lastChild.nodeValue = descchar;
      }
      
      for (i = 0; i < arr.length; i++) {
        table.appendChild(arr[i]);
      }
    };
    var EventFunc = function(){
      var asc = (head[this.cellIndex].lastChild.nodeValue == descchar);
      sortODTable(this.cellIndex, asc);

      for (var i = 0, len = head.length; i < len; i++) {
        if (i != this.cellIndex) head[i].lastChild.nodeValue = "";
      }
    };

    for (var i = 0, len = head.length; i < len; i++) {
      head[i].appendChild(document.createTextNode(""));
      head[i].addEventListener("click", EventFunc, false);
      head[i].style.cursor = "pointer";
    }
  }, false);
}

ついでに前のインクリメンタル検索のも8.5xで出来るようにして、今回のと合わせたjsファイル(ちょっと構成変わってるけど)を置いとくのでつかいたいひとは自由にいろいろしてくださいね!

ここに書いてからすぐ冗長なとこを見つけて書き換えた(arrを毎回生成からsortODTableの前に置いて使いまわすように変えた)んだけど書き換え後のコードだとインクリメンタル検索で項目を絞ってからソートするときに結果がおかしくなるので戻した。というか気持ちの良くないソートだなあ

TODO

  • 気持ちの良くないソート(ソートする基準の列の値が同じ場合に適当に行の順序が変わるのを変わらないように)を直す!

ascとdescがごっちゃになってたのとかをいろいろ直した。次にへんなところ見つけてもcustomizeOpearDrives.jsだけ直すよてい。

[近況]自分で髪切った
Sat, Oct 14, 2006 3:00 AM

普通の髪用のヘアーカッターを使ったのにバリカン使ったみたいに短くなってしまったのは何故だろう!

[opera][userjs]opera:drivesにインクリメンタル検索ボックスをくっつけるやつ
Fri, Oct 13, 2006 3:00 AM

Shishimushi - ?UserJSのインストールと管理が面倒臭い人用のdir.cssとかあってとてもすてきだった*1から入れて、それのパネルでjsファイルを検索できるようにしようーと思ってつくってたんだけど、パネルにUserJSは適用されないのをつくってから思い出した。あーうー。

//C:\なんとか〜とか書いてあるところの後ろにくっつける
//チェックボックスでふつうの検索と正規表現の検索を切り替えるー

if (location.href.match(/^file:\/\/localhost\/.*\/$/)) {
  document.addEventListener("load", function(){
    //http://0xcc.net/blog/archives/000008.html +
    function isearch(pattern, re){
      var regex = new RegExp(re ? pattern : pattern.replace(/(\W)/, "\\$1"), "i");
      var items = document.getElementsByTagName("table")[0].getElementsByTagName("a");

      for (var i = 0, length = items.length, e; i < length; i++) {
        e = items[i];
        e.parentNode.parentNode.style.display = (e.getAttribute("href").match(regex)) ? "table-row" : "none";
      }
    }

    var h2 = document.getElementsByTagName("h2")[0];
    var searchbox = document.createElement("input");
    h2.appendChild(searchbox);

    var relabel = document.createElement("label");
    h2.appendChild(relabel);
    relabel.textContent = " (";

    var re = document.createElement("input");
    relabel.appendChild(re);
    re.type = "checkbox";

    relabel.appendChild(document.createTextNode("REGEXP)"));

    searchbox.addEventListener("keyup", function(){
      isearch(this.value, re.checked);
    }, false);
  }, false);
}

*1:俺普通にApplication DataのOperaのとこにuserjsフォルダがあるからコピーのときに空白が%20になってzzz.vbsの処理の途中でそんなファイル無い!って言われてちょと困った。zzz.vbsのp=ClipboardTextのとこをp=unescape(ClipboardText)にするといちおうだいじょうぶ?

[_]最少投球数の問題(回答結果と答え)
Wed, Oct 11, 2006 3:00 AM

回答結果

ちょっとしたクイズです。日本のプロ野球のある試合で、決して破られることのない、両チーム合わせての最少投球数の記録が出るとしたら、それは何球になるでしょう。 (注意:コールドゲームは含みません。またなぞなぞの類でもありません)

最少投球数だと思う項目を選んでください。
16球 7
27球 12
28球 4
52球 36
54球 24
138球 2
154球 2
162球 2
その他(いわしへ) 11

答え

正解は52球です。

まずAチームの投手が27アウトを1球ずつで取る。次にBチームの投手が、同じように8回まで24アウトを取る。そして9回裏の第一打席にサヨナラホームランを打たれる。ということで27+24+1で52でした。

人力検索はてな - ちょっとしたクイズです。日本のプロ野球のある試合で、決して破られることのない、両チーム合わせての最少投球数の記録が出るとしたら、それは何球になるでしょう。 (注意..

と思いきやボークとかの反則のことを問題文に禁止事項として入れていなかった(考えてもいなかった)ので正解は0球だったという。間抜けめ!

余談

質問出す前に一応全部理由のある不正解を考えて項目にしたので、全部の項目に票が入ってくれてうれしかったり。「16球」だけちょっとミスった。あと「25球」も入れればよかったかな。

16球
1回表で先攻チームが全員ホームラン打ってあとは3人が1球で倒れる。1回裏で後攻チームが1球ずつで三者凡退。「コールドゲームは含みません」だしそもそも「日本のプロ野球のある試合」(日本のプロ野球では10点コールドはない。アマチュアでも1回コールドは...)なのでだめ。この理由なら表じゃなくて裏で10人にホームラン打たせればいいから13球で良かった
27球
1チームの投手の完封のための最少投球数。「両チームの投手合わせて」なのでだめ
28球
先攻チーム3*5, 後攻チーム3*4と1本ホームラン打ったあとに雨とかで5回コールドゲーム。「コールドゲームは含みません」なのでだめ
54球
両チームとも3*9(試合が終わらない)
138球
勝利チームの投手が1952年5月11日の柴田栄治(阪急, 71球)、敗北チームの投手が1947年8月10日の別所昭(南海, 67球)だった場合(参考:Yahoo!知恵袋 - 投手は三振を27個とるより27球で試合を終了するの...とか)
154球
両チームの投手がそれぞれ三球三振を8回まで続け、9回表で先攻チーム3*3*9, 後攻チーム3*3*8+1
162球
両チームとも三球三振を9回まで続ける。3*3*9*2(試合が終わらない)

そういえば中日ドラゴンズリーグ優勝したね!今年こそは日本一になれるかな?

[_]最少投球数の問題
Tue, Oct 10, 2006 3:00 AM

本屋で「面白くてやめられない論理パズル」(ASIN:4806118982)っていう本を見かけて小さい頃に思いついたクイズを思い出したので人力検索のアンケートに投げてみた(question:1160476767)。既出かも。

[xyzzy]xyzzyでUnicodeエスケープするとかアンエスケープしないとか
Sun, Oct 8, 2006 3:00 AM

userjsつくるのにいちいちUnicodeエスケープするのめんどいめんどいと思ったのでバッファの内容をUnicodeエスケープできるようにしようとしたんだけどLispわかんないので親切な人にいろいろ教えてもらった!めもめも。

;;Unicodeエスケープするやつ。「letつけないとマズい」らしい
;;http://ukgk.g.hatena.ne.jp/faerie/20061005/1160035556
(defun unicode-escape (input &optional output)
  "ストリームを Unicode エスケープする。"
  (let (c)
    (while (setq c (read-char input nil))
      (if (> (char-unicode c) 255)
          (format output "\\u~4,'0X" (char-unicode c))
        (write-char c output)))))

(defun unicode-escape-region (from to)
  "リージョンを Unicode エスケープする。"
  (interactive "*r")
  (ed::text-decode-region #'unicode-escape from to))

(defun unicode-escape-string (s)
  "文字列を Unicode エスケープする。"
  (with-output-to-string (o)
    (with-input-from-string (i s)
      (unicode-escape i o))))

;;親切な人に新しく教えてもらったやつ
;;「ナローイングしてたらバッファ全体じゃない」らしい
;;カーソル移動しないようにsave-excursionっていうのつけてみた
(defun unicode-escape-buffer ()
  "バッファ全体を Unicode エスケープする。"
  (interactive "*")
  (save-excursion
    (ed::text-decode-region #'unicode-escape (point-min) (point-max))))

んでエスケープできたらアンエスケープもしたいのが人の性なので(なのです)、それっぽいのをバッファ全体だけだけどでっち上げてみたよ!

(defun unicode-unescape-buffer ()
  "バッファ全体を Unicode アンエスケープする???"
  (interactive)
  (save-excursion
    (goto-char (point-min))
    (let (c)
      (while (scan-buffer "\\\\u\\([0-9a-fA-F]\\{4\\}\\)" :regexp t)
        (setq c (unicode-char (parse-integer (match-string 1) :radix 16)))
        (delete-region (match-beginning 0) (match-end 0))
        (insert c)))))

とりあえず動けばイーゼ、だけどバッファ以外もしたいのが人の性(なのです)。

Unicodeエスケープのこと調べるまでUnicodeエスケープをISO-Latin-1のコードだと思ってた///

さんこう
みんなで仲良く〓〓ω〓〓 〓〓〓〓 - ふるごむのうんこ日記 - xyzzy で Unicode エスケープ

顔が何かの犯人みたい!

上のunicode-unescape-bufferの正規表現抜けてたので直した([0-9a-f]→[0-9a-fA-F])!

[近況]バッティングセンターに金を吸い取られる
Tue, Oct 3, 2006 3:00 AM

この前久しぶりにバッティングセンターに行ってバットを振り回していたら初めてホームランボードに球が当たったので、それに気を良くしてバッティングセンターを見かけるとふらっと入って気づいたら千円くらい使ってしまうようになった。昔はバッティングセンターに行っても全くいい当たりが出ないのであまり楽しいと思わなかったんだけど、最近は何故かよく当たるようになってきているのでとても楽しい。ただ昔のバッティングセンターは左ボックスが極端に少なかったりなかったり(可変速の両ボックスがひとつだけとか)するので左でなかなか打てないのが少し不満。左で打ちたい。

100km/h〜120km/hのボックスを行ったり来たりして、空振りかチップすると勢いで一回転し、それが続くと軽くめまいを起こし、「あーあかんわー」とかひとりごとをつぶやきながら打っている奴がいたら俺...あーこんなの隣に居たらいやだな。おとなしく打とう。

[opera][css][メモ]Operaの独自拡張CSSのメモ
Fri, Sep 22, 2006 3:00 AM

プロパティメモ
-o-linknone | attr(<attribute-name>)'link' 変数の値を設定し、それにより後に 'opera-use-link-source' プロパティを通じてリンクが生成されOpera 9 でサポートされるウェブ仕様 - CSSる('opera-use-link-source'じゃなくて'-o-link-source'。http://jp.opera.com/docs/specs/opera7/からずっと間違っている)
-o-link-sourcenone | current | next要素を source anchor に設定し、現在ないし次の " -o-link " 変数のいずれの値を利用するかを宣言Opera 9 でサポートされるウェブ仕様 - CSSする
-o-replacenone | attr(<attribute-name>) このプロパティは要素が置き換えられるか否かを宣言します。置き換えられる場合、attr() function を用いてコンテンツの URI 情報が見つかった属性を指摘しますOpera 8 でサポートされるウェブ仕様廃止(相当する CSS3 メカニズムに変更予定Opera 9 でサポートされるウェブ仕様 - CSS)
-o-text-overflowellipsis20021024とか20030514版のCSS3 Text(CSS3 Text LayoutにわけられるらしいけどText LayoutはWDも出ていない)のtext-overflow:ellipsisと同じ。値はellipsisしかない
background-image-o-skin(<image-name>*1 )skin.iniのImagesセクションにある画像名を指定してスキンの画像を表示させる
white-space-o-pre-wrapwhite-space:preと全く同じだけど例外として、 一行がボックス(containing box)よりも幅が広い場合は、端で折り返されOpera 7 でサポートされるウェブ仕様
width-o-skinbackground-image:-o-skin(<image-name>)で指定した画像の横幅
height-o-skin | -o-content-size-o-skinはbackground-image:-o-skin(<image-name>)で指定した画像の縦幅。-o-content-sizeはobject要素とかの内容幅に合わせるぽい

-o-replaceは前8.何かで試してみたけどちゃんと動かなかった気が...指定の仕方が悪かったのかな。あ、Operaの独自拡張CSSも使わないでくださいって書かないとだめかな。だめだよね。

*1:今適当につけた

[javascript]HTMLDocumentを(かなり無理矢理)生成する方法がわかったのでGM_xmlhttpRequestでwell-formedじゃないHTMLのコードを取ってきて新しく生成したHTMLDocumentでパースしてみるよ
Thu, Aug 24, 2006 3:00 AM

var xsl = (new DOMParser()).parseFromString([
  '<?xml version="1.0"?>',
  '<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">',
  '<output method="html"/>',
  '</stylesheet>'
].join("\n"), "text/xml");

var xsltp = new XSLTProcessor();
xsltp.importStylesheet(xsl);
var htmldoc = xsltp.transformToDocument(document.implementation.createDocument("", "", null)); //HTMLDocument

これでHTMLDocument生成できた。document.implementation.createDocument("http://www.w3.org/1999/xhtml", "html", HTMLのDocumentType)とかやったらHTMLDocument出来るかなーと思ったけど出来なかった。

何でHTMLDocumentを生成したかったのかっていうと、http://lowreal.net/logs/2006/06/19/1を見て他の方法ないかなーと思って調べたらNSRangeのcreateContextualFragmentで出来そうだったからやってみたんだけど、DocumentFragmentだとDOM XPathでevaluate出来ない(コンテキストノードにDocumentFragment使えない)ことに気づいて、div要素つくってDocumentFragmentつっこんでevaluateするのはそんなに変わんないしなあと思ったので新しくつくったDocumentにDocumentFragmentをつっこむことにしようとしたんだけど、XMLDocument(createDocumentの返り値)からつくったRange(NSRange)だとcreateContextualFragmentしたときにNS_NOINTERFACEうんぬん言われて出来なかったのでHTMLDocumentからつくったRangeならいけるんじゃないかなーと思ったから!

ということで、はい、できましたー

(function(){
  var xsl = (new DOMParser()).parseFromString([
    '<?xml version="1.0"?>',
    '<stylesheet version="1.0" xmlns="http://www.w3.org/1999/XSL/Transform">',
    '<output method="html"/>',
    '</stylesheet>'
  ].join("\n"), "text/xml");

  var xsltp = new XSLTProcessor();
  xsltp.importStylesheet(xsl);
  htmldoc = xsltp.transformToDocument(document.implementation.createDocument("", "", null));

  GM_xmlhttpRequest({
    method : "GET",
    url : "http://www.hatena.ne.jp/",
    onload : function (req) {
      var range = htmldoc.createRange();
      htmldoc.appendChild(htmldoc.createElement("html"));
      range.selectNodeContents(htmldoc.documentElement);

      //createContextualFragmentだとよしなにやってくれるっぽい
      htmldoc.documentElement.appendChild(range.createContextualFragment(req.responseText));

      //DOCTYPEとhtml要素についた属性がなくなっちゃうけどね
      alert((new XMLSerializer()).serializeToString(htmldoc));

      //$Xはhttp://lowreal.net/logs/2006/03/16/1とかで拾ったりして何とかしてくださいね!
      alert($X("//html", htmldoc));
    }
  });
})();

うわあふぁっきん

[_]
Sun, Aug 20, 2006 3:00 AM

9時間×10日のただ働きなんて耐えられないよ...

[javascript]style要素(LinkStyleインタフェース)を生成してCSSStyleSheetインタフェースを得、insertRuleする
Sun, Aug 20, 2006 3:00 AM

(http://d.hatena.ne.jp/quaa/20060415#p1の追々記)

var ls = document.createElement("style");
document.getElementsByTagName("head")[0].appendChild(ls);
ls.type ="text/css";

var ss = ls.sheet;
ss.insertRule("body{color:red}", ss.cssRules.length);

DOM2 Style/CSS。IE6はsheetがundefinedになるのでできない。

var ls = document.createElement("link");
document.getElementsByTagName("head")[0].appendChild(ls);
ls.rel= "stylesheet";
ls.type= "text/css";

var ss = ls.sheet;
ss.insertRule("body{color:red}", ss.cssRules.length);

Opera9だとこれ(link要素の)でもinsertRuleとかできるようになるけどFirefox1.5だとできない(INVALID_ACCESS_ERRみたいのになる?何か足りない?)。

[opera][userjs]del.icio.usのタグ補完を無効にしたい
Sun, Aug 20, 2006 3:00 AM

パソコンの能力が貧弱でdel.icio.usのタグ補完が重いので無効にしたいけど設定が見つからない。なのでこの中にエロイ人、おじいさん、goo、はてなダイアリーがいたら、あたしに教えなさ...教えてください。それまでとりあえずでつくったUserJSでしのぐことにします。

//==UserScript==
// @include http://del.icio.us/(userid)/*
//==/UserScript==

window.opera.addEventListener('BeforeScript', function(e) {
	if (e.element.src.indexOf('delicious.js') > -1) {
		e.element.text = e.element.text.replace(/tags: create\([^\)]+\)/,
			"tags: create('input', {value: data.tags, style: inputStyle, autocomplete: 'off', css: 'tags'})");
	}
}, false);

以上。あ、あとBeforeExternalScriptイベントでもe.element.text(みたいなの)を使いたいってジョンに伝えてください。

ブックマークした後でその場で編集するときのことしか考えてなかった!また後で考える

すっかり忘れてた!

//==UserScript==
// @include http://del.icio.us/(userid)
// @include http://del.icio.us/(userid)/*
// @include http://del.icio.us/url/*
//==/UserScript==

window.opera.addEventListener("BeforeScript", function(e) {
	if (e.element.src.indexOf("delicious.js") > -1) {
		e.element.text = e.element.text.replace(/tags: create\([^\)]+\)/,
			"tags: create('input', {value: data.tags, style: inputStyle, autocomplete: 'off', css: 'tags'})");
	} else if (e.element.src.indexOf("post.js") > -1) {
		e.element.text = e.element.text.replace(/document.onkeydown = document.onkeypress = document.onkeyup = handler/, "");
	}
}, false);

@includeの(userid)のところは自分のIDに書き換えるんだよ、って書くの忘れた。しかも自分のところで何か動かない...と思ったら自分がID書き換えてなかった。なきたい

[__]こわいはなしをおもいついた
Sat, Aug 19, 2006 3:00 AM

「この前墓の前通ってさあ、夜中」
「うん」
「一人やったし怖いから歌歌いながら通ってて。妖怪人間ベムの歌」
「余計怖いやん」
「まあそうやけど。で歩いてたら後ろから何か足音がすんの」
「おお」
「うわーと思って早歩きで歩いて。なのにずっとついてくんの。足音」
「怖いな」
「そんでコツ、コツ、って足音がどんどん近づいてきて」
「えー」
「肩をトントン、て叩かれたの。で振り返ったら」
「『すみません、JASRACの者ですが』」

[__]きのう
Sat, Aug 19, 2006 3:00 AM

「上木彩矢の『もう君だけを離したりはしない』って歌あるじゃん」
「どんな歌だっけ?」
「もう君だけを離したりはしなーい 昨日はイエスタデーイ」
「まあ昨日はイエスタデイだ」
「あれ?明日はイエスタデーイ?」
「明日はイエスタデイじゃない」

[近況]漫画喫茶、PlayNC、ドコモのメールアドレス
Thu, Aug 17, 2006 3:00 AM

友達と久しぶりに漫画喫茶に行ってリネージュ2やろうってことになったんだけど、ログインしようと思ったら名前とパスワードともうひとつセキュリティカードから番号を入力しないといけないようになってた。

セキュリティカードをもらうにはPlayNCっていうののアカウントに移行しないとだめってことなので移行の手続きをしたんだけど、一緒にいた友達はメールアドレス変えてて移行できない、サポートに言えばいいらしいけど説明がわかりにくい、しかも携帯の料金2ヶ月払ってなくて止められてると(ひどい)。

しょうがないから今回は友達のお姉さんの携帯のメールアドレスで新しいアカウントつくって、料金払ったらまた自分のアドレスに変えるってことにした。で友達の手続き終わるまでニュースとか見て待ってたんだけど、不正なメールアドレスとかなって進めないって言うので見たらローカルパートにピリオドが連続してた(xxx.xxxx..xxx@docomo.ne.jpみたいな感じ)。あー。友達のお姉さんはいろいろと苦労してる気がしたよ。

こんなんで(しかも落ち度無いのに)クレームつけられるサービス提供側もかわいそうだね。

[近況]かみなり
Sat, Aug 12, 2006 3:00 AM

雷すごい雷の音大きいそれなりに晴れてるのにどしゃぶりだしテレビが映らなくなった高校野球が見れなくなったはてなも落雷したひー

[HTML]text/htmlのXHTMLで失うものとか変わるもの
Sat, Aug 12, 2006 3:00 AM

書きたかったことがあったんだけどちょうどいいとっかかり(『第4回 HTMLからXHTMLへの移行方法』(ITPro))があって何かエンジンがかかったので今日書く。

XHTML 1.0では、HTMLとは異なるMIMEタイプ「application/xhtml+xml」と指定するのが正しいのだが、IE 6がダウンロードダイアログを表示するなど不安的な動作をする場合があるので、実務的にはHTMLと同じように「text/html」と指定しておくのが一般的だ。

第4回 HTMLからXHTMLへの移行方法(1):ITpro

FirefoxやOperaはXHTMLのMIMEタイプがtext/htmlの場合XML名前空間をサポートしない。そのためSVGやMathMLが意図した形でレンダリングされなかったり(Operaは今のところMathMLはサポートしていない)、JavaScript(DOM)によって要素を取得する場合、MIMEタイプの種類がHTML(text/html)かXML(application/xhtml+xml, text/xml...)かでは挙動が変わってきたりする。

DOMの各メソッドでXML名前空間の接頭辞のついた要素の取得が可能かどうか
IE6Firefox1.5Opera9Opera8.x
HTMLXMLHTMLXMLHTMLXMLHTMLXML
getElementsByTagName(局所名) × × ×
getElementsByTagNameNS(名前空間URI, 局所名) -- × ×
getElementsByTagName(QName) × × × ××

Operaは9 beta1でHTML ドキュメント内の XML名前空間サポートの廃止Opera 9.0 ベータ 1 for Windows 更新履歴をしたので9系とそれ以前でも違う(http://jp.opera.com/docs/specs/opera8/Opera 8 より text/html lに対する名前空間のサポートを中止しましたOpera 8 でサポートされるウェブ仕様とどう違うのかよくわからないが)。XML名前空間なんか使わない、というのなら別にどうでもいいことかもしれない。

application/xhtml+xmlのXHTMLをIEで

Content-Typeがapplication/xhtml+xmlのXHTMLをIEで見れるように製作者側で対処することは可能。そのひとつをhttp://past.openvista.jp/blog/documents/W3C/XHTML_FAQ/#ieから引用。

Microsoft の Intenret Explorer は application/xhtml+xml に対応しているんでしょうか?

していません。しかし、トリックを施すことで Internet Explorer にXHTML 1.0文書を application/xml で送り出す事が出来ます。

文書の先頭に次の太字(=強調)になっている行を付け加えてください。

<?xml version="1.0" encoding="iso-8859-1"?>
<?xml-stylesheet type="text/xsl" href="copy.xsl"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>

copy.xsl の中身は以下:

<stylesheet version="1.0"
     xmlns="http://www.w3.org/1999/XSL/Transform">
    <template match="/">
        <copy-of select="."/>
    </template>

</stylesheet>

このファイルは参照元の(XHTML)文書と同じサイト内(=同ドメイン内?)になければならないことに注意してください。

あなたが文書をXML文書として送っていて、その文書がXMLとして解釈されているのとしたら、このトリックを使うとブラウザは text/html の(文書)を受け取ったと考えてしまいます。だからあなたはXHTML 1.0文書を送るにあたっては、レガシーなブラウザへの送信方法に関する多くのガイドラインに従わないといけません。

そうすれば、あなたのXHTML文書は application/xml に対応しているブラウザであれば引き続き、うまく表示・動作するでしょう。

XHTML Frequently Answered Questions(私的日本語訳) - Software Linkage

XHTML 1.1の場合はMSXMLのXHTML 1.1 DTDの解析に不具合があるようで解析に失敗する(使用する前にパラメータ エンティティを定義しなければなりません。リソース 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd' の実行エラーです〜とかいうエラーメッセージが出る)が、DTDをMSXML用に修正することで対処はできる

あとCGIでContent-Type変えるとかtype-map使うとか閲覧者側だったらレジストリいじるとかー(エンジン切れた)。

[はてな]引用記法の案
Wed, Aug 9, 2006 3:00 AM

引用ブロックの記法がこんな感じだったらいいのになー。

>[http://example.com/:title=quote]>
引用文章

引用文章
<<

通常の引用記法の開始の記号の間にhttp記法

<blockquote cite="http://example.com/" title="quote">
<p>引用文章</p>

<p>引用文章</p>
<cite><a href="http://example.com/">quote</a></cite>

</blockquote>

展開するとこんなん。ほんとはcite要素はさまないでほしいけどそれはまた別のおはなし

[userjs]http://www2u.biglobe.ne.jp/~oz-07ams/prog/のDOM3の邦訳のXMLをXSL変換するやつ
Sun, Aug 6, 2006 3:00 AM

生のXML読むのつらい...と思ってずっと見てなかったんだけど今日たまたまソースのぞいたらxml-stylesheet処理命令がコメントアウトされてあったのでUserJSでXSL変換させてみることにしたよ。

// ==UserScript==
// @include http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/XPath/xml-source-20040226-ja.xml
// @include http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/Val/xml-source-20040127-ja.xml
// @include http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/Events3/xml-source-20031107-ja.xml
// @include http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/LS/xml-source-20040407-ja.xml
// @include http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/Core3/xml-source-20040407-ja.xml
// ==/UserScript==

(function(){
	var uri = "http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/tools/xmlspec-dom.xsl";
	uri += "?" + (new Date()).getTime();

	var req = new XMLHttpRequest();
	req.open("GET", uri, false);
	req.onload = function(){
		var xsltp = new XSLTProcessor();
		xsltp.importStylesheet(req.responseXML);

		var df = xsltp.transformToFragment(document, document);
		document.replaceChild(df, document.documentElement);
	};
	req.send(null);
})();

重いけどわーい。でもOperaの9.00とか9.01だとキャッシュがあると普通にresponseXMLが取れない。非同期で試すとキャッシュがあるときはXMLHttpRequestのreadyStateが3, statusが200で止まる。ないときはreadyStateが4, statusが200になってちゃんと取れる。LSParserの同期でも非同期でもキャッシュがある場合は取れない。8.54だと大丈夫(XSLサポートしてないから意味無いけど)。でもほかのXMLHttpRequest使ったスクリプトはキャッシュ関係なく動いてるしなあ。むー。しかしこんなことしなくても全部ローカルに保存してちょっといじって普通にXSL変換させるほうがよいのであった。あはは

メモ:これつくる前に試したこと

createProcessingInstruction
var xslpi = document.createProcessingInstruction('xml-stylesheet', 'href="http://www2u.biglobe.ne.jp/~oz-07ams/prog/dom-ref/tools/xmlspec-dom.xsl" type="text/xsl"');
document.insertBefore(xslpi, document.firstChild);

新しいスタイルシートは,ターゲット'xml-stylesheet' [XML-StyleSheet]をもつ処理命令の生成及びそれの文書中への挿入によって,生成され,XML文書と関係付けられるDocument Object Model Style Sheetsってあったからやってみたんだけど挿入は出来るけど変換してくれない。

window.opera.pushXSLTransform
var req = new XMLHttpRequest();
req.open("GET", uri, false);
req.onload = function(){
  window.opera.pushXSLTransform(req.responseXML);
};
req.send(null);

動かない(9.01)。裏で動いてるっぽい(アドレス欄叩いても更新されなくなる)けど結局何にもならない。いつの間にか追加されてたhttp://www.opera.com/support/tutorials/userjs/specs/#pushxsltransformみると引数にはDocument(XMLHttpRequestのresponseXMLとかDOMParserのパースした戻り値とかLSParserのパースした戻り値とか)を入れればいいみたいなんだけど...

メモ:そのた

  • XSLTProcessorのサポートはOpera9TP1から
  • IE(JScript)で動的にXSL変換するにはMSIE用のXML要素にid振るかActiveXObject("Microsoft.XMLDOM")でxmlとxslをloadしてtransformNodeするらしい
  • XMLでdocument.write()使えないのMozilla系だけかと思ったらOperaもだった

DOM XSLTとかないん?

[_]いらないものが多すぎる
Wed, Aug 2, 2006 3:00 AM

部屋を片付けたいんだけど全然片付かない。片付けようって気もすぐ萎える。部屋にあるものの8割はいらないものっていう認識なのでいらいらする。俺のものじゃないものとかある。本棚とか棚がやけに多い。でも本が多いわけではない。

ライフプログラミングしたい。一定時間毎に勝手に部屋を掃除するプログラムをつくりたいんです。それか部屋tmpをつくっていったんtmpに物を全部移動させて、いるものだけ元の部屋に戻してtmp爆破したい。もちろん物を移動させるのは俺じゃない!...あーむしろ今の部屋の爆破許可出るならそのまま部屋爆破したいです嘘ですあーあー。地道に片付けないとなあ。

[opera]canvasでローカルの画像をbase64エンコードするwidgetか何かをつくろうとした→失敗
Thu, Jul 27, 2006 3:00 AM

Web Applications 1.0のcanvas要素のtoDataURL使えば画像をbase64エンコードした文字列が取れるらしいので、The data: URI kitchenみたいにローカルの任意の画像をbase64エンコードするwidgetか何か簡単につくれるやんと思って試作でつくったんだけど、Operaだとtype属性が"file"のinput要素からvalueを参照するとファイル名だけしか取れなかったので失敗した...

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
      xml:lang="ja">
<head>
<script type="application/javascript"><![CDATA[
window.addEventListener("load", function(){
  function openDataURL(imgurl){
    var img = new Image();
    img.src = imgurl;

    img.onload = function(){
      var canvas = document.createElement("canvas");
      canvas.width = this.width;
      canvas.height = this.height;
      var ctx = canvas.getContext("2d");
      ctx.drawImage(this, 0, 0);

//      widget.openURL(canvas.toDataURL());
      window.open(canvas.toDataURL());
    };
  }

  var localimage = document.getElementById("localimage");

  var open = document.getElementById("open");
  open.addEventListener("click", function(){
    if (localimage.value != "") {
      openDataURL("file://localhost/" + localimage.value);
    }
  }, false);
}, false);
]]></script>
<title>TEST</title>
</head>
<body>
<h1>TEST</h1>

<form>
<dl>
<dt>ファイル</dt>
<dd><input id="localimage" type="file" accept="image/jpeg,image/png,image/gif,image/bmp"/></dd>
</dl>
<dt>実行</dt>

<dd><input id="open" type="button" value="base64でエンコードされた画像を開く"/></dd>
</form>
</body>
</html>

こんなやつ。ボックス内には絶対パスが入るのに何でvalueで参照するとファイル名しか取れないんだろう!type属性をtextにしてパスコピペとかめんどういし!Firefox(2.0 beta1)だとtoDataURLが使えて絶対パスも取れるから動くようす。

[opera][javascript]OperaではHTMLElement(とそれを継承しているインタフェース)のメンバにprototypeがない?
Wed, Jul 26, 2006 3:00 AM

Operaのwidgetsをつくろうかなーと思ってJavaScriptを書いているときにprototypeとかいろいろ使おう、と思って

HTMLSelectElement.prototype.getSelectedItem = function(){
	return this.options[this.selectedIndex];
}

とか

HTMLTextAreaElement.prototype.clear = function(){
	this.value = "";
}

みたいなのを書いたんだけど、実行するとエラーになる。OperaではHTMLElement(とそれを継承しているインタフェース)のメンバにprototypeがない?

javascript:alert(HTMLSelectElement.prototype); //エラー(WRONG_THIS_ERR)
javascript:alert(HTMLTextAreaElement.prototype); //エラー(WRONG_THIS_ERR)

javascript:alert(HTMLElement.prototype); //エラー(WRONG_THIS_ERR)
javascript:alert(Element.prototype); //[object Object]
javascript:alert(Node.prototype); //[object Object]

javascript:alert(HTMLSelectElement instanceof Object); //true
javascript:alert(Object.prototype); //[object Object]

javascript:alert(HTMLElement.hasOwnProperty("prototype")); //false

9.0だけかと思ったけど8.54も同じだった。あと9.01(build 8543)も。ところでWRONG_THIS_ERRって何なん? 普通メンバなかったら参照したときundefinedが返る(javascript:alert(HTMLElement.prototyp)とか)と思うんだけど...

あとhasOwnPropertyも変な感じ。hasOwnProperty("prototype")の結果見るとElementでもNodeでもfalseが返ってくる。

javascript:alert(HTMLElement.hasOwnProperty("prototype")); //false
javascript:alert(Element.hasOwnProperty("prototype")); //false
javascript:alert(Node.hasOwnProperty("prototype")); //false

javascript:alert(Object.hasOwnProperty("prototype")); //true

うーんうーん

勘違いだった><。HTMLElement(とそれを継承しているインタフェース)のメンバにprototypeはある。でも参照したときエラーになる理由はまだわからない。

[opera]www.y-adagio.comのDOM2の邦訳のページでフラグメント識別子つきのアンカーを選択しても移動できない問題
Sun, Jul 2, 2006 3:00 AM

www.y-adagio.comのDOM2の邦訳(http://www.y-adagio.com/public/standards/tr_dom2_core/core.htmlとか)はありがたいんだけどフラグメント識別子つきのアンカーを選択しても移動できたりできなかったりして結構不満で、もしかしたらHTML の id 属性値は大文字に変換される2003年11月 - マーク付けノートとかそういう話なんかなあと思ったんだけど、最近ソース見たらid属性の属性値が重複している要素が(結構)あって、その要素の1つがdisplay:noneで消されていた。何かOperaだとid属性が重複している要素が複数あって、その最後の要素がCSSで消されているHTML文書ではフラグメント識別子つきのアンカーが機能しないみたい(逆にIEとFirefoxだと最初の要素をCSSで消すと機能しないみたい)。

ということでUserJSで2つ目のid属性除去した。あとwww.y-adagio.comのDOM2の邦訳ページはbody要素直下にfont要素(@face="MS 明朝")がはさまってて、それが何かOperaだとユーザCSSで上書きはできるけど解除できない(* {font-family:"" !important}とか芦塚さんみたいに* { font-family : none !important }とか。CSSの仕様にこういうのあるのかっていったらないんだけど。FirefoxだとuserContent.cssとかstylishでこういう風に書いてfont要素で指定されたフォントも解除できる)のも困るのでfont要素から中身出してfont要素だけ消すことにした。CSSをユーザモードにすればいいんだけどdiv.eng内の文章が出てこられると長くなるのが困るね。div.engただ消すだけだとアンカー使えなくなるし。

// ==UserScript==
// @include http://www.y-adagio.com/public/standards/tr_dom2_core/*
// @include http://www.y-adagio.com/public/standards/tr_dom2_events/*
// @include http://www.y-adagio.com/public/standards/tr_dom2_views/*
// @include http://www.y-adagio.com/public/standards/tr_dom2_style/*
// @include http://www.y-adagio.com/public/standards/tr_dom2_traran/*
// ==/UserScript==

(function(){
  var ss2ndIds = document.evaluate('//div[@class="eng"]//*[@id][@name]', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);

  var ndCurrent;
  for (var i = 0; i < ss2ndIds.snapshotLength; i++) {
    ndCurrent = ss2ndIds.snapshotItem(i);
    ndCurrent.removeAttribute('id');
    ndCurrent.removeAttribute('name');
  }
  var range = document.createRange();
  var ndFont = document.getElementsByTagName('font')[0];
  range.selectNodeContents(ndFont);
  var df = range.extractContents();
  ndFont.parentNode.replaceChild(df, ndFont);
})();

2006-07-02
Sun, Jul 2, 2006 3:00 AM

たまっているもの放出しないと。

[userjs]bookmarkletでHTTPヘッダ見るよ+XMLHttpRequestのgetResponseHeaderとかよくわからん
Sun, Jul 2, 2006 3:00 AM

bookmarkletでHTTPヘッダ見るよ

ふとHTTPヘッダ見たい!と思ってXMLHttpRequestで簡単なbookmarkletをつくって使ってたんだけど、そういえばそういうbookmarkletあったな、と思ってhttp://bookmarklet.daa.jp/blog/archives/000010.htmlに行ったらbookmarklet使えなくなってた("view.cgi"を削るだけで使えるけど)のでちょっと直した。ヘッダ見たいだけだからメッセージボディいらんやんと思ってHEADにした。

web-sniffer.netを使ったやつ
javascript:location.href="http://web-sniffer.net/?type=HEAD&url="+encodeURIComponent(location.href)
XMLHttpRequestを使ったやつ
javascript:(function(r){r.open('head',location.href,false);r.send(null);alert(r.getAllResponseHeaders())})(new XMLHttpRequest())

XMLHttpRequestのはalertで出るのでちょっと見たいときに。Live HTTP HeadersみたいなのがOperaにもあればいいんだけど。

XMLHttpRequestのgetResponseHeaderとかよくわからん

上のbookmarkletみたいにXMLHttpRequestでgetResponseHeaderとかgetAllResponseHeadersをOperaで使うとHTML以外の画像とかテキストのファイルでContent-Type取れない...ってずっと思ってたんだけど、この前Googleのイメージ検索のキャッシュ画像に上のXMLHttpRequestのbookmarklet使ったらContent-Typeちゃんと出た。単にサーバから送信されてるかどうかだった。IEとかFirefoxはContent-Typeなかったら拡張子見てContent-Type表示してるみたい...と思ったんだけどIEだと拡張子.jpgの画像でtext/htmlとか出た。そもそも各ブラウザでもらってくるHTTPヘッダが違う。変なの。あとで調べるかも*1

*1:って言って調べたためしはあまりない

[userjs][opera]GM_xmlhttpRequestをOperaで使いたいな.js(不完全)
Sun, Jul 2, 2006 3:00 AM

このままだとずっと放置しそうなので(さっきまで忘れてた)置いておくことにします。ひどい不具合が2つもあるので普通に使うのはおすすめしません。誰か直してください。一応@includeでlocalhostのみで動くようにしてあるのでほかでも動かしたかったら適切に実行許可するサイトを加えてね。

やばい「不完全(不具合多いから)」と「まあこれ入れただけで動くようなGM_xmlhttpRequest使ったGreasemonkeyスクリプトは俺が確認した中では1つもないんだけど」って書くの忘れてた。

処理

  1. object要素生成してGM_xmlhttpRequestの引数のurlのルートのページ開く
  2. object要素で開いたページにGM_xmlhttpRequestの引数を文字列化してpostMessageで送りつける
  3. (ここから元のページからobject要素で開いたページに処理移る)
  4. 送りつけられた引数をevalで連想配列に戻す
  5. XMLHttpRequestを実行
  6. evalで戻したGM_xmlhttpRequestの引数を元にいろいろする

不具合

  • "message"イベント(CrossDocumentMessageEvent)リスナと、でっち上げたGM_xmlhttpRequestがグローバルなのでこれを利用すると制作者側でもドメイン外のページを読み込めるようになる
    • GM_xmlhttpRequestはそれを使うUserJS内に一緒に匿名関数に入れれば隠せるけどmessageイベントリスナは隠せない
    • 信頼できるサイトのみ@includeで実行許可すべき
  • 全てのページでGM_xmlhttpRequestを自動的に読み込むようなスクリプトだとobject要素で読み込んだページでさらにobject要素を追加してページを読み込んでさらにさらに、って感じになるので読み込みが終わらなくなる
  • GM_xmlhttpRequestのonload, onerror, onreadystatechangeに指定した関数の中に匿名関数内のユーザ定義関数が含まれていると(参照できないから)エラーになる
    • ユーザ定義関数を匿名関数の外に置けばいいけど製作者側の関数と名前がかぶるとおかしなことになると思う

コードの3分の1は擬似toSource用(http://knight.s41.xrea.com/weblog/article.php/98らへんを参考にした。OperaでtoSource使えるのいつかな)でもう3分の1はGreasemonkey0.6.4のxmlhttprequester.jsからほとんどそのまま持ってきたコード。ライセンスは多分大丈夫と...おもいます... (licence.txtを機械翻訳に通したら「勝手に使ったり売ったりしてもいいけどそうしたことに対して俺ら著作権者に損害賠償とかの責任はないよ。個々のGreasemonkeyスクリプトのライセンスのことはそれをつくった人に聞いてよ」みたいなことが書いてあるような気がしたよ)

コード

本体
// ==UserScript==
// @name GwO
// @include http://localhost/*
// /==UserScript==

function GM_xmlhttpRequest(details){
  function objtoSource(obj){
    var str = '';
    var prop;
    var isArr = (obj instanceof Array);
    var mdblquote = /\"/g;
    var mnewline = /\n/g;

    for (var i in obj){
      if (obj.hasOwnProperty(i)) {
        prop = obj[i];

        if (!isArr) str += '\'' + i + '\':';

        switch (typeof prop) {
          case 'undefined':
          case 'boolean':
          case 'number':
            str += prop;
            break;
          case 'string':
            str += '\'' + prop.replace(mdblquote, '\\"').replace(mnewline, '\\n') + '\'';
            break;
          case 'function':
            str += ('(' + prop + ')').replace(mnewline, '');
            break;
          case 'object':
            if (prop == null) str += 'null';
            else if (prop instanceof Boolean) str += '(new Boolean(' + prop + '))';
            else if (prop instanceof Number) str += '(new Number(' + prop + '))';
            else if (prop instanceof String) str += '(new String(\'' + prop.replace(mdblquote, '\\"').replace(mnewline, '\\n') + '\'))';
            else if (prop instanceof Array) str += objtoSource(prop);
            else if (prop instanceof Date) str += '(new Date(' + prop.getTime() + '))';
            else if (prop instanceof RegExp) str += prop;
            else str += objtoSource(prop);
            break;
        }
        str += ', ';
      }
    }
    str = str.substring(0, str.length - 2);
    return (isArr ? '[' + str + ']' : '({' + str + '})');
  }

  var url = details.url;
  if (typeof url != "string") throw new Error("Invalid url: url must be of type string");

  var scheme = url.match(/^([^:]+):/)[1];

  switch (scheme) {
    case 'http':
    case 'https':
    case 'ftp':
      var ndObj = document.getElementById('ujsGMxmlhttpRrequest');
      var domainurl = url.match(/^[a-zA-Z]+:\/\/[^\/]+\//);

      if (ndObj == undefined) {
        ndObj = document.createElement('object');
        document.body.appendChild(ndObj);
        ndObj.id = 'ujsGMxmlhttpRrequest';
        ndObj.style.width = '0';
        ndObj.style.height = '0';
        ndObj.data = domainurl;
        ndObj.addEventListener('load', function(){
          ndObj.contentDocument.postMessage(objtoSource(details));
        }, false);
      } else {
        if (ndObj.data != domainurl) ndObj.data = domainurl;
        else if (ndObj.contentDocument) ndObj.contentDocument.postMessage(objtoSource(details));
      }
      break;
    default:
      throw new Error("Invalid url: " + url);
  }
}

document.addEventListener('message', function(e){
  function setRequestEvent(req, event, details){
    if (details[event]) {
      req[event] = function() {
        var responseState = {
          responseText : req.responseText,
          readyState : req.readyState,
          responseHeaders : (req.readyState == 4 ? req.getAllResponseHeaders() : ''),
          status : (req.readyState == 4 ? req.status : 0),
          statusText : (req.readyState == 4 ? req.statusText : '')
        };
        details[event](responseState);
      }
    }
  }

  var details = eval(e.data);
  if (typeof details != 'object') return;

  var req = new XMLHttpRequest();

  setRequestEvent(req, 'onload', details);
  setRequestEvent(req, 'onerror', details);
  setRequestEvent(req, 'onreadystatechange', details);

  req.open(details.method, details.url);
  if (details.headers) {
    for (var prop in details.headers) {
      req.setRequestHeader(prop, details.headers[prop]);
    }
  }
  req.send(details.data);
}, false);
テスト用
// ==UserScript==
// @name GwO test
// @include http://localhost/*
// /==UserScript==

(function(){
  var url = ''; //実行許可したサイトの何か適当なURL
  var btn = document.createElement('button');
  document.body.appendChild(btn);
  btn.textContent = 'test';
  btn.addEventListener('click', function(e){
    this.textContent = 'loading';
    GM_xmlhttpRequest({
      method: 'GET',
      url: url,
      onload: function(responseDetails) {
        alert(responseDetails.responseText)
      }
    });
    this.textContent = 'done';
  }, false);
})();

[音楽]そういえば宇多田ヒカルのアルバムにバックホーンの山田将司が
Fri, Jun 23, 2006 3:00 AM

そういえば宇多田ヒカルのアルバムにバックホーンの山田将司が客演しているらしい。聴きたいけど聴きたくない気もする。ちょっと前のJAPAN COUNTDOWNで宇多田さんが(山田に対して)こんな事歌わせてる私、凄〜い!*みたいなことを言っていたのを聞いて何か「宇多田め!」と思った。宇多田め!

そういえばバックホーンが最近出したアルバムまだ聴いてないなあ。最近俺の耳はもうずっと日本語ラップよりです。最近やっとSOUL SCREAMのTHE "DEEP"とSHAKKAZOMBIEのHERO THE S.Z.聴けた。俺の耳ははーこーはーこーしてるのとぽっぷぽっぷしてるのの間くらいのが好きみたい。それと古い目の音が好き。あとヒップホップははーこーはーこーしてるやんちゃそうな人たちが競ってるのが韻とか言葉遊びっていうギャップもすてきだよね。

[opera]HTMLで-o-link
Wed, Jun 21, 2006 3:00 AM

そういえばいつのまにかHTMLでも-o-linkが使えるようになってた。

q[cite], blockquote[cite] {
  -o-link : attr(cite);
  -o-link-source : current;
}

UserCSSでこんな感じにすれば普通にアンカーみたいに選択できる。前は確かコンテキストメニューがLink Popup Menuになるだけだったけど。

[opera]しょんぼりしょんぼり
Wed, Jun 21, 2006 3:00 AM

Opera9正式版出たね。まだいろいろ不具合あるみたいだけど。

それとはあんまり関係なく、最近俺は、最小フォント設定を14にしてたせいでAcid2 Testの崩れたのしか見れてなくてしょんぼりしてたり(デフォルトの9にしたらちゃんと見れた)、menu.iniのセクション削るとその削られたセクションの分はデフォルト設定で補完してくれることに最近になって気づいて「今までの苦労は何だったんだろう...」ってしょんぼりしたり、パネルを浮動表示にして前面表示とかできるかなー確かずっと前そんなようなのあった気がするなーと思ってそれっぽいアクション(Hotlist always on top)探し出して使ってみたけど動かなくてしょんぼりしたり、サイト別設定で「Author Display Mode|AuthorCSS」(作成者モードの作成者CSSのチェック)をオフにするんじゃなくて、作成者モード自体をオフにしたくてopera6.iniの説明見てoverride.iniにUser Prefs|Author Display Mode=0って書いてみたけど動かなくてってしょんぼりしたり、しょんぼりしっぱなしだった。むー

[_]
Mon, Jun 19, 2006 3:00 AM

終わったことをどうこう言ってもその瞬間に戻って修正できるわけでもないもんな。明日からのことを考えよう。な。

ああ、それにしても腹が立つ。

[Opera]build 8473×DOM 2 CSS, Style
Sat, Jun 10, 2006 3:00 AM

Added support for DOM level 2 Style Sheets and associated parts of DOM level 2 CSS. (Yay!!)

Friday once more! - Desktop Team - by Desktop Team

Yay!!うあー軽く小躍りしそうにな嘘。でもうれしい。これでDOM2までは一応全部サポートしたことになるのかー、な?ちょっと前にdocument.implementation.hasFeatureのテストをつくってみたんだけど*1、それをbuild 8473で見ると2.0まで全部true, 3.0はLS, LS-Async, XPathだけtrueが返るよ。やったね。

このおかげで趣味のWebデザインのスタイルがOperaでも適用されるようになっててすてき、と思ったけどプレーンな状態に慣れちゃったからすごく違和感があるなあ。何か最近HTMLの構造が結構しっかりしているところはスタイル切った方が見やすい気がしてきた。

サイト毎にユーザモードに出来るようにならないかな。document.styleSheets回して全部disabledにする簡単なUserJSでもつくってスタイル切りたいサイトだけ@includeで追加していけばいいんだけど。んーここもスタイル切ろうかな。

override.iniのことを忘れてた。スタイル切りたいサイトのドメイン追加してAuthor Display Mode|Author CSS=0ってすればいいんだ。

徳保さんが試作版の Opera9 では document.styleSheets に対応し、JavaScript でスタイルシートを追加などできるようになったとのこと。まだまだ不安定、暫定的な対応にとどまっており、Opera9.0 正式版への搭載は見送られました次期 Opera に期待したい、と書いているんだけど、Opera9.0正式版でDOM 2 StyleやDOM 2 CSSはサポートされていますよ(Added support for DOM level 2 Style Sheets and associated parts of DOM level 2 CSSOpera 9.0 for Windows Changelog。詳細なサポート状況はhttp://www.opera.com/docs/specs/opera9/js/dom/css/から)。

jp.opera.comのDOM 2 Style/CSSのサポート状況を記したページ見たらタイトルは9なのに表が何故かopera8のだった。これのせいだろうか。

*1:めんどいし重いの嫌だからinnerHTMLにコードつっこんだった!でもtable要素にinnerHTMLつっこんだらOperaだとタグが除去されたよ。変だね

[はてな][userjs][__]はてなブックマークを一行掲示板に仕立てるUserJS(Greasemonkeyスクリプト)
Thu, Jun 1, 2006 3:00 AM

対象

  • Opera 9.0(b1, b2 -) (DOM XPathとかを使っているので8.5*では動きません)
  • Firefox 1.5.0.3

はてなブックマークのエントリページの構造が変わったら動かなくなる可能性大。

このスクリプトが行うこと

  • エントリページのRSSから、ユーザがブックマークした時間(hh:mm:ss)をエントリページのYYYY年MM月DD日の横に追加する。configのaddtimeをtrueにすると有効、falseにすると無効
  • エントリページのコメントを昇順から降順に変える。configのreverseをtrueにすると有効、falseにすると無効
  • エントリページの見た目をいろいろいじる(コメントに番号をつけたり)。configのstyleのtypeを0にするとふつう、1にすると一行掲示板っぽく、2にすると、俺の脳内はてブを再現します!うそです!

f:id:quaa:20060601224309p:image(reverse:true, addtime:true, style.type:1のとき)

f:id:quaa:20060601224336p:image(reverse:true, addtime:true, style.type:2のとき。ひとおおすぎでconfig全部trueだとかなり重いよ)

configのautoloadをtrueにすると自動で実行。falseの場合は「このエントリーをブックマークしているユーザー」らへんにボタンができるので、その場合はボタンを選択して実行。

履歴

2006-06-03
本当に掲示板っぽくなるように、コメントのないものを隠せるようにした(config.hideiwcで切り替え。名前が変だなあ)
style.type:2の微調整(カテゴリ名を取得するXPath式が甘かったのを直したり)

[_]危ないスクリプトを公開するべきか
Wed, May 31, 2006 3:00 AM

GreasemonkeyのGM_xmlhttpRequestをOperaでも使えるようにするスクリプトをつくったにはつくったんだけど、不具合が多すぎる。

  • "message"イベント(CrossDocumentMessageEvent)リスナと、でっち上げたGM_xmlhttpRequestがグローバルなのでこれを利用すると制作者側でもドメイン外のページを読み込めるようになる。例えばはてなのトップページからID名取得したりできる
  • 全てのページでGM_xmlhttpRequestを自動的に読み込むようなスクリプトだとobject要素で読み込んだページでさらにobject要素を追加してページを読み込んでさらにさらに、って感じで無限ループするので読み込みが終わらなくなる
  • GM_xmlhttpRequestのonload, onerror, onreadystatechangeに指定した関数の中に匿名関数内のユーザ定義関数が含まれていると(参照できないから)エラーになる

最初に気づけたことばっかりだよなあ。

これを公開するのはさすがにどうかと思うんだけど、公開すればもしかしたら誰かちゃんとしたものに直してくれるかもしれないし...むー。もうちょっとなんとかできないか考えよう。

[opera][userjs]OperaのUserJSでセキュリティ制約を超えてXMLを取得する
Fri, May 26, 2006 3:00 AM

HTML5を調べようと思っていろいろサイトを見ていたら、http://virtuelvis.com/archives/2005/12/cross-document-messaging(サンプル)に行き当たった。あれ、欲しいXMLファイルがあるサイトに対してaddEventListener('message'〜でXMLファイルをLSSerializerとかXMLSerializerでシリアライズして返すようなUserJSを書いて、シリアライズしたものをほかで取得するようにすればセキュリティ制約を超えてファイルを得られるかも?...と思いついたのでやってみたらできた。HTML5ばんざい!

まず最初に下記の2つのUserJSをそれぞれtest1.user.js, test2.user.jsとか名前をつけてUserJSが有効になるフォルダに置く*1。1つ目のUserJSは取得したいファイルのURLをそのURLのトップページに送信するもの。このUserJSでははてなブックマークの注目エントリのRSSを取得しようとする。

// ==UserScript==
// @exclude  http://b.hatena.ne.jp/*
// /==UserScript==

(function(){
  function getXDXML(URL){
    var obj = document.createElement('object');
    document.body.appendChild(obj);
    obj.style.width = '1px';
    obj.style.height = '1px';
    obj.data = URL.match(/^http:\/\/[^\/]+\//);

    obj.addEventListener('load', function(){
      obj.contentDocument.postMessage(URL);
    }, false);
  }
  document.addEventListener('message',function(e){
    var lsparser = document.implementation.createLSParser(
      DOMImplementationLS.MODE_SYNCHRONOUS,
      "http://www.w3.org/TR/REC-xml"
    );
    var lsinput = document.implementation.createLSInput();
    lsinput.stringData = e.data;
    alert(lsparser.parse(lsinput));
    alert(e.data);
  },false); 

  var btn = document.createElement('button');
  document.body.appendChild(btn);
  btn.textContent = 'test';
  btn.addEventListener('click', function(){
    var URL = 'http://b.hatena.ne.jp/entrylist?mode=rss&sort=hot&threshold=3';
    getXDXML(URL);
  }, false);
})()

2つ目のUserJSはpostMessageで送信されたURLからファイルをパース、シリアライズして送信元に返すもの。

// ==UserScript==
// @include  http://b.hatena.ne.jp/*
// /==UserScript==

(function(){
  addEventListener('message',function(e){
    var lsparser = document.implementation.createLSParser(
      DOMImplementationLS.MODE_SYNCHRONOUS,
      "http://www.w3.org/TR/REC-xml"
    );
    var xmldoc = lsparser.parseURI(e.data);
    var lsser = document.implementation.createLSSerializer();
    e.source.postMessage(lsser.writeToString(xmldoc));
  },false); 
})();

次に適当なサイトを開く。サイトを開くと一番下に「test」って書いてあるボタンが出来るのでそれをクリックする。クリックして少し経つとalertで[object Document](XMLの内容の文字列ををパースしたもの。DOMでいろいろできる)、その次にXMLファイルのデータが表示される(はず)。Opera9.0b1でしか確認してないのでほかのOperaはわからない。気が向いたらあとで調べるかも。

これをちょっと改造してGM_XMLHttpRequestをでっち上げれば(2つ目のUserJSでファイル取得するのをLSParserじゃなくてXMLHttpRequestにやらせて、readyStateとかのデータをつめた配列を文字列にしたものを送信・受信してevalで戻すとか)いろんな便利GreasemonkeyがOperaでも使えるかも!と思うんだけど、messageイベントの競合避けるためとはいえUserJS2つも必要なのがなんかなあ。あとかなり危ない気もする。もしこれでGM_XMLHttpRequestをでっち上げるなら許可するサイトをちゃんと@includeで管理するようにしないと。

*1:そういえばにOperaでGreasemonkeyみたいにloadイベントなしで匿名関数で実行させるのが上手くいかないーとか言ったけど、拡張子をuser.jsにする必要があった

[firefox]Greasemonkey+XUL
Fri, May 26, 2006 3:00 AM

Greasemonkey+XULの組み合わせいいなあ。思いつかなかった。XULちょっとうらやましい。

  1. GreasemonkeyでXULを使ったスクリプトがたくさん出来る
  2. Greasemonkeyとの互換性を気にするOperaがXULサポートする
  3. WHATWGとかで標準仕様に
  4. わふー

とか、な、いか。HTML5でいい、か、な?canvasくらいしか知らない。うー英語勉強しよう...

[_][javascript]DOM Load and Saveが楽しそう
Mon, May 22, 2006 3:00 AM

Ajaxイン・アクション欲しい!そういえばAjaxといえばXMLHttpRequestだけど、DOM3にはそれに似たDOM Load and Saveっていうのがあるんだって。Operaだと結構前から(7.6から?)サポートしていたらしい。全然知らなかったー。文字列からパースしたりできるみたい。よくわかんないけど楽しそう。

Firefoxはdocument.load(ファイル名)でXML文書が読み込めるみたい。

でもdocument.load() は W3C の DOM Level 3 Load & Save モジュールの一部です*って書いてあるのに仕様探してみてもそれらしいメソッドが見当たらない。英語版 2003/10/29ってあったからもしかして、と思って仕様の版さかのぼってみたらDocumentLSのloadっていうのが20030619の版にあった。先行実装しすぎ!あとFirefox(Mozilla系)には独自の実装がある

Added support for document.load.

Opera 9.0 Beta 2 for Windows Changelog

なにいっ。OperaにはDOMParserもあるしXMLSerializerもあるし、Mozilla系の使った方がくろすぶらうざ...

[javascript][opera]ElementCSSInlineStyle.styleを上書きできるOpera
Fri, May 19, 2006 3:00 AM

ちょっと前に気づいて追記しようと思っていたのに忘れていたことをbrazilさんからトラックバックもらって(withステートメントは非推奨じゃないみたい。そうかー。brazilさんありがとうございます)思い出したので、今ここに書いてd:id:quaa:20060415#p1からリンクさせることで追記、と言う形にしよう。DOM(2) CSSのElementCSSInlineStyleのstyleはreadonlyだけど、Operaだとそのままスタイルの文字列つっこんでも動く。

// Introduced in DOM Level 2:
interface ElementCSSInlineStyle {
  readonly attribute CSSStyleDeclaration  style;
};
Document Object Model CSS
document.body.style = 'color:red';
IE6
エラー。「メンバが見つかりません」
Firefox1.5.0.3
エラー。「setting a property that has only a getter」
Opera8.54とか9.0b1とか
普通に動作する

さっきbuild 8418インストールして試してみたけど動いたよ。

[_]宇宙で遊びたい
Thu, May 18, 2006 3:00 AM

先週のNHK教育で天体シュミレーションソフトを使って宇宙について学ぶっていう結構面白い番組*1がやっていて、その番組の最後にそのソフト(Mitaka)を国立天文台のサイトでダウンロードできるって言っていたので遊ぼうと思ってダウンロードしてみたんだけど、俺のパソコンではiniファイルいじっても満足に宇宙探検出来なかったので泣いた。Stellariumっていうオープンソースのプラネタリウムのソフトも遊べなかったしなあ。

MitakaはPSのコントローラで動かせる(番組でもPSのコントローラで動かしていた)みたいなのでいっそのことPS3に移植かなんかしたらいいと思った。そうしたら俺もPS3か、か、買わない。高いよ。あと調べたらPS3のメモリ512MB以上なかった。

*1:高校講座の地学

[_]「「「「騙されるな!」騙されるな!」騙されるな!」...」
Thu, May 4, 2006 3:00 AM

< 何か最近『騙されるな!「(自分の書いたエントリ)」はインチキ記事だ!』って書いてあるエントリを短期間に複数見たんだけど、自分の書いた刺激的なエントリに『騙されるな!「(自分の書いたエントリ)」はインチキ記事だ!』を書くのは文責を弱めることと引き換えにその主張に本気で同意した人をばっさり斬るようなもんだな、とぼんやり思った。狼少年的というか。そういう遊びもはまると面白かったりするけど、あんまりひどい使い方すると信用失くすので気をつけたほうがいいよ。

[_]
Thu, May 4, 2006 3:00 AM

あーもうここがめもでもいいか。わけようとしなくても。めもここー。

でもまとめちゃうと検索したりするときにうっとうしいんだよなあ。俺が。むしろ細分化したほうがいいように思う。

[javascript]DOM XPathの(UN)ORDERED_NODE_ITERATOR_TYPEを回してる最中にドキュメントに修正を加えるのはだめらしい
Sun, Apr 30, 2006 3:00 AM

ちょっと前にDOM XPathでイテレータを回していろいろテキストを追加したりするuserjsをいつものようにつくってたんだけど、それをそのときはじめてFirefoxで確認してみたらループの1回目しかちゃんと動いてなくて、エラーコンソールにAn attempt was made to use an object that is not, or is no longer, usableとかNS_ERROR_DOM_INVALID_STATE_ERRって出ていた。

仕様がんばって読んだら(UN)ORDERED_NODE_ITERATOR_TYPEはドキュメントが修正されると反復を無効にするとかそんな感じのことが書いてあった。ドキュメントが修正されるとiterateNextメソッドはINVALID_STATE_ERR(利用不可能又はもはや利用可能ではないオブジェクトを使用しようとしている*)を投げるしinvalidIteratorStateアトリビュートは真を返すんだって(http://www.w3.org/TR/2004/NOTE-DOM-Level-3-XPath-20040226/xpath.html#XPathResultらへん)。なー。またいろいろ書き直さないと。

OperaはいつくらいにINVALID_STATE_ERR投げるように直してくるのかな。でもまだDOM3 XPath勧告になってないしなあ。

[近況]普通免許がとれたよ
Fri, Apr 28, 2006 3:00 AM

2ヶ月かかった。学科試験の日はこんな感じだった。

  1. 9時50分に自動車学校に集合と言われていたのに自動車学校に到着できるかなりぎりぎりの時間に起きる。原付飛ばしてなんとか間に合わせると、3階の教室に行ってくださいと言われたので従う
  2. 時間があるのでテストやりますと言われる。えー
  3. 10時ちょうどくらい。テスト開始
    1. なんか他の子が遅れてやってきた。えー
    2. テストの結果が85点でひとしきり焦る
    3. すぐ行って試験してすぐ帰るんだろうと思ってて教科書持ってきてなかったので、見直しするのに貸してもらうように言ったら淀川長治みたいな顔の教官に「何で教科書持ってきてないんだ」って嘲笑される。むきー
  4. まだ時間があるからちょっと問題が少ないテストをやる、と違う教官に言われる。えー
    • 前にやったことがある問題だったので1問間違えただけですむ(卒業検定(実技)受かった後に93点取らないといけない模擬テストをパスできなくて合計3回やったせい)
  5. 11時40分くらい。自動車学校から出るバスに乗って試験場まで1時間くらいかけて行く
  6. 13時ちょうど。適性試験を受ける。書類提出したりして試験受ける教室まで行く
  7. 13時40分くらい。試験開始
  8. 14時30分くらい。試験終了
  9. 結果待ちのため10分くらい休憩してから結果発表。顔をふせるよう言われる
    1. 抽出試験(自動車学校ごとにランダムで何人か実技やらされる)の人が番号で呼ばれる
    2. 2人くらい番号で呼ばれる。多分不合格。残った人は全員合格
  10. 写真撮影とかして免許が出来るまで休憩。待ち時間が長すぎるので心理実験かなんかか、と思い始める。何故か全員無言で待つ
  11. 15時40分くらい。原付の免許を返して免許を貰う。いつも思うんだけど写真の顔の角度がおかしい。右に5度くらいかたむいてる
  12. 帰りのバス待つ。やっぱり長い
  13. 17時10分くらい。帰宅
  14. 17時30分くらい。妹が帰ってきたので「試験落ちた」って真顔で言う

いろんな人に「試験落ちた」って言おうかと思ったよ!

[opera]Opera 9.0 Beta 1 < jp.opera.com
Fri, Apr 21, 2006 3:00 AM

Opera 9.0 Beta 1が出たのでやっと入れたよ。昨日ちょこっと環境整備してたんだけどやっぱりこれだけはいつまでたってもめんどいなー。Weekly Build毎回インストールして使ってる人はすごい。

とりあえず気になったのはページ内検索(/)の重さ。ちょっとサイズが大きいページでページ内検索すると一文字入力するごとに砂時計がぴこぴこ出る。うちだけかな。あと将来的にSite PreferencesのユーザCSS(My style sheet)をファイル指定じゃなくてFirefoxのStylish(拡張)みたいにその場で編集できるようになったらもっといいんじゃないかと思った。

今回のベータはWeekly Buildの最新の版から1つ前のものらしい。Weekly Buildの結局1回か2回くらいしかインストールしてなかったな。でも情報とかは結構いろいろ見てたからBetaが出たことよりもむしろ久しぶりに行ったjp.opera.comで和訳がものすごい進んでたことの方にびっくりした。userjsのドキュメントも和訳されてた。わーい。window.operaのメソッドつかってみんなでいろんなところをOperaで普通に使えるようにしようぜー

[web][opera]はてなブックマークで#の入ったURIを渡すと#以降が切り捨てられる?という話
Mon, Apr 17, 2006 3:00 AM

これははてながどうこうするものじゃないんじゃないかと思った。

URIの構文について書かれているRFC3986(の邦訳)見ると#はフラグメント識別子(フラグメント(id属性やname属性で名前をつけられた箇所)を指定するためのもの)の区切り子なので、それ以降はフラグメント識別子として識別されてクエリには含まれないらしい。

f:id:quaa:20060417173921p:image*1

『Uniform Resource Identifier (URI): 一般的構文 - 3. 構文の構成要素』

なのでパーセントエンコーディング*2しないかぎり#が出てきた時点でクエリの部分は終了となり、後はすべてフラグメント識別子とされる。そしてクエリを送信した後フラグメント識別子と一致するフラグメントを探しに行く。大体の場合は一致しないので切り捨てられたように見える、そういうことじゃないかな。

試しにdel.icio.usとMM/MemoとJoltMarkでもJavaScript使わずに%u使ったブックマーク追加ボタンつくってやってみたけど全部#以降はクエリとして渡されなかった。URIをクエリとして渡すにはOperaの%uとかはあんまりいい方法じゃないのかも。

*1:フォントによっては崩れるので画像にした。テキストで見たい場合は引用元を参照

*2:RFC3986見てはじめて知った。URL(URI)エンコードはどこから出てきた言葉なんだろう

[javascript]javascriptでCSSのスタイル指定するための方法をいろいろと考える
Sat, Apr 15, 2006 3:00 AM

いろいろとよくわかってないので考えよう。

CSSStyleDeclaration.CSS2Properties = valueで指定する

document.body.style.color = 'red';
with(document.body.style){
  color = 'red';
}

DOM2 Style/CSS。with使うといろいろ指定したいときに楽だけどwithは非推奨らしい(d:id:gorokumi:20060405:1144385102、あとhttp://www.dodgson.org/omo/t/?date=20060402#c02)。最近知った。

それと邦訳見てて気になったんだけど、CSS2Propertiesインタフェースの属性の取得は,CSSStyleDeclarationインタフェースのgetPropertyValueメソッドの呼出しと等価とする『Document Object Model CSS - インタフェース CSS2Properties』(www.y-adagio.com)らしい。じゃあ何でIEでもFirefoxでもOperaでも取れるようになってないんだろう?検索して辿り着いたところにはHTML要素に対応するオブジェクトの style プロパティは inline style ( タグの style属性として記述したスタイル )の内容を表すので、 スタイルシート( styleタグ要素 )に記述した内容は設定されません『MozTips - 適用されているスタイルを取り出す』(はぎさんちのページ)ってあったけどそれってどこに書いてあるのかな。DOM2 HTMLだとNote: The style attribute of an HTML element is accessible through the ElementCSSInlineStyle interface which is defined in the CSS module [DOM Level 2 Style Sheets and CSS].『Document Object Model HTML』(The World Wide Web Consortium)(注:HTML要素のスタイル属性は、CSSモジュール[DOM Level 2 Style Sheets and CSS]に定義されるElementCSSInlineStyleインターフェースを通ってアクセス可能です*1 )らしい。DOM1 HTML(邦訳)だと注意. このインターフェイスの style 属性は将来的な利用のために予約される。『 DOM1(HTML) 』(どら猫本舗)ってあった。全然わからない。誰か!

すこしわかってきたんだけど、かなり誤解があったみたいだ。まずHTMLElement.style(この認識も間違いだった)では値の取得自体出来ないと思ってて、仕様見ててHTMLElement.styleでその要素のスタイル情報が取れるはずじゃないのかなーと思ってたんだけど、ElementCSSInlineStyleの項に要素に添付された行内スタイル情報は,style属性を通じて開示される。これは,HTML要素(又は同じ方法でSTYLE属性を使用する他のスキーマ若しくはDTDにおける要素)に対するSTYLE属性の内容を表現する。ElementCSSInlineStyleインタフェースのインスタンスは,Elementインタフェースが表現する要素が行内CSSスタイル情報をサポートする場合,そのElementインタフェースのインスタンス上の束縛固有なキャスト化メソッドを使用して得ることができる,と期待されるってあるようにstyle属性のある要素(ってことでいいのかな)はElementCSSInlineStyleでもあり得るので、そのメソッドのstyleではstyle属性で指定されたものだけを取得できるみたい。

あとgetComputedStyleはCSS2Properties使えないと思いこんでたけどこれも間違っていた。次に書くように普通に取れる。

var bodycolor = document.defaultView.getComputedStyle(document.body, null).color;

確かにブラウザ(Firefox, Opera)の実装でもCSS2Propertiesインタフェースの属性の取得は,CSSStyleDeclarationインタフェースのgetPropertyValueメソッドの呼出しと等価で、CSS2Propertiesインタフェースの属性の設定は,CSSStyleDeclarationインタフェースのsetPropertyメソッドの呼出しと等価らしい。

Element.setAttribute('style', value)で指定する

document.body.setAttribute('style', 'color:red;');

ひとつの要素にがっつり指定するなら良い。ルール追加とか一部削除とかめんどそう。

CSSStyleDeclaration.setProperty(propertyName, value, priority)で指定する

document.body.style.setProperty('color', 'red', null);

DOM2 Style/CSS。IE6だめ。CSS2Propertiesあるからpriority必要な時以外は使わないと思う。

CSSStyleSheet.insertRule(rule, index)で指定する

var n = 0;
document.styleSheets[n].insertRule('body{color:red;}', document.styleSheets[n].cssRules.length);

DOM2 Style/CSS。IE6だめ、Opera8.54, 9.0tp2だめ。

styleSheet.addRule(sSelector, sStyle [, iIndex])で指定する

var n = 0;
document.styleSheets[n].addRule('body', 'color:red');

IEだけ。

style要素を追加してinnerHTML/textContentで指定する

var style = document.createElement('style');
style.setAttribute('type', 'text/css');
style.innerHTML = 'body{color:red;}';
document.getElementsByTagName('head')[0].appendChild(style);

IE6で未知の実行時エラーです、って言われる。style.appendChild(document.createTextNode('body{color:red;}'))してもエラー(予期しないメソッドの呼び出し〜)。style.appendChild(document.createComment('body{color:red;}'))としてみてもエラー、Firefox1.5.0.2でもOpera8.54, 9.0tp2でも指定が効かない。

link要素を追加してrel="stylesheet", type="text/css", href属性の属性値をCSSファイルにする

var cssfile = './style.css'; //body{color:red}
var link = document.createElement('link');
link.setAttribute('rel','stylesheet');
link.setAttribute('type','text/css');
link.setAttribute('href', cssfile);
document.getElementsByTagName('head')[0].appendChild(link);

クラス選択子にあらかじめスタイル指定しておいて、class属性つけかえることでスタイル変えるとかするっていうのもいいかな。ウィンドウの幅を計算してどうこう、とかはこれだけじゃ無理。

link要素を追加してrel="stylesheet", type="text/css", href属性の属性値をdataスキームのURIにして指定する

var sheet = 'body{color:red}'
var link = document.createElement('link');
link.setAttribute('rel','stylesheet');
link.setAttribute('type','text/css');
link.setAttribute('href', 'data:text/css,' + encodeURIComponent(sheet));
document.getElementsByTagName('head')[0].appendChild(link);

dataスキーム使えないとだめ(IEはだめ)。ルールの追加とかやろうと思うとめんどい。

ぐるぐるぐる。Operaでuserjsつくって遊ぶだけならdataスキームの(かstyle要素追加するの)とCSS2Propertiesを併用すれば大体いいかなあ。ところで(IEは無視するとして)OperaはいつになったらDOM2 Style/CSSちゃんと実装するんだろう。NOばっかりで悲しくなる

参考にしたところ
『文書オブジェクトモデル(DOM)水準2 スタイル規定(www.y-adagio.com)』(DOM2 Style邦訳)
『JavaScript for CSS』(www2.portland.ne.jp/~sigekazu/)
『JavaScriptでCSSを弄る際のメモ』(暴満館, 2006-03-14)
『MozTips』(はぎさんちのページ)
『JavaScriptでテキストファイルを生成してダウンロードさせる』(outsider reflex, 2005-10-06)(data: URIの応用)

*1:翻訳かけた

[opera][javascript]javascriptのloadイベント
Fri, Apr 7, 2006 3:00 AM

いつもOperaでuserjsつくるときにやってるようにFirefoxでdocument.addEventListener('load',listener,useCapture)ってやったらうんともすんともいわないので変だなと思ってたんだけど、documentにloadイベント追加して動くのOperaだけだった。

window.onload = listener;document.onload = listener;window.addEventListener('load', listener, useCapture);document.addEventListener('load', listener, useCapture);
IE動く動かない--
Firefox動く動かない動く動かない
Opera動く動く動く動く

ちょっとびっくりした。あとOpera(使ってるバージョンいまだにtp2だけど)でgreasemonkeyのスクリプトみたいにaddEventListener書かないでロード時に実行させるようにするとHTMLElementが取れない。でも取れるときもある。なんだろう。ページの大きさが関係してる気がするけどよくわからない。Weekly Build入れてみようか。

[_]今の社会は高速道路に似ている
Mon, Apr 3, 2006 3:00 AM

question:1142754222じゃないけど今の社会*1は高速道路に似ていると最近ふと思った。

高速道路では普通の車はスムーズに走っていけるけど欠陥の多い車はいつ事故するか気が気じゃない。そしてその不安に気を取られて、または実際にその欠陥によって事故する(普通の車も判断を誤ると事故する)。事故した車がまた高速道路に復帰するにはそれを修理するための金が必要で、その破損の具合によっては金を多く費やさなければいけないが、破損を修理することができるだけの金を保険なんかから捻出できない車はずっと復帰できないでいる。

bookmarkletで置き換えるならこんな感じ。

javascript:(function(){document.body.innerHTML=document.body.innerHTML.replace(/高速道路/g,'社会').replace(/車/g,'人').replace(/走って/g,'生きて').replace(/欠陥/g,'短所').replace(/事故/g,'挫折').replace(/破損/g,'ダメージ').replace(/修理/g,'克服').replace(/金/g,'気力').replace(/保険/g,'周りの援助');})()

いつ挫折するか気が気じゃないのは短所の多い人じゃなくて自分で短所が多いと思っている人か。それと「周りの援助」を得るにはあらかじめ周りの信頼とか信用を得てないとだめ。

今の社会って速度がはやい気がするのでついていくだけで苦労する。もっとゆっくりすすみたいんだけどなあ。

*1:昔の社会のことは知らんけど

[__]エイプリルフール
Sat, Apr 1, 2006 3:00 AM

みんな!俺ものすごい嘘を思いついたよ!

[userjs]greased lightboxの文字化けの対処
Thu, Mar 30, 2006 3:00 AM

うわーこんな便利でかっこいいやつがあったんだ。もっと早く知っていれば良かった(途中まで自作してた)。日本語の文字化けの件はブラウザのアドレス欄にjavascript:alert(escape('好きな文字列'));ってやって出てきたISO-Latin-1(って言うらしい)の文字コードを該当部分(1062行目くらいの日本語の部分)にunescape('ISO-Latin-1の文字コード')ってやれば大丈夫だと思う。下記のような感じで。

ja : [
	{
	  	loading			: unescape('%u8AAD%u307F%u8FBC%u307F%u4E2D'),
		loadingSub		: unescape('%u30AF%u30EA%u30C3%u30AF%u3067%u30AD%u30E3%u30F3%u30BB%u30EB%u3057%u307E%u3059'),
		context			: unescape('%u5143%u306E%u753B%u50CF%u3092%u8868%u793A'),
		error			: unescape('%u753B%u50CF%u304C%u5B58%u5728%u3057%u307E%u305B%u3093')
	}
], // end japanese

あれ、Operaのuserjsって日本語だめだったっけか。userjsで日本語使う機会がなかったから知らなかった。

id:takefさんにunescape()を使わない方法を教えてもらいました。ありがとうございます。ひとつかしこくなった。

ja : [
	{
  		loading			: '\u8AAD\u307F\u8FBC\u307F\u4E2D',
		loadingSub		: '\u30AF\u30EA\u30C3\u30AF\u3067\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3059',
		context			: '\u5143\u306E\u753B\u50CF\u3092\u8868\u793A',
		error			: '\u753B\u50CF\u304C\u5B58\u5728\u3057\u307E\u305B\u3093'
	}
], // end japanese

普通に書いたまま表示してくれればいいのになあ。テキストエディタでiso-8859-1で保存してみたけどだめだった。

[opera][userjs]関数名がかぶるとファイルの名前があとのファイルの関数に上書きされる
Mon, Mar 27, 2006 3:00 AM

以下をtest1.jsで保存

function test(){alert(1)}
document.addEventListener('load', function(){test()}, false);

以下をtest2.jsで保存

function test(){alert(2)}
document.addEventListener('load', function(){test()}, false);

こうしてからどこかのページを開くと2が2回表示される。@namespaceつけたらなんとかなるかなと思ってつけてみたけど同じだった。何でか今までuserjsならバッティングしないと勝手に思ってたんだけどユニークな名前考えるしかないのかな。

(function(){ 処理 })();でやったら大丈夫になった。というかこれただのグローバルの汚染の弊害じゃん。俺だめだめじゃん。前つくったやつ直さないと。

[_]めも
Mon, Mar 27, 2006 3:00 AM

  • [opera]http://orera.g.hatena.ne.jp/usopion/20060323
    • あとでもふもふしよう
    • [js]window.openのはうわーかんたんじゃんと思ったけどwindow.open書き換えるとbookmarkletでwindow.openつかいたいときに困るからわざわざ遠回りしたんだった。俺記憶力なさすぎる
  • [js]addEventListenerのuseCaptureがわからへん。イベントバブルってなんやねん。キャプチャってなんやねん
  • [_]ここをもっとにっきてきにつかおう
    • [_]にっきの名前変えたい
  • [__]うそ消費しすぎてエイプリルフールのうそおもいつかなくなった
  • [__]ひらがなだいすき
  • [_]あー俺がんばれ。ちょうがんばれ。自動車学校とかバイトとか学校とかがんばれ。仮病でもつかわないと4月10日から休みが1日もない

[opera][userjs]リンクつきのフォトライフの画像をuserjsでその場でポップアップさせる
Fri, Mar 24, 2006 3:00 AM

リンクつきのフォトライフの画像をuserjsでその場でポップアップさせる。画像クリックで閉じる。「link」で本来のページに飛ぶ。[http://ranger.labs.goo.ne.jp/:title=ブログレンジャー]とかXMLHttpRequestつかったサイトをつかいすぎて普通の画面遷移すらうっとうしくなってきた俺におすすめの品。 最大3回(jpg, png, gif)読み込もうとするのではてなにやさしくない(jpgだったら1回だけど)。ポップアップした画像をkeypressで消せない(それ自体 ...

[__]「箇条書きメソッド」
Thu, Mar 23, 2006 3:00 AM

箇条書きメソッド((「なんとかメソッド」ってあんまり好きじゃないんだけど今回は特別))とは 文章を(順序ありや順序なしで)箇条書きする手法 今のところ[http://hxxk.jp/:title=hxxk.jp]の真琴さんしか使っていないようだ([google:箇条書きメソッド])というとてもレアな単語 よいところ 日本語が不自由でも結構大丈夫 言いたいこと(だけ)を全部列挙できる 労力をあんまりかけなくていい 見通しがいい いわゆる長文アレルギーで、見ただけで圧倒されちゃうタイプの人(俺)に最適 ...

[音楽]RHYMESTER - HEAT ISLAND
Wed, Mar 22, 2006 3:00 AM

asin:B000E1NY44:detail 最近買ったCDの中では一番聴いている気がする。とても好き。 『けしからん』MUMMY-Dスチャダラ?とかちょっと思った 『紳士同盟』みたいなトラック前聴いたようなと思ったんだけど思い出せなくて気持ち悪い思いをした。何回か聴いてるうちに頭の中でMACKA-CHINの声がした。MONTIENの『N.A.C.』だった 『ウィークエンド・シャッフル』人多すぎる。楽しい。7分も経ってる気がしない。FG+SONOMI+童子-T。SONOMIはFGでいいのかどうなのか。 ...

[はてな]はてなわんわんワールドのおうちをどこにおこう?
Mon, Mar 20, 2006 3:00 AM

わんわんワールドのなかで[http://hatena.g.hatena.ne.jp/hatelabo/20060318/1142678166:title=おうちをおけるようになった]らしいんだけど、どこがいいかな。検索してみよう。 :[http://world.hatelabo.jp/?word=%E3%81%AF%E3%81%A6%E3%81%AA:title=はてな]:うわさの長屋! :[http://world.hatelabo.jp/?word=%E6%9D%B1%E4%BA%AC%E3%82% ...

[opera]「勝手に新しいページが開くなんてやだやだスクリプト」
Sat, Mar 18, 2006 3:00 AM

d:id:quaa:20060316#p1の続き。...続き続き言ってると何があったかわかんなくなるなあ。あらすじを書こう。 :前回までのあらすじ:id:quaaさんはjavascriptで勝手に新しいページが開かれるなんてやだやだ!と思い[http://www.opera.com/support/tutorials/userjs/]あたりとにらめっこしながらそれを無効化するuserjsを書きました(次の日寝不足になりました)。しかしそれはHTMLでonclick属性なんかを直に書いたリンクには効果が ...

[opera]javascriptを使った手法で勝手にページを開かれるのを何とかできたよ
Thu, Mar 16, 2006 3:00 AM

d:id:quaa:20060315#p3の続き。 わーいできましたー functionのところは自分の好きなtarget属性を消すスクリプトに置き換えればいいよ。上のやつはOpera9.0tp1からくらいでしか動きません(でも9.0tp2でしか確認してない)。 window.opera.addEventListener()のAfterEventListener.loadだとdocument.addEventListener()のloadより呼び出される回数がちょっと多いんだけどよくわかってないの ...

[web][opera]javascriptを使った手法で勝手にページを開かれるのを何とかしたいな
Wed, Mar 15, 2006 3:00 AM

http://car.s35.xrea.com/diary/200603.php#D15-05からいろいろ辿った。Operaのuserjsのdocument.addEventListener(’load’,...,...)ってページのjavascriptより先に実行されるみたい?なので、javascriptを使った手法で勝手にページを開かれるのは無効化できなくて困る。 ユーザスタイルでa[target=”_blank”]::after{content:url(base64エンコードした画像のURI)}とか ...

[__]ねえねえみんな、エイプリルフールでつく嘘を考えようよ
Wed, Mar 15, 2006 3:00 AM

管理人は死にました ポーションの飲みすぎによって 牛肉の食べすぎによって 熟成やずやの香醋が待ちどおしくて IEがAcid2テストをパスしました Firefoxの次のバージョンは13になります。略称は正式にFF13になります Opera9正式版から広告が復活します。大西洋を泳いで横断すると広告が外れるスイムウェアになります 4月からドラえもんの声優が全員前の声優に戻ります 「ふたりはプリキュア Splash Star」が打ち切りになり、4月から「明日のナージャ2」が始まります 「大好きで…大好きで…僕の ...

[web]そういえばMM/Memo
Wed, Mar 15, 2006 3:00 AM

d:id:quaa:20060314#p2の続き。Movable TypeをダウンロードしたときにTypekeyのアカウントを取ったので[http://1470.net/mm/:title=MM/Memo]も使えることに気づいてそれもちょっと使ってみようと思った。なんだそれ。ジャンキーか!SBMジャンキーか! Webページ、本、音楽、映画、位置情報、テレビ番組に関する簡単メモツール。いわゆるソーシャルブックマークサービス的な機能もあるって書いてるし、MM/Memoはブックマークじゃなくて一言メモ書きとして ...

[__]ひどいよ小沢さん
Tue, Mar 14, 2006 3:00 AM

小沢さんひどいよ、ひどすぎるよー卵を温めて破裂してしまったときの電子レンジの中くらいひどいよー 小沢さんひどいよ、ひどすぎるよー一日学校休んだら次の日机に花瓶が置いてあったときのクラス内の雰囲気くらいひどいよー 小沢さんひどいよ、ひどすぎるよー彦摩呂が出てくるたびに「うわぁ、疑惑の総合商社やー」とか言わんかなと密かに期待してる俺くらいひどいよー 小沢さんひどいよ、ひどすぎるよー何でもかんでも皮膚科の先生に相談しちゃうくらいひどいよー 小沢さんひどいよ、ひどすぎるよー[これはひどい][どうでもいい][はい ...

[web]他のソーシャルブックマークを使おう
Tue, Mar 14, 2006 3:00 AM

結局のところ俺が必要なのはソーシャルブックマークじゃなかった。管理のしやすいオンラインブックマークだったのだって書いたけど、よく考えたらソーシャルブックマークの類ってはてなブックマークしかちゃんと使ってなかったので他のソーシャルブックマークを使うことにした。 そういうわけで勢いで[http://del.icio.us/:title=del.icio.us]のアカウントを取ったんだけど、俺は英語が読めないということを忘れていて、んーどうしようと思っていたところで[http://mark.jolt.jp/: ...

[_]ふしぎにんげん
Tue, Mar 14, 2006 3:00 AM

ふつうの人たちがこれから松永さんにどんな酷いことをしていくのか、ちょっと楽しみにもしています。 俺は松永(id:matsunaga)さんが元オウム信者でも何でもあんまり興味ない(そもそもこの話題について何か書こうとも思ってなかった)けど、これはちょっと思った。しかもそれでもみんな自分は善良な、とか常識的な人間だと思っているらしいのがふしぎでおもしろい。人間ってみんなみんな残酷だね。 俺はメタ酷い子なので周囲(はてならへんとかblogらへんとか2chらへんとかあやしいらへんとかいろいろ)の反応と、id:m ...

[web]野次馬さん
Sun, Mar 12, 2006 3:00 AM

[http://tomoblog.fool.jp/blog/2006/02/mixi.html#comment-60] 元は記事パクったとかパクられたとかそんな話([http://hxxk.jp/2006/03/12/0546:title])。それは当事者間でやってくれればいいんだけど、それよりも俺が興味があるのは何故パクリ騒動(に限らないけど)があると野次馬さんがバッシングし出すのか、ということだ。音楽でも漫画でもそうだけど、Aの人がBの人に何か「パクられた」からといってそこらへんの人が損害を被るわ ...

[opera][css]Operaである要素をmarqueeのように動かすスタイル指定
Wed, Mar 8, 2006 3:00 AM

marqueeを止めるuserjsをどっかにあった気がするなと思いながらつくったんだけど、つくったあとに検索してたら見つけてしまった([http://kawatarou.info/note/opera/blink_marquee.htm:title]。CSSで止められるの知らなかったので無駄骨だった!)。 Operaはmarqueeのdisplayをblockにすると動きが止まるらしい。じゃあOperaだとmarqueeのdisplayの初期値って何なんだ、と思ってdisplayの値を表示(marque ...

[opera]d:id:quaa:20060120#p1の続き
Tue, Mar 7, 2006 3:00 AM

d:id:quaa:20060307#p2で改造したbookmarkletを[http://quaa.jf.land.to/test/domtest]で使う。 まずOpera8.51(windows。8.52と8.53面倒だからインストールしてない。多分同じ)。 やっぱり前やったときと同じように属性が勝手に追加されているし、src属性のURIも絶対URIになっている。 Opera9.0tp2(windows)。 いい感じ。でも前やったときのスクリプト(「domtest」のボタン押す)で見ると9. ...

[opera][javascript]DOMのソースを見るbookmarkletを改造
Tue, Mar 7, 2006 3:00 AM

昔d:id:jintrick:20050328を見たことをさっき思い出した。これならd:id:quaa:20060120#p1でやったみたいに無理矢理再帰処理しなくてもいい。だけどそのままだとOperaでは動かないので書き直す。 まずOperaだとwindow.open()で開いたウィンドウのdocument.bodyはnullなのてエラーになる。document(HTMLDocument)のbodyプロパティはBODY 内容のある文書では BODY 要素を返し、フレーム設定文書ではこれは最外 FRAM ...

[opera][_]Re:Operaのinfoパネル
Tue, Mar 7, 2006 3:00 AM

[http://car.s35.xrea.com/diary/200603.php#D06-02] infoパネルって「»」みたいなボタン押してAlt+F3(View frame source)するとxmlファイルが出てくるのでカスタマイズ出来るのかも、と淡い期待を抱いた時期もあったんですが本当にカスタマイズできたらいいですよね f:id:quaa:20060307014334p:image「windowsパネル」、で、あってると思うんだけど言われてみれば変な気もするなあ...でもopera ...

[javascript][メモ]DOM3 XPathの勉強をするのメモ
Mon, Mar 6, 2006 3:00 AM

id:takefさんとか[http://lowreal.net/:title=NULL::something]のcho45さんとかのDOM3 XPathを使ったスクリプトを見ていたら便利そうだったので勉強してみることにした。以下メモ(修正したり消したり追加したりする)。 DOM3 XPathの使い方 [http://www.w3.org/TR/DOM-Level-3-XPath/]見る [http://www.hawk.34sp.com/stdpls/xml/dom_xpath.html]見る 簡単に使 ...

[_]アンカー生成するやつ
Mon, Mar 6, 2006 3:00 AM

:普通の:javascript:(function(){prompt(’’,’’+document.title+’’);})() :はてな用:javascript:(function(){prompt(’’,’[’+location.href+’:title]’);})() :どう使うか:Opera(windows)ならニックネームつけてブックマークしてからF2、ニックネーム入力、Ctrl+C、Esc。 :い ...

[css]アンダースコア・ハックの疑問
Fri, Mar 3, 2006 3:00 AM

アンダースコア・ハックは別にアンダースコアじゃなくていいみたい(記号ならなんでもいい?)なのに何でアンダースコアだけなんだろう。 何か決まりがある...わけないよなあ。

[はてなブックマーク]はてなブックマークのブックマークを全部削除した
Thu, Mar 2, 2006 3:00 AM

はてなブックマークは俺にとってメリットがあまりない、相性が悪いということにいまさら気づいたので、思い切って今までのブックマークをbookeyというソーシャルブックマーク管理ツールで全部削除した(もったいないのでエクスポートはした)。そしてもうはてなブックマークにはあまり近づかないことにした。 俺とはてなブックマークの相性の悪さとか はてなブックマークユーザとして 情報収集がはてなブックマークに依存するので視野が狭くなる 人気とか注目エントリーを見ていると見る記事がものすごく増えるくせにその場楽しいだけな ...

[opera][保留]OperaとBOMの謎
Mon, Feb 27, 2006 3:00 AM

ちょっと前にテキストエディタ(TeraPadとかxyzzyとか)のデフォルトエンコードを全部UTF-8に変更したんだけど、そうした後から書いたOpera用のユーザjavascriptが何故か動かなくてしょっちゅうはまっていた。 エンコードを変えるとちゃんと動作するので変だな、と思ってUTF-8のことをちょっと調べてみたんだけど、UTF-8(というかUnicode)には「BOM(Byte Order Mark)」という、データをメモリ上に格納する方式を区別するための特殊なコード(0xFEFF)が先頭ついて ...

[_]はてなWordLinkからやっと脱出できたよ!
Sat, Feb 25, 2006 3:00 AM

最初の方の「[http://wordlink.hatelabo.jp/w/%e4%bf%ba%e3%81%ae%e4%ba%ba%e7%94%9f:title=俺の人生]」とか「[http://wordlink.hatelabo.jp/w/%ef%bc%88%e6%80%a7%e7%9a%84%e3%81%aa%e6%84%8f%e5%91%b3%e3%81%a7%ef%bc%89:title=(性的な意味で)]」とか[http://wordlink.hatelabo.jp/w/%e3%81%82%e3% ...

[音楽]ZEEBRA - The New Beginning
Tue, Feb 21, 2006 3:00 AM

asin:B000E41M90:detail 買った。ZEEBRAかっこええなあ。Twigy, Dev Large, Mummy-D, Q, F.O.H...客演がいっぱいだ。でもJaz-OとかSwizz BeatzとかScott Storchとか言われても洋楽全然聴いてないのですごさがわからない! そういえばゲオ行ったらZEEBRAの新譜の横にZEBRAHEADの新譜が置いてあってちょっと笑った。ボーカル抜けたから解散かなーと思ってたけど新しいボーカルが入ったらしい。ほしかったけど金が3300円しかな ...

[firefox]Tab Treeいいなあ
Tue, Feb 21, 2006 3:00 AM

http://park2.wakwak.com/~benki/tabtree.html ツリー状にページ一覧を表示できるFirefox用の拡張。こういうKIKI風のシンプルなツリー表示Operaにもほしいよね。せっかくwindowsパネルがあって一応ウィンドウとページの2階層まではツリーになってるんだから。Weekly Buildとかで実装されたら俺即食いつくと思う。 なんていうかOperaのパネルっていろいろ惜しいんだよなあ。infoパネルもmeta要素とlink要素の情報とか外部スクリプトと外部ス ...

[TV]唐突にちょっと昔の子供向けアニメが見たくなった
Sun, Feb 19, 2006 3:00 AM

具体的にはポンキッキーズでやってた学校の怖いうわさ 花子さんが来た!と天才テレビくんでやってたアリス探偵局なんだけど、好きだったはずなのに話を全然覚えてない。「ほわほわほわほわ」と「かくかくうまうま」くらいしか覚えてない。ひどい。

[HTML]object要素を介してブロック要素を含めることが是ならその役目はiframe要素でも良いんではないか
Sun, Feb 19, 2006 3:00 AM

[http://www.akatsukinishisu.net/wiki.cgi?p%CD%D7%C1%C7%A4%CE%C3%E6%A4%CBobject%CD%D7%C1%C7%A4%F2%B2%F0%A4%B7%A4%C6%A5%D6%A5%ED%A5%C3%A5%AF%CD%D7%C1%C7%A4%F2%B4%DE%A4%E1%A4%EB%A4%B3%A4%C8%A4%CB%B4%D8%A4%B9%A4%EB%B5%C4%CF%C0:title]をちょっと見ていてobject要素を介してブロック ...

[はてな]はてなブックマークに現れたドッペルゲンガー芦塚さんの謎に迫るよ
Sat, Feb 18, 2006 3:00 AM

はてなブックマークの「このエントリーをブックマークしているユーザー」にb:id:asizukaさんとb:id:ashizukaさんが居て両方コメントが同じなんだけどid:asizukaさんのブックマークに行こうしてもはてなブックマークのトップページに行くだけだしid:ashizukaさんのは日付が全部今日、という謎。なので今日は謎探偵になって推理してみるよ!((芦塚さんを非難するつもりではないよ)) id:asizukaでidを取ってブックマーク あるときidを変えたくなったのでid:asizukaでブ ...

[css]要素に対するcontent
Fri, Feb 17, 2006 3:00 AM

一応CSS3 Generated and Replaced Content Moduleで拡張されるcontentプロパティでは、::before、::afterに加え通常の要素などにも適用できるようになります。 うへえ、そうなんだ。Operaて現状でも(俺が使い始めた7くらいでも)型選択子とかにcontentが適用されるから何か違うような、と思ってたんだけど、そうか。今までユーザスタイルシートでimg{ content : attr(alt) }くらいしかしたことなかったからさっきh1{ content ...

[__]g:mohicanのキーワードが[面白すぎる]ので最大限活用[してみるテスト][というのはどうだろう]
Thu, Feb 16, 2006 3:00 AM

[はぁ?][悔しかったのはわかるが][構って電波]は[意味不明]。[印象操作]して[いい気になっている]だけ [優越感ゲーム][については流すとして]、[迷惑な人][ということにしたいのですね]。[とりあえず][過去記事全部読んでから発言してください] [あなたの常識と私の常識は違うんです]。[たぶん似たようなことは散々言われているんだろうけど][要するに][レッテル張り][といっても過言ではありません] [なるほど][面白い解釈ですが、正確でないことは確かです]ので[出直してきてください] [当たり前 ...

[_]
Mon, Feb 13, 2006 3:00 AM

同じエントリが3つも登録されててびっくりした。9.0tp2ってフォームの挙動ちょっと今までと違う気がする。読み込む前にテキストフィールドに入れた文字が読み込み終了したときに消えたりするし。

[opera]そういえば9.0tp2になって属性に含まれるURIの扱いが修正されていた
Mon, Feb 13, 2006 3:00 AM

d:id:quaa:20051112:p1で書いたやつ。 Attribute selectors now use the specified value of URIs, instead of resolved values.属性セレクタは解決された値ではなく、指定されたURIの値を使用するようになった これでwikipedia見てもうっとうしくないな。javascriptの方でも修正されていた(d:id:quaa:20060120:p1のやつで確認した)。 そういえば関係ないけど俺ずっと絶対URIのこ ...

[opera]Opera9.0tp2用ウィジェットMyFeedReader!
Sun, Feb 12, 2006 3:00 AM

フィードを読むウィジェットできたよ。 http://quaa.jf.land.to/opera/widgets/myfeedreader011.zip Opera9.0tp2の場合のみリンクを選択すると「ダウンロードした設定ファイルは害を及ぼす可能性があります。作成者を信用する場合のみインストールしてください。続行しますか?」とか聞かれるので俺を信用できる人だけ「はい」を押してください。用心深い人は「リンク先を保存」して開いて確認するといいです。 デフォルトではてなブックマークの注目エントリーのRS ...

[opera]ウィジェットつくるよ
Thu, Feb 9, 2006 3:00 AM

メモ XMLHttpRequestで普通にどこのファイルでも取れる(セキュリティ制約ない) アンカーにカーソルを乗せてもaddress:とかtitle:とかのツールチップが出てこない コンテキストメニューをウィジェット上のどこで出してもshow widgetsとpinとremove(リンクをコピーしたりできない) ウィジェットのリンクは新しいウィンドウで開く(うっとうしい) ウィジェット消してもzipは残る(かなり邪魔) alert出ない(確認しにくい。document.body.innerHTMLで代 ...

[opera]かんたんはてブウィジェット
Wed, Feb 8, 2006 3:00 AM

「シナあもーん、Opera9.0tp2用のはてブのウィジェット何かつくってよー」 slashdotのウィジェットをダウンロードする %APPDATA%Opera¥(何か9.0tp2用のフォルダ)¥profile¥widgetsらへんにzipがあるので解凍する js/srashdot.jsの最初の方(22行目くらい)にあるrssURLの値を”http://rss.slashdot.org/Slashdot/slashdot”から”http://b.hatena.ne.jp/entrylist?mode=rs ...

[opera]Opera 9.0 Technology Preview 2
Wed, Feb 8, 2006 3:00 AM

寝過ごして乗り遅れたせいで書くことがあんまりない。 広告のブロックをGUIで出来るのは良いな(Content Block)。あと検索エンジンの追加が詳細設定から出来るのも良いな(search shortcut editor。でも文字コードの編集が出来ないしセパレータの追加も出来ないし並び替えも出来ないみたい)。opera:configで設定変更反映させるのにOpera再起動しなくてもいいのも良いな。タブにマウス合わせたり右クリック+ホイールでページをサムネイル表示できるのはちょっと面白いかも(opera ...

[はてな]「はてなダイアリーの隠し機能で楽々更新」に引っかかるひとたち
Sat, Feb 4, 2006 3:00 AM

http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/Hamachiya2/20060204/1138998854 http://mxxi.hamachiya.com/2006/02/post_15.html(はまちやさんの説明) background属性でjavascript動くの知らなくてびっくりしたけど(ってもCSSのbackgroundプロパティでjavascript動くのは知ってたか)はまちやのひとがちゃんと書いてるのにうかつに踏んじゃうひとがこ ...

[_]楽しそうな人達の文章を掛け合わせてみよう
Sat, Feb 4, 2006 3:00 AM

きっこさんとかデンマンさんとかはまちやさんとか、楽しそうな人達が使う独特なフレーズなんかを掛け合わせたら最高に楽しい文章が完成するんじゃないかと思ったんだ。題材がないので日記ジェネレータも取り入れてみた。 2***年*月*日の日記 こんにちはこんにちは!!今の部屋に引っ越してもう36年たつし、beatmaniaや、前世の記憶のような大砲を集める趣味のせいで部屋が手狭になってきてリトル不便なので、新しい部屋を探そうと不動産屋めぐりをしてみたよ! 5件目の店で、新築ではないんだけど、安全性の高いマンション ...

[はてな]昨日今日のはてブはまちちゃん脆弱性メモ
Thu, Feb 2, 2006 3:00 AM

ブックマークされたタイトルをちょっと加工するとjavascriptが使える、ということをはまちやさんが公表(http://mxxi.hamachiya.com/2006/02/post_14.html。1日23時33分) 削除ボタンを大きくさせ、そこにマウスオーバーすると「XSS」とalertが出て削除しにくくなるようにタイトルを加工したテストブックマークがはまちやさんによってされる(http://b.hatena.ne.jp/entry/http://test/。2日00時06分) 削除ボタンにマウス ...

[IE]IE7 Beta2が出たのでちょっと使ってみた
Wed, Feb 1, 2006 3:00 AM

20分ちょっと使って気づいたとこだけ列挙。インストールにOSの再起動が必要な所がうざったいよな。 application/xhtml+xmlは相変わらずダウンロードになる CSS a要素以外のhoverが効くっぽい position:fixedはだめっぽい フィード 登録ボタンの矢印押すとlink要素のtitle属性出してくれる RSSを整形して表示出来る アイテムをインクリメンタル検索出来る。ソート出来る window.external.AddSearchProviderっていうメソッドで検索を追加でき ...

[_]今こんな感じ
Tue, Jan 31, 2006 3:00 AM

f:id:quaa:20060131202700p:image 眠い!気持ち悪い!

[CSS]W3Cの仕様書等の文書の日本語訳集(CSS)
Tue, Jan 31, 2006 3:00 AM

W3Cの仕様書等の文書の日本語訳集がリンク切れ多いのと古いのでCSSだけ集めてきた(リストの2階層目が原典で3階層目が邦訳。バージョンでわけたから勧告とか勧告候補とかワーキングドラフトとかごちゃまぜ)。こういうの絶対誰かリストつくってると思ってたんだけど見つからんもんなぁ。 CSS1 Cascading Style Sheets, level 1 [W3C Recommendation 17 Dec 1996, revised 11 Jan 1999] Cascading Style Sheets, l ...

[web]いまさらHaropy(Tropy)の素敵な散策方法を思いついた
Tue, Jan 31, 2006 3:00 AM

Operaの場合 fastforward.iniに「Random」を追加する スペースキー押しまくり(もしくはFlipForwardしまくり) Firefoxの場合 All-in-One Gesture拡張を入れる 詳細設定1の「’前後へのリンクを辿る’:該当すると見なす文字列」の「次のリンク」に「Random」を追加する 「次のリンクを辿る」にジェスチャを振る ジェスチャ使いまくり Operaで見るとHaropyの文字が見えないので作成者スタイルを切るなりする。何で見えなくなるんだっていうと h2 ...

[CSS][opera][firefox]OperaとFirefoxのbefore/:after擬似要素へのpositionプロパティの扱いが違う(が両方正しい)
Sat, Jan 28, 2006 3:00 AM

何かまた見つけてしまった扱いの違い(しかしタイトルが長いな...)。Operaは:before/:after擬似要素へのpositionプロパティは有効だが、Firefoxでは無効になる。今度はちゃんと仕様調べて判断しようと思ってCSS2の仕様の邦訳を見た。利用者エージェントは :before擬似要素及び :after擬似要素を有する ’position’特性, ’float’特性, list 特性, 及びtable特性を無視しなければならない。((:before擬似要素及び :after擬似要素を有す ...

[_]エントリのカテゴリをずっと付け忘れていたので今から付けに行きます
Sat, Jan 28, 2006 3:00 AM

はてなダイアリーはカテゴリごとにもRSS吐いてくれるのでつけないともったいないの神様が怒りに来るよね。ということで今からカテゴリ付けに行きます。 一応つけ終わった。読み返すと何か妙な気分になる。時々笑える。 気づいたこと カテゴリ付けをいつのまにか止めてる前のカテゴリわけに表記ゆれがありすぎた([news]と[ニュース]とか) ブラウザ関連の話もCSSもjavascriptも全部カテゴリがwebになってた javascriptのコードがしょっぱい 何故かdocument.body.innerHTML.re ...

[ネタ]だいたひかるのネタをひとつ思いついた
Fri, Jan 27, 2006 3:00 AM

私だけ?逮捕された自称占い師のハーレムの人が細木数子に見える まあ倖田來未が時々綾戸智絵に見える人ですけど!

[TV]TVチャンピオンってこんな番組だったっけ?
Thu, Jan 26, 2006 3:00 AM

TVチャンピオン「オタクを萌えさせる職人“フィギュア王”決戦」ていうのを途中(スパロボのエクセレンのフィギュアをリメイクしてるとこらへん。何でエクセレン?)から見たんだけどすごい面白かった。 回転寿司のまわるとこに参加者のひとがつくったフィギュア並べて一般の審査員(オタの人)に眺めさすしオタの人「オメガ萌え」とか(グッジョブって言やあいいのに)何故か「ジージェイ」とか言い出すし2回戦くらいで光浦やらまちゃまちゃやら和田アキ子の萌えフィギュアつくりだすし(しかも上手い)参加者のひとがフィギュアつくってる ...

[はてな]はてなのプロフィールに画像を登録するよ
Thu, Jan 26, 2006 3:00 AM

プロフィールに画像を登録していろんなところに表示させられるようになった(http://hatena.g.hatena.ne.jp/hatena/20060126/1138263309)のでテストテスト。こういう機能追加は遊べるので良いなあ。はてブは重くなりそうだけど(飽きたらimg.hatena-id-icon { display : none; }とか画像非表示設定にするかもね。[bookmark] 大丈夫ですよ。負荷にならないように設計してあります。だって!心配しなくても(多分)いいみたい)。 i ...

[_]福豆の季節!
Mon, Jan 23, 2006 3:00 AM

福豆うまいよね。節分終わったら買い溜めするんだー

[opera]Operaさんにbody要素に勝手につけられたtext=”#000000”を削除できない
Mon, Jan 23, 2006 3:00 AM

removeAttributeでもremoveAttributeNodeでもだめ。エラーもでないが効果もない。setAttirubuteで書き換えてからremoveAttributeすると書き換えた値が消えて#000000に戻る。どうにか消せないか。前書いたけどtext属性があると「作成者フォントと配色」がOnの時フォントの色設定が効かないのでbrowser.cssとかユーザスタイルシート使わないといけなくて面倒。でもOffだとbgcolorなんかも無効になる...まあOffでもいいか。はてなのヘッダとか ...

[ブラウザ][opera][firefox][IE]メジャーなブラウザはHTMLをDOMでどう解釈しているか
Fri, Jan 20, 2006 3:00 AM

Operaは直接参照した画像をセンターに配置するためにtableでマークアップしているということを知って(テキストファイルをpreでマークアップしているのは知っていたけれど画像は知らなかった)、実際どういうマークアップがされているか知るためにDOMからソースをとるjavascriptを書いていて見つけたことを書く。長くなるので結論だけ先に言うと「firefoxは大分良い、opera変、IEは窓から投げ捨てろ、いやまあ4-5年前のブラウザだもんね」って感じ? まず以下のようなソースをもつHTMLファイルを ...

Operaを説明しようぜ(2)
Wed, Jan 18, 2006 3:00 AM

d:id:quaa:20051104:p1の続き。ちょっと前にperlとかPHPの勉強用にレンタルサーバを借りたので、Operaの説明はそこで更新していくことにした(http://quaa.jf.land.to/opera/about)。「特長」の項を「機能」に変更してしまったりしてどんどん内容が膨大になってきている。それにしてはM2(そういえばM2ってOpera Mailに名前変わった?)とか説明してなかったりMDI/SDI/TDIの説明があんまりしっくりこなかったりするけどまあそこら辺はおいおい変更し ...

firefoxの拡張をつくる...のを一旦諦めるよ
Tue, Jan 17, 2006 3:00 AM

拡張でfoobar2000のツールバーをつくろうと思ってたけどfoobar2000のコマンドから値が取得できないなぁとかscrollbar横にしてボリュームコントロールの予定がset volume toで好きな値をsetできない(0dbから-3dbきざみで-21dbまでしかダメっぽい)よとかそういえばfoobar2000はプラグインがいろいろあるじゃん、それどうやって判別するの?とかその他もろもろあってやる気をなくした。再生ボタンとかだけならFoobar Controlsがあるしなぁ。新しい題材を思いつ ...

はてなの車
Mon, Jan 16, 2006 3:00 AM

はてなの車がOperaで動かないのにわざわざFirefox立ち上げて動かしてわーすげーって普通に喜んでブックマークで面白いって書いたアホの子です。checkBrowser: function() {return !window.opera;}はひどいなあ(http://d.hatena.ne.jp/hatenadiary/20060116#c1137406597)。それにしてもはてな重い。あの車のせいかな。軽くてちゃんと動く車が好きなんだけどなーあ

Operaの「他のスキンを探す」にユーザーjavascriptで検索をつける
Sat, Jan 14, 2006 3:00 AM

my.opera.comのスキン一覧のところには検索フィールドがあるのにOperaのツール > 外観の設定 > スキン > 他のスキンを探す、のところのスキン一覧(http://my.opera.com/community/customize/skins/embedded/)には検索フィールドがないなんておかしいと思わないか?そんなときはユーザーjavascriptでさくっと検索フィールドを追加してしまおう。 if (location.href.match(/^http:¥/¥/m ...

ブラウザのシェアをはてなグラフで
Sat, Jan 7, 2006 3:00 AM

Firefox、シェア10%に迫る勢い(ITmedia)でOperaのシェア変わってないよって言ってたのでで本当に変わってないのかなーと思ってCSVファイルつくってはてなグラフで表示させてみたけどやっぱり変わってなかった。増えるのも減るのも微々たるもの。広告なくなったときの月は上がってる(上がってるっていっても0.1%)けどその次の月になったらもう下がってる。 ついでなのでほかのブラウザのシェア率も入れてみた。 http://graph.hatena.ne.jp/quaa/MSIE/ http:// ...

firefoxの拡張をつくるよ
Wed, Jan 4, 2006 3:00 AM

firefoxの拡張をつくってみたい衝動に駆られたのでXULとかを勉強中。とりあえずいろんな拡張を見てパクってみたり検索しまくったりしてるけどドキュメントの邦訳なんかがほとんどない上に古いので前途多難っぽい(先に英語勉強し直した方がいいかも)。まずchrome://のURIがよくわからなかったしインストールのさせ方もいろいろだし他の拡張見てると見たことないjavascriptの関数がいっぱい。 参考になりそうなところ [xul][en][http://www.xulplanet.com/:title] ...

おめでとうフライング
Fri, Dec 30, 2005 3:00 AM

あけましておめでとう!先言っておかないと忘れそうなので。それにしても年あけてもおめでたいことなんて何もないのにおめでとうって。それでいったらHappy New Dayでもいいじゃん。毎日おめでとう。おめでてーな。 あけましておめでとう!

はてブはどっかおかしいというか何かキモチワルイ
Fri, Dec 30, 2005 3:00 AM

http://caramel-tea.com/2005/12/27/post_743.php http://d.hatena.ne.jp/otsune/20051229/p1 http://blog.goo.ne.jp/simauma_dx/e/143c0d6428af374bc14c592c32afb6e4 ここらへんの話(はてブでのネガティブコメントについて)。 はてブのコメントで批判するのは別に良い。だが「何故ダメか」が書かれていないことが否定的なコメントを書かれた側からすれば厄介だと思う。た ...

Operaとdata:スキーム
Thu, Dec 8, 2005 3:00 AM

8.51でdata:スキームのURL(data:,abcとか)をアドレスバーに直打ちしたら表示されなかったのでdata:スキーム使えなくなってるのか?と思って調べてみた。 |* |*9.00tp1|*8.5x|*8.02|*8.0|*7.23| |*data:のURLをコピーしたのち「URLへ移動」|表示する|表示する|表示する|表示する|表示する| |*data:のURLのリンクを「選択」|表示する|表示する|表示する|表示する|表示する| |*data:のURLをコピーしたのちアドレスバーに貼り付 ...

[近況]
Thu, Dec 1, 2005 3:00 AM

この前事故(原付で自分で転んだ)して怪我した左膝を来週手術することになった。内視鏡で半月板っていうのが損傷してないか、十字靭帯っていうのが切れてないかを調べるらしい。はふー人生初手術!11月中に自動車学校位って免許取る計画だったのになー(あんまり行きたくないけど免許は欲しい)はっはっは。手術したら1週間くらい入院。怪我療養が長引くなあ。 あ、アップルのiMac G5欲しい!締め切りギリギリに書こうと思ってたのに書くの忘れてた!と思ったら期間が延長してたらっきー!全角感嘆符が肝ですね!

これ(はてなのタグクラウドとかキーワードクラウドのフォントサイズ)はひどい
Wed, Nov 23, 2005 3:00 AM

ほんとにひどい。豆字すぎ。昨日できたダイアリーのキーワードクラウドははてなのテーマだと90%(ul.keywordcloud li)*80%(a.keywordcloud0)で実質a.keywordcloud0は72%だし、はてなリングのタグ一覧は90%(div#container)*90%(ul.tagcloud li)*80%(a.tagcloud0)で実質a.tagcloud0は64.8%になってしまう。はてなブックマークのタグ一覧はa.tagcloud0の親にフォントサイズ指定がないからまだ見ら ...

joltmark試用中
Sun, Nov 20, 2005 3:00 AM

ソーシャルブックマークサービスで新しく「joltmark」というのができたそうなので使ってみている。 タグの絞り込み検索が出来るのは良いな。絞り込みたいタグの右にあるボタンをクリックしていくとどんどん検索結果が絞り込まれていく。はてブも検索機能もっと良くしてくれたらいいのに。情報の宝庫なんだから。 タグが何個つけられて何文字までいけるのかはヘルプに書いてないので試してみたけどわからなかった。だってタグ100個入れても大丈夫だし、300文字のタグでも普通に登録できるんだもの!「説明」というはてブでいうと ...

はてなブックマークの「コメント直接編集」機能で挿入される構造
Tue, Nov 15, 2005 3:00 AM

はてなブックマークでコメント直接編集が出来るようになっていた(http://hatena.g.hatena.ne.jp/hatenabookmark/20051115/1132035573)。ワンテンポ待つ時間が省けて結構便利。 動的に生成・挿入される要素がいっぱいあったのでメモしとく。コメント入力機能の改善(http://hatena.g.hatena.ne.jp/hatenabookmark/20051125/1132903374)により若干の変更がされた。 クリック前 dd.comment d ...

はてなダイアリーのarchiveページのinvalidなul
Sun, Nov 13, 2005 3:00 AM

はてなダイアリーのarchive(http://hatena.ne.jp/(user_id)/archive)で過去の日記を一覧表示するために使われているULは直にULを含んでいる(UL > LI > ULでなくUL > UL)。ULが子要素に出来るのはLIだけなのでこれは正しくない。 これで何があかんかっていうとUL > ULの入れ子だもんで入れ子になったUL/OLにスタイル指定(普通のUL/OLにはmargin-bottomを1emにして入れ子のUL/OLでmargin-b ...

[近況]暇すぎる
Sun, Nov 13, 2005 3:00 AM

ちょっと前に原付で事故して左足けがしたのでやることがなにもない。一週間くらいずっと家にいる。食う・寝る・TV見る・パソコン・音楽聴くくらいしかやることがない。あとちょこっとゲーム。でも一応足動かせるようになったし原付も戻ってきたので早く足治して遊ぶぞー

OperaとfirefoxのCSSでのhref属性値の扱いが違う
Sat, Nov 12, 2005 3:00 AM

opera9.0tp1ではCSS3の属性セレクタが使えるようになったっていうので、ユーザスタイルシートにa[href^=”http://”]::after{ content : ”[ex]” }として外部リンク(絶対パスのアンカー)にだけリンクの後ろに[ex]とつけようとしたんだけど、これを記述したらすべてのリンクに[ex]ついてしまっていた。 firefoxでは出来たのにおかしいなー、と思っていろいろやってみたところ、operaは相対パスを絶対パスに変換してからhref属性値を扱い、firefoxは ...

2.0
Thu, Nov 10, 2005 3:00 AM

web 2.0というのがまったくもってちんぷんかんぷんなので、2.0の気分だけでも味わおうと思いましてこの日記のタイトルを「trashcan+green(2.0)」にしようと思ったんですが、思いのほかタイトルに2.0をつけている日記が多いのでやめました。そんな天邪鬼。しょうがないので語尾に2.0をつけて2.0気分になることにします2.0。本当にありがとうございました2.0。ついでに2.0bookmarkletもつくったのでこれで2.0気分に浸ることにします2.0。

はてなリングの駄目なところ
Wed, Nov 9, 2005 3:00 AM

はてなリングに登録してみたんだけど、何かいろんなところが気になる。まず「ロゴ貼り付けタグのコピー」のページでjavascript切ってるとtextareaの中にコードが生成されないからタグがコピーできないし、ロゴをHTMLだけで設置する方法が提供されてない(http://d.hatena.ne.jp/tzk/20051109/1131504976のように勝手にやることはできるけど)。それと複数のはてなリングロゴを設置すると追加されるdiv要素やimg要素のid属性が重複する(div#hatena-rin ...

yahooがレイアウトのテスト中らしいよ
Sat, Nov 5, 2005 3:00 AM

yahooに入ったら何かレイアウトが変わってた。見ると新しいレイアウトをテスト中です、と書いてある。 f:id:quaa:20051105200807p:image でもIEとかfirefoxで見るといつもと変わらない。operaで見たときだけテスト中。何なんだ?と思ったら また、テスト用のページはYahoo! JAPANにアクセスされたPCのなかから無作為で抽出させていただいております。PC単位で抽出されるため、アクセスする端末が変わると通常のトップページが見えることがあります。 だって。 とり ...

Operaを説明しようぜ
Fri, Nov 4, 2005 3:00 AM

結構前にはてなキーワードのOperaを編集してみたけどちょっとずつ弄ってくの面倒なのでここでまとめることにした。 「opera」とは ノルウェーのOpera Software ASA社によるWEBブラウザのこと。Internet Explorer、Mozillaに続く「第三のブラウザ」とも呼ばれる。赤いオーのアイコンでお馴染み。従来operaはシェアウェア(39米ドル程度を支払うことでライセンスコードを受け取り、広告バナーを撤去する。広告を気にしなければ無料でも使えた)であったが、2005年8月30 ...

「はてなブックマーク - 日本橋で暮らすということ : 記事への無断リンクお断り申し上げます」について
Sun, Oct 30, 2005 2:00 AM

いろんなことを考えたのだけどまとめる能力がなかった 先の件について たとえ「自分がしていることが正しい」と思っていてもモヒカンな人と野次馬が大挙して押し寄せたら一ムラ人が取れる最善の策は「逃げる」しかない そのブックマークで誰か幸せになれたんだろうか 荒らされたのはblogという「場」ではなく「私の心」ということかもね 無断リンク禁止に対して 何年前の議論だよ(どっかで「そんな5年前の議論」みたいなことが言われていたがどこで言われていたか失念した)、というのは毎年毎年インターネット世界に大量に入っ ...

老人ホームでの猫事件の真相のさらに真相(これで決着か)
Thu, Oct 27, 2005 3:00 AM

埼玉の老人ホーム、猫事件の真実 老人ホームで女性が何者かに足指を食いちぎられた事件。最初、猫が犯人だという報道が出、それに対して異論が噴出した。そして今日さらにその後の展開を上記リンクのページで知ったのだが、それによれば結局猫が犯人という可能性が高いという。ただ、 猫は二週間も何も食べていなかった(状況的に食べられなかった) 老人ホームの管理体制に不備・甘さがあった 被害者の女性が寝たきりであった という極めて特殊な状況下での事件であったということのようだ。餓死するかもしれないってなったらそりゃ食 ...

衣替えが必要です
Sun, Oct 23, 2005 3:00 AM

バイト先から原付で家帰る直前に雨降ってきて、雨具持ってなかったから濡れて帰ったんだけど、もう尋常じゃなく寒い。酔っ払ったおっさん放置したらおっさん凍死するくらいの寒さ。10月なのに雨は夜更けすぎに雪へと変わりそうな寒さ。原付だから余計に風が冷たい。 あと悲しいのは自動販売機の「あったか〜い」の占める割合がまだ1-2割で、しかもあったかいのはコーヒーばっかりってこと。自動販売機の担当の人はコーンポタージュとかあったかいレモンティとかを早急に仕入れてください。早急に!苦いの飲めへんから!まあ所持金が100 ...

bqモジュール用文字列作成ブックマークレットの勝手改造版
Wed, Oct 19, 2005 3:00 AM

question:1129261635のいわしですごいよさげなbookmarkletを知った(日これ - RubyでBlog , コンサドーレ札幌 , はてなダイアリー「bqモジュール」作成bookmarklet)。でもbqモジュール使えなくなりそうなので普通に使えるように勝手に改造して、ついでにprompt表示からtextareaに表示させるようにしてみた。 ポップアップ版 非ポップアップ版 引用したい文章を選択してこのbookmarkletを発動させると、引用したい文章を囲んだciteと ...

はてなブックマークで嫌がらせ
Tue, Oct 18, 2005 6:42 PM

トラックバックスパム及びはてなブックマークスパムサイトbogusnews及びBar’s Hideoutは今すぐ閉鎖しろ。(真性引き篭もり) アカウントを何個もつくり、悪意を持って他人のblogのエントリをブックマークしまくって自作自演に見せかけ、そのblogの評判とそのblogを書いている人の信用を故意に下げさせることも可能だな、と思った。自作自演に見えるブックマークを誰が仕掛けたか、というのは多分検証不可能だと思うから、完全にばれないで嫌がらせが出来るんじゃないだろうか。そう考えると、今回のbogu ...

50文字制限のバカ(半角英数のみだと150文字?)
Sat, Oct 15, 2005 3:06 PM

http://d.hatena.ne.jp/crowdeer/20051015/accountをブックマークして 2005年10月15日 quaa 『[hatena][裏技]?iを見ればアカウントがメインかサブかわかるのかー。いいことを知った(でも使い道ない)』 とコメントしたらid:crowdeerさん本人から 2005年10月15日 crowdeer 『[自説明]quaaさんへ:厳密にはアイポンだけでメインかサブかはわかりません。詳細は文中chepookaさんのとこ参照で。』 とのツッコミが ...

「カスタマブックマークをブクマ」の途中経過
Sat, Oct 15, 2005 6:04 AM

[hB - customize] 基本のスタイルからそれほど変えない(使いやすさ重視?) 基本的には自分だけが見るページなので、他ブラウザでサイド落ちてるとか気にしない人が多いかも(そしてそういうブックマークを見ると、僕はブクマするべきか迷う) 「コレクション」の画像(a.asin:hover img.asin)を拡大するブックマークが思ったより多い ?Bのスタイルって「基本」「シンプル」「サバンナ(色違い)」しかないと思ってたけどもう一個いろんな人が使ってるスタイルがある。どこかで配布されているのか ...

おもわぬ副産物
Fri, Oct 14, 2005 11:36 AM

カスタマなデザインを見つけるためにかたっぱしから人のブックマークを開く 何だかよさげなエントリをみつける ブクマ むはー もうほとんどのユーザ名が既読リンクになってる気がする。http://b.hatena.ne.jp/entry/http://www.usability.gr.jp/alertbox/20051003.htmlここの人たちordsonさんまで全部開けたり。制限なしでいいなあと思ったカスタマブックマークをブクマしようと思ってるけどいかんせん二番煎じなのでlaisoさんがブクマしてると遠 ...

ハテナ?
Fri, Oct 14, 2005 7:03 AM

不思議な微生物、藻食べて植物に大変身 名は「ハテナ」(朝日) “半草半獣”の新種微生物、その名は「ハテナ」(読売) (読売2) (yahoo-読売) 謎の微生物ハテナ:筑波大の研究グループ、砂浜で発見(MSN-毎日) 虫それとも草? 「?(ハテナ)」な生物(yahoo-産経) 半分動物、半分植物=不思議な微生物、和歌山で発見−葉緑体取り込み利用・筑波大(yahoo-時事通信) ブクマ全部合わせたら100超えてる。みんなハテナ大好きだなあ。もうキーワード登録されてるし!

ふと思い立ったので他の人の?Bを漁ってきます
Thu, Oct 13, 2005 3:12 PM

id:laisoさんがブックマークしてないカスタマなブックマークを見つける旅。基準は俺の独断と偏見。こういうときにはoperaのリンクパネル固定が役立つな。

[news]「女性足指けが事件(毎日による)」の続報
Thu, Oct 13, 2005 1:50 PM

女性足指けが事件:「猫犯人説」に異論噴出 無実の声も(msn毎日) 埼玉の老人ホーム、猫事件の真相(mana’s blog) まあねこが足指を食いちぎることができるのか、またしようとするのかと考えれば自分はねこ犯人説はないと思うんだけど、mana’s blogに書かれたことが事実だとして、それならば誰が「ねこの仕業」と思ったのかな?誰も思ってないんだったら捕獲する必要がないし...(口の周りに血痕が見られず、網戸の穴も調べてない、と言うのならなおさら) それと何でマスコミの出す情報はほとんど同じにな ...

はてなはおそろしいところ
Wed, Oct 12, 2005 1:36 PM

はてなで暇が潰せまくる。 巡回する アンテナ RSS 「キーワードを含む日記」 ブックマークの人気・注目エントリ ブックマークのコメント・「このエントリーを含む日記」 面白い(面白そうな)記事を書き留める ブックマーク ダイアリー 面白い(面白そうな)サイトを登録 アンテナ RSS 1に戻る(以下エンドレス) こわいのは「その時は充実した気になる」ことと依存度が高くなりすぎること。 意志力がないやつははてなに足を踏み入れてはいけない...はてなは悪魔のツールだー

シソーラス検索で匿名を検索すると
Sun, Oct 9, 2005 12:55 PM

f:id:quaa:20051010011215j:image 匿名っておそろしいですね...

ブッシュ批判Tシャツは市販品なのかな
Sat, Oct 8, 2005 4:52 PM

なんかネット巡回してるとやんわりと右傾化してくる気がする。知識もないのに! ロリー・ヒーズリーさんはとりあえず乗員の言うとおりTシャツを裏返しに着る大人ーな対応をして、オレゴン州に着いた瞬間にばっとTシャツを表向きにしていけば良かったんじゃないかな!というか乗員はそんなちっちゃいことで客を降ろすな!

[news]気になったニュース(ブッシュ批判Tシャツとかみ猫)
Sat, Oct 8, 2005 11:13 AM

ブッシュ批判Tシャツ着用の女性、飛行機から降ろされる(asahi.com) 「ほかの乗客からの苦情」があったんだから航空会社は注意せざるをえないと思う。そりゃ苦情を訴えた乗客がブッシュだったとか航空会社が政府に連絡して政府が止めさせるように言ったとかなら途中で飛行機を降ろされたロリー・ヒーズリーさんは怒ってもいいと思うよ(それなら納得する)。でも苦情を訴えたのは一般人で、それも訴えたのは一人だけじゃない。人の不快を考慮に入れないで自由を声高に主張したいなら誰もいないところでやればいいと思う。 特養 ...

[近況]今日はついてない日
Sat, Oct 8, 2005 4:22 AM

配達のバイト終わって家に帰る途中、原付であと家まで50mあるかくらいのところの交差点を左折しようとしたら雨で濡れた地面で滑って転んだ。左肘と左膝負傷するしジーンズ破れるし何より借り物の原付の左ミラーが根元から折れた。しかも腹立って折れたミラー投げたら鏡割れちゃった。 配達の途中も物凄い雨降ってきたし。1ヶ月くらい前に屋根がある配達用の原付が壊れたから屋根がないのに変わったせいで雨具着たのにビタビタ。もうやだー あと大人の科学のプラネタリウムの原板の接着面べりべり剥がれてきた!そんなもんだ!

エンタ!検定に挑戦
Fri, Oct 7, 2005 11:51 PM

+++ 第1回 エンタ!検定 成績発表 +++ あなたの総合得点は65点  全国平均 60点 全国順位(10月6日 1時現在) 7839位(24510人中) −−ジャンル別得点表 −−−−−−−−−−−−−−−     0_________10__________20点 映画 ■■■■■■■■■■■■■ テレビ■■■■■■■■■■■■■ 音楽 ■■■■■■■■■■■■■■■ 書籍 ■■■■■■■■■■■ 芸能 ■■■■■■■■■■■■■ −−−−−−−−−−−−−−−−−−−−−−−−− − ...

favicon.icoを変更したよ
Fri, Oct 7, 2005 11:51 PM

何やらはてなダイアリーでfaviconを自分の好きなものに変えられるようになったそうなので、ここもfaviconを変えてみた。オスカー((セサミストリートに出てくる緑色のもじゃもじゃモンスター。ゴミ箱に住んでる))のアイコンにしようと思ったけど、簡単につくれそうなスライミー((セサミストリートに出てくる奇抜な色のミミズ。オスカーの親友))にした。ちっちぇーのであんまり何かわからないな。 ところでJPEG、PNG、GIF、ICO、BMP形式がアップロード可能ですとしているのにICO形式でアップロードした ...

[web]今こそCSSコミュニティの出番だのに
Fri, Oct 7, 2005 11:51 PM

人力検索でHTMLやらCSSの質問があると大体適当に回答されているのでがっかりする。回答者はリスクないけど質問者はポイント払わないといけないんだから、答えるんなら小さいことでもちゃんと答えてあげればいいのに。 今もCSSコミュニティかっこなぞの人達((俺定義だとCSS關係者に37の質問を答えた人達のこと。これに答えたんだから「CSS關係者」ってことで))が活発に活動してたら大人気になってただろうになー。今は猫も杓子もぶろぐぶろぐ!の時代だからCSSの情報の需要が高まってる感じだし、はてなブックマークみ ...

question:1127659682でid:kuma-ismさんが求めているもの
Fri, Oct 7, 2005 11:51 PM

kuma-ismさんが本当に欲しい回答は、中央にも配置されず、floatの命令もきかずでずべて左側によってしまってます↓。、などとあるように、floatの回り込みが上手くできないということに対する解決法だと思う。 二つの<id>がありまして、一方を左、一方を右に同じ高さで表示したいのですが、floatで指定しますと高さが変わってしまうかどちらとも左によってしまいます、はfloatの回り込みで何か失敗していて階段状に高さがガタガタしているんだろう。前に自分もこの日記内でasinの画像と詳細を回り込みさせ ...

[近況]大人の科学マガジン9を発売日に買ったのにまだプラネタリウムがつくれてない
Fri, Oct 7, 2005 11:51 PM

ISBN:4056041865:image はてなブックマークの人気エントリで見つけて一目ぼれ(?)して、発売日当日に買ったはいいけどその日の深夜から旅行に出かけて昨日帰ってきて、さあ今日作るぞと意気込んで昼作り出したはいいけど恒星原板というのを繋ぎ合わせるところで面倒になって今になっても完成していないそんな工作が苦手なこんにちはどうも僕です。 今から頑張って作るから!! 完成したよ!ちょっとぼやけているけどなかなか素晴らしいよ。あ、あれは流れ星かな?(隙間です) ...貼り合わせた部分を半分切る ...

言い忘れた
Fri, Oct 7, 2005 11:51 PM

id:kyoumoeさんの日記の、のまネコのことを書いたエントリのコメント欄はとてもおもしろいので皆見るといいと思うよ!kyoumoeさんはすばらしいなあヽ(´ー`)ノ ((初めて顔文字使った)) というかチャンネルボーイがキーワード化されてるし!こらー

[web]のまネコ問題はもう終わりそう
Fri, Oct 7, 2005 11:51 PM

のまネコ問題ってのはいわずと知れたアレです。ある人がつくったO-ZONEのDragostea Din Tei(恋のマイヤヒ)という曲を使った映像作品が面白いというのでavexが目をつけて、映像作品の作者に許可を得てプロモーションに使ったところ、予想以上に反響が大きく、そして映像内に登場するネコが可愛いということでavexはグッズ展開することにしましたと。 でもそのネコに見えるものは、最初は特定の掲示板の人らに受けるようにインターネットで生まれた絵文字の「モナー」というキャラクターだったのだけども、CD ...