たまに18歳未満の人や心臓の弱い人にはお勧めできない情報が含まれることもあるかもしれない、甘くなくて酸っぱくてしょっぱいチラシの裏。RSSによる簡単な更新情報を利用したりすると、ハッピーになるかも知れませんしそうでないかも知れません。
の動向はもえじら組ブログで。
宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
僕はXHTMLのルビ(小さな字で読み仮名をふったりするアレ)を使いたくてXHTML 1.1を選択してるんですが、過去にXHTML2で検討されてたl要素(パラグラフより細かい単位の「行」を示すための物)やiframeやなんかをどうしても埋め込みたくなって、しかしそのせいでバリデータでエラーが出てしまうのも嫌だったので、見よう見まねで頑張って独自の文書型宣言を書いてみたんですよ。いつやったのか忘れたけど、結構前に。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [
<!ENTITY % XLINK.xmlns.attrib "xmlns:xhtml2 CDATA #FIXED 'http://www.w3.org/2002/06/xhtml2'">
<!ENTITY % Inline.extra "| xhtml2:l | iframe">
<!ELEMENT xhtml2:l (#PCDATA|br|span|em|strong|dfn|code|samp|kbd|var|cite|abbr|acronym|q|sub|sup|bdo|a|img|map|object|input|select|textarea|label|button|ruby|ins|del|script|noscript|xhtml2:l)*>
<!ATTLIST xhtml2:l
id ID #IMPLIED
class CDATA #IMPLIED
style CDATA #IMPLIED
title CDATA #IMPLIED>
<!ELEMENT iframe (#PCDATA|br|span|em|strong|dfn|code|samp|kbd|var|cite|abbr|acronym|q|sub|sup|bdo|a|img|map|object|input|select|textarea|label|button|ruby|ins|del|script|noscript|xhtml2:l)*>
<!ATTLIST iframe
id ID #IMPLIED
class CDATA #IMPLIED
style CDATA #IMPLIED
title CDATA #IMPLIED
longdesc CDATA #IMPLIED
src CDATA #IMPLIED
frameborder ( 1 | 0 ) '1'
marginwidth CDATA #IMPLIED
marginheight CDATA #IMPLIED
scrolling ( yes | no | auto ) 'auto'
height CDATA #IMPLIED
width CDATA #IMPLIED
>
]>
CGIを使ってIEにはこの文書型宣言を出さないようにしてますが、FirefoxとかChromeとかでトップページあたりを開いてソースを見れば、こういうのが頭にくっついてるのが分かると思います。
で、バリデータ的にはこれでvalidになったのでめでたしめでたしだったんですが、GeckoのDTDパーサ部分にバグがあるらしくて、この文書型宣言を正しく解釈してくれないんですよね。最後の]>
ではなくその前の>
の部分で文書型宣言が終わったものと見なされてしまうせいで、Firefoxでこのサイトのページを開くと、ページの頭に謎の]>
という文字列がくっついてしまう状態になってたのです。表示が崩れるのが嫌だったので、この]>
がテキストノードとしてページの頭に存在してる時は動的に削除するようなJavaScriptを書いて、長らくごまかしてました。
そしたら先日、W3CのHTML5のルビに関する議論の中で紹介されてたXHTMLルビサポートのページを見たという方(Leif Halvard Silliさん)がメールを下さいまして、以下のようなハックを使えばページの頭に謎の]>
が出てくる事を防げるよ、と教えてくれたんです。
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [
<!ENTITY % XLINK.xmlns.attrib "xmlns:xhtml2 CDATA #FIXED 'http://www.w3.org/2002/06/xhtml2'">
<!ENTITY % Inline.extra "| xhtml2:l | iframe">
<!ELEMENT xhtml2:l (#PCDATA|br|span|em|strong|dfn|code|samp|kbd|var|cite|abbr|acronym|q|sub|sup|bdo|a|img|map|object|input|select|textarea|label|button|ruby|ins|del|script|noscript|xhtml2:l)*>
<!ATTLIST xhtml2:l
id ID #IMPLIED
class CDATA #IMPLIED
style CDATA #IMPLIED
title CDATA #IMPLIED>
<!ELEMENT iframe (#PCDATA|br|span|em|strong|dfn|code|samp|kbd|var|cite|abbr|acronym|q|sub|sup|bdo|a|img|map|object|input|select|textarea|label|button|ruby|ins|del|script|noscript|xhtml2:l)*>
<!ATTLIST iframe
id ID #IMPLIED
class CDATA #IMPLIED
style CDATA #IMPLIED
title CDATA #IMPLIED
longdesc CDATA #IMPLIED
src CDATA #IMPLIED
frameborder ( 1 | 0 ) '1'
marginwidth CDATA #IMPLIED
marginheight CDATA #IMPLIED
scrolling ( yes | no | auto ) 'auto'
height CDATA #IMPLIED
width CDATA #IMPLIED
>
<?parser-hack ><!-- ?>
]>
<!--><?!-->
強調箇所がそのハック。処理命令(PHPのコード片を埋め込んだりするのに使うのと同じ奴)の記法でコメントとして解釈できる文字列を埋め込んで、問題の部分を無視させるという物のようです。バリデータに通しても、これでもvalidです。素晴らしいです。
同じような事をやってる酔狂な人がもしいたら役立てて欲しいと思ったので、氏に許可を得てエントリにさせて頂きました。Thanks a lot, Leif!
何故これがvalidなのかも考えてみよう。
<?parser-hack ><!-- ?>
><!--
という内容」を含んだ処理命令として解釈される。[
から]
までの間に登場しうる内容として処理命令も含まれている。そして、上記の箇所は一つの完結した処理命令である。よって、文書型宣言中に登場しても何ら問題ない。<!--><?!-->
><?!
という内容」を含んだコメントと解釈される。という具合で文法的には何も問題ないので、W3Cのバリデータはこれをvalidと判断する。きちんとXMLパーサを実装しているブラウザ上でも同様です。
一方、Geckoの解釈はどうか。これは「ソースを表示」での色分けを見るとよく分かる。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [
Geckoはまず、この部分だけで完結した文書型宣言と認識する。「[
」で終わりと判断したのではなくて、その次の <!ENTITY
が来た時点で「あ、もう文書型宣言は終わってたのね」と見なしてるようだ。
<!ENTITY ~>
<!ELEMENT ~>
<!ATTLIST ~>
この辺はすべて、それぞれ別々の宣言として解釈されている。という事で、
]>
何もハックをしない場合はこの部分だけが取り残されてしまって、Gecko的にはこれが「XML的には不正だけどSGML的にはアリ」なテキストノードとして扱われて、ゴミとして表示されてしまうわけだ。
では、ハック有りの場合はどうなるか。
<?parser-hack ><!-- ?>
]>
<!--><?!-->
Geckoはこれを3つのノードとして解釈している。
<?parser-hack >
まずGeckoは、これを1つの処理命令と判断する。XMLの仕様では ?>
が来るまで処理命令の終わりにはならないんだけど、Geckoのパーサは >
で処理命令が終わったものと見なしてしまう。
<!-- ?>
]>
<!-->
これは当然1つのコメントになる。
<?!-->
最後、これも <?
から >
までで1つの処理命令と見なされる。
という事で、ハック有りの時はどの文字もテキストノードとして取り残されずに済むので、画面上は何もゴミが表示されずに済む。
こんなのよく考えるなー、と、読み解いてみて改めて感心しました。
目が覚めたら14時でした。
勉強会本体の感想。
Firemacs作者の山本さんの話を聞いてると、以前の自分を思い出した。XPCOMにどんな機能があるのか知らなかった頃に、知ってる範囲の知識でどうにかして解決しようとあれこれ工夫を試みていた。そういう「工夫」を思い付くかどうか、というのが、もしかしたらある種の「分れ道」なのかもしれないなと思った。
marさんによるXUL preLoaderの話。
document.loadOverlay()
で動的に読み込む。……というのが、preLoaderの発想。preLoaderのような発想が僕に無かったのは、loadOverlay
というメソッドを知らなかった・存在を忘れてたからというのも大きいんだけど、それ以前に、他の拡張機能で同じ方法を使われて異なるIDを指定されてしまったらこのテクニックは破綻してしまう、ということに気づいていたからだ。僕は以前から、拡張機能を作るときは他の拡張機能となるべく衝突しないようにということに気を付けるようにしている(TBEの時はそれで散々叩かれたし)ので、preLoaderのテクニックはあまり推奨しづらい。
ところで、今ふと思ったんだけど。E4X使ったらJavaScriptの中に普通にXUL文書片を書けるから、preLoaderあんまりいらなくね?(ぉ
誕生日を祝ってもらえて、フォクすけは幸せ者ですね。僕もこれくらい愛されてみたいです。どうでもいいですが、ケーキの周りのフィルムについたクリームを舐め取っている様子をばっちり撮られてしまっていました。
Mozilla 24のための各プログラムの番宣ビデオ?の撮影があって、Shibuya.jsのビデオに僕まで出ることになってしまった、というかほとんど僕が喋ってた。幽霊部員なのに。あとで映像見てみても、ほんとキモイなーと思った。また叩かれるんだろうなあ。いやだなあ。
活用されてる例を知らないんだけど、XULもXMLだから、DTDでエンティティ参照使ってモジュール化できるんですよね。
<?xml version="1.0"?>
<!DOCTYPE page [
<!ENTITY button '<button label="button label"/>'>
<!ENTITY buttons '
&button;
&button;
&button;
&button;
'>
]>
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
&buttons;
</page>
せっかくだから何かに活用できないものかしらん。
追記。理由は知りませんが、MozillaではChrome URLで示された外部DTDファイルは読み込めません。なので、これはWeb上での話ではなく、拡張機能の開発の話って事で。
活用されてる例を知らないんだけど、XULもXMLだから、DTDでエンティティ参照使ってモジュール化できるんですよね。
<?xml version="1.0"?>
<!DOCTYPE page [
<!ENTITY button '<button label="button label"/>'>
<!ENTITY buttons '
&button;
&button;
&button;
&button;
'>
]>
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
&buttons;
</page>
せっかくだから何かに活用できないものかしらん。
追記。理由は知りませんが、MozillaではChrome URLで示された外部DTDファイルは読み込めません。なので、これはWeb上での話ではなく、拡張機能の開発の話って事で。
活用されてる例を知らないんだけど、XULもXMLだから、DTDでエンティティ参照使ってモジュール化できるんですよね。
<?xml version="1.0"?>
<!DOCTYPE page [
<!ENTITY button '<button label="button label"/>'>
<!ENTITY buttons '
&button;
&button;
&button;
&button;
'>
]>
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
&buttons;
</page>
せっかくだから何かに活用できないものかしらん。
追記。理由は知りませんが、MozillaではChrome URLで示された外部DTDファイルは読み込めません。なので、これはWeb上での話ではなく、拡張機能の開発の話って事で。
活用されてる例を知らないんだけど、XULもXMLだから、DTDでエンティティ参照使ってモジュール化できるんですよね。
<?xml version="1.0"?>
<!DOCTYPE page [
<!ENTITY button '<button label="button label"/>'>
<!ENTITY buttons '
&button;
&button;
&button;
&button;
'>
]>
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
&buttons;
</page>
せっかくだから何かに活用できないものかしらん。
追記。理由は知りませんが、MozillaではChrome URLで示された外部DTDファイルは読み込めません。なので、これはWeb上での話ではなく、拡張機能の開発の話って事で。
活用されてる例を知らないんだけど、XULもXMLだから、DTDでエンティティ参照使ってモジュール化できるんですよね。
<?xml version="1.0"?>
<!DOCTYPE page [
<!ENTITY button '<button label="button label"/>'>
<!ENTITY buttons '
&button;
&button;
&button;
&button;
'>
]>
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
&buttons;
</page>
せっかくだから何かに活用できないものかしらん。
追記。理由は知りませんが、MozillaではChrome URLで示された外部DTDファイルは読み込めません。なので、これはWeb上での話ではなく、拡張機能の開発の話って事で。
活用されてる例を知らないんだけど、XULもXMLだから、DTDでエンティティ参照使ってモジュール化できるんですよね。
<?xml version="1.0"?>
<!DOCTYPE page [
<!ENTITY button '<button label="button label"/>'>
<!ENTITY buttons '
&button;
&button;
&button;
&button;
'>
]>
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
&buttons;
</page>
せっかくだから何かに活用できないものかしらん。
追記。理由は知りませんが、MozillaではChrome URLで示された外部DTDファイルは読み込めません。なので、これはWeb上での話ではなく、拡張機能の開発の話って事で。
活用されてる例を知らないんだけど、XULもXMLだから、DTDでエンティティ参照使ってモジュール化できるんですよね。
<?xml version="1.0"?>
<!DOCTYPE page [
<!ENTITY button '<button label="button label"/>'>
<!ENTITY buttons '
&button;
&button;
&button;
&button;
'>
]>
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
&buttons;
</page>
せっかくだから何かに活用できないものかしらん。
追記。理由は知りませんが、MozillaではChrome URLで示された外部DTDファイルは読み込めません。なので、これはWeb上での話ではなく、拡張機能の開発の話って事で。
活用されてる例を知らないんだけど、XULもXMLだから、DTDでエンティティ参照使ってモジュール化できるんですよね。
<?xml version="1.0"?>
<!DOCTYPE page [
<!ENTITY button '<button label="button label"/>'>
<!ENTITY buttons '
&button;
&button;
&button;
&button;
'>
]>
<page xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
&buttons;
</page>
せっかくだから何かに活用できないものかしらん。
追記。理由は知りませんが、MozillaではChrome URLで示された外部DTDファイルは読み込めません。なので、これはWeb上での話ではなく、拡張機能の開発の話って事で。