「xml」を含む日記 RSS

はてなキーワード: xmlとは

2009-11-28

HTMLを体系的に理解するための7仕様

はじめに

最近マークアップエンジニア志望の若者と話す機会が多いのだけれど、そこで気づかされるのは、彼らの中に過去HTML(特に90年代以前の仕様)を読んだことのあるという人が、驚くほど少ないことだ。

例えば「マーク・アンドリーセンをどう思う?」と聞くと、「アンドリーセンって誰ですか?」という答えが返ってくる。「ヨスケの独自要素で何が一番好き?」と聞くと、「見たことがありません」と言われてしまう。「ではきみは、昔のHTMLを見たことがあるの?」と聞くと、たいていが「とほほでやっていたものくらいなら……」という答えしか返ってこない。

今の若い人の間では、HTMLを体系的にとらえようという人は少ないようだ。見るのは専ら近年の話題仕様ばかりで、歴史を辿ってみたり、系譜をひもといて標準化団体ごと理解しようとする人はほとんどいない。

これは、ちょっと由々しき問題だと思わされた。HTMLは、もう長いこと(90年代の早い時期から)インターネット王者としてあらゆるWeb関連技術の上に君臨してきた。だから、Webを作ることを仕事にしたいなら、何をするにせよ避けて通ることはできない。

HTMLは、表・画像・フォーム・音楽デザインフレーム動画など、さまざまな分野においてその時代々々に達成された最新の成果を持ち寄るようにして作られてきたところがある。だから、HTMLを読まずして現代のインターネットは語れないと言ってもいいくらいだ。

もし何かクリエイティブなことをしたいのなら、HTMLを読むことは欠かせない。また、単に読むだけではなく、それを包括的・体系的にとらえることも必要だ。なぜなら、HTML包括的・体系的にとらえることによって、現代のインターネットそのものを、包括的・体系的にとらえられるようになるからだ。そしてそうなれば、Webを作ることの道理や筋道が理解でき、何かクリエイティブなことをする上で、大きな助けとなるからである。

そこでここでは、昔のHTMLをほとんど見たことがないという人や、あるいはHTMLそのものもあまり見ないという人のために、これを見ればHTMLを体系的に理解でき、現代インターネットの成り立ちや実相までをも包括的にとらえることができるようになる、7本の仕様を紹介する。

ここで紹介するHTMLは、いずれも後のWeb業界に決定的な影響を与えたものばかりだ。これらが、HTMLという標準のありようや方向性を決定づけた。この7本を見れば、HTMLというのはどのようなきっかけで生まれ、どのような変遷を辿って、どのような足跡を残してきたかというのが、体系的に理解できるようになる。そしてそれが、世界インターネット利用シーンにどのような影響を及ぼしてきたかということも、知ることができるようになるのだ。

HTMLを体系的に理解するための7本の仕様

1本目『HTML 3.0』(1995年

まず最初は、ちょっと強引かも知れないけれど、第一次ブラウザ戦争前のHTMLをひとまとめにするところから始める。

80年代末にティムバナーズ=リーの発明したHTMLというメディアは、その後『HTML 1.0』(1993年)『HTML+』(1994年)『HTML 2.0』(1995年)などの仕様で次第にそのスタイル確立していき、マーク・アンドリーセンが一大産業として発展させた後、『HTML 3.0』に行き着く。そして幸運なことに、ここに集大成されるのだ。

ブラウザ戦争前のHTMLは、これ1本だけ読めば良い。このHTMLに、戦前HTMLの全ての要素(属性)が詰まっている。このHTMLを見れば、HTMLインターネット王者としての風格、スターという存在の大きさ、作者以上にブラウザが重視される「産業」としての側面、お尻Pから終了タグ省略可へ・文字情報から画像付きへと移り変わった技術革新の変遷など、戦前HTML史やWeb業界のありようが全て分かるのだ。

このHTMLの魅力は、説明し始めるといくら紙幅があっても足りないので、ここではその一端を紹介するにとどめておく……といっても、気の利いたことを言えるわけではない。『HTML 3.0』の魅力を知るには、まずは読んでもらうこと――これに尽きるからだ。そして、もし一度でも読めば、その魅力はたちどころに理解できるだろう。

HTML 3.0』を見て驚かされるのは、現在HTMLと比べても全く遜色ないところである。破棄されてから14年の時が経過しているが、現代人の読解にも当たり前のように堪えうるのだ。それは、逆にいえばHTMLというものは、今から14年前、つまりこの『HTML 3.0』が作られた時点で、様式として一つの完成を見たということでもある。

HTML 3.0』は、HTMLという標準が到達しようとした一つの極みである。それゆえ、HTML史というものは、『HTML 3.0』以前と以降とで分けられるようになった。これ以降に作られたHTMLで、『HTML 3.0』の影響を免れたものはないからである。

2本目『Compact HTML』(1998年

iモード世界HTML史に与えた影響というのは、一般に理解されているよりもはるかに小さなものである。日本人というのは、「日本技術世界に影響を与えた」というと、なぜか鼻高々と聞いてしまうところがある。「日本ガラパゴス」という言葉は聞いたことがあっても、「それって日本人過小評価しているだけじゃないの?」と、眉に唾をしてとらえるところがある。

しかしiモードは、真に日本HTML史を塗り替えたサービスの一つである。特に、このサービスの後世に与えた影響には、本当に計り知れない大きさがある。

iモードは、ドコモメインストリームだったポケットベルが、それまでの栄華の反動で深刻な低迷期に陥っていたPHS流行後すぐの時期、そんなポケットベルに取って代わって、日本で最も輝いていた携帯サービスであった。それゆえ、広末に見蕩れ世界HTMLファンたちは、iモードWebサイトを見ることによって、失われかけていたWeb制作の魅力を再発見することにもなったのである。

iモードは、没落したHDMLに変わってモバイルWebの命脈をつなぎ止めた、言うならば救世主のような存在であった。海外モバイル陣営が営々と築きあげてきたそれまでの栄光を切り捨て、日本の後代へと引き継いだ重要リレー第一走者としての役割を、HTML史において担ったのである。

そして、そのバトンを受け取った日本の若きWebデザイナーたちが、2000年代に入って雨後の竹の子のように現れたことで、モバイルWebは鮮やかな発展を遂げる。だから、もしiモードが存在しなければ、HTMLの様相は今とは違ったものになっていたかもしれないのだ。

そんなiモードHTMLバージョンはいくつもあるのだが、中でも特に多くのHTMLファンを――取り分け日本の若きWebデザイナーたちを魅了したのが、この『Compact HTML』である。この仕様の一番の魅力は、なんといってもその大胆に構築されたW3C Noteであろう。HTML史において、これほど拡張多く適当ディテールで構成されたNoteは他にない。そのためこのNoteは、これ以降無数に手本とされ、真似され、拡張されることとなるのである。

3本目『HTML 4.0』(1997年

正字仮名の影響を受けた日本の若き日記書きたち――言うなれば「CSSコミュニティ」――が頭角を現す直前のW3Cで、HTML史に乾坤一擲の巨大な爪痕を残した1本の仕様誕生する。

この時期、情報技術進歩によって、HTMLにもさまざまな新しいテクノロジーがもらたされていたのだが、それらを十全に取り入れたばかりではなく、縦横に駆使することによって、これまでとは全く違った国際化、全く違ったアクセシビリティ体験を生み出すことに成功したのが、この仕様HTML 4.0』を勧告したWorld Wide Web Consortiumである。

HTML 4.0』は、HTML史において最も革新的な仕様の一つとなった。この仕様に初めて触れた当時のWebデザイナーたちは、そのあまりの目新しさに度肝を抜かれた。そこでは、これまで全く見たことのないマークアップがくり広げられていた。そのため、これまで想像さえしたことのなかった全く新しいHTML体験を、そこで味わうことになったからである。

W3Cの果たした一番の功績は、テクノロジーHTMLを見事な調和をもって融合させたことだろう。例えばそこでは、「スタイルシート」という新しい技術デザインと、それでレイアウトされたページが閲覧者に与える独特の感覚というものを、双方ともに熟知していた。だから、それらを効果的に融合させることによって、全く新しいHTML体験を生み出すことができたのである。

この仕様HTML 4.0』には、そうしたテクノロジーHTMLとの融合が、至るところに散見できる。その数の多さとクオリティの高さによって、HTMLはここに、新しい時代の幕開けを迎えるに至ったのである。

4本目『ISO/IEC 15445:2000』(2000年

先に述べた「CSSコミュニティ」がWeb日記業界に論争をもたらすのは、2000年代に入ってからのことである。そして、そのきっかけとなったできごとの一つが、1947年生まれの非政府組織で、IECとも協力した生粋工業標準化団体であった国際標準化機構が、この仕様ISO/IEC 15445:2000 (ISO-HTML)』によって成功を収めたことである。

このHTMLは、単にJIS的に標準化しただけではなく、文化的な意味においても、フラットリニア構造の力を広く世界に知らしめることとなった。この仕様の成功によって、世界の人々は、レベル付けされた見出しの魅力の大きさを知る。そしてそれが、やがて見出しレベル分けが世界スタンダードとなり、誰もが当たり前のように使う状況を育んでいくのである。

またこの仕様は、CSSコミュニティそのものにも大きな影響を与えた。この仕様の成功に刺激を受けた才能ある若きコミュニティ住人たちが、その後立て続けに台頭し、いくつもの名サイトを生み出していくからである。

それらが相まって、やがてCSSコミュニティは空前の黄金時代を迎えることになる。その端緒となり、道筋を切り開いたのが、他ならぬこの『ISO-HTML』なのだ。

5本目『XHTML 1.0』(2000年

HTML 4.0』で繁栄の足がかりを築いたW3Cは、この仕様XHTML 1.0』によって、ついにその栄華の頂点に達する。そして、それを成し遂げたメタ言語も、W3C勧告のの一つであり、また『HTML 4.0』を作ったSGMLの改良でもあった、Extensible Markup Languageであった。

この勧告は、史上最も商業的に成功した仕様となる。そのためこれ以降、この勧告にならって商業バズワードを盛り込んだ仕様が数多く作られるようになり、しかもそれらが、実際に大きな商業的話題を集めていくのだ。すると、そこで生み出された多くの意見は、やがて再びW3C還元され、さらなる発展をもたらすことにもつながった。

そんなふうに、この仕様がきっかけとなってW3Cにもたらされた意見は、HTMLという言語を変革させていくことになるのだが、それに伴って、HTMLそのものにも大きな革新をもたらすことになる。

その変革も、他ならぬW3Cの手によってなされた。ここで『XHTML 1.0』の成功によって手にしたメンバーをもとに創設した文書マークアップの開発集団「HTML Working Group」が、より魅力的な拡張性を追求していく中で、やがてM12n(モジュール化)という技術の開発に至るのである。するとそれが、これまでのHTMLを一変させたのだ。

M12nは、HTMLに魅力的かつ効果的な特殊語彙を、DTDでしかも複雑怪奇にもたらすことに成功した。おかげでそれは、あっという間に世界から見捨てられていった。そのため今では、M12nの使われているHTMLを探す方が難しくなったくらいだ。それくらい、この『XHTML 1.0』がWeb業界にもたらした変革には、大きなものがあったのである。

6本目『XHTML 2.0』(2009年

2000年代以降、繁栄を謳歌したW3Cは、しかしその栄華の大きさゆえ、00年代中盤に入るとそれを存続させることに力をそがれてしまい、革新的な仕様はなかなか生まれてこなくなった。

しかし、そんな時代が5年は続いた00年代の後半になって、今度はその栄華のただ中で育った新しい世代のHTML WGメンバーたちが台頭してくることにより、再び変革の時を迎えることとなる。

その新しい世代のHTML WGメンバーとは、マイクロソフトモジラファンデーションオペラらに代表される「ブラウザベンダ」と、無関係な編集者たちであった。

彼らに共通するのは、文書構造に不必要なものなら全て――とるに足らないガジェット的なものまで含めて――残らず切り離そうとする「オタク的な性質」を持っていたことだ。

彼らは、それまで見過ごされがちだったHTMLの些末な要素にスポットを当て、それを別仕様に押し出すことで、従前とは一風変わった、新たな魅力を持った草案を生み出していった。そして、その真打ち的な存在として00年代の後半に登場したのが、XHTML2 Working Groupだ。

XHTML2 WGは、特に99年に最後の草案が作られたこの仕様XHTML 2.0』によって、オタク的なHTMLの楽しみ方が、一部のマニアだけにとどまり、それ以外の多くの人たちには受け入れられないことを証明してみせた。この失敗が、デ・ファクト的な新生HTML WGにさらなる脚光を浴びせることになったのはもちろん、それに影響を受けたWeb WorkersやDOM Level 3 Eventsといった、次世代のWeb標準たちの誕生にもつながっていったのである。

7本目『HTML5』(2022年?)

最後は、第二次ブラウザ戦争集大成ともいえるこの仕様である。

HTML5』は、HTML史においては『HTML 3.0』と同じような意味を持つ。つまり、それまでのHTMLの要素が全て詰まっているのだ。この仕様を見れば、それ以前のHTML歴史というものが全部分かる。

HTML5』には、HTMLのあらゆる要素が詰まっている。ここには、『HTML 3.0』のような歴史的な仕様としての「総合性」があり、『Compact HTML』のような「実装の実在さ」がある。『HTML 4.0』のような「マルチメディアアクセシビリティの融合」があり、『ISO-HTML』のように「セクション構造の魅力を全世界に知らしめ」た。また、『XHTML 1.0』のように「バズワード的に成功」したのはもちろん、『XHTML 2.0』が別仕様押し出した「オタクガジェット」にも満ちている。

全て詰まっているのだ。なんでもあるのである。つまりこのHTMLは、『HTML 3.0』と全く同じ意味合いを持っているのだ。HTML史というものは、『HTML5』以前と以降とで分けられる。これ以降に作られるHTMLで、『HTML5』の影響を免れるものはないであろうからである。

まとめ

以上、これさえ読めばHTML包括的・体系的にとらえることができる7本の仕様を、制作された年代順に紹介した。

こうして見ると面白いのは、歴史的に重要仕様は、必ずしも定期的に現れるのではなく、あるところでは連続しているし、あるところでは長らくなかったりすることだ。それはまるで「素数分布」のようだ。一見規則性はないように見えるものの、何かしらの法則が隠されているようでもあり、興味深い。

それから、ここに挙げた仕様は、いずれも「読むことによって他の仕様にも興味が移行する」ということを念頭に選んだ。

例えば、『HTML 3.0』を読んだならば、ブラウザ戦争前夜の独自HTML拡張自然と興味がいくだろうし、『Compact HTML』を読んだなら、iモードのそれ以外のバージョンHTMLも見たくなるだろう。CSSコミュニティについてもそれは言えるし、『ISO-HTML』を読んだなら、このHTML流行らす土壌ともなった「フラットリニア構造」というムーブメントにも自然と興味がわくはずだ。さらには、『XHTML 1.0』はXMLオタクになるきっかけになるだろうし、『XHTML 2.0』はその他の「オタク的なXML EventsやXForms」の仕様も見たくなるという効果を持っている。

ただし、最後に選んだ『HTML5』だけは、こうした例とは別に考えなければならないかも知れない。なぜならこのHTMLは、完成度があまりにも高いために、これを見た後に他のHTMLを読むと、どうしても物足りなく感じてしまうからだ。

しかしいずれにしろ、これらの仕様を読むことによって、HTMLをさらに愛さずにいられなくなるのは疑いない。そしてまた、これらの仕様を読むことによって、HTML包括的・体系的に見る目を養ってもらえれば、その後のクリエィティブな活動にも、大きな助けとなるはずだ。

おまけ(参考文献)

上に挙げた仕様への理解は、以下に紹介する著作を読むことによって、さらに深まる。これらを読むことによって、ぼくは「HTMLを体系的に見るとはどういうことか」を学んできた。

高校時代に読んだこのサイトによって、「リソースとは何か」ということを、ぼくはを知った。

HTMLSGMLの応用だ」ということが、このサイトを読むことでよく分かる。何気なく見ていた省略記法でも、その裏には、実にさまざまな技術や、それを開発してきた歴史というものが隠されていた。

世界CSSコミュニティの何に驚かされたかといえば、それはやっぱり精緻に書き込まれた正字仮名にだ。ノジタン日記には、HTML本質が詰まっている。だからこそ、あれだけ多くの日記で多くのコミュニティ住人に、言及されたり模倣されたりしたのだ。

ここでは取りあげられなかったのだが、とほほ氏がHTMLというジャンルに及ぼした影響にも、本当に大きなものがある。そして、ぼくが上に挙げた感想のいくつかは、このサイトに書かれていたばけらさんとの「スタイルシート論争」を参考にしたものなのだ。

これらのサイトを読めば、どんなHTMLが素晴らしく、どんなHTMLがそうではないというのが、よく分かる。その判定基準を知ることができ、審美眼を養うことができるのだ。なにしろ、あのCSSコミュニティ住人の言うことなのだ。これにまさる教科書は、他にはない。


元ネタ

2009-08-24

アメブロのRSSはここがクソ

アメーバブログには他ブログサービスと比較してクソな仕様がいくつかあるけれど、

その最たるものは、RSS Readerでは画像が表示されないという点だ。


feedの合間に広告を出す仕様は理解できる。

『著作権保護のため、記事の一部のみ表示されております。』という上から目線の余計な一言にも耐えられる。

(『続きを読む』でいいだろ、とは思う)

だけど画像が表示されないというのはあまりに致命的すぎて、RSS Readerでは読むなと言ってるようなものだ。


しょこたんブログまでもがアメーバブログに移転して1ヶ月が経つ。

あれだけ熱心に流し読みしていた彼女のブログも、画像無しではまるでルーのないカレーライスだ。

もはやRSS Readerに登録するだけの価値を見いだせなくなってきた。


ネット上にはrss20.xmlを登録すれば全文&画像配信されると書いてあるけれど、試してみても何ら効果はなかった。


どうしてこんなクソサービスにこぞって人が流れるのか理解できない。

(藤川有里ブログであったり、マナカナブログであったり、ここ2~3ヶ月立て続けにアメブロへの移転が続いていらだちは募るばかり)

外部の人間には分からないアメーバブログならではの利点があるのだろうか。

みんな水増しされたヒット数に踊らされてるだけなんじゃないだろうか。

2009-07-12

http://anond.hatelabo.jp/20090712163829

建築系の4年だけども、ちょっと言いたい。

デザイナーになり方なんて無いぞ。

デザイン職として企業採用されれば君の言うデザイナーなの?

経験者歓迎の求人に申し込んでも、結局経験者から採用していくのは当然なわけで

当然じゃない。そりゃ技術はもちろん元気よく愛想よく営業能力も抜群なら未経験者の出る幕無しだけど、他分野の未経験者を採ってその人の強味を活かしたいだとか、

何色にも染まってない人を採って会社のやり方を疑いなく吸収してくれるからだとか、未経験に期待する人事担当者も実際にいるわな。

で、どうすればなればいいって人に聞いてる時点でデザイナーとしてやってくのは無理なんじゃないかと。

ウェブデザイン業界はよく知らないけど、そもそもデザイナーがやるべき仕事ソリューションなんだから、それに矛盾しない形が表現できるかどうかがデザイナーの質だと思うのね。

だからコンサルティングの要素が強い。問題解決能力を一番求められるのにそれを聞いてるようじゃダメっしょ。

まぁ他学科の学生が言うのもアレだけども、技術力とデザインセンスとDTPスキルを磨けば何とかなるんじゃないかな。

具体的にはTCPIPとかFTPとかDNSとかhtaccessとか無数にある用語とその意味を把握した上でperlCGI作ったりruby on railsブログを作ったりしてウェブの基礎知識を蓄えてだな、

それで最も重要なのはデザインスキル。DTPオペレーターデザイナーとか自称してるの見てると笑われるだけだからここ重要な。

まあデッサンしまくって立体造形感覚を磨いて色彩とかフォントとかレイアウトとかデザイン全般に必要な知識も学んでだ、モニター上に表現する前に紙に書けないとオペレーター止まりよ。

その後でHTMLとかXMLとかマークアップ言語勉強してテキストエディタで一通りウェブページを作って、頭に中で思ってる事と実際にプロットされる画面とを近づけていって、ついでにワードプレスとかのCMSも勉強してphpSQLの仕組みが大体解ってこれば知らぬ間にウェブデザインでやっていくに自分に足りないものが解ってくるってもんよ。

この辺りまで来ればサイト作れるでしょ。アイデアを必死に考えて3,4つポートフォリオを作ってだな、仕事していく上で会社で使ってるソフトを覚えておけばいい。

サイトデザインが人より劣っていてもactionscriptである程度の事できたりphotoshopでかっこいい素材作れたり実務経験うんぬんに左右されない人材評価項目なんて一杯あるもんだ。

こんだけでも未経験でやれることはたくさんあるでしょ。ちなみに上のは俺がやってきた事ね。

面接で何も持ってこなくて「やる気は誰にも負けません!」っていうのと、実際に自分が作ったものが下手でもいいからもって来るとではどっちが努力の片鱗が見えるとおもう?

もう解ったよな、はじめよう。

2009-06-18

http://anond.hatelabo.jp/20090618121442

もともと

if("0x0a" == 10){

}

を成り立たせた方が都合がよい。というのの応用で

"0x0a" == 10 == "10" となるだけだからねぇ。

if ("0x0A" == 0x0A) {
    print '(´ε` )チュッ';
}else{
    print '\(^o^)/';
}

は'(´ε` )チュッ'だしねぇ。

"0x0a" == 10 == "10" == 0x0Aなんだよね・・・

この辺がPHP世界

数字に変換されると言うよりは

==演算子、 おおよそ意味が一緒

===演算子、 おおよその意味が一緒で、型も一緒

だからねぇ。

もともと、HTMLXMLの中の数字っぽい物を数字として処理する方が、多いからこうなってるだけで・・・

文字列キャストしたら0になるっていうのが、単なる他の言語の決めの問題だからねぇ。

少なくともC/C++言語では文字列キャストしたら、ポインタアドレスが返ってくるから0じゃねーし。

atoiの事を言っているなら、それキャストじゃなくて、関数つかってるし・・・関数使うなら=タイプした方が速いだろうという、マインド

言語毎の仕様差分は、黙って覚える物で文句を言う物じゃないと思う。

2009-06-17

やっぱLLだな

SQL + Perl/Python/Ruby/Java + JavaScript + CSS + HTML、おまけにXMLとかJSONとかYAMLとか。DOMとかXPathとか。

2009-04-20

最近はてなハイクの一幕

などとタイトルをつけてはいますが、どんなことが起こっているのかを説明するつもりはさらさらありません。あしからず。以下のお題に投稿するには余りに長くなったので、勝手ですがこちらを借りました。

漢字はいらない!でひとこと - はてなハイク

http://h.hatena.ne.jp/keyword/%E6%BC%A2%E5%AD%97%E3%81%AF%E3%81%84%E3%82%89%E3%81%AA%E3%81%84%EF%BC%81

上のようなお題がハイク内で立てられ、ちょっと盛り上がったので、以下、全力で釣られてみます。

漢字使用によるデメリット

既にいくつか指摘のあるとおり、表意文字としての漢字日本語から引き算して表音文字としてのひらがな/カタカナへ統一することは、朝鮮半島でのハングル使用が少なくない同音異義語を産出し混乱を招いている現況と同様の事態を引き起こすだろうマイナスの側面がある。

弱者とは誰のことなのか

漢字使用によって抑圧される弱者として日本語母語としない外国人を想定するのなら、その弱者の補助ツールとして各種翻訳サービスを挙げることができようが、ひらがな/カタカナのみで表記された文章の翻訳は、日本語において多量に存在する、しかし漢字による表記で区別可能な同音異義語を、前後の文脈から判断して行わなければならなくなる事態を引き起こす。現在の提供されている無償の翻訳サービスですらまともなものではないのに、余計に使えないものになるだろう。

弱者として視覚障害者を想定するのであれば、視覚障害者と晴眼者の差異、視覚障害者能力が障害と見做される由縁は、「読む」ことと「聞く」ことにおける「読む」ことの利便性に他ならない。ここで、書記言語から口語言語の優位性を説くのであれば、文字を拒否するという極端な姿勢もあり得ようが、一方では、漢字使用をやめたところで、「読む」ことと「聞く」ことの差異が縮まるというものではないことも容易にわかる。漢字の不使用に「わかちがき」の使用を追加したところで事態は変わらない。ところで、書記言語から口語言語の優位性が説かれるときに、今度は聴覚障害者や構音障害者が抑圧されているかのようにみえるのは、一体どういうことだろうか。

あるいは、単に漢字の読みがわからない、また付随して意味がわからない者を弱者として想定するならば、キッズgooなどの検索先ページへの仮名振り機能は強力なツールとして既に存在しているし、オンライン辞書ツールなどの使用による「学習啓蒙」がなされて穏当、かつ然るべきではないか。

また、補助ツールを用いずに弱者への配慮をhtml/xml記述されたページ内で完結させることを考えるならば(大体、html/xml記述されたページがメディア媒介なのだが)、例えばhtml/xmlruby関連タグを備えているが、投稿においてタグ使用できないはてなハイク仕様が抑圧的だという見方もあり得よう。しかしながら、これは視点を変えれば、タグ使用することができない弱者への配慮でもあることは付記しておくべきだろう。

それどころか、ruby関連タグxml1.1でようやく認められるに至ったのであり、この点でいえば現状のhtml/xmlが抑圧的であるという判断すらあり得よう。引き算の態度を貫徹するのであれば、漢字を拒否する前に、はてなハイクでの、いや、ネット上の書き込みを拒否する態度というのも、ひとつ考えられよう。あるいは、html/xmlにおける扱いについて問題の多い日本語使用をやめて、問題の少ないラテン系言語使用に踏み切るという態度もあり得よう。

弱者とまた別の弱者

話は変わるが、歩道に敷かれている視覚障害者用の点字ブロックがいかに妥協の産物であるか、病院等の公共施設採用されるユニバーサルデザインがいかに試行錯誤の、過渡の形象であるか、ということに目をやるのが良い。そこに横たわる根幹的問題のひとつは、弱者とまた別の弱者の利害不一致である。漢字の排除が同音異義語の混乱を招くという形式は、弱者とまた別の弱者の差異を捨象するという形式と相同的なのである。これは、弱者とまた別の弱者の双方に潜在する、共通する性質を汲み取り問題解決へ向かわんとする繊細な作業――それは、不十分とは言え、点字ブロックユニバーサルデザインを産み出す過程で行われている作業である――とは全く相反した暴力的行為に他ならない。ユニバーサルデザインが足し算の思考であるとは、確かに足し算の部分も引き算の部分もあるだろう。しかし、足し算と引き算しかできない小学一年生であれば、最小公倍数と最大公約数の思考の部分についてわからないのも無理はない。

見え隠れする幼稚なユートピア幻想

さらに、より根本的には、スピヴァク古典サバルタンは語ることができるか』で指摘したのは、サティー寡婦殉死)の実行者を被抑圧者としてカテゴライズすることだったが、スピヴァクはそれを決して否定したり退けたりなどしていない。外部の視点を持ちこんで、ある彼/彼女を被抑圧者として規定すること、これこそが抑圧以外の何物でもないが、しかしこの規定によって被抑圧者を被抑圧者と認識し、被抑圧者たる彼/彼女に語りかけることが、彼/彼女の身になって考えることができる。抑圧なしのユートピアなど幻想である。抑圧なしのユートピアがお好みならば、まずもって「私」という拭い切れない自己同一性を捨て去ってみればよい。想像はできる。「お前」と同定されることのない、「私」を「私」と呼ぶことのできない、抑圧なしのユートピアがそこに拡がっているだろう。まさに、「サバルタンは語ることができない」。かつてフーコーが打ち出した『魂は身体の牢獄である』という、一見したところトリッキーテーゼに込められていたかもしれない苛立たしさには、同意するに吝かではない。この種の原初的抑圧の暴力性には敏感であるべきだし、しかし、しばし躊躇いながらも、この暴力から笑いを産み出す昇華の方法を探るべきなのである。この昇華幻想ではない。理不尽に突き付けられた、尽きることのない、終わりのない、仕事だからだ。

終わりに

僕が何を言いたいのかというと、お題ができたら全力で釣られて、あーでもないこーでもないと盛り上がり、次第に飽きては、パロディ化して派生した別のお題で盛り上がり――そんな楽しいところがはてなハイクです。

――落ち込むこともあるけれど、私は元気です――

2009-02-01

深淵データストレージ世界

ちょこっとしたデータプログラムとやり取りするのに楽な方法にはsqliteとかJSONとかxmlとか・・・他にはあるでしょうか?

2009-01-16

面倒くさくなった

// ==UserScript==
// @name           anond
// @namespace      http://anond.hatelabo.jp/
// @include        http://anond.hatelabo.jp/?page=*
// ==/UserScript==
function anond(doc) {
    $X(".//div[@class='section'][.//h3/a[2][starts-with(@href, 'http://anond.hatelabo.jp')]]", doc, Array).forEach(function(node){
        node.style.display = "none";
    });
    $X(".//h3/a[1]", doc, Array).forEach(function(node){
        var a = document.createElement("a");
        a.name = node.pathname;
        a.href = "#" + node.pathname + "/footer";
        a.innerHTML = "V";
        node.parentNode.insertBefore(a, node);
    });
    $X(".//p[@class = 'sectionfooter']/a[1]", doc, Array).forEach(function(node){
        var a = document.createElement("a");
        a.name = node.pathname + "/footer";
        a.href = "#" + node.pathname;
        a.innerHTML = "^";
        node.parentNode.insertBefore(a, node);
        node.parentNode.insertBefore(document.createTextNode(" | "), node);
    });
}

anond(document);
if (AutoPagerize.addDocumentFilter)
    AutoPagerize.addDocumentFilter(anond);


// by http://lowreal.net/blog/2007/11/17/1
// $X(exp);
// $X(exp, context);
// $X(exp, type);
// $X(exp, context, type);
function $X (exp, context, type /* want type */) {
    if (typeof context == "function") {
        type    = context;
        context = null;
    }
    if (!context) context = document;
    var exp = (context.ownerDocument || context).createExpression(exp, function (prefix) {
        var o = document.createNSResolver(context).lookupNamespaceURI(prefix);
        if (o) return o;
        return (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : "";
    });

    switch (type) {
        case String:
            return exp.evaluate(
                context,
                XPathResult.STRING_TYPE,
                null
            ).stringValue;
        case Number:
            return exp.evaluate(
                context,
                XPathResult.NUMBER_TYPE,
                null
            ).numberValue;
        case Boolean:
            return exp.evaluate(
                context,
                XPathResult.BOOLEAN_TYPE,
                null
            ).booleanValue;
        case Array:
            var 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;
        case undefined:
            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: {
                    // not ensure the order.
                    var ret = [];
                    var i = null;
                    while (i = result.iterateNext()) {
                        ret.push(i);
                    }
                    return ret;
                }
            }
            return null;
        default:
            throw(TypeError("$X: specified type is not valid type."));
    }
}

2008-12-26

[]Hatena::Bookmark::24H::Chart

修正:いい加減&が変換されるのを何とかしてほしい

解説:Hatena::Bookmark::24H(http://hatebu24h.ashitano.in/)に、トップエントリの獲得したブックマーク数の推移のチャートを加えます。

// ==UserScript==
// @name           chart of Hatena::Bookmark::24H
// @namespace      http://anond.hatelabo.jp/
// @include        http://hatebu24h.ashitano.in/*
// ==/UserScript==

var url = unescape("http://chart.apis.google.com/chart?chs=160x60%26cht=ls%26chd=t:");
url = url + $X("//div[@class='clocktxt']", Array).map(function(s){return s.firstChild.nodeValue}).join(",");
//var id = $X("//h3/a/@href")[0].nodeValue;
//url = url + $X("//div[@class='entrytitle' or @class='entrytitle2'][.//a[@href='"+id+"']]/../preceding-sibling::div[1]", Array).map(function(s){return s.textContent.match(/\d+/)}).join(",");
var before = makeElements({
    nodeName: "div",
    className: "sidebox",
    childNodes: [{
        nodeName: "div",
        className: "sidetitle",
        innerHTML: "Recent top entry chart"
      },{
        nodeName: "div",
        className: "sidetitle",
        childNodes: {
            nodeName: "img",
            src: url
        }
    }]
});
var after = $X("//div[@class='sidebox']", Array)[0];
after.parentNode.insertBefore(before, after);

// util

// var 0.01
function makeElements(obj) {
    if (typeof obj != "object")
        return document.createTextNode(obj);
    if (obj instanceof Array)
        return obj.map(makeElements);
    var node = document.createElement(obj.nodeName);
    delete obj.nodeName;
    if (obj.childNodes) {
        [].concat(makeElements(obj.childNodes)).forEach(node.appendChild, node);
        delete obj.childNodes;
    }
    function extend(dst, src) {
        for (var i in src) {
            if (typeof src[i] == "object" &amp;&amp; dst[i] &amp;&amp; typeof dst[i] == "object")
                extend(dst[i], src[i]);
            else
                node[i]=obj[i];
        }
    }
    extend(node, obj);
    return node;
}

// by http://lowreal.net/blog/2007/11/17/1
// $X(exp);
// $X(exp, context);
// $X(exp, type);
// $X(exp, context, type);
function $X (exp, context, type /* want type */) {
    if (typeof context == "function") {
        type    = context;
        context = null;
    }
    if (!context) context = document;
    var exp = (context.ownerDocument || context).createExpression(exp, function (prefix) {
        var o = document.createNSResolver(context).lookupNamespaceURI(prefix);
        if (o) return o;
        return (document.contentType == "application/xhtml+xml") ? "http://www.w3.org/1999/xhtml" : "";
    });

    switch (type) {
        case String:
            return exp.evaluate(
                context,
                XPathResult.STRING_TYPE,
                null
            ).stringValue;
        case Number:
            return exp.evaluate(
                context,
                XPathResult.NUMBER_TYPE,
                null
            ).numberValue;
        case Boolean:
            return exp.evaluate(
                context,
                XPathResult.BOOLEAN_TYPE,
                null
            ).booleanValue;
        case Array:
            var 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;
        case undefined:
            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: {
                    // not ensure the order.
                    var ret = [];
                    var i = null;
                    while (i = result.iterateNext()) {
                        ret.push(i);
                    }
                    return ret;
                }
            }
            return null;
        default:
            throw(TypeError("$X: specified type is not valid type."));
    }
}

2008-12-09

mayaweb.jpftp

テクニカル的な事を書いてみる。

今日、mayaweb.jp携帯サイト無料レンタルしたのだが、

FFFTPが繋がらない!googleで検索しても、

ftp://www.mayaweb.jp/アドレスftpがついてると

FFFTP等は認識しないから、www.mayaweb.jpにしろ!

ぐらいしか情報が出てこない…登録完了メールでの

FTPアドレスwww.mayaweb.jpだから何の解決にもならん!

で、インターネットエクスプローラー

ftp://www.mayaweb.jpアクセスしてみた。

IDパスワードログインはできたのだが、

表示→「FTPでエクスプローラーを開く」をクリックすると、

認証に失敗する。取り敢えず、キャンセルして、

PC側のエクスプローラーからファイルドラッグしたら

アップロードできた。うーん、アップロードはできたが、

意味が分からん!どうなってるんだ、ほんと。

まあ、アップロードできたので良しするか…

あっ、mayaweb.jpは、googleサイトマップに登録するための

sitemap.xmlアップロードできた。無料レンタルサーバー

って、xmlとかの拡張子ファイルはアップできないところも

あるんだよなぁ… そうそう、グーグルサイトマップ

最近モバイルとかの種類を選択しなくてもいいようになった。

裏を返せば、サイトマップモバイルだと、<mobile:mobile />タグ

付け加えないとダメになったってことだろう。

googleモバイルに登録されたければ、モバイル用のサイトマップ

書いておこう。モバイル用のサイトマップは、こんな感じ

今回作った携帯サイトコレ(笑)

2008-12-01

PHP

XMLで構成されたサイトPHPで作れって言われたんだけど、PHPXMLを飲み込めるかな

2008-11-27

はてブでびゅー

してみようかとおもう。デザイン綺麗になったし。

しかし

Firefoxブクマインポートするとか(XMLに変換?)

Googlenotebookからインポートとか、できたらいいのに

よくわからない。

皆どうやってはてブデビューしたの?

いろんな情報財産(?)があっちこっちに散在している

現状がイラっとする。

散在させた自分が悪いんだけどさ。

2008-11-17

Macで作ったppt,docの図がWindowsで表示できない場合の対処方法

Mac OS で作成された WordPowerPointファイル

Windows で開いたら,図の代わりに

QuickTimeý Ç??

êLí£ÉvÉçÉOÉâÉÄ

ǙDZÇÃÉsÉNÉ`ÉÉÇ??å©ÇÈÇžÇ??Ç…ÇÕïKóvÇ??Ç??ÅB

みたいな感じで表示されてしまったときの対処方法

-------------------------------------------

1.当該の hogehoge.doc あるいは hogehoge.ppt ファイルWord

PowerPoint で開き,「ウェブページとして保存」する.

このとき「単一ファイル Web ページ」や「XML ドキュメント」ではなく

「*.html」形式で保存されていることを確認.

2. 保存したフォルダに「hogehoge_files」というサブフォルダが出来たのを確認.

3. そこに *.pcz というファイルがあるのを確認.

4. *.pcz を *.tgz にリネームして,各種ソフト解凍

5. そこでできたファイルを *.pict / *.pctリネーム

6. QuickTime Picture Viewer 等で開いて copy → 元のファイルにpaste.

あるいは Irfan View (+ Quicktime.dll) 等で形式変換してから挿入.

以上.

2008-11-11

プログラミング言語が生き残れる条件

http://anond.hatelabo.jp/20081111231247

これからはXMLが簡単にパース出来ない言語は滅ぶよ!

だからawk大丈夫だね!

2008-11-01

http://anond.hatelabo.jp/20081101031348

Could not load class (App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS) because : Can't locate XML/LibXML.pm in @INC (@INC contains: /home/pc/mobirc/lib /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at /home/pc/mobirc/lib/App/Mobirc/Plugin/HTMLFilter/DoCoMoCSS.pm line 5.

どっか変なところある?

真っ当なエラーメッセージだと思うけど。

http://anond.hatelabo.jp/20081101031143

pc@ubuntu-vm:~$ mobirc/mobirc

Could not load class (App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS) because : Can't locate XML/LibXML.pm in @INC (@INC contains: /home/pc/mobirc/lib /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at /home/pc/mobirc/lib/App/Mobirc/Plugin/HTMLFilter/DoCoMoCSS.pm line 5.

BEGIN failed--compilation aborted at /home/pc/mobirc/lib/App/Mobirc/Plugin/HTMLFilter/DoCoMoCSS.pm line 5.

Compilation failed in require at /usr/local/lib/perl/5.8.8/Class/MOP.pm line 151.

at /usr/local/lib/perl/5.8.8/Class/MOP.pm line 133

Class::MOP::load_first_existing_class('App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS') called at /usr/local/lib/perl/5.8.8/Class/MOP.pm line 157

Class::MOP::load_class('App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS') called at /usr/local/share/perl/5.8.8/MooseX/Plaggerize.pm line 20

App::Mobirc::load_plugin('App::Mobirc=HASH(0x8d7e490)', 'HASH(0x8d7536c)') called at /home/pc/mobirc/lib/App/Mobirc.pm line 44

App::Mobirc::_load_plugins('App::Mobirc=HASH(0x8d7e490)') called at /home/pc/mobirc/lib/App/Mobirc.pm line 35

Class::MOP::Class:::around('CODE(0x8ab5250)', 'App::Mobirc', '/home/pc/mobirc/config.yaml') called at /usr/local/lib/perl/5.8.8/Class/MOP/Method/Wrapped.pm line 129

Class::MOP::Method::Wrapped::__ANON__('App::Mobirc', '/home/pc/mobirc/config.yaml') called at /usr/local/lib/perl/5.8.8/Class/MOP/Method/Wrapped.pm line 89

App::Mobirc::new('App::Mobirc', '/home/pc/mobirc/config.yaml') called at mobirc/mobirc line 36

pc@ubuntu-vm:~$ sudo mobirc/mobirc

Could not load class (App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS) because : Can't locate XML/LibXML.pm in @INC (@INC contains: /home/pc/mobirc/lib /etc/perl /usr/local/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl .) at /home/pc/mobirc/lib/App/Mobirc/Plugin/HTMLFilter/DoCoMoCSS.pm line 5.

BEGIN failed--compilation aborted at /home/pc/mobirc/lib/App/Mobirc/Plugin/HTMLFilter/DoCoMoCSS.pm line 5.

Compilation failed in require at /usr/local/lib/perl/5.8.8/Class/MOP.pm line 151.

at /usr/local/lib/perl/5.8.8/Class/MOP.pm line 133

Class::MOP::load_first_existing_class('App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS') called at /usr/local/lib/perl/5.8.8/Class/MOP.pm line 157

Class::MOP::load_class('App::Mobirc::Plugin::HTMLFilter::DoCoMoCSS') called at /usr/local/share/perl/5.8.8/MooseX/Plaggerize.pm line 20

App::Mobirc::load_plugin('App::Mobirc=HASH(0x8d799e0)', 'HASH(0x8d7089c)') called at /home/pc/mobirc/lib/App/Mobirc.pm line 44

App::Mobirc::_load_plugins('App::Mobirc=HASH(0x8d799e0)') called at /home/pc/mobirc/lib/App/Mobirc.pm line 35

Class::MOP::Class:::around('CODE(0x8ab4390)', 'App::Mobirc', '/home/pc/mobirc/config.yaml') called at /usr/local/lib/perl/5.8.8/Class/MOP/Method/Wrapped.pm line 129

Class::MOP::Method::Wrapped::__ANON__('App::Mobirc', '/home/pc/mobirc/config.yaml') called at /usr/local/lib/perl/5.8.8/Class/MOP/Method/Wrapped.pm line 89

App::Mobirc::new('App::Mobirc', '/home/pc/mobirc/config.yaml') called at mobirc/mobirc line 36

イミフ

2008-10-29

ヨドバシ・ドット・コム」がリニューアル後おかしくなってるそうな

どうしたんかいな、とネットワークトレースをとってみた。そしたら、トップ画面の要求に対してこんな応答が返っていた。

GET / HTTP/1.1
Host: www.yodobashi.com
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

HTTP/1.1 200 OK
Date: Wed, 29 Oct 2008 02:02:31 GMT
Server: Apache
Pragma: no-cache
Cache-Control: private
Expires: -1
Set-Cookie: JSESSIONID=FAE13F42154EB566479E047B57CBF2EA; Path=/cs
Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/
Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/
Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/
Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/
Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/
Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/
Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/
Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/
Set-Cookie: SS_X_JSESSIONID=AFA6E52B61BCC8A2C2704B1F60B98B6A; Path=/
Set-Cookie: BIGipServerPool_www_yodobashi_com_cms=1258399936.20480.0000; path=/
Content-Length: 83878
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html;charset=Windows-31J

えーと。どこから突っ込んでいいのやら。

ベンダ変えた方がよくないですか?>ヨドバシ

2008-10-05

自社サイトの構築を頼まれたが、エラーが多いと上司に怒られた

17個のエラーがありました。このHTMLは 85点です。タグが 24種類 90組使われています。文字コードUTF-8 のようです。

6: line 1: XHTML1.0 では XML宣言をすることが強く求められています。 → 解説 21

0: line 24: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 28: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 35: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 38: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 44: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 75: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 76: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 77: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 78: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 79: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 80: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 81: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 82: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 83: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

0: line 88: (<img> には width と height 属性を指定するようにしましょう。) → 解説 185

5: line 105: XHTML1.0 では XML宣言中に encoding 指定をしましょう。 → 解説 137

2008-09-14

60行で作らないPHPテンプレートエンジン

今更だけど60行で作るPHP用テンプレートエンジンクラス化した。

  1. PHP5で動かしてね
  2. 細かい使い方はコード見て適当に判断してね
  3. もちろん改変、商用利用自由にね
  4. サンプルテンプレート60行で作るPHP用テンプレートエンジンと一緒
コード
<?php
class NoSixTemplate{
   protected $template_dir = null;
   protected $template = null;
   protected $context = array();
   
   function __construct($filename = null, $directory = null){
      $this->set_template($filename);
      $this->set_dir($directory);
   }
   
   function set_template($filename){
      $this->template = $filename;
   }
   
   function set_dir($directory){
      if(substr($directory, -1) != '/') $directory .= '/';
      $this->template_dir = $directory;
   }
   
   function set_data($context_key, $context_data, $overwrite = false){
      if(empty($this->context[$context_key]) || $overwrite){
         $this->context[$context_key] = $context_data;
      }else{
         if(is_array($context_data) &amp;&amp; is_array($this->context[$context_key])){
            $this->context[$context_key] = array_merge($this->context[$context_key], $context_data);
         }else{
            $this->context[$context_key] .= $context_data;
         }
      }
   }
   
   function reset($context_key = null){
      if(is_null($context_key)){
         $this->context = array();
      }else{
         $this->context[$context_key] = null;
      }
   }
   
   function convert_template(){
       $filename = $this->template_dir.$this->template;
       $cachename = $filename.'.cache';
       if(!file_exists($cachename) || filemtime($cachename) < filemtime($filename)){
           $s = file_get_contents($filename);
           $s = $this->convert_string($s);
           
           if(is_writable($cachename) || is_writable($this->template_dir)){
               file_put_contents($cachename, $s);
           }
       }
       return $cachename;
   }
   
   function convert_string($s) {
       $s = preg_replace('/^<\?xml/', '<<?php ?>?xml', $s);
       $s = preg_replace('/#\{(.*?)\}/', '<?php echo $1; ?>', $s);
       $s = preg_replace('/%\{(.*?)\}/', '<?php echo htmlspecialchars($1,ENT_QUOTES); ?>', $s);
       return $s;
   }
   
   function display(){
       $cache = $this->convert_template();
       extract($this->context);
       include($cache);
   }
}
?>
サンプルコード
<?php
require_once('NoSixTemplate.php');
$template = new NoSixTemplate('template.php', 'template_directory');
$template->set_data('title', 'Example');
$template->set_data('list', array(10,'<A&amp;B>',NULL));
$template->display();
?>

2008-08-03

読売新聞だからなんだっての?

火星生命存在の可能性?「NASA近く発表」と米専門誌

http://www.yomiuri.co.jp/science/news/20080802-OYT1T00463.htm

という読売新聞の記事に対して、はてなブックマークでnekoraという人が

2008年08月02日 nekora 読売新聞なのがなぁ

と言っている。

http://b.hatena.ne.jp/entry/http://www.yomiuri.co.jp/science/news/20080802-OYT1T00463.htm

http://b.hatena.ne.jp/nekora/20080802#bookmark-9518450


さて勝手にこの人が言ってもない事を読み取るぞ。

  • こんな面白い記事が載っているのが(私の好きではない)読売新聞なのがなぁ
  • 信憑性の無い記事を書く(という印象を私が持っている)読売新聞なのがなぁ(だから記事の内容が信用できないなぁ)

ほかに何かあるかな。僕が知らないだけでこの火星探査機は読売新聞が飛ばしてるとか大口スポンサーになってるんでしょうか。

読売新聞は信頼性の無い海外メディアの記事を頻繁に参照してデタラメな記事を載せているとか?

それとも読売新聞がアビエーション・ウイークに載ってもいないデタラメを報じているのでは、とでも言いたいのか、翻訳ミスがあると言いたいのか。

(ちなみにアビエーション・ウイークのこれに関する記事はこちら↓)

http://www.aviationweek.com/aw/generic/story_channel.jsp?channel=space&id=news/WH08018.xml

2008-06-02

さくらのレンタルサーバ ライトユーザが書く実情(または宣伝もしくは疑問)

http://anond.hatelabo.jp/20080601175525

他の有料レンタルサーバを使ったことないので、あてにはできないけど。

総評

ライトプランの制限

重要なこと

プラン変更は出来ない。変更したい場合は別プランで新規登録後、データを移すことになる。

その他

実際の環境

公式にはこちら

以下私の環境。これは割り当てられたサーバにより多少の違いがあり得る。その他詳細はアカウント毎に確認できる。

CPUIntel(R) Pentium(R) M processor 2.00GHz
メモリ2GB
OSFreeBSD 6.1-RELEASE-p23 i386
ApacheApache/1.3.39
Perl5.8.8
Ruby1.8.5
Python2.4.5

主なperlライブラリ

2008-05-13

GuiceSeasar2 を連携させてみたよ

[参考文献]

    S2 は、.dicon ファイルで定義をだいぶ簡略化できる。パフォーマンスはどうなんだろう。誰かテストしてくれいw

    app.dicon

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

    <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" "http://www.seasar.org/dtd/components24.dtd">

    <components namespace="client">

    <include path="hello.dicon" />

    <component class="org.seasar.guice.Client" />

    </components>

    hello.dicon

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

    <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"

    "http://www.seasar.org/dtd/components24.dtd">

    <components initializeOnCreate="false">

    <component class="org.seasar.guice.HelloServiceImpl" />

    </components>

    HelloService.java、HelloServiceImpl.java は、上記 ITPro と内容が同じなので省略。

    Module.java

    package org.seasar.guice;

    import org.seasar.framework.container.S2Container;

    import org.seasar.framework.container.SingletonS2Container;

    import org.seasar.framework.container.factory.S2ContainerFactory;

    import com.google.inject.AbstractModule;

    import com.google.inject.name.Names;

    public class Module extends AbstractModule {

    S2Container container = null;

    public Module(S2Container container){

    this.container = container;

    }

    @Override

    protected void configure() {

    bind(S2ContainerFactory.class).annotatedWith(Names.named(container.getPath()));

    bind(Client.class).toInstance(SingletonS2Container.getComponent(Client.class));

    }

    }

    Client.java

    package org.seasar.guice;

    public class Client {

    private HelloService helloService = null;

    public void setHelloService(HelloService helloService) {

    this.helloService = helloService;

    }

    public void execute() {

    helloService.sayHello();

    }

    }

    Main.java

    package org.seasar.guice;

    import org.seasar.framework.container.S2Container;

    import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

    import com.google.inject.Guice;

    import com.google.inject.Injector;

    public class Main {

    private static final String PATH = ".\\app.dicon";

    public static void main(String[] args) {

    SingletonS2ContainerFactory.setConfigPath(PATH);

    SingletonS2ContainerFactory.init();

    S2Container container = SingletonS2ContainerFactory.getContainer();

    Module module = new Module(container);

    Injector injector = Guice.createInjector(module);

    Client client = injector.getInstance(Client.class);

    client.execute();

    }

    }

    実行結果

    java -cp ?? org.seasar.guice.Main

    2008/05/13 21:19:22 org.seasar.framework.log.Logger info

    情報: Running on [ENV]product, [DEPLOY MODE]Normal Mode

    Hello, world!

    実行環境JDK 7 (build 1.7.0-ea-b24)

    2008-03-27

    http://anond.hatelabo.jp/20080327022633

    というわけでまとめはwikiで。

    という話が過去にあったなと、検索したらもうすぐ2年です><

    http://www.goodpic.com/mt/archives2/2005/06/blogwiki.html

    http://mojix.org/2005/06/28/232219

    でみんなワイワイ。ブックマークでワイワイ。

    ま、ブログも専用カテゴリ過去日記トラックバックで幾らか似たような事が出来るし、はてなグループキーワードwiki的だけれど、結局はまとめる手間が面倒臭いと。

    トラックバックがそのあたりを少しだけ補完してくれるのだけれど、もう少しハンドリングが良くなるといいな。XMLとかJSONとかで配ってくれるとツリー構築とかしやすくなると思う。

    あと、閲覧側が手軽に記事同士を関連付けていける仕組みってのがほしいかも。その辺はブックマークが担う部分か。現状、はてなブックマークはそのあたりが幾らか備わってるな。wiki的に誰でも編集できるとか、含む日記とか。そのあたり、対人間も含めもう少しハンドリングよくしたり、ユーザーのページで役に立つようにしたらよいかも。

    だからあれか、フローストックの中間的な部分をフローからストックへ向けてデータを再利用しながら改良していきやすいシステムでつなげていけばいいのか。

    はてなブックマークポチポチ選択していったら、ブログからトラックバックコメントを取ってきて、それをまたポチポチ選択していくと関連する話のツリーやまとめが出来てきて、それでポチっと押すとはてな記法でそれが吐き出されて、とか。

    そういや、今度作り直すんだって?そんな風にならないかな。

    2008-03-21

    []Python 2.5のdistutilsで、Visual Studio 2005を使いたい!

    目的

    Visual Studio 2005しかインストールしてない場合、Python 2.5だとdistutilsが正しく動かないっぽいので、どうにかしたいYO!

    なんでVisual Studio 2005だと、distutilsが動かないんかな?

    distutilsでVisual Studioを使うときのコンパイル環境は、sysモジュールのversionプロパティを参照して環境を選択をしているようです。Pythonインタプリタを起動して、以下のような命令を実行してみると、sys.versionプロパティが確認できます。

    import sys;print sys.version
    

    Python 2.5.2だと、以下のようになっています。Visual Studio 2003の環境が使われるようです。

    2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)]
    

    Python 2.6a1だと、以下のようになっています。Visual Studio 2008の環境が使われるようです。

    2.6a1 (r26a1:61155, Mar  1 2008, 12:11:56) [MSC v.1500 32 bit (Intel)]
    

    以上から察するに、Python 2.5.2とPython 2.6のどちらでも、Visual Studio 2005の環境が選択されることはないっぽいです。うーん、困った!

    解決策

    Python 2.6とVisual Studio 2008をインストールしよう!」というのを真っ先に思いつきましたが、あんまり環境を変えたくないんだよなー。というわけで、環境の変更を最低限に抑えてどうにかしてみました。簡単に言うと、distutilsだけの置き換えをしました。

    Python 2.6 をインストールする

    Python 2.6の公式ダウンロードページから、Windows版のインストーラーをダウンロードして、適当な場所にインストールしてください。

    distutilsだけ置き換える

    "Python-2.5.2/Lib/distutils"を別の場所に移動し、"Python-2.6a1/Lib/distutils"を"Python-2.5.2/Lib"以下にコピーしてください。以降はPython 2.6は必要ないので、アンインストールして構いません。

    ファイルの修正
    • 例外をPython 2.5.2で許されている形式に変更。
    • get_build_version()関数で強制的に8を返すように変更。

    上記の2点の変更を行います。distutilsディレクトリに、以下のパッチをあててください。

    Index: msvccompiler.py
    ===================================================================
    --- msvccompiler.py
    +++ msvccompiler.py
    @@ -170,6 +170,7 @@
         if majorVersion == 6:
             minorVersion = 0
         if majorVersion >= 6:
    +        return 8
             return majorVersion + minorVersion
         # else we don't know what version of the compiler this is
         return None
    Index: msvc9compiler.py
    ===================================================================
    --- msvc9compiler.py
    +++ msvc9compiler.py
    @@ -128,7 +128,7 @@
                                    "sdkinstallrootv2.0")
                 else:
                     raise KeyError("sdkinstallrootv2.0")
    -        except KeyError as exc: #
    +        except KeyError, exc: #
                 raise DistutilsPlatformError(
                 """Python was built with Visual Studio 2008;
     extensions must be built with a compiler than can generate compatible binaries.
    @@ -172,6 +172,7 @@
         if majorVersion == 6:
             minorVersion = 0
         if majorVersion >= 6:
    +        return 8
             return majorVersion + minorVersion
         # else we don't know what version of the compiler this is
         return None
    @@ -455,7 +456,7 @@
                     try:
                         self.spawn([self.rc] + pp_opts +
                                    [output_opt] + [input_opt])
    -                except DistutilsExecError as msg:
    +                except DistutilsExecError, msg:
                         raise CompileError(msg)
                     continue
                 elif ext in self._mc_extensions:
    @@ -482,7 +483,7 @@
                         self.spawn([self.rc] +
                                    ["/fo" + obj] + [rc_file])
     
    -                except DistutilsExecError as msg:
    +                except DistutilsExecError, msg:
                         raise CompileError(msg)
                     continue
                 else:
    @@ -495,7 +496,7 @@
                     self.spawn([self.cc] + compile_opts + pp_opts +
                                [input_opt, output_opt] +
                                extra_postargs)
    -            except DistutilsExecError as msg:
    +            except DistutilsExecError, msg:
                     raise CompileError(msg)
     
             return objects
    @@ -520,7 +521,7 @@
                     pass # XXX what goes here?
                 try:
                     self.spawn([self.lib] + lib_args)
    -            except DistutilsExecError as msg:
    +            except DistutilsExecError, msg:
                     raise LibError(msg)
             else:
                 log.debug("skipping %s (up-to-date)", output_filename)
    @@ -598,7 +599,7 @@
                 self.mkpath(os.path.dirname(output_filename))
                 try:
                     self.spawn([self.linker] + ld_args)
    -            except DistutilsExecError as msg:
    +            except DistutilsExecError, msg:
                     raise LinkError(msg)
     
             else:
    
    manifestファイルを作る

    python.exeと同じディレクトリに、以下のXMLを"python.exe.manifest"として保存してください。

    <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
    <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
      <dependency>
        <dependentAssembly>
          <assemblyIdentity
            type='win32'
            name='Microsoft.VC80.CRT'
            version='8.0.50608.0'
            processorArchitecture='x86'
            publicKeyToken='1fc8b3b9a1e18e3b'
            />
        </dependentAssembly>
      </dependency>
    </assembly>
    

    これで終わりです。

    ログイン ユーザー登録
    ようこそ ゲスト さん