2009-06-21

Web規格に関する批判的感想

XML

XML宣言のencodingは、無駄である。そもそも、ASCII互換ではない文字コードもあるし、一文字に対するバイト数が混在する文字コードもある。

document type宣言も、無駄である。

DTDは、およそ設計されうるschemaの中で、最悪の物だ。だからこそ、多くの独自schemaが生まれた。DTDは、実態参照のためぐらいにしか使わない方がいいだろう。

xml:lang属性は無駄である。確かに標準の属性はあってもいいかもしれないが、明確に言語を指定したい場合以外は、無駄でしかない。なぜなら、文章中に複数の言語が混じることはよくあることだからだ。

W3C規格の最近の過ち

モジュール化は、大いなる過ちである。すべての環境でサポートされている機能でなければ、使いたいとは思わない。これはWebに限らず当てはまる。DirectXの歴史なんて、ひどい物だった。

現実に即していない機能が多すぎる。例えば、現実に使われているCSSのselectorを見れば、その机上の空論が分かると思う。最近は、二つ以上の実装がないと勧告しないようにしているらしい。まあ、多少はマシだろう。

そのくせ、本当に欲しい機能は、直接に規定されていないという事実。なぜマウスイベントにoffsetX, offsetY相当の機能がないのだ。

XHTML

document type宣言でどの規格を使用するか宣言すること。あれは失敗だった。

HTML5

HTMLとDOMをごっちゃにしていること。間違っている。なぜみなHTML5を使いたいかというと、HTML5にvideoやaudioやcanvasがあるからだ。あくまで使いたい機能があるからであって、規格が優れているからではない。実際、canvasの設計は、あまり褒められた物ではないと思う。とくに、行列周りは、個人的に好かない。なんで演算が逆順なんだよ。ふざけているのか。

2009-06-20

芋粥

芋粥といえば、芥川竜之介の芋粥が有名だ。しかし、あれは駄作である。芥川竜之介は、古典を曲解すること甚だしく、全然、別の物語になってしまっている。むしろその解釈の違いが狙いだという肯定的な意見もあるが、それは、芥川竜之介というのが天才だったという世間の評価に影響されての弁護に過ぎない。第一、今昔物語や宇治拾遺物語を見れば分かるように、芥川竜之介は、両書に共通して出てくる、ある重要な事柄を一つ、書き漏らしている。これだけをもって、芥川竜之介は古典を尊重していないと結論するに足る。

ところで、芋粥とは何ぞや。これは、山芋を甘葛のシロップで煮込んだお粥のことらしい。この話を真に理解するため、私は芋粥を作ることにした。

まず材料だが、山芋というのは、手に入りにくい。どうやら、山芋は栽培が難しいらしい。したがって、普通に売っている山芋は、かなり値が張る。そこで、今回は長芋を用いることにした。これなら安い。
山芋は、高いとはいえ、入手はさほど難しくない。問題は甘葛だ。甘葛というのは、当時の甘味料のことだ。値段以前の問題で、まず、売っている場所を見つけるのが難しい。そこでしかたなく、砂糖を使うことにした。当時から考えれば、結晶の状態の糖なんて、夢のような甘味料だったに違いない。それこそ甘葛など比べものにならない、伝説の物質と云ってもいい代物だ。どこのスーパーでも、キロ単位で売っている今となっては、全くありがたみがないのだけれど。

長芋を薄く切り、茶碗一杯分食べ残していたご飯に、砂糖をガバガバ入れて、煮込んだ。

私は、砂糖を入れた粥などというものは、生まれてこの方食べたことがない。果たしてウマいのであろうか。

まずい。いやになるぐらいまずい。確かに、米と砂糖の相性は悪くない。しかし、やはり甘ったるい。これはチョコレートや清涼飲料水の甘さと違い、とても不快な甘ったるさがある。とてもじゃないが、飽きるほど食べたいものではない。さらにひどいことに、長芋は、大量の砂糖で煮込んでも、全く甘くならない。つまり、甘ったるい米の中に、全然甘くない芋が混在しているのだ。これは最悪だ。

五位が一盛りをだにえ喰わずなりける理由が、明らかに実感できる。これはダメだ。体が受け付けない。なるほど、五位は日頃の望みが叶ってしまって幻滅したわけではなかったのだ。単に甘ったるい物にうんざりしただけだろう。当時は今と違い、ハッキリとした甘い物が貴重であったにせよ、味覚は、昔の人も今の人も、変わっていないはずだ。とするならば、当時、この甘い粥を食べても、うんざりしたことであろう。これは「飽きる」という言葉で表されべき感覚ではない。とにかく最悪だ。

今昔物語、第二十六巻第十七話
利仁将軍若き時、京より敦賀に五位を将て行く語

今昔、利仁の将軍と云人有けり。若かりける時は、□□と申ける。その時の一の人の御許に、恪勤になん候ける。越前国に、□の有仁と云ける勢徳の者の聟にてなん有ければ、常に彼国にぞ住ける。

而る間、其主の殿に、正月に大饗被行けるに、当初は大饗畢ぬれば、取食と云者をば追て不入して、大饗の下をば、其殿の侍共なん食ける。それに、其殿に、年来に成て所得たる五位侍有けり。其大饗の下、侍共の食ける中に、此五位、其座にて暑預粥を飲て舌打をして、「哀れ、何かで暑預粥に飽かん」と云ければ、利仁此を聞て、「大夫殿、未だ暑預粥に飽せ不給か」と云へば、五位、「未だ不飽侍」と答ふ。利仁、「いで、飲飽せ奉らばや」といへば、五位「何に喜ふ侍ん」と云て止ぬ。

其後、四五日計有て、此五位は殿の内に曹司住にて有ければ、利仁来て、五位に云く、「去来させ給へ、大夫殿。東山の辺に湯涌して候ふ所に」と。五位、「糸喜く侍る事哉。今夜身の痒かりて、否寝入不侍つるに。但し、乗物こそ侍らね」と云へば、利仁、「此に馬は候ふ」といへば、五位、「穴喜」と云て、薄綿の衣二つ計、青鈍の指貫の裾壊たるに、同色の狩衣の肩少し落たるを着て、下の袴も着ず、鼻高なる者の、鼻崎は赤にて、穴の移り痛く湿ばみたるは、洟を糸も巾ぬなめりと見え、狩衣の後は、帯に被引喎たるを、引も不は、喎乍らあれば、可咲ども、五位を前に立てヽ、共に馬に乗て、川原様に打出て行。五位の共には、賤の小童だに無し。利仁が共にも、調度一人、舎人男一人ぞ有ける。

然て、川原打過て、粟田口に懸るに、五位、「何こぞ」ととへば、利仁、「只此也」とて、山科も過ぬ。五位、「近き所とて、山科も過ぬるは」といへば、利仁、「只彼計也」とて、関山も過て、三井寺に知たりける僧の許に行着ぬ。五位、「然は此に湯涌たりけるか」とて、其をだに、「物狂はしく遠かりける」と思ふに、房主の僧、「不思懸」と云て経営す。然ども、湯有り気も無し。五位、「何ら、湯は」といへば、利仁、「実には、敦賀へ将奉る也」と云ば、五位、「糸物狂はしかりける人哉。京にて此く宣はましかば、下人なども具すべかりける者を。無下に人も無て、然る遠道をば、何かで行んと為ぞ。怖し気に」といへば、利仁疵咲て、「己れ一人が侍るは、千人と思せ」と云ふぞ理なるや。此て物など食つれば、急ぎ出ぬ。利仁、其にてぞ胡録取て負ける。

然て、行程に、三津の浜に狐一つ走り出たり。利仁、此を見て、「吉使出来にたり」と云て、狐を押懸れば、狐、身を棄て逃といへども、只責に被責て、否不逃遁を、利仁、馬の腹に落下て、狐の尻の足を取て引上つ。乗たる馬、糸賢しと不見ども、極き一物にて有ければ、幾も不延さ。五位、狐を捕へたる所に馳着たれば、利仁、狐を提て云く、「汝ぢ狐、今夜の内に、利仁が敦賀の家に罷て云む様は、『俄に客人具し奉て下る也。明日の巳時に、高島の辺に男共迎へに、馬二疋に鞍置て、可詣来』と。此を不云は、汝狐、只試よ。狐は変化有者なれば、必ず今日の内に行着ていへ」とて放てば、五位、「広量の御使哉」といへば、利仁、「今御覧ぜよ。不罷では否有じ」と云に合、狐実に見返前に走て行、と見程に失ぬ。

然て、其夜は道に留ぬ。朝に疾く打出て行程に、実に巳時計に、二三十町計凝て来る者有り。何にか有んと見るに、利仁、「昨日の狐、罷着て告侍にけり。男共詣来にたり」といへば、五位、「不定の事哉」と云程に、只近に近く成て、はらと下るまヽに云く、「此見よ、実御ましたりけり」といへば、利仁、頰咲て、「何事ぞ」と問へば、長しき郎等進来たるに、「馬は有や」と問へば、「二疋候ふ」とて、食物など調へて持来れば、其辺に下居て食ふ。

其時に、有つる長しき郎等の云く、「夜前、希有のことこそ候しか」と。利仁、「何事ぞ」と問へば、郎等の云く、「夜前、戌時計に、御前の、俄に胸を切て病せ給ひしかば、何なる事にかと思ひ候ひし程に、御自ら被仰様、『己は、別の事にも不候此昼三津の浜にて、殿の俄に京より下らせ給けるに、会奉たりつれば、逃候つれども、否不逃得で被捕奉たりつるに、被仰る様、『汝、今日の内に我家に行着て、云ん様は、客人具し奉てなん俄に下るを、明日の巳時に、馬二疋に鞍置て、男共高島の辺りに参り合へ、といへ、若、今日の内に行着て不云は、辛き目見せんずるぞ』と被仰つる也。男共、速に出立て参れ。遅く参ては、我勘当蒙なん』とて、怖じ騒せ給つれば、『事にも候ぬ事也』とて、男共に召仰候つれば、立所に例様に成せ給て、其後、鳥と共に参りつる也」と。利仁、此を聞て頰咲て、五位に見合すれば、五位、奇異と思たり。

物など食畢て、急立て行程に、暗にぞ家に行着たる。「此みよ。実也けり」とて、家の内騒ぎ喤る。五位馬より下て家の様を見に、脺はヽしき事物に不似。本着たりし衣二つが上に、利仁が宿直物を着たれども、身の内し透たりければ、極く寒気なるに長櫃に火多く□□て、畳厚く敷たるに、菓子食物など儲たる様微妙也。「道の程寒く御ますらん」とて、練色の衣の綿厚を、三つ引重て打覆たれば、楽と云ば愚也や。

食喰などして静りて後、舅の有仁出来て、「此は何に、俄には下せ給せて、御使の様物狂はしき。上俄病給ふ、糸不便の事也」といへば、利仁、打咲て、「試むと思給へて申たりつる事を、実に詣来て、告候ひけるにこそ」といへば、舅も咲て、「希有の事也」とて、「抑も、具し奉らせ給ひたなる人とは、此御ます殿の御事か」とヽへば、利仁、「然に候。暑預粥に未不飽と被仰れば、飽せ奉らんとて将奉たる也」といへば、舅、「安き物にも飽せ不給ける哉」とて戯るれば、五位、「東山に湯涌たりとて、人を謀出て、此く宣ふ也」などいへば、戯れて、夜少し深更ぬれば、舅も返入ぬ。

五位も、寝所と思しき所に入て寝むと為るに、其に綿四五寸計有直垂有。本の薄は六借く、亦何の有にや、痒き所出来にたれば、皆脱棄て、練色の衣三が上に、此直垂を引着て臥たる心地、未だ不習に、汗水にて臥したるに、傍に人の入気色有。「誰そ」と問へば、女音にて、「御足参れと候へば、参り候ひつる」と云気ひ不ば、掻寄て、風の入所に臥せたり。

而る間、物高く云音は何ぞと聞ば、男の叫て云様、「此辺の下人承はれ。明旦の卯時に、切口三寸、長さ五尺の暑預、各一筋づヽ持参れ」と云也けり。奇異くも云哉と聞て寝入ぬ。未だ暁に聞ば、庭に筵敷音す。何態為にか有むと聞に、夜暁て蔀上たるに、見れば、長筵をぞ四五枚敷たる。何の料にか有むと思ふ程に、下衆男の、木の様なる物を一筋打置て去ぬ。其後、打次き持来つヽ置を見れば、実に口三四寸計の暑預の長さ五六尺計なるを、持来て置。巳時まで置たれば、居たる屋計に置積つ。夜前叫びしは、早ふ、其辺に有下人の限りに物云ひ聞する。人呼の岳とて有、墓の上にして云也けり。只、其の音の及ぶ限の下人共の持来るだに、然計多かり。何況や、去たる従者共の多さ、可思遣。

奇異と見居たる程に、斛納釜共五つ六ほど掻持来て、俄に杭共を打て居へ渡しつヽ、何の料ぞと見程に、白き布のと云物着て、中帯して、若やかに穢気無き下衆女共の、白く新き桶に水を入て持来て、此釜共に入る。何ぞの湯涌すぞと見れば、此水と見は味煎也けり。亦、若き男共十余人計出来て、袪より手を出して、薄き刀の長やかなるを以て此の暑預を削つヽ撫切に切る。早ふ、暑預粥を煮也けり。見に、可食心地不為、返ては踈しく成ぬ。さらと煮返して、「暑預粥出来にたり」と云へば、「参らせよ」とて、大きなる土器して、銀の提の斗納計なる三つ四つ計に汲入て、持来たるに、一盛だに否不食で、「飽にたり」と云へば、極く咲て集り居て、「客人の御徳に暑預粥食」など云ひ嘲り合へり。

而る間、向ひなる屋の檐、狐指臨き居たるを、利仁見付て、「御覧ぜよ、昨日の狐の見参するを」とて、「彼れに物食せよ」と云へば、食はするを打食て去にけり。

此て、五位、一月計有に、万づ楽き事無限。然て、上けるに、仮・納の装束数下調へて渡しけり。亦、綾・絹・綿など皮子数に入て取せたりけり。前の衣直などは然也。亦、吉馬に鞍置て牜など加へて取せければ、皆得、富て上にけり。

実に、所に付て、年来に成て被免たる者は、此る事なん自然ら有ける、となん語り伝へたるとや。

宇治拾遺集、利仁芋粥事

今は昔、利仁の将軍のわかゝりけるとき、そのときの一の人の御もとに格勤して候けるに、正月に大饗せられけるに、そのかみは、大饗はてゝ、とりばみと云ふものを拂いて入れずして、大饗のおろし米とて、給仕したる格勤の者どもの食けるなり。その所に年比になりて、給仕したる者の中にはところえたる五位ありけり。そのおろし米の座にて、芋粥すゝりて、舌うちをして、「あはれいかで芋粥にあかむ」と云ひければ、利仁、これを聞きて、「太夫殿、いまだ芋粥にあかせ給はずや」と問ふ。五位、「いまだあき侍らず」といへば、「あかせたてまつりてんかし」といへば、「かしこく侍らん」とてやみぬ。

さて四五日ばかりありて、曹司住みにてありける所へ、利仁きていふやう、「いざゝせ給へ、湯あみに、太夫殿」といへば、「いとかしこき事かな。こよひ身のかゆく侍つるに乗物こそは侍らね」といへば、「こゝにあやしの馬ぐして侍り」といへば、「あなうれし〱」といひて、うすわたのきぬ二計に、青鈍の指貫のすそ破(や)れたるに、おなじ色のかり衣の肩すこしおちたるに、したの袴も着ず、鼻だかなるものの、さきはあかみて、あなのあたりぬればみたるは、すゝ鼻をのごはぬなめりと見ゆ。狩衣のうしろは、おびに引ゆがめられたるまゝに、引もつくろはねば、いみじうみぐるし。 をかしけれども、さきにたてゝ、われも人も馬にのりて、河原ざまにうち出ぬ。五位の共には、あやしの童だになし。利仁が共には、調度懸、舎人、雑色ひとりぞありける。河原うち過て、粟田口にかゝるに、「いづくへぞ」と問へば、「たゞこゝぞここぞ」とて、山科もすぎぬ。「こはいかに、こゝぞ\/とて、山しなも過しつるは」といへば、「あしこ〱」とて、関山も過ぬ。「こゝぞ〱」とて、三井寺にしりたる僧のもとにいきたれば、こゝに湯わかすかと思ふだにも、物ぐるおしう遠かりけりと思に、こゝにも、湯ありげもなし。「いづら、湯は」といへば、「まことは敦賀へ率(ゐ)て奉る也」といへば、「物ぐるほしうおはしける。京にて、さとの給はましかば、下人なども具すべかりけるを」といへば、利仁、あざわらひて、「利仁ひとり侍らば、千人とおぼせ」といふ。かくて、物など食ていそぎいでぬ。そこにて利仁やなぐひとりて負ひける。

かくてゆく程に、みつの濱に、狐の一、はしり出たるをみて、「よき使出来たり」とて、利仁、狐をゝしかくれば、狐、身をなげて迯れども、をひせめられて、えにげず。おちかゝりて、狐の尻足を取て引あげつ。乗たる馬、いとかしこしともみえざりつれども、いみじき逸物にてありければ、いくばくものばさずしてとらへたるところに、この五位走らせて行つきたれば、狐を引あげていふやうは、「わ狐、こよひのうちに、利仁が家のつるにまかりていはんやうは、「にはかに客人をぐし奉りてくだる也。明日の巳の時に、高嶋邊に、をのこ共むかへに、馬にくらをきて、二疋ぐしてまうで来」といへ。もしいはぬ物ならば、わ狐、たゞ心みよ。狐は変化あるものなれば、けふのうちに行つきていへ」とてはなてば、「荒凉の使哉」といふ。「よし御覧ぜよ。まからでは世にあらじ」といふに、はやく狐見返し〱て、前に走り行。「よくまかるめり」と云にあはせて、走先立ちてうせぬ。

かくて、その夜は道にとゞまりて、つとめてとく出て行ほどに、誠に巳時ばかりに、卅騎ばかりよりてくるあり。なにゝかあらんとみるに、をのこどもまうできたりといへば、不定のことかなといふほどに、唯近にちかくなりてはら〱とおるゝほどに、「これ見よ。まことにおはしたるは」といへば、利仁うちほゝえみて何ごとぞとゝふ。おとなしき郎等すゝみきて、「希有の事の候つるなり」といふ。まづ、「馬はありや」といへば、 「二疋さぶらふ」といふ。食物などして来ければ、そのほどにおりゐてくふつゐでに、おとなしき郎等のいふやう、「夜べけうのことのさぶらひしなり。戌の時ばかりに臺盤所の、むねをきりにきりてやませ給しかば、いかなることにかとて、にはかに僧めさんなど、さはがせ給しほどに、てづから仰さぶらふやう、「なにかさはがせ給。おのれは狐なり。別のことなし。この五日、みつの濱にて、殿の下らせ給つるにあひたてまつりたりつるに、逃げつれど、え逃げで、とらへられ奉りたりつるに、「けふのうちにわが家にいきつきて、客人ぐし奉りてなんくだる。あす巳時に馬二にくらをきてぐしてをのこども高島の津にまいりあへといへ。もしけふのうちにいきつきていはずば。からきめみせんずるぞ」とおほせられつるなり。をのこどもとくとく出立てまいれ。をそくまいらば。我は勘当かうぶりなん」とおぢさはがせ給つれば、をのこどもにめしおほせさぶらひつれば、例ざまにならせ給にき。その後鳥とともに参さぶらひつるなり」といへば、利仁、うちえみて、五位に見あはすれば、五位あさましと思たり。物などくひはてゝいそぎたちてくら〲に行つきぬ。」これ見よ。まことなりけり」とあざみあひたり。

五位は馬よりおりて家のさまをみるに、にぎはしくめでたきこと物にもにず、もと着たる衣(きぬ)二がうへに、利仁が宿衣をきせたれども、身の中しすきたるべければ、いみじう寒げに思ひたるに、ながすびつに火をおほふおこしたり。 たゝみあつらかにしきて、くだ物くひ物しまうけて、たのしくおぼゆるに、「道の程さむくおはしつらん」とて、ねり色の衣(きぬ)の綿あつらかなる、三ひきかさねてもてきて、うちおほひたるに、たのしとはおろかなり。物くひなどして、ことしづまりたるに、しうとの有仁、いできていふやう、「こはいかで、かくはわたらせ給へるに、これにあはせて御使のさま物ぐるおしうて、うへ、にはかにやませたてまつり給ふ。けうの事なり」といへば、利仁うちわらひて、物の心みんとおもひてしたりつる事を、まことにまうできて、つげて侍るにこそあんなれ」といへば、しうともわらひて、「希有のことなり」といふ。「具し奉らせ給つらん人は、このおはします殿の御事ぞ」といへば、「さに侍り、「芋粥にいまだ飽かず」と仰せらるれば、飽かせ奉らんとて、率てたてまつりたる」といへば、「やすき物にも、えあかせ給はざりけるかな」とて、たはぶるれば、五位、「東山に湯わかしたりとて、人をはかりて、かくの給なり」など、いひたはぶれて、夜すこしふけぬれば、しうとも入ぬ。寝所とおぼしきところに、五位入てねんとするに、綿四五寸ばかりあるひたゝれあり。我もとのうすわたはむつかしう、何のあるにか、かゆき所もいでくるきぬなれば、ぬぎをきて、ねり色のきぬ三がうへに、このとのゐ物ひき着ては、臥したる心、いまだならはぬに気もあげつべし。あせ水にて臥したるに、又、かたはらに人のはたらけば、「たぞ」とゝへば、「「御あしたまへ」と候へば、参りつる也」といふ。けはひにくからねば、かきふせて、風のむく所にふせたり。かゝるほどに、物たかくいふこゑす。何事ぞときけば、をのこのさけびていふやう、「このへんの下人、うけたまはれ。あすのうの時に、切口三寸、ながさ五尺の芋、おの〱一すぢづゝもてまいれ」といふ也けり。あさましうおほのかにもいふものかなと、きゝてねいりぬ。あかつき方にきけば、庭に莚しくをとのするを、なにわざするにかあらんときくに、こやたうばんよりはじめて、おきたちてゐたるほどに、蔀あけたるに、みれば、ながむしろをぞ、四五枚しきたる。なにの料にかあらんとみるほどに、げす男の、木のやうなる物をかたにうちかけて来て、一すぢをきていぬ。その後、うちつゞきもてきつゝをくをみれば、まことに口三寸ばかりのいもの、五六尺ばかりなるを、一すぢづゝもてきてをくとすれど、巳のときまでをきければ、ゐたる屋とひとしくをきなしつ。夜べさけびしは、はやうそのへんにある下人の限りに物いひきかすとて、人よびの岡とて、あるつかのうへにていふなりけり。たゞそのこゑの及ぶかぎりのめぐりの下人のかぎりもてくるにだに、さばかりおほかり。ましてたちのきたる従者どものおほさをおもひやるべし。あさましとみたるほどに、五石なはのかまを五六舁もてきて、庭にくゐどもうちて、すへわたしたり。何の料ぞとみるほどに、しぼぎぬのあをといふもの着て、帯して、わかやかにきたなげなき女どもの、しろくあたらしき桶に水を入て、此釜どもにさくさくといる。何ぞ湯わかすかとみれば、この水とみるはみせんなりけり。わかきをのこどもの、袂より手出したる、うすらかなる刀のながやかなるもたるが、十余人ばかりいできて、このいもをむきつゝ、すきゞりにきれば、はやく芋粥煮る也けりとみるに、くふべき心ちもせず、かへりてはうとましく成にけり。さら〱とかへらかして、「芋粥いでまうできにたり」といふ。「まいらせよ」とて、先、大なるかはらけ具して、かねの提の、一斗ばかり入ぬべきに、三四に入て、「かつ」とてもてきたるに、飽きて、一もりをだにえ食はず。あきにたりといへば、いみじうわらひてあつまりてゐて、「客人殿の御とくにいもがゆくひつ」といひあへり。かやうにする程に、向のながやの軒に、狐のさしのぞきてゐたるを、利仁見付て、「かれ御らんぜよ。候し狐の見参するを」とて、「かれに物くはせよ」といひければ、くはするにうちくひてけり。

かくてよろづのこと、たのもしといへばをろかなり。一月ばかりありて、のぼりけるに、けおさめのさうぞくどもあまた具たり。 又、たゞの八丈わたぎぬなど、皮子どもに入てとらせ、はじめの夜の直垂はたさらなり、馬にくらをきながらとらせてこそ送りけれ。

きう者なれども所につけて年比になりてゆるされたる物は。 さるものゝをのづからあるなりけり。

2009-06-19

javascript 5thの機能

Javascript 5thのドラフト規格を流し読みしてみた。それほど大きな変更は無い。最も大きな変更は、strict modeだと思われる。これは、一部のあまりにも動的なコードを制限する機能のことだ。ひとつのコードの中にstrict modeと、動的で危険なコードを、混在できる。strict modeのコードでなくても、プロパティを付け加えたり消したりするの防ぐする機能などが入っている。

他には、JSONをネイティブにサポートすることや、ライブラリへの細かな変更などだろうか。SetterやGetterは、すでにサポートしているブラウザが多いとはいえ、果たしてそれほど使われるのだろうか。

実際、文法上は、何も変わっていない。だから、いますぐstrict modeで書くことも出来る。

C++一辺倒だったので、もっと動的な言語を学ぼうとしてjavascriptに入ったが、しかし、あまりにも動的過ぎるような気がする。文法が単純なのは、うらやましい限りだが。

なんにしても、言語は複数知っておくべきだと実感した。JavascriptもJavascriptで面白い。

2009-06-18

DOM level 3のマウスイベントにおけるカーソル位置の詳細

マウスイベントは、DOM level 3で定義されている。問題は、規格の定義が曖昧で、ブラウザの実装が救いがたいぐらい異なっているということだ。ここでは、マウスの位置を取得する方法を、完璧に解説しようと思う。とくに、canvasを使うにあたっては、マウスカーソルの位置を取得することは重要だ。

座標とは何か

ここで私の言う座標とは、ある点を(0,0)と置いた場合の、その点からの位置(x,y)のことである。ただし、右下が正になる。これはコンピューターの世界では、一般的な座標系である。では、その基準となるべき「ある点」とはどこか。これが問題である。

次のようなコードを考える。

var mouse_event_listener =
{
        handleEvent : function(event)
        {
                //ここにコードが記述される
        }
} ;

これは、DOM level 3 Eventに準拠するイベントリスナーの、Javascriptによる実装である。このコードをベースに、マウスカーソルの位置を取得したい。

スクリーン座標

var x = event.screenX ;
var y = event.screenY ;

スクリーン座標は、コンピュータのディスプレイの左上を原点とする座標系である。screenX, screenY属性で取得できる。Javascritpでは、同名のプロパティとして実装されている。しかし、これは、現実的には、何の役に立たない。ブラウザ自体がディスプレイのどの位置にいるのかがわからないので、画面上の位置を知ったところで、何にもならないからだ。

ウインドウ座標

var x = event.clientX ;
var x = event.clientY ;

ウインドウ座標とは、現在のブラウザのウインドウの、ドキュメントを表示している部分の左上原点とした座標である。問題は、ウインドウは、必ずしもドキュメント全体を表示するとは限らない。スクロールと呼ばれるUIによって、ドキュメントの一部だけを表示しているかもしれない。

ドキュメント座標

これは、ドキュメント全体に対する座標である。ウインドウ座標が、ドキュメントをすべて表示している場合と考えてもいい。理想は、この座標だ。問題は、この座標を、クロスブラウザな実装で得るのが不可能に近いということだ。これについては最後に解説する。

ある要素からの相対座標

HTML5のcanvasを使う場合、そのcanvas要素の左上を原点とした座標での、マウスカーソルの位置が知りたい場合がよくある。というのも、canvasを使う以上、通常のマークアップ言語を離れた、特殊な描画がしたいのだから、これ自体は不思議ではない。問題は、その方法だ。一体どうすれば、この座標を得られるのだろう。以下に列挙する。

offsetX/offsetY

var x = event.offsetX ;
var y = event.offsetY ;

多くのブラウザで、MouseEvent インターフェースには、offsetXとoffsetYが定義されている。これは、まさに欲している、イベント要素からの相対座標である。問題は、W3Cの規格では定義されていないことと、さらにひどいことに、ブラウザ間で、微妙に異なる実装をしている。そもそも、その要素からの相対座標といっても、具体的にどこを原点とした座標なのか、ということだ。規格では、padding boxの左上を原点としている。ところが、ブラウザによって、原点の取り方が異なる。

IE8は、完璧な実装をしている。
Firefoxでは、サポートしていない。
Safari、Chrome、Konqueror、では、border boxの左上を原点としている。
Operaでは、content boxの左上を原点としている。

ブラウザ間で差異があり、W3C規格で未定義で、Firefoxでサポートしていないことに目をつぶれば、一応この機能は使える。実際に使う際には、要素のpaddingを0pxに設定しておいたほうがいいだろう。

layerX/layerY

var x = event.layerX ;
var y = event.layerY ;

Firefoxのみがサポートしている独自規格で、offsetX、offsetYと機能は同じである。W3C規格には載っていないし、Firefox以外にサポートしているブラウザもない。

ドキュメント座標から、要素への相対座標を得る

今、何らかの方法で、マウスカーソルのドキュメント座標が得られたとする。ここから要素への相対座標を得ることは、可能である。イベントリスナーが登録されている要素からの相対座標を得たいとする。Eventインターフェースには、target属性があり、これを使えば、イベントリスナーが登録されている要素が得られる。Elementインターフェースは、CSSOM View Moduleに定義されているように、offsetLeftと、offsetTop属性を持っている。問題は、これは、親要素からのオフセットだということだ。ある要素の親要素には、さらに親要素が存在する可能性がある。したがって、body要素まで延々と親要素をたどっていかなければならない。いま、x, yにドキュメント座標が入っているとすると、そのコードは以下のようになる。

for ( var p = event.target ; p !== null ; p = p.offsetParent )
{
        x -= p.offsetLeft ;
        y -= p.offsetTop ;
}

body要素のoffsetParentはnullを返すと規定されているので、このコードで、親要素を延々とたどって、相対座標を計算できる。

ドキュメント座標を得る方法

さて、いよいよ本題の、ドキュメント座標を得る方法について解説する。ドキュメント座標が得られれば、上記のoffsetを引くループで、相対座標が得られる。ただし、これがなかなか難しい。

pageX/pageY

var x = event.pageX ;
var y = event.pageY ;

これは、W3C規格では定義されていない。しかし、IE以外の主要なブラウザすべてでサポートされている。これはまさに、ドキュメント座標が得られる。

ウインドウ座標にスクロール分を加算する

// it only worked on webkit.
var x = event.clientX + document.body.scrollLeft ;
var y = event.clientY + document.body.scrollTop ;

// it's worked on Firefox and Opera, but not for webkit.
var x = event.clientX + document.documentElement.scrollLeft ;
var y = event.clientY + document.documentElement.scrollTop ;

// I think this is the perfect solution. but for unknown reason, failed at both Firefox and Opera.
var x = event.clientX + document.getElementsByTagName("body").item(0).scrollLeft ;
var y = event.clientY + document.getElementsByTagName("body").item(0).scrollTop ;

もういやだ。一体body要素のElementインターフェースはどうやって取得すればいいのか。歴史的に、document.bodyが使われてきた。ところが、DOM level 2では、document.documentElementが定義され、かなりのブラウザがそちらに移った。そして、document.bodyが動かなくなった。quirks modeかどうかで、この挙動を変えるブラウザが存在することも、頭を悩ませる。また、HTML5では、document.bodyが規格に入っている。だから、HTMLとDOMを統合したHTML5ならば、document.bodyが正しいということになるし、それ以外なら、DOM level 2の定めるところにより、document.documentElementが正しいといえるのだろう。しかも、たいていのブラウザでは、動かないだけで、実際にはどちらも定義されているので、未定義かどうかでブランチすることも出来ない。したがって、ウインドウ座標からスクロール分を加算してドキュメント座標を得る手法では、ブラウザのブランチが必要不可欠になってしまう。

ところで、三番目のコードは、私としては、正しく動くと期待していたのだが、なぜかwebkit系のブラウザ(SafariとChrome)でしか動かない。もうわけが分からない。

参考

Document Object Model (DOM) Level 3 Core Specification
Document Object Model (DOM) Level 3 Events Specification
CSSOM View Module
HTML5
Javascript Madness: Mouse Events
Javascript - Event properties
Mission Impossible - mouse position | evolt.org
W3C DOM Compatibility - CSS Object Model View

追記:コメント欄より、 CSSOM View ModuleのgetBoundingClientRect()を使う。
基本的に理想主義者の私は、まず先に参考にするのは規格書なので、getBoundingClientRect()の存在は知っていたが、どうもその解説が複雑で、まじめに読む気にならなかった。さて、思い直して読んでみたところ、これはなかなか面白いものだ。これをまじめに解説した日本語の情報がWebあるかどうか、ふとググってみたところ、なかった。そこで、解説してみることにする。

getBoundingClientRect()の仕様を説明するには、まず、getClientRects()を説明しなければならない。これらの二つは、どちらもElementViewインターフェースで定義されており、DOM level 3では、すべてのElementは、ElementViewインターフェースを実装していなければならない。

getClientRects()は、その要素の子のボーダーボックス領域のリストを返す。getBoundingClientRect()は、getClientRects()の戻り値のリストから計算して、TextRectangleを返す。言い換えれば、その要素の領域だ。

重要な事は、これがviewportに対する相対座標だということだ。つまり、event.clientX/Yとは、同じ座標系ということになる。これで、マウスカーソルの、その要素に対する相対座標が得られる。

うれしいことに、これはほとんどのブラウザで動く。有名なquirksmode.orgのW3C DOM Compatibility - CSS Object Model Viewによれば、IE7以前で、2ピクセルずれるとか、Firefoxは結果を丸めないとか、些細な違いがあるが、それはそのブラウザのバグで、私の知ったことではないし、他の悲惨な方法に比べれば、実に他愛ない違いである。

var x = event.clientX ;
var y = event.clientY ;
var rect = event.target.getBoundingClientRect() ;
        
x -= rect.left ;
y -= rect.top ;

これで、この前のHTML5のCanvasの使ったデモは、規格を正しく実装しているどんなブラウザでも動くようになった。

最悪のコンピューター

Fifteen Classic PC Design Mistakes | Technologizer

これはひどい。

DOM mouse eventの座標がカオスだ

Mouse position

マウスイベントが飛んでくるのはいい。だが、canvasにおいて、座標系がまるで使い物にならない。DOM level 2、level 3のEventにおける定義では、screenX/Yと、clientX/Yが使える。screenのコンピューターの画面全体における座標なので、あまり必要ない。clientの方は、ブラウザのウインドウ全体における座標だ。

欲しいのは、そのマウスイベントが発生したElement上での相対座標だ。これを求める方法は、W3Cの規格だけでは実装できない。

あるElementの左上の座標を求めるプロパティはある。しかし、そのElementの親Elementからの相対座標なので、結局、bodyまでさかのぼらなければならない。激しく面倒だ。

前回のcanvasを使ったコード、どうしてもすべてのブラウザをサポートする、workaroundの無いコードがかけない。現在、Operaでうまく動かない。どうも、Operaでは、ScrollTopやScrollLeftが0を返す。ベータバージョンを使っているからだろうか。とにかくブラウザ間の互換性の無さにだけはあきれ返る。

とりあえず、マウスイベントのclientXとclientYを、relativeな座標に直す関数を書いてみた。

function computeRelativePosition(event)
{
        var ret = { x : event.clientX, y : event.clientY + document.body.scrollTop } ;
        for ( var p = event.target ; p !== null ; p = p.offsetParent )
        {
                ret.x -= p.offsetLeft ;
                ret.y -= p.offsetTop ;
        }

        return ret ;
} ;

HTML5のcanvasを使ってみた

Canvasを使っているのでRSSリーダーからは見れないと思います。

マウスイベントのclientXとclientYは、クライアント座標であって、canvasの左上を(0,0)とした座標ではないので、四角形を出現させる位置がずれていた。、offsetTopとoffsetLeftを使って修正したが、これは規格にはない。どうしたものか。

かなりやっつけ仕事。canvas上をクリックすると、どんどん四角形が増えていく。ドラッグすると面白いことになる。回転軸が四角形の中央でないのは仕様。バグだったけど、動きが面白かったので、あえて修正しなかった。

一つだけ気にくわない点がある。いわゆる拡大縮小や回転、移動は、行列で行えるのだが、"The transformations must be performed in reverse order."ってどういう事だ。なぜ逆なんだ。逆にしたら分かりやすくなるとでも思っているのか? どう考えても混乱するだけだろ。あと、Identity Matirxにするメソッドぐらいほしい。なんでIdentity Matirxのような基本的なものを、手動で書かなければならないんだ。まあ、canvasが普及すれば、javascriptによるベクトルや行列計算のライブラリが発展するだろうが、それでも、FlashやSilverLightに勝てるとは思えない。

2009-06-17

Weird Al Yankovic released a new song!

Fuck Yeah! I almost crapped my pants when I found THIS on digg.com. Weird Al is the best singer ever.

「予防的先制攻撃」が国際法違反であることを知らない人間が党国防部会の委員長と防衛大臣をやっていたという事実

小池元防衛相が党基地対策委員長を「抗議の辞任」 - MSN産経ニュース

自民党の小池百合子元防衛相は16日、党本部で記者団に、党基地対策特別委員長を辞任したことを明らかにした。

 党の国防関係合同会議が麻生太郎首相(党総裁)に提出した提言の「敵基地攻撃能力の保有」の項目に「予防的先制攻撃を行わない」との文言が盛り込まれたことに抗議したという。

 この文言は、提言の作成過程で、自民党の防衛庁長官・防衛相経験者会議が「外国に誤解を与えてはいけない」とする山崎拓元副総裁らの主張を取り入れて採用した表現。

 敵基地攻撃は国際法や憲法、専守防衛の範囲内の「先制攻撃」の一種。「予防的先制攻撃」は差し迫った脅威ではないが放置すれば将来、受け入れがたい脅威をもたらす可能性のある相手を攻撃する国際法上違法な「予防攻撃」を指す。

 小池氏は産経新聞の取材に対し「『専守防衛』で手足を縛り、『予防的専制攻撃』でさらに縛る。縛る話ばかりだ。日本の防衛政策を縛り続けていいのか。近隣諸国への配慮といっても、向こうは配慮なんてしない」と語った。

おいおい、「予防的先制攻撃」の否定は、先制攻撃そのものを否定するわけではないというのが分かっていないのか。

予防的先制攻撃というのは、将来、脅威になり得る相手に対して先制攻撃を加えるというもので、これは国際法に違反している。アンクル・サムとユダヤ人と共産主義者の大好きな攻撃がこれである。三者とも、常に盛大にこれを行っており、しかも正当な先制攻撃だと主張しているようだが、それはまた別の話だ。

アンクル・サムやユダヤ人や某アカい大国ならともかく、日本が予防的先制攻撃を行ったら、他国から合法的に侵攻する大義名分を与えてしまうことになる。なぜなら、予防的先制攻撃は国際法に違反しており、法を先に破ったのは、日本と言うことになるのだから。だから、日本の脅威になり得る某国としては、おそらく日本が予防的先制攻撃をしてくれることを、待ち望んでいるはずだ。そうなれば、合法的に侵攻できるのだから。

そして、予防的先制攻撃の否定は、先制攻撃自体を否定するものではない。あくまで、「疑わしいな~」とか、「ほっといたら将来ヤバいな~」程度の理由で先制攻撃するのを否定するだけなのだから。

こんな無知な女が、元は党国防部会の委員長と防衛大臣をやっていたというのか。世も末だ。

VC10にSafeIntクラスが入るらしい

Visual C++ Team Blog : Channel 9 Video: David LeBlanc (and Ale Contenti): Inside SafeInt
SafeInt

オーバーフローかゼロ除算を起こす場合に、例外を投げてくれるIntegerらしい。(アンダーフローは規格で保証されている)

2009-06-16

Opera unite

http://unite.opera.com/
http://dev.opera.com/articles/view/an-introduction-to-opera-unite/

この前、ネットエージェントに、BitCommetの使用に情報漏洩リスクがあると考えているのかとメールを送ったら、やけに湾曲的な表現でやんわりとごまかされた。曰く、「BitTorrentプロトコルでmalwareや著作権侵害のファイルが配布されているのは周知の通りで云々」と。これは、わざと直接答えることを避けている文面だ。そんなごまかしで納得はできないので、もっと直接な表現を使った「BitTorrentプロトコル自体にリスクがあると考えているのか」と。答えは、一週間以上たった今でも返ってこない。まあ、はっきり答えられない理由は分かりきっているわけだが。

まあ、そうこうしているうちに、Operaはもっと先に進んでいく。こんどは、ブラウザからサーバを立てられるサービスを始めたらしい。およそ、フリーなサーバー用のソフトウェアは、Windows/Linux/Macを問わず、いくらでもある。しかし、大抵、使い方が難しい。簡単に使えることを目指したソフトウェアとしては、ブラウザから操作するというのは、なかなかいいのではないか。多くのユーザーは、ダイナミックDNSやNATを用いているので、その辺を越えるサービスだけ、Opera側で提供しているようだ。

この試みが成功するかどうかは分からないが、なかなか面白そうだ。

面白い画像と動画

Dilbert.com

さすがだ。

キンチョールでタイヤははめられるか。

gottardo nord from fb1 visuals on Vimeo.

特殊なレンズを使い、ミニチュアのように撮影した動画。

有機EL

トッキ、有機EL大型パネル製造装置を開発-4Gガラス基板に対応:日刊工業新聞

 トッキは有機エレクトロルミネッセンス(EL)の大型パネルの製造装置を開発した。第4世代(4G、720ミリ×920ミリメートル)ガラス基板に対応しており、26型を2面、42型を1面とれる。薄型テレビ向け有機ELパネルの量産用途で国内外の電機メーカーから受注を見込む。大型有機ELの実用化を後押しする。
 有機ELパネルは、ガラス基板に電極を付けた後、有機材料を成膜して製造する。トッキが開発した装置は、真空に保った状態で有機材料を加熱、気化させて基板に薄膜を形成する。成膜したガラス基板を封止する工程まで全自動で行う。
 トッキは携帯電話の画面など中小型パネルに適した370ミリ×470ミリメートルガラス基板の装置を製品化している。現在、量産実績のある有機ELテレビはソニーの11型が最大。
(掲載日 2009年06月16日)

26インチが十万ぐらいで買える時代が早く来ないかな。ただし、1920x1080とかは遠慮願いたい。なぜテレビは16:9で、しかも16とか32の倍数じゃない解像度を選んだのだろう。

中国人の書いた緑壩娘がどうみてもパクリな件について

どう見ても東方のパクリだ。

結局、支那が優れていたのは唐の時代までだったんだろうな。宋の時代になってしまうと、漢詩も好いものが少ない。

昆夷道遠不復通
世出切玉誰能窮
宝刀近出日本国
越賈得之滄海東
魚皮装貼香木鞘
黄白間雑鍮与銅
百金伝入好事手
佩服可以禳妖凶
伝聞其国居大島
土壌沃饒風俗好
其先除福詐秦民
採薬淹留丱童老
百工五種与之居
至今器玩皆精巧
前朝貢献屡往来
士人往々工詞藻
徐福行時書未焚
逸書百篇今尚存
令厳不許伝中国
拳世無人識古文
先王大典蔵夷貊
蒼波浩蕩無通津
令人感激坐流涕
錆渋短刀何足云

日本刀歌、欧陽脩

自有五白猫
鼠不侵我書
今朝五百死
祭與飯與魚
送之於中河
況爾非爾疎
昔爾囓一鼠
銜鳴遶庭除
欲使衆鼠驚
意将清我廬
一従登舟来
舟中同屋居
糗糧雖甚薄
免食漏窃餘
此實爾有勤
有勤勝鶏猪
世人重駆駕
謂不如馬驢
已矣莫復論
為爾聊欷歔

祭猫、梅尭臣

あとは、宋代の禅も多少は日本文化に影響を与えているのだが、所詮は、「一休さん」程度にしか残っていない。一休の説話も、詳しく調べれば面白いのだが、悲しいかな、今の世には、全く知られていない。

中国(1949年以降の、中華人民共和国の事を指す)になってからは、もう見る価値がない。「逸書百篇今尚存(いつしょひゃっぺんいまなほそんす)、 令厳不許伝中国(れいきびしくしてゆるさずちゅうごくにつたふるを)、拳世無人識古文(よをあげてこぶんをしるのひとなし)」は、おそらく、現代の中国と日本においても、成り立つだろう。文化大革命のおかげで、中国の多くの書物が失われた。

2009-06-15

W3Cの日本語組版処理の要件が正式にリリースされたらしい

日本語版
英語版

英語版が正式だと言うことだが、日本語版も、まともな日本語になっている。もちろん、編者はほぼ全員日本人だから、当然のことだし、日本語の印刷技術を、日本語で正しく記述していないというのはおかしい。

HTML5のaudio要素のサンプル

wtf! If you can read this, that means your shitty browser *does not* even support proper javascript and/or DOM level 2!. Throw that browser away man, it's a crap!

audio要素をサポートしたブラウザなら、vorbis.comのサンプルが聞けるはずだ。もし、未サポートのブラウザを使っているならば、屈辱的な文章が表示されるだろう。もし、まともなjavascriptやDOM level 2をサポートしていないブラウザを使っているならば、侮辱的な文章が表示されるだろう。フィードリーダーからでは動かないと思われるので、実際に動かしたい場合は、ブログを直接閲覧して欲しい。

ところで、addEventListener()に渡すのは、W3CのDOM level 2規格によれば、EventListenerインターフェースを実装したものである。W3Cの規格は、プログラミング言語から独立している。これを単純にjavascriptに置き換えれば、handleEventというメソッドを持っているオブジェクトと言うことになる。さっそく、そのようなコードを書いてみたところ、モダンなブラウザすべてで動いた。ただし、単なるfunctionを渡しても、モダンなブラウザすべてで動いた。また、ほとんどの解説サイトでは、単にfunctionを渡している。まあ、そもそもメソッドを持つクラスやオブジェクトという概念のない言語もあるだろうから、一概に言えないが、うーん、何だかなぁ。

javascript 1.7のletがほしい

generatorは、javascriptの様な動的な言語でも、やはり、あまり欲しいとは思わない。しかし、letはとても欲しい。letなしだと、わざわざ明示的にclosureを書かなければならない。それはとても可読性が悪い。

objectが特許侵害だという誤解がなされている件

http://pc11.2ch.net/test/read.cgi/hp/1189817507/738-

738 名前:Name_Not_Found[sage] 投稿日:2009/06/14(日) 20:22:09 ID:???
video要素って何のためにあるんだよ
object要素に謝れ!

739 名前:Name_Not_Found[sage] 投稿日:2009/06/14(日) 20:36:14 ID:???
ビデオのためじゃないの?

740 名前:Name_Not_Found[sage] 投稿日:2009/06/14(日) 21:02:51 ID:???
>>738
そのobject要素関連の技術に特許が認められたから
だいたい、img要素からして意味なかったしな

741 名前:Name_Not_Found[sage] 投稿日:2009/06/15(月) 00:57:20 ID:???
特許ビジネスがある限り、標準化なんて絵に描いた餅ってことでFA?

742 名前:Name_Not_Found[sage] 投稿日:2009/06/15(月) 01:02:22 ID:???
んなわけねー
特許に触れなきゃいいんだから

743 名前:Name_Not_Found[sage] 投稿日:2009/06/15(月) 01:03:58 ID:???
>>741

今の、HTML技術に特許あるの?
結構、勝手気ままにやってねえ?

object要素自体に特許はない。object自体は、外部ソースを指し示す要素でしかない。実際、多くのブラウザでは(というより、IE以外では)、objectの指し示す先が画像だろうがHTMLだろうが何だろうが、およそ描画できるものはなんでも描画しようという傾向にある。ただ、だからといってimg要素やiframe要素を廃止しようなどという動きは起こらない。したがって、videoやaudioも、存在意義がある。だいいち、objectに統一しようと言うぐらいなら、そのほかの要素も同様にすべきで、divとspanだけで、既存のほとんどの要素は置き換えられるだろう。必要なのは、より強力なCSSだ。

特許ゴロのEolasのPatent 5,838,906は、Web上の埋め込みコンテンツを、外部アプリで処理する特許だ。だから、Object要素に対して、Flash、Java、ActiveXなどのプラグインを呼び出すと、この特許に抵触するというらしいのだが。

そもそも、そんな一般的なことが特許として成立するのか? というのが本音だ。ある埋め込みコンテンツを指し示す文字列がある場合、外部のアプリケーションを呼び出すような仕組みに、果たして特許など認められるのだろうか。しかも、javascriptなどを使って、動的に埋め込む場合は、この特許の範囲外という、なんだか不思議な抜け穴もある。

この特許の有効性については、いまだに争われている。この特許を認めたアメリカ司法の連中は、何か吸っていた(smoking something)としか考えられない。それも、よほど好い何かを吸っていたはずだ。

ちなみに、この特許、1994年の10月17日に申請されているので、2014年には、少なくともアメリカでは、特許が切れる。つまり、有効期限は、あと5年しかないわけだ。

ところで、世の中は面白いもので、どう考えても理不尽だが、結果的に考えて、まあ、悪くはなかったんじゃないかという事例も多い。たとえばこのEolasの特許だが、これがあるせいで、Flashを埋め込むJavascriptライブラリの開発が進んだ。その結果、SWFObjectと、UFOという、二つの有名なライブラリができ、両者は後に統合されて、現在では、swfobjectとなっている。

あのUnisysのGIF圧縮に関する特許は、どうかするとEolasよりタチが悪い。何しろ、当初、非商用目的には金を取らないと言っていたにもかかわらず、後で撤回し、さかのぼって請求し始めたからだ。これも、PNGというフリーで悪くない規格制定の原動力となった。もちろん、8bitカラー以上の可逆圧縮な画像圧縮の規格は、いずれ必要とされただろうが、Unisysの特許問題がケツを叩いたのか、かなり素早く開発された。

世の中は面白い。

2009-06-14

rubyを消すブックマークレット

厳密に言うと、HTML5のrtとrp要素を消すブックマークレットなのだが。ただし、IEでは動かない。というより、まともなブラウザなら動くといった方が正しいか。

hide ruby
show ruby

例:
ラオウはケンシロウの強敵(とも)である。奴は本気(マジ)で強い。
事故る奴は・・・・、不運(ハードラック)と踊(ダンス)っちまったんだよ・・・・
山吹色の波紋疾走(サンライトイエローオーバードライブ)
Bites The Dust(負けて死ね)

追記:なぜかfirefoxでは、hide ruby、こっちじゃないと動かない。よく分からない。ChromeとOperaでは、ブックマークレットの中にreturn文を書けるのだが、どうもFirefoxでは動かないようだ。何故だろう。

やはり、どうもFirefoxは、bookmarklet中のreturn文が動かないらしい。理由は分からない。

そもそも、上記のコードは、関数内ではない。したがって、return文は使えないのが理由なのだろう。そこで、関数内にいれてみた。

hide ruby

これは動いた。なるほど、なるほど。上のリンクも書き換えた。しかし疑問なのは、なぜChromeとOperaでは動いたのかと言うことだ。私の予想では、この両ブラウザでは、return文を実行する直前までは、実行できていたから動いたのではないかと思う。

HTML5とjavascriptを学び始めたが、IEクソだな

この一週間ほど、javascriptを学んでいる。以前、文法だけ学んで、DOMを学ばずに飽きてしまった。とりあえずw3cの規格と、whatwgのHTML5のドラフトに、ある程度目を通したので、早速実際にコードを書いてみた。

結論:IEはクソだ。

DOM level 2すらまともにサポートしていないIE8は、存在すら許されないレベルだ。クソだ。クソにも程がある。IEがこれほどクソとは知らなかった。

HTML5を、XHTML5として書いてみたが、実に分かりやすい。考えてみれば、XHTML1.0や1.1は、理想主義に走りすぎていた感がある。dtdとかxmlnsとか、理想としてはすばらしいのだろうが、ブラウザがまともに処理しないものに意味はない。2.0? そういえばそんなものもあったような気がするが忘れた。

とりあえず、Chromeで、HTML5のaudio要素を試してみた。これはすばらしい。再生、ストップ、シーク、すべてをjavascriptから行える。

HTML5には未来を感じる。ChromeのJavascriptの早さを考えれば、2Dのゲームなら、ブラウザで十分な時代が、すぐにやってきそうな気がする。

2009-06-13

中国はどうしようもないな

China's New Censorship Software a Potential "Large-Scale Disaster"
Chinese censorware will expose every PC in the nation of malware, ID theft, botnetting
Is China Creating the World's Largest Botnet Army?
Chinese Govt Spyware Puts Computers At Risk
China Demands All New PCs Include Censorship Software
Chinese Government To Mandate PC Censorware

さすが宗主国様。

一般曹候補生の一次試験を通過

とりあえず一次試験を突破。

受けたのは、陸自の一般曹候補生。船には興味がないので海は選択肢に上らない。(訓練に水泳があるのは、ちょっと興味があるが) 空についてはよく知らず、また、田母神みたいなイデオロギーに振り回されている思想家を昇進させるような空気があるので敬遠した。およそ非民間人に現実離れした思想家ほど不必要なものはない。

ところで、以下は私の主観なのだが、試験の時、陸海空のどこを志望するかで、性格が分類できるような気がした。私は一般曹候補生を受けたので、幹部候補を受ける人間はまた違うかも知れない。というのも、幹部は部下の管理などの能力も要求されるので、また違った性格が要求される。それは私の能くする所ではないので、幹部は受けなかった。

まず、陸自志望者は、いろんな人間がいた。スーツを着ている真面目そうな人間もいれば、なんじゃこいつはというような、名状しがたい服を着た奴もいた。しかし一般に、平均的な人間が集まっていると思う。年齢もバラバラだった。

海自は、とにかく俺は自衛隊に入りたいんだという血気盛んな人間が多いように見えた。それも、今年高校を卒業だというかいう、若者が多かった。

空自は少し変わっている。絵に描いたようなヲタク達だ。一口にヲタクと言っても、いろんな種類がいる。いわゆるキモいピザデブも、オタクには違いない。ここで言うヲタとは、そうではなくて、痩せぎすでやたらと知識欲があり、自分の専門分野については、誰かまわず、相手の反応も見ずに延々と語るようなタイプのヲタクだ。

繰り返すが、以上は単なる私の主観である。文章にするから書けるのであって、私の性格上、口頭でこんなことは、あまり話さない。あまり。

2009-06-12

以下について教えてあげよう☠☢☣☤

我、不知其宿題與課題也。そも、宿題と課題とは、同じ義には候はずや。ただし、これ易き文字列処理問題にて候。

・大文字は小文字に、数字は'0','1','2'...を'9','8','7'...と反転させる。
・ただし、'#'以降の文字は変換しない。
・例として "Abc012_59F_#012Gh"を渡した場合の戻り値は "abc987_40f_#012Gh"となる。

僭越ながら、ユーザー定義リテラルを用ひ候。

// 名前空間に入れること肝要なり。
namespace udl
{
        // ユーザー定義リテラルてふものなり。
        std::string operator "" _conv( char const *ptr )
        {
                std::string temp(ptr) ;

                std::transform(
                        temp.begin, std::find(temp.begin, temp.end, '#')
                        , temp.begin()
                          // ラムダてふ便利な無名関数なり。
                        , [] (char const c ) -> char 
                          {
                                if ( c >= '0' && c <= '9') return '9' - c + '0' ;
                                if ( c >= 'A' && c <= 'Z' ) return c - 'A' + 'a' ;
                                return c ;
                          } ) ;

                return temp ;
        }
}



int main()
{
        //使う際には、using declarationにて指定する必要有之候。
        using udl::operator "" _conv ;
        std::cout << "Abc012_59F_#012Gh"_conv << std::endl ;
}

げにユーザー定義リテラルてふものは、その易きこと如此。

V8に関する興味深い動画

Get Microsoft Silverlight

Expert to Expert - Erik Meijer and Lars Bak: Inside V8 - A Javascript Virtual Machine | Going Deep | Channel 9

今年の四月という、少々古い動画だが、V8のプログラマとMSのプログラマが、javascriptのVMについて語っている。

かなり考え方の違いが現れていて面白い。MSの開発者が、javascriptから自前でネイティブコードを生成するよりも、JavaやC#のMSILのような、よく知られたバイトコードに変換して、ネイティブコードの生成は、それに任せるというのはどうだと言っているが、V8の開発者からすれば、javascriptというのは、十分分かりやすい中間言語だそうだ。javascriptから意味上の大量のチェックを行った上で、バイトコードを生成して、さらに意味上の大量のチェックを行いつつ、ネイティブコードに変換するのは、二度手間でしかないというスタンスらしい。それだったら、javascriptから直接ネイティブコードを生成した方が早いと言っている。興味深い価値観の違いだ。

2009-06-11

swfobjectが更新された。

whats_new - swfobject - SWFObject 2.2 - What's new? - Google Code

もちろん、2.2を落とすこともできるし、Google AJAX Libraries APIから使うこともできる。私の場合はメジャーバージョンだけ指定しているので、アップデートに当たって、特に何かする必要はない。

しかし、このライブラリも、いつまで使うことになるだろうか。Chromeがそこそこ安定したvideo要素を実装した暁には、即座にそちらに切り替えるつもりでいる。早めにラッパ関数に切り替えておいて良かった。既存の記事を書き換えなくてもいいというのは、実にすばらしい。

予備自衛官補の辞令書の交付式

予備自衛官補の辞令書の交付式の案内状が来た。大津の駐屯地で行う。

辞令書と、訓練に関する説明、駐屯地内の見学、また、実際に駐屯地の昼食が食べられるそうだ。

三輪バイクの道交法での扱いが変わる

三輪バイク:9月から要二輪免許 ヘルメット着用も - 毎日jp(毎日新聞)

ただし、ソースが毎日新聞だが、変態的な記事ではないので誇張はないだろう。

むしろ、いい加減に、車輪の個数で車種を定義するのをやめた方がいいと思うのだが。これとか、国内法では、二輪車なので、おそらくヘルメットの着用が義務づけられる気がするのだが、どう考えてもヘルメットの必要はない。なにしろ最近の型はエアバッグまで付いているらしいのだから。

google Chromeが更新された

メニューを使おうとするとクラッシュする。

video要素でフリーズしなくなった。ただし、再生がスムーズではない。早くなったり遅くなったりと、まったくもってリアルタイムの再生ができない。しかも、未だに全部再生できずに止まる。

まだ評価するには時期尚早といった所か。

SilverLight 3の正式版が、今日あたりリリースされるという噂を目にしたのだが、所詮は噂だったようだ。残念。

自分は今まで漢詩を全然理解していなかったのだな

漢文が読めるようになるにつれて、漢詩の本来のおもしろさが分かるようになってきた。漢詩というものは、センテンスとしては、とても分かりやすい作りになっている。五言ならば、二、三、七言ならば二、二、三、という具合だ。もちろん、延々と同じでは単調であきるので、長い漢詩だと、たまにこれに当てはまらない部分もあるが、ほぼこの形になっている。たとえば、

離離原上草
一歳一枯榮
野火燒不盡
春風吹又生
遠芳侵古道
晴翠接荒城
又送王孫去
萋萋滿別情

白居易、擬古

臨邛道士鴻都客
能以精誠致魂魄
為感君王輾轉思
遂教方士殷勤覓
排空馭氣奔如電
升天入地求之徧
上窮碧落下黄泉
兩處茫茫皆不見

白居易、長恨歌

やはり、白居易の詩はすばらしい。兼好法師が、「文は白氏の文集」と行っていたのも、宜なるかな。

ついでに私の好みを挙げておくと、やはり項羽や曹操の詩はすばらしい。陶淵明もいい。それから、猫好きだという理由で梅尭臣を評価するし、日本人としては、日本に言及している欧陽脩も、やはり無視することはできない。

ところで、漢詩の要素として、韻がある。問題は日本語には、音による韻はなじみがないので、理解できない。七五調などといったものはあるが、日本語には音による韻文はない。第一、当時の支那語の四声と今の四声は異なる。

2009-06-09

はてなブックマークがセコい手を使ってSEOしているらしい

はてなブックマークのやりすぎちゃったかもしれないSEO - ぼくはまちちゃん!(Hatena)

はてながやっちゃってたらしい。はてなブックマークやはてなキーワードといえば、検索する際に、大した情報価値もないのに引っかかるゴミサイトという認識しかなく、検索の際には"-はてな"を指定しなければならない時もしばしばなのだが、google botだけの特別な計らいがあったらしい。やれやれだ。

追記:このSEO、クローキングには当たらないというのが小飼 弾さんの見解らしい。
404 Blog Not Found:「検索ボットのみURI Redirect」はクローキングにあらず
というのも、返すコンテンツは同じで、URLが複数あるだけなので、クローキングの定義には当たらないというのが、その理由らしい。

なるほど、そういう見方もできるか。しかしそれもそれで、あまりよろしくないと思う。SEOのために複数のURLを用意するのが当然という風潮になると、面倒でしかないと思う。しかも、検索ロボット専用のURLとなっては、その存在意義は、自分のサイトの評価を押し上げるためでしかない。もしこれが許されるのであれば、多くのWebサイトは、検索結果の評価を押し上げるためだけに、マルチURLを実装するだろう。そうなれば、もはや、URLが検索クエリーを包括しているという事は、評価を上げる要素に当たらなくなる。何故ならば、みんな行っているのであり、むしろ行っていないサイトは、評価を下げてくれという意味に取られるだろう。これは、もはや何の意味もなくなってしまうだろう。

最適なのは、URL文字列自体を評価の対象にするのをやめるということじゃないだろうか。URLが検索ワードを含んでいるからといって、そのコンテンツ自体が有益であるとは限らないと思う。