はてなキーワード: xmlとは
最近マークアップエンジニア志望の若者と話す機会が多いのだけれど、そこで気づかされるのは、彼らの中に過去のHTML(特に90年代以前の仕様)を読んだことのあるという人が、驚くほど少ないことだ。
例えば「マーク・アンドリーセンをどう思う?」と聞くと、「アンドリーセンって誰ですか?」という答えが返ってくる。「ヨスケの独自要素で何が一番好き?」と聞くと、「見たことがありません」と言われてしまう。「ではきみは、昔のHTMLを見たことがあるの?」と聞くと、たいていが「とほほでやっていたものくらいなら……」という答えしか返ってこない。
今の若い人の間では、HTMLを体系的にとらえようという人は少ないようだ。見るのは専ら近年の話題仕様ばかりで、歴史を辿ってみたり、系譜をひもといて標準化団体ごと理解しようとする人はほとんどいない。
これは、ちょっと由々しき問題だと思わされた。HTMLは、もう長いこと(90年代の早い時期から)インターネットの王者としてあらゆるWeb関連技術の上に君臨してきた。だから、Webを作ることを仕事にしたいなら、何をするにせよ避けて通ることはできない。
HTMLは、表・画像・フォーム・音楽・デザイン・フレーム・動画など、さまざまな分野においてその時代々々に達成された最新の成果を持ち寄るようにして作られてきたところがある。だから、HTMLを読まずして現代のインターネットは語れないと言ってもいいくらいだ。
もし何かクリエイティブなことをしたいのなら、HTMLを読むことは欠かせない。また、単に読むだけではなく、それを包括的・体系的にとらえることも必要だ。なぜなら、HTMLを包括的・体系的にとらえることによって、現代のインターネットそのものを、包括的・体系的にとらえられるようになるからだ。そしてそうなれば、Webを作ることの道理や筋道が理解でき、何かクリエイティブなことをする上で、大きな助けとなるからである。
そこでここでは、昔のHTMLをほとんど見たことがないという人や、あるいはHTMLそのものもあまり見ないという人のために、これを見ればHTMLを体系的に理解でき、現代インターネットの成り立ちや実相までをも包括的にとらえることができるようになる、7本の仕様を紹介する。
ここで紹介するHTMLは、いずれも後のWeb業界に決定的な影響を与えたものばかりだ。これらが、HTMLという標準のありようや方向性を決定づけた。この7本を見れば、HTMLというのはどのようなきっかけで生まれ、どのような変遷を辿って、どのような足跡を残してきたかというのが、体系的に理解できるようになる。そしてそれが、世界のインターネット利用シーンにどのような影響を及ぼしてきたかということも、知ることができるようになるのだ。
まず最初は、ちょっと強引かも知れないけれど、第一次ブラウザ戦争前の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』の影響を免れたものはないからである。
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は、これ以降無数に手本とされ、真似され、拡張されることとなるのである。
正字正仮名の影響を受けた日本の若き日記書きたち――言うなれば「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はここに、新しい時代の幕開けを迎えるに至ったのである。
先に述べた「CSSコミュニティ」がWeb日記業界に論争をもたらすのは、2000年代に入ってからのことである。そして、そのきっかけとなったできごとの一つが、1947年生まれの非政府組織で、IECとも協力した生粋の工業標準化団体であった国際標準化機構が、この仕様『ISO/IEC 15445:2000 (ISO-HTML)』によって成功を収めたことである。
このHTMLは、単にJIS的に標準化しただけではなく、文化的な意味においても、フラットでリニアな構造の力を広く世界に知らしめることとなった。この仕様の成功によって、世界の人々は、レベル付けされた見出しの魅力の大きさを知る。そしてそれが、やがて見出しのレベル分けが世界のスタンダードとなり、誰もが当たり前のように使う状況を育んでいくのである。
またこの仕様は、CSSコミュニティそのものにも大きな影響を与えた。この仕様の成功に刺激を受けた才能ある若きコミュニティ住人たちが、その後立て続けに台頭し、いくつもの名サイトを生み出していくからである。
それらが相まって、やがてCSSコミュニティは空前の黄金時代を迎えることになる。その端緒となり、道筋を切り開いたのが、他ならぬこの『ISO-HTML』なのだ。
『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業界にもたらした変革には、大きなものがあったのである。
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標準たちの誕生にもつながっていったのである。
最後は、第二次ブラウザ戦争の集大成ともいえるこの仕様である。
『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を体系的に見るとはどういうことか」を学んできた。
高校時代に読んだこのサイトによって、「リソースとは何か」ということを、ぼくはを知った。
「HTMLはSGMLの応用だ」ということが、このサイトを読むことでよく分かる。何気なく見ていた省略記法でも、その裏には、実にさまざまな技術や、それを開発してきた歴史というものが隠されていた。
世界がCSSコミュニティの何に驚かされたかといえば、それはやっぱり精緻に書き込まれた正字正仮名にだ。ノジタンの日記には、HTMLの本質が詰まっている。だからこそ、あれだけ多くの日記で多くのコミュニティ住人に、言及されたり模倣されたりしたのだ。
ここでは取りあげられなかったのだが、とほほ氏がHTMLというジャンルに及ぼした影響にも、本当に大きなものがある。そして、ぼくが上に挙げた感想のいくつかは、このサイトに書かれていたばけらさんとの「スタイルシート論争」を参考にしたものなのだ。
これらのサイトを読めば、どんなHTMLが素晴らしく、どんなHTMLがそうではないというのが、よく分かる。その判定基準を知ることができ、審美眼を養うことができるのだ。なにしろ、あのCSSコミュニティ住人の言うことなのだ。これにまさる教科書は、他にはない。
【元ネタ】
アメーバブログには他ブログサービスと比較してクソな仕様がいくつかあるけれど、
その最たるものは、RSS Readerでは画像が表示されないという点だ。
feedの合間に広告を出す仕様は理解できる。
『著作権保護のため、記事の一部のみ表示されております。』という上から目線の余計な一言にも耐えられる。
(『続きを読む』でいいだろ、とは思う)
だけど画像が表示されないというのはあまりに致命的すぎて、RSS Readerでは読むなと言ってるようなものだ。
しょこたんブログまでもがアメーバブログに移転して1ヶ月が経つ。
あれだけ熱心に流し読みしていた彼女のブログも、画像無しではまるでルーのないカレーライスだ。
もはやRSS Readerに登録するだけの価値を見いだせなくなってきた。
ネット上にはrss20.xmlを登録すれば全文&画像配信されると書いてあるけれど、試してみても何ら効果はなかった。
どうしてこんなクソサービスにこぞって人が流れるのか理解できない。
(藤川有里ブログであったり、マナカナブログであったり、ここ2~3ヶ月立て続けにアメブロへの移転が続いていらだちは募るばかり)
外部の人間には分からないアメーバブログならではの利点があるのだろうか。
みんな水増しされたヒット数に踊らされてるだけなんじゃないだろうか。
建築系の4年だけども、ちょっと言いたい。
デザイナーになり方なんて無いぞ。
当然じゃない。そりゃ技術はもちろん元気よく愛想よく営業能力も抜群なら未経験者の出る幕無しだけど、他分野の未経験者を採ってその人の強味を活かしたいだとか、
何色にも染まってない人を採って会社のやり方を疑いなく吸収してくれるからだとか、未経験に期待する人事担当者も実際にいるわな。
で、どうすればなればいいって人に聞いてる時点でデザイナーとしてやってくのは無理なんじゃないかと。
ウェブデザイン業界はよく知らないけど、そもそもデザイナーがやるべき仕事はソリューションなんだから、それに矛盾しない形が表現できるかどうかがデザイナーの質だと思うのね。
だからコンサルティングの要素が強い。問題解決能力を一番求められるのにそれを聞いてるようじゃダメっしょ。
まぁ他学科の学生が言うのもアレだけども、技術力とデザインセンスとDTPスキルを磨けば何とかなるんじゃないかな。
具体的にはTCPIPとかFTPとかDNSとかhtaccessとか無数にある用語とその意味を把握した上でperlでCGI作ったりruby on railsでブログを作ったりしてウェブの基礎知識を蓄えてだな、
それで最も重要なのはデザインスキル。DTPオペレーターがデザイナーとか自称してるの見てると笑われるだけだからここ重要な。
まあデッサンしまくって立体造形感覚を磨いて色彩とかフォントとかレイアウトとかデザイン全般に必要な知識も学んでだ、モニター上に表現する前に紙に書けないとオペレーター止まりよ。
その後でHTMLとかXMLとかマークアップ系言語勉強してテキストエディタで一通りウェブページを作って、頭に中で思ってる事と実際にプロットされる画面とを近づけていって、ついでにワードプレスとかのCMSも勉強してphpとSQLの仕組みが大体解ってこれば知らぬ間にウェブデザインでやっていくに自分に足りないものが解ってくるってもんよ。
この辺りまで来ればサイト作れるでしょ。アイデアを必死に考えて3,4つポートフォリオを作ってだな、仕事していく上で会社で使ってるソフトを覚えておけばいい。
サイトデザインが人より劣っていてもactionscriptである程度の事できたりphotoshopでかっこいい素材作れたり実務経験うんぬんに左右されない人材評価項目なんて一杯あるもんだ。
こんだけでも未経験でやれることはたくさんあるでしょ。ちなみに上のは俺がやってきた事ね。
面接で何も持ってこなくて「やる気は誰にも負けません!」っていうのと、実際に自分が作ったものが下手でもいいからもって来るとではどっちが努力の片鱗が見えるとおもう?
もう解ったよな、はじめよう。
もともと
if("0x0a" == 10){
}
を成り立たせた方が都合がよい。というのの応用で
"0x0a" == 10 == "10" となるだけだからねぇ。
if ("0x0A" == 0x0A) { print '(´ε` )チュッ'; }else{ print '\(^o^)/'; }
は'(´ε` )チュッ'だしねぇ。
"0x0a" == 10 == "10" == 0x0Aなんだよね・・・
数字に変換されると言うよりは
だからねぇ。
もともと、HTMLやXMLの中の数字っぽい物を数字として処理する方が、多いからこうなってるだけで・・・
文字列をキャストしたら0になるっていうのが、単なる他の言語の決めの問題だからねぇ。
少なくともC/C++言語では文字列はキャストしたら、ポインタアドレスが返ってくるから0じゃねーし。
atoiの事を言っているなら、それキャストじゃなくて、関数つかってるし・・・関数使うなら=タイプした方が速いだろうという、マインド。
などとタイトルをつけてはいますが、どんなことが起こっているのかを説明するつもりはさらさらありません。あしからず。以下のお題に投稿するには余りに長くなったので、勝手ですがこちらを借りました。
上のようなお題がハイク内で立てられ、ちょっと盛り上がったので、以下、全力で釣られてみます。
既にいくつか指摘のあるとおり、表意文字としての漢字を日本語から引き算して表音文字としてのひらがな/カタカナへ統一することは、朝鮮半島でのハングル使用が少なくない同音異義語を産出し混乱を招いている現況と同様の事態を引き起こすだろうマイナスの側面がある。
漢字の使用によって抑圧される弱者として日本語を母語としない外国人を想定するのなら、その弱者の補助ツールとして各種翻訳サービスを挙げることができようが、ひらがな/カタカナのみで表記された文章の翻訳は、日本語において多量に存在する、しかし漢字による表記で区別可能な同音異義語を、前後の文脈から判断して行わなければならなくなる事態を引き起こす。現在の提供されている無償の翻訳サービスですらまともなものではないのに、余計に使えないものになるだろう。
弱者として視覚障害者を想定するのであれば、視覚障害者と晴眼者の差異、視覚障害者の能力が障害と見做される由縁は、「読む」ことと「聞く」ことにおける「読む」ことの利便性に他ならない。ここで、書記言語から口語言語の優位性を説くのであれば、文字を拒否するという極端な姿勢もあり得ようが、一方では、漢字の使用をやめたところで、「読む」ことと「聞く」ことの差異が縮まるというものではないことも容易にわかる。漢字の不使用に「わかちがき」の使用を追加したところで事態は変わらない。ところで、書記言語から口語言語の優位性が説かれるときに、今度は聴覚障害者や構音障害者が抑圧されているかのようにみえるのは、一体どういうことだろうか。
あるいは、単に漢字の読みがわからない、また付随して意味がわからない者を弱者として想定するならば、キッズgooなどの検索先ページへの仮名振り機能は強力なツールとして既に存在しているし、オンライン辞書ツールなどの使用による「学習の啓蒙」がなされて穏当、かつ然るべきではないか。
また、補助ツールを用いずに弱者への配慮をhtml/xmlで記述されたページ内で完結させることを考えるならば(大体、html/xmlで記述されたページがメディア=媒介なのだが)、例えばhtml/xmlはruby関連タグを備えているが、投稿においてタグを使用できないはてなハイクの仕様が抑圧的だという見方もあり得よう。しかしながら、これは視点を変えれば、タグを使用することができない弱者への配慮でもあることは付記しておくべきだろう。
それどころか、ruby関連タグはxml1.1でようやく認められるに至ったのであり、この点でいえば現状のhtml/xmlが抑圧的であるという判断すらあり得よう。引き算の態度を貫徹するのであれば、漢字を拒否する前に、はてなハイクでの、いや、ネット上の書き込みを拒否する態度というのも、ひとつ考えられよう。あるいは、html/xmlにおける扱いについて問題の多い日本語の使用をやめて、問題の少ないラテン系言語の使用に踏み切るという態度もあり得よう。
話は変わるが、歩道に敷かれている視覚障害者用の点字ブロックがいかに妥協の産物であるか、病院等の公共施設で採用されるユニバーサル・デザインがいかに試行錯誤の、過渡の形象であるか、ということに目をやるのが良い。そこに横たわる根幹的問題のひとつは、弱者とまた別の弱者の利害不一致である。漢字の排除が同音異義語の混乱を招くという形式は、弱者とまた別の弱者の差異を捨象するという形式と相同的なのである。これは、弱者とまた別の弱者の双方に潜在する、共通する性質を汲み取り問題解決へ向かわんとする繊細な作業――それは、不十分とは言え、点字ブロックやユニバーサル・デザインを産み出す過程で行われている作業である――とは全く相反した暴力的行為に他ならない。ユニバーサル・デザインが足し算の思考であるとは、確かに足し算の部分も引き算の部分もあるだろう。しかし、足し算と引き算しかできない小学一年生であれば、最小公倍数と最大公約数の思考の部分についてわからないのも無理はない。
さらに、より根本的には、スピヴァクが古典『サバルタンは語ることができるか』で指摘したのは、サティー(寡婦殉死)の実行者を被抑圧者としてカテゴライズすることだったが、スピヴァクはそれを決して否定したり退けたりなどしていない。外部の視点を持ちこんで、ある彼/彼女を被抑圧者として規定すること、これこそが抑圧以外の何物でもないが、しかしこの規定によって被抑圧者を被抑圧者と認識し、被抑圧者たる彼/彼女に語りかけることが、彼/彼女の身になって考えることができる。抑圧なしのユートピアなど幻想である。抑圧なしのユートピアがお好みならば、まずもって「私」という拭い切れない自己同一性を捨て去ってみればよい。想像はできる。「お前」と同定されることのない、「私」を「私」と呼ぶことのできない、抑圧なしのユートピアがそこに拡がっているだろう。まさに、「サバルタンは語ることができない」。かつてフーコーが打ち出した『魂は身体の牢獄である』
という、一見したところトリッキーなテーゼに込められていたかもしれない苛立たしさには、同意するに吝かではない。この種の原初的抑圧の暴力性には敏感であるべきだし、しかし、しばし躊躇いながらも、この暴力から笑いを産み出す昇華の方法を探るべきなのである。この昇華は幻想ではない。理不尽に突き付けられた、尽きることのない、終わりのない、仕事だからだ。
僕が何を言いたいのかというと、お題ができたら全力で釣られて、あーでもないこーでもないと盛り上がり、次第に飽きては、パロディ化して派生した別のお題で盛り上がり――そんな楽しいところがはてなハイクです。
――落ち込むこともあるけれど、私は元気です
――
// ==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.")); } }
修正:いい加減&が変換されるのを何とかしてほしい
解説: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" && dst[i] && 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.")); } }
テクニカル的な事を書いてみる。
今日、mayaweb.jpで携帯のサイトを無料レンタルしたのだが、
ftp://www.mayaweb.jp/のアドレスにftpがついてると
FFFTP等は認識しないから、www.mayaweb.jpにしろ!
FTPアドレスがwww.mayaweb.jpだから何の解決にもならん!
ftp://www.mayaweb.jpにアクセスしてみた。
意味が分からん!どうなってるんだ、ほんと。
まあ、アップロードできたので良しするか…
あっ、mayaweb.jpは、googleサイトマップに登録するための
sitemap.xmlはアップロードできた。無料のレンタルサーバー
裏を返せば、サイトマップにモバイルだと、<mobile:mobile />タグを
付け加えないとダメになったってことだろう。
Mac OS で作成された Word や PowerPoint のファイルを
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) 等で形式変換してから挿入.
以上.
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.
どっか変なところある?
真っ当なエラーメッセージだと思うけど。
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
どうしたんかいな、とネットワークトレースをとってみた。そしたら、トップ画面の要求に対してこんな応答が返っていた。
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
えーと。どこから突っ込んでいいのやら。
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
今更だけど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) && 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&B>',NULL)); $template->display(); ?>
http://www.yomiuri.co.jp/science/news/20080802-OYT1T00463.htm
という読売新聞の記事に対して、はてなブックマークで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
地味になって残念
http://anond.hatelabo.jp/20080601175525
他の有料レンタルサーバを使ったことないので、あてにはできないけど。
プラン変更は出来ない。変更したい場合は別プランで新規登録後、データを移すことになる。
公式にはこちら
以下私の環境。これは割り当てられたサーバにより多少の違いがあり得る。その他詳細はアカウント毎に確認できる。
CPU | Intel(R) Pentium(R) M processor 2.00GHz |
メモリ | 2GB |
OS | FreeBSD 6.1-RELEASE-p23 i386 |
Apache | Apache/1.3.39 |
Perl | 5.8.8 |
Ruby | 1.8.5 |
Python | 2.4.5 |
[参考文献]
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 と内容が同じなので省略。
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));
}
}
private HelloService helloService = null;
public void setHelloService(HelloService helloService) {
this.helloService = helloService;
}
public void execute() {
helloService.sayHello();
}
}
Main.java
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!
というわけでまとめはwikiで。
http://www.goodpic.com/mt/archives2/2005/06/blogwiki.html
http://mojix.org/2005/06/28/232219
でみんなワイワイ。ブックマークでワイワイ。
ま、ブログも専用カテゴリ+過去日記+トラックバックで幾らか似たような事が出来るし、はてなはグループのキーワードがwiki的だけれど、結局はまとめる手間が面倒臭いと。
トラックバックがそのあたりを少しだけ補完してくれるのだけれど、もう少しハンドリングが良くなるといいな。XMLとかJSONとかで配ってくれるとツリー構築とかしやすくなると思う。
あと、閲覧側が手軽に記事同士を関連付けていける仕組みってのがほしいかも。その辺はブックマークが担う部分か。現状、はてなブックマークはそのあたりが幾らか備わってるな。wiki的に誰でも編集できるとか、含む日記とか。そのあたり、対人間も含めもう少しハンドリングよくしたり、ユーザーのページで役に立つようにしたらよいかも。
だからあれか、フロー/ストックの中間的な部分をフローからストックへ向けてデータを再利用しながら改良していきやすいシステムでつなげていけばいいのか。
はてなブックマークでポチポチ選択していったら、ブログからトラックバックやコメントを取ってきて、それをまたポチポチ選択していくと関連する話のツリーやまとめが出来てきて、それでポチっと押すとはてな記法でそれが吐き出されて、とか。
そういや、今度作り直すんだって?そんな風にならないかな。
Visual Studio 2005しかインストールしてない場合、Python 2.5だとdistutilsが正しく動かないっぽいので、どうにかしたいYO!
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の公式ダウンロードページから、Windows版のインストーラーをダウンロードして、適当な場所にインストールしてください。
"Python-2.5.2/Lib/distutils"を別の場所に移動し、"Python-2.6a1/Lib/distutils"を"Python-2.5.2/Lib"以下にコピーしてください。以降はPython 2.6は必要ないので、アンインストールして構いません。
上記の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:
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>
これで終わりです。