はてなキーワード: W3Cとは
SEOが次にどうなっていくのかを考えてみた。
社内でSEOについて話しても
この繰り返しなので話が進まない。
ビックデータを扱う時に行うデータクレンジングを強化してスキーム化したものだと思ってる。
こんなのをいちいち手作業を基本としてやってたらコスト無限大なので
パンダアップデートはほんとどうても良くてこんなの対処できないウェブマスターとか
中規模以上のシステム担当者はチェンジしてもらったほうが世のためになる。
このレベルのウェブマスターに適当なこと吹き込んで状況を悪化させる
で、次にどうなっていくかを考えると
リアルタイムレコメンドの性質が強化されそう。パーソナライズとは関係ない。
これにセマンティック強化の流れがかみ合うと
それが検索結果にも同じく入ってくるのかと考えると
そんな顧客満足度を下げるような事はしない。
まずGoogleが定義した仕様の通りにサイトを作ること。W3CじゃなくてGoogle。
次にデータクレンジングのトレンドをリアルタイムに把握すること。
ようするにペンギンにやられないように先手を打つこと。
10とか20とかじゃ意味がなく、統計で使うので母数に最低1000は欲しい。
母数として利用で出来るサイトを抽出するのにさらに10倍以上のサイト数が必要。
技術に理解のない会社はデータマイニングをエクセルでやりたがるけど、無謀。
どんなにサイトをホワイトハットで言う所のクリーンな状態にしたって
検索結果の上位には表示されない。
キーワードの解釈され方の傾向を掴むのは統計じゃ出来ないのは必然。
どの状態であればGoogleから好意的に解釈されるかを意思決定するAIの出番なんだろうか?
先読みして何かする部類のものはないと思ってる。
ツールベンダーが多数出てきたり。
いっせーの! Webにのって さあ出かけよう ブラウザとのランデブー ユーザーが大事 実装が大事 JS、マジ大好き ユーザーの痛み それ言語のせい? UIの動き UXのつもり 今までのJSのポジションを 越えた未来は どうなるの? ねぇどうせWebKitでしよ ダメ? ダメ! ECMA標準だけ 油断も隙もない APIとのボーダー越えたい そうもっと! 大胆で ちょっと強引? 俺ワールド全開 優しいJSも いじわるなJSも ひとりじめ 型つけてみて やっぱやめて ウラハラ alt-js Java以上C++未満の JS、マジ最高 V8だけが きらめいて 遠い背中も 追いかけたよ これからの最適化 フローグラフの分まで伝えたい ぎゅってしてPNaClコンパイル ダメ? ダメ! 不埒です CSS3に甘えたい GPUに触れたい どこまで? APIのボーダー教えて おっとっと! 手強い IEの仇 ムキになったら 古いシステムも Flashの将来も 譲れない 実装して やっぱやめて 一方通行プロセス W3C信じて プラグイン書いて No more E4X 動的なの? 静的なの? 型推論好き? 好き! 好きだから 笑わず答えて Ion Monkey 越えよう おっとっと! 大胆で ちょっと強引? prototypeを知ったら JSでの設計や コーディングも変わるの? 答えてよ! ときめき 走り出す わくわくコーディング Self以上 Scheme未満の JS、超愛してる!!
http://jp.techcrunch.com/archives/20100430joe-hewitt-web-development/
MSは囲い込み戦略を、その決して洗練されていないソフトウェアの品質から叩かれることがあるけど、
確かに、独自技術を特許で固めることはしていなかったように思う。
現に、Ajaxのテクノロジーは、基礎をIEの独自拡張から始め、firefoxなど他のブラウザの実装に発展してきた。
Adobe Flashも同じくユーザーに何一つ強制はしていない。
そして事実上、今日の一般的なミドルウェアとして使われている。
そのFlashプラットホームを、Appleは否定しているものの、
では、代替となりえる技術をAppleが開発して W3C に標準化を求めるかというと
そんなことはしていない(HTML5をAppleが推進していたのかどうかは知らないけど)
ただ、ネットをもっとオープンで誰もが自由に使えるものにしようとしている気がした。
Mecabがこれから iPhoneプラットホームで使えなくなる(広義)という話を聞いて
珍しくApple非難が一般デベロッパ・一般ユーザーからも出てきたな、と思ったところではたと気づいた。
iPod移行、Apple には Google よりもクリーンなイメージが自分の中にあったのだ、と。
では Appleは善良な企業か、Google のように「悪いことはしない」という企業哲学に基づいた経営なのかというと
それは分からない。
第壱話 HTML5、襲来
第弐話 見知らぬ、ブラウザ
第参話 鳴らない、Audio
第四話 WAI-ARIA、逃げ出した後
第伍話 Safari、心の向こうに
第七話 WWWの造りしもの
第八話 Chrome、来日
第九話 瞬間、Canvas、重ねて
第拾話 セクションダイバー
第拾壱話 静止したACID3の中で
第拾弐話 先行実装の価値は
第拾参話 バグ、混入
第拾四話 Firefox、魂の座
第拾伍話 バグとハック
第拾六話 死に至る非標準、そして
第拾七話 四人目のECMAScriptエンジン
第拾八話 DTDの選択を
第拾九話 ベンダーの戰い
第弐拾参話 IE
第弐拾四話 最後のCSS
第弐拾伍話 終わるXHTML2
第弐拾六話 世界の中心でセマンティックを叫んだけもの
少し遅れた感があるけど、解いてみた。
出力がテキストでないけど・・・。
仕事の合間を使ってやったものの、昼前に始めたのが5時頃にようやくできる程度。
これを25分とは尋常じゃないな、大口叩くだけあってよっぽど優秀なんだろう。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_jis"> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <meta http-equiv="Content-Style-Type" content="text/css"> <style type="text/css"> <!-- pre { font-family: monospace; } --> </style> <script type="text/javascript"> <!-- window.onload = function() { var q = new Map(); q.load("maptest.txt"); q.search(); var answer = document.getElementsByTagName("pre").item(0); var answerText = "\r\n"; for(var ix = 0; ix < q.route.length; ix++) { answerText += q.route[ix].join("") + "\r\n"; } answer.firstChild.data = answerText; alert("終了しました。"); }; /** マップオブジェクト */ function Map() { this.ymap = []; this.route = []; } //マップの読み込み Map.prototype.load = function(filePath) { //ファイルシステム var fileSystem = new ActiveXObject("Scripting.FileSystemObject"); //ファイル読み込み var file = fileSystem.OpenTextFile(filePath); while(!file.AtEndOfLine) { var fileBuffer = file.ReadLine(); this.ymap.push(fileBuffer.split("")); } file.Close(); fileSystem = null; }; //マップの探索 Map.prototype.search = function() { var that = this; //マップコピー var ymap = this.ymap.concat(); for(var y = 0; y < ymap.length; y++) { ymap[y] = ymap[y].concat(); for(var x = 0; x < ymap[y].length; x++) { if(ymap[y][x] == "S") var start = new MapNode(y, x); if(ymap[y][x] == "G") var goal = new MapNode(y, x); } } var openList = []; var closeList = []; start.costf = start.distance(goal); openList.push(start); //経路探索 while(openList.length > 0) { var node = openList.shift(); //探索終了 if(goal.equal(node)) { createRoute(node); break; } closeList.push(node); //隣接ノードの作成 var tonari = []; if( ymap[node.positionY][node.positionX - 1] == " " || ymap[node.positionY][node.positionX - 1] == "G" ) tonari.push(new MapNode(node.positionY, node.positionX - 1, node)); if( ymap[node.positionY - 1][node.positionX] == " " || ymap[node.positionY - 1][node.positionX] == "G" ) tonari.push(new MapNode(node.positionY - 1, node.positionX, node)); if( ymap[node.positionY][node.positionX + 1] == " " || ymap[node.positionY][node.positionX + 1] == "G" ) tonari.push(new MapNode(node.positionY, node.positionX + 1, node)); if( ymap[node.positionY + 1][node.positionX] == " " || ymap[node.positionY + 1][node.positionX] == "G" ) tonari.push(new MapNode(node.positionY + 1, node.positionX, node)); //隣接ノードの検索 for(var tx = 0; tx < tonari.length; tx++) { var openIn = false; var closeIn = false; tonari[tx].cost = node.cost + 1; var costf = tonari[tx].cost + tonari[tx].distance(goal); tonari[tx].costf = costf; //オープンリストから検索し入れ替える。 for(var ox = 0; ox < openList.length; ox++) { if(tonari[tx].equal(openList[ox])) { openIn = true; if(costf < openList[ox].costf) { openList.splice(ox, 1); push(openList, tonari[tx]); } break; } } //クローズリストから検索し、オープンリストへ移す。 for(var cx = 0; cx < closeList.length; cx++) { if(tonari[tx].equal(closeList[cx])) { closeIn = true; if(costf < closeList[cx].costf) { closeList.splice(cx, 1); push(openList, tonari[tx]); } break; } } //どちらにもない場合、オープンリストへ追加する。 if(!openIn &amp;&amp; !closeIn) push(openList, tonari[tx]); } } //適切な位置に追加する。 function push(array, item) { for(var ix = 0; ix < array.length; ix++) { if(item.costf < array[ix].costf) { array.splice(ix, 0, item); return; } } array.push(item); } //ルートマップの作成 function createRoute(lastNode) { var node = lastNode.parent; while(node.parent) { ymap[node.positionY][node.positionX] = "$"; node = node.parent; } that.route = ymap; } }; /** マップノード */ function MapNode(y, x, parentNode) { this.positionY = y; this.positionX = x; this.parent = parentNode; this.cost = 0; this.costf = 0; } //同一ノードかチェックする。 MapNode.prototype.equal = function(targetNode) { if( this.positionY == targetNode.positionY &amp;&amp; this.positionX == targetNode.positionX ) return true; return false; }; //直線距離を求める。 MapNode.prototype.distance = function(targetNode) { sabunY = this.positionY - targetNode.positionY; sabunX = this.positionX - targetNode.positionX; return sabunY ^ 2 + sabunX ^ 2; }; // --> </script> <title>経路探索:A*</title> </head> <body> <pre>&nbsp;</pre> </body> </html>
最近マークアップエンジニア志望の若者と話す機会が多いのだけれど、そこで気づかされるのは、彼らの中に過去の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コミュニティ住人の言うことなのだ。これにまさる教科書は、他にはない。
【元ネタ】
http://anond.hatelabo.jp/20090227165033 の増田も言っているが、それなりに強制力のあるのはフィルタリングサービスだろう。
IEならば、コンテンツアドバイザがお手軽だ。詳細は以下を参照。指定サイト単位での禁止も出来る。あわせてRSACi(現ICRA?)のフィルタリングが有効になるが、日本語は適用外だろうし最低限の奴にも引っかかるようなサイトに用はないだろう、ということにすればよい。
http://www.kcn.jp/support/contents_filter/index.xml
フィルタリング用のソフトウェアも多いらしいので参考に下記を挙げておく。
http://www.iajapan.org/rating/nihongo.html
また、最近のセキュリティソフトには簡易PFWが付いていたりして、こういった静的なフィルタリングくらいなら出来る事も多い。これなら、別ブラウザでも有効だろう。
ところで、このコンテンツアドバイザであるが、実はPICSというW3Cによる規格らしい。
http://www.iajapan.org/trans2japanese/w3c/REC-PICS-labelsJ.html
特定用途なら、簡単なCGIと設定ファイルでオリジナルも作れそうだ。
また、詳細設定で静的ファイルでの設定も出来るかもしれない。
マークアップに困ったときは、ちゃんとマークアップしてそうなサイトを参考にしているんだけど、(なんで今までやらなかったんだろう)初めてW3CのページのHTMLを見た。そしたら、タイトルの下のナビゲーション部分が下のようなマークアップになっていたんだけどさ(改行とインデントは僕がつけた)。
<map title="Introductory Links" id="introLinks" name="introLinks"> <div class="banner"> <span class="invisible"> <a href="#technologies" title="Skip introductory links and the mission statement" class="bannerLink"> Skip to Technologies </a> | </span> <a href="/Consortium/activities" accesskey="A" title="W3C Activities" class="bannerLink"> Activities </a> | <a href="/TR/" accesskey="T" title="Technical Reports and Recommendations" class="bannerLink"> Technical Reports </a> | <a href="/Consortium/siteindex" accesskey="S" title="Alphabetical Site Index" class="bannerLink"> Site Index </a> | <a href="/Consortium/new-to-w3c" accesskey="N" title="Help for new visitors" class="bannerLink"> New Visitors </a> | <a href="/Consortium/" accesskey="B" title="About W3C" class="bannerLink"> About W3C </a> | <a href="/Consortium/join" accesskey="J" title="Join W3C" class="bannerLink"> Join W3C </a> | <a href="/Consortium/contact" accesskey="C" title="Contact W3C" class="bannerLink"> Contact W3C </a> </div> </map>
…えっと、普通はっていうか、一般的には、ナビゲーションってul,li要素にしない?map要素ってなにこれ、なんでこんな場所で使われてんの?map要素ってイメージマップに使う要素じゃないの?
担当者である社長と打ち合わせをしたが、彼は日本の企業サイトはあまり好きではないらしい。
ターゲットが日本人なので、日本人向けのデザインの方がいいと思うのだが、
それを説明した上でも、韓国っぽいものの方がいいという。
じゃー韓国のサイトのデザインで調べて参考にするかと、.co.krでググってみた。
とあるので、そこそこ覚悟はしていたが、やはり酷かった。
とりあえず、制作の役に立ちそうな特徴からピックアップしてみる。
例:http://www.grandhotel.co.kr/
・とにかくFLASHを使う。グローバルナビでは、FLASH必須。しかもサブナビが下一列に出る。
・各ページのメインイメージもFLASHにしてる。文字がハデに出てくる。
例:http://www.zalman.co.kr/jpn/WTB/Area.asp
以下悪い点。
・なぜかフレームを使って、ページを移動してもURLが変わらないようにしている。
例:http://www.wonbinus.co.kr/japan/
・ポップアップ大好き。
ハングルは読めないから何書いてるかわからないが、あんまSEOの概念がないのか?
・ロールオーバー?何それおいしいの?
一言でいうと、FLASH使ってカラフルならよさげで(かなり乱暴なまとめだ)、Firefoxなんて動作確認しない。
酷い部分は置いといて、カラフルなのとかを真似たら、きっと満足してくれると思うよ!
以下、各サイトの寸評。
\n'); document.write (' \n')
とコードが丸見え。
ホテル。
ロゴ、メインイメージ、ナビ、サブナビで合計4つのFLASHを使い、
さらにフッタ部分でもうねうねするFLASH。
http://www.wonbinus.co.kr/japan/
ページを移動してもURLが変わらないと思ったら、何故かフレームを使っていた。
フレームを使う必要性がわからない。
ページ毎に色が変わる。
まあふつう。
デザインは個人的に好き。
fxだとセンタリングがずれるだけでなく、左側ナビ部分に謎のFLASHが登場する。
ここもフレームを使っていて、URLが動かないようにしている。
「ROOM」内のローカルナビをクリックすると、ポップアップで部屋の紹介が出るという仕様。なんだそりゃ。
ハデ。PIPかと思いきや、お辞儀してるだけで話さない。
http://www.seoulcasino.co.kr/Kor/gaming/slot.asp
ここなんかではajaxを使っている。
何故か本文はコーディングされていない。
これ、韓国人好きみたい。
他のページに飛ぶが、やっぱりURLが変わらない。
IEだと右側にFLASHのローカルナビが上下するが、fxだと左側でしょんぼりしている。
フッタのデザインと、そのFLASHがマウスの位置に反応する遊び心はいい。
「江南区とその周辺で高齢者向け高層住宅及び痴呆性高齢者グループホームを運営。施設、 サービスの紹介、入居案内。」
お約束のようにグローバルナビがFLASHで、下横一列にサブナビが出てくる。
メインイメージのFLASHの下のアイコンはロールオーバーしない。
fxで見ると、フッタ部分がむやみに延びている。
サウンドオフは当然ないし、
それどころかちっこいメディアプレーヤーが埋め込まれていて、それが勝手に再生する。
つまり音声が二重になる。何考えてんだ?
「インターネットは韓国が作ったニダ!」というセリフがふと頭をよぎった。
音声の件にしろ、コピーライトにしろ、なんかものすごくこの企業の自己主張を感じる。
どうでもいいが、flashに出てくる女性がどう見てもブ×だろ。
もう少しいい素材はないのか?
一枚だけなんか見たことある写真だと思ったら、
http://www.sozaijiten.com/cdrom/imagedetail.asp?pid=316&fid=00017007&i=1
だったorz
http://www.daraelaw.co.kr/index.php
(株)宇進産電。
ヘッダ部分はフレームで分けてあり、コンテンツ部分のみ変わるようにしてある。
さらに、fxで見てたら、右から2番目のボタン(日本語だと「研究書紹介」)をクリックすると、
「攻撃サイトとして報告されています!」と表示された。
こんなの初めて見たよ。
http://www.zalman.co.kr/jpn/main.asp
「ZALMAN」
企業ロゴがヘボいわりには、サイトの内容自体はしっかりしている。
ここが一番見やすい。
追記:30ブクマくらいはいくかと思ったけど、思った以上に反応があって驚いた。
ブクマで書かれてたけど、各国のサイトを調べたら面白いかもね。
今回調べてみてそれを思い出した。
自由なはずのインターネットでも選択権がなくて、IEでしか見られないってのは、けっこう悲惨な状況だと俺は思う。
視野が狭すぎる。
IEのみ対応ってのは、シェアを考えればたしかに「合理的」ではあるんだけど、
こんな状況だとIE8がリリースされたら、どんだけまともに閲覧できるんだろう?
(β版は全然試してない)
その時はその時で作り直していくんだろうけど、結局将来的に無駄なリスクを抱えるわけだ。
単純に見た目のデザインとしては、
グローバルナビがFLASHだったりFLASHもハデで見た目はまあいいんだけど、
フレーム使ってURL固定してたり、ロールオーバーなかったりと、ディティールがすごい雑なんだよね。
「topへ戻る」は利便性もあるだろうけど、見た目的に上下するのがカッコイイからつけてる気がしてしまう。
もちろん各国によってブラウザのシェアや現実的なコストの問題もあるが、
そもそもweb制作って、W3C標準に準拠すべきものじゃないのか?
そういう観点から言っても、どうなのかなーと疑問に思わざるを得ない。
特徴として追加で、
・色であんまゾーニングしない。レイアウトの枠を感じさせないデザインが多い。
てところか。
あ、ZALMANのデザイナーじゃないんで、よろしくw
IETFの人「我々のネットワークでは日本語が使用できません」
IETFの人「誠に申し訳ない」
W3Cの人「当然バナナもおやつです。見た目はタグで整形して下さいね」
W3Cの人「尤も細かいデザインはテーブルタグで巧く微調整してね。腕の見せ所だよ」
W3Cの人「おやつはHTML要素で論理マークアップして、バナナはCSSで整形するのが推奨されます」
ネットユーザ「あのー、美味しいバナナで綺麗に飾りたいんですが」
W3Cの人「……お客様がおやつを其処に置いて頂くだけで、此方で御用意した様々な機能が御利用頂けるのですがまだお判りではありませんか」
こんなところかな。異論は認める。
追記
確かに、写真部Flickrたんは忘れていたけど、キャラ付けが思いつかないね。six apartとwordpressは迷ったけど、どっちでもいいかな、と。EITFものど元まででかかったけど、思い出せなくてRFCにした。それ以上は、きつくなるだけなので、ここまでで。
それにしても、マジでみんな列挙型ネタ、好き過ぎ。こういうネタやったらウケるだろうなぁ、と思ったらほぼそのまんまはてブに反映されててワロタ。「○○するための××をN個」なんてすぐにはてブホットエントリ入りするし。例えば、ネタ系列でも、同じような事をプログラミング言語とかでやってみたら、またすぐにエントリ入りするだろうね。戦国時代な数の多いジャンルでやると、すぐにウケると思うよ。
私立T女子学園は、正にその通り(個人的にあずまんがよりもT女だったので)。ああいうギャグ群像劇がモデル。
Google信者なので、世界征服ネタは思いつかなかったけど、普段は良い顔しているけど、自分に批判的な言動には「な・ん・だ・っ・て?」みたいに目を光らせてみるというのも良いかも。あとは、Googleモテネタとか。
とか、そんな感じ。
ちなみに、この手のマンガを考えるときに、超大金持ちを混ぜておくというのは、話を膨らませるための一種の王道。こち亀の中川とか、うる星やつらの面堂終太郎とか、そういうの。御坊っ茶魔くんとか、有閑倶楽部なんて、それだけをネタにしたような作品だし。ここで言えば、microsoftがT女の田中小夏みたいな立場。例えば、
とか、そんな感じ。富豪刑事とか、デスノートのL絡みも似たようなもんでしょう。同じようなシチュエーションは、発明家でも使えるので、そちらで考えてみても面白いです。上記で言えば、
とか、そんな感じ。ネタ振りがYouTubeで、たしなめるのがGoogleかな。話の切っ掛けは、性格の幼いキャラにして、その後、やや大人なキャラが突っ込み入れて、その後、別の展開と言うのがセオリー。Twitterとか、YouTubeがそういう先陣を切るキャラでしょう。
あとは、三段論法を壊すというオチもこの手のギャグでありがち。ここで言えば、TechCrunchが、矛盾する情報に悩んであさっての方向で結論を出したりとか、Wikipediaが、あまりの情報の多さに、却ってとんちんかんなことを言い出したり。ちょっとひねらないと面白くないけどね。
というわけで、皆さん、楽しんでいただけだでしょうか。ネタが当たって、僕は楽しかったです。
あんま関係無いけど、<li>要素の中に<ul>を書くのって邪道じゃね?
<ul> <li> 親 </li> <ul> <li> 子1 </li> <li> 子2 </li> ... </ul> </ul>
って書くべきだと思うんだけど。
上のコードは間違いでした(汗)
文法の参考 http://memo.blogdns.net/html.html
W3Cのドキュメント http://www.w3.org/TR/REC-html40/struct/lists.html#h-10.2
長いので一行まとめ:便利になる前の試行錯誤の時点で潰されてるんじゃないかって思った。
昔、まだダイヤルアップの人とか 800*600 の人とかが普通にいた頃、自サイトをコンパクトにする試みを色々やっていた。何かそういう実験をひそやかにやるのが主な目的のサイトだった。ナビゲーションリンクを各ページに埋め込む代わりに JavaScript に記述して呼び出せばキャッシュが効いて効率が上がるんじゃないか、とか。(JavaScript の効かないブラウザ・切ってるブラウザ向けに、総目次になっているトップへのリンクを表記しといて最低限のアクセシビリティは保ってた。アクセシビリティなんて言葉知らなかったけど。)
フレームや段組に貴重な画面領域をごそっと持って行かれるのを避けたかった。でもマウスホイールが付いてないマウスもザラにあったり、ましてやマウスジェスチャーなんて誰も使ってなかった時代背景から、スクロールも最小限に抑えたい気持ちもあった。そこで、普段は隠れてるけど、ある簡単な操作(画面右下にマウスを移動させるとか)でナビゲーションリンクが出て来る仕組みを色々考案しては試していた。
その中のひとつとして、右クリック(コンテキストメニュー)にナビゲーションを仕込むという試みをした時があった。本来のコンテキストメニューに戻す項目をそのメニュー内と画面の端っこにつけて、トップページで使用法をアナウンスする形でリリースした。
その後間もなく、どういう経緯で目をつけられたのかは分からないけど、今で言うモヒカン族くずれの方々が「ユーザービリティ!ユーザービリティ!」と雄叫びを上げながらわらわらとサイト狩りに来たのでびびってやめた。相当びびったのでその後数年間 W3C 教(というか某方面教)に入信して狩られないお作法を学んだ。
あれから数年、別腹で試みて、当時はノーリアクションだったり難色を示されてた「JavaScript でお絵かき」とか「送信中は押せない送信ボタン」とか「記事を貼り付ける位置を自由に決められる掲示板」とかが、世間様に受け入れられたり色んな人が改良してたりするのを見て、土壌が大分変わってるように感じた。だもんでコンテキストメニューいじりも何か進展があったんじゃないかとおぼろげに思ってたりしたけど、具体的には Flash のコンテキストメニューいじるくらいのノリでグリグリやってるんじゃないかなあと思ってたけど、その辺はみたとこ昔と変わらないんだね。
もしかしたら今もまだ「右クリック」に過剰反応して、そういう狩りをして芽を摘んでる人がいるんじゃないのかなあとか思った。そんな自分も document.body に付いてるイベントハンドラは根こそぎ削除して閲覧してたりして、評価する機会をふいにしてるから、人の事言えた義理でもないけど。
ちなみに単純な右クリック禁止自体はやる意味が無いのでやったことがない。6年くらい前に「右クリック禁止解除」ってブックマークレット作ってたくらいだから(当時はブックマークレットって言葉も知らなかったけど)やりたくないっていうアドバンスな気持ちも持ち合わせてたんだと思う。
ので、その結果を貼ってみます。とりあえず、はてなブックマークが始まってから1ヶ月(2005/2/10〜2005/3/9,1033エントリ)の、ブックマーク数によるベスト10を出しました。
ここで皆さんにお願いがあるのですが、今回のベストX以外にどういう観点でデータを抽出したら良いか(どういう一覧がほしいか)、コメントをいただけませんか?データは集めてみたものの、活用方法に困ってます。
====================
でした。
当時はまだ「有名サイトのトップページにとりあえず貼っておく」みたいな使われ方をしていますね。ブックマークをどう使うか、というスタイルを探していたんでしょうか。
「b:keyword:コンピュータ(330回)」「b:keyword:ウェブ(321回)」「b:keyword:一般(147回)」「b:keyword:はてな(77回)」「b:keyword:Google(67回)」「b:keyword:サイエンス(47回)」「b:keyword:blog(42回)」「b:keyword:ゲーム(41回)」「b:keyword:Internet Explorer(33回)」「b:keyword:はてなブックマーク(31回)」「b:keyword:RSS(30回)」「b:keyword:Microsoft(30回)」「b:keyword:JavaScript(29回)」「b:keyword:読書(28回)」「b:keyword:iPod(25回)」「b:keyword:firefox(25回)」「b:keyword:Apple(24回)」「b:keyword:ニッポン放送(23回)」「b:keyword:サービス(23回)」「b:keyword:音楽(20回)」
「b:t:web(88回)」「b:t:blog(65回)」「b:t:ネタ(59回)」「b:t:news(49回)」「b:t:はてな(42回)」「b:t:it(33回)」「b:t:hatena(33回)」「b:t:社会(30回)」「b:t:ニュース(28回)」「b:t:neta(27回)」「b:t:misc(26回)」「b:t:ajax(26回)」「b:t:tool(25回)」「b:t:software(24回)」「b:t:tips(23回)」「b:t:javascript(23回)」「b:t:ブログ(22回)」「b:t:まとめ(21回)」「b:t:livedoor(20回)」「b:t:google(20回)」
でした。当時から「ネタ」タグって多かったんですかね(タグやキーワードは現在の付与状況しか分からないので、当時の本当の状態が分からない)。
前の60行テンプレートエンジンを改良して、レイアウトテンプレート機能を追加してみた(それでも全部で90行)。
レイアウトテンプレート機能とは、例えば個別のテンプレートが<table>...</table>を出力して、それをレイアウトテンプレートが<html><body>...</body></html>で囲って出力するとかそんなの。
詳しくは終わりの方のサンプルをみてくれ。
これは Ruby on Rails(とその仲間たち)にある便利機能のひとつ。
ついでにいうとSmartyにはない機能のひとつ。
今まで知らなかった人はぜひ試してくれ。チョー便利だから。
前回はたくさんのブックマークありがと。
コメントで「男前テンプレート」と名前がついてたので、勝手に採用。
あと、これ以上の機能追加はしないので、各自勝手に改造して使ってくれ(そのためにコメントをつけてるから)。何でも人任せにするな。
コード:
<?php /* * OtokomaeTemplate.php -- レイアウトテンプレートに対応した90行のテンプレートエンジン * * - レイアウトテンプレート中で echo $_content; とすると中身が表示される。 * - テンプレート中で設定した変数をレイアウトテンプレートで使うことが可能。 * - レイアウトテンプレート名をテンプレート側で指定することも可能。 * - 使い方: * require_once('OtokomaeTemplate.php'); * $TEMPLATE_DIR = 'templates'; // 省略可、パーミッションに注意 * $LAYOUT_TEMPLATE = 'layout.php'; // 省略可 * $context = array('title'=>'Example', * 'list'=>array(10,'<A&B>',NULL)); * include_template('template.php', $context); * - 要 PHP 5.1 or later * - ライセンス: public domain (自由に改造してね) */ /* * 設定用のグローバル変数 */ $TEMPLATE_DIR = NULL; /* テンプレートを探すディレクトリ */ $LAYOUT_TEMPLATE = NULL; /* レイアウトテンプレートのファイル名 */ /* * テンプレートを読み込んで実行する。 * $_context は変数名をキー、値を要素とする連想配列。 * $_layout はレイアウトテンプレートのファイル名。 * - NULL または省略した場合は $LAYOUT_TEMPLATE を使う。 * - FALSE ならレイアウトテンプレートを使わない。 * - $_context['_layout'] = '...'; とすればテンプレート側でも指定可能。 */ function include_template($_filename, $_context, $_layout=NULL) { global $LAYOUT_TEMPLATE; $_content = render_template($_filename, $_context); if (@$_context['_layout'] !== NULL) // テンプレート側で指定された場合は $_layout = $_context['_layout']; // それを使う。 elseif ($_layout === NULL) // 引数で指定されなかった場合は $_layout = $LAYOUT_TEMPLATE; // デフォルトのファイル名を使う。 if ($_layout) { $_context['_content'] = $_content; // レイアウトテンプレート中で使う変数 $_content = render_template($_layout, $_context); } echo $_content; // or return $_content; } /* * テンプレートを読み込んで実行し、その結果を文字列で返す。 * include_template() の実体。 */ function render_template($_filename, &$_context) { $_cachename = convert_template($_filename); extract($_context); // 連想配列をローカル変数に展開 ob_start(); include($_cachename); // テンプレートを読み込んで実行 return ob_get_clean(); } /* * テンプレートファイルを読み込み、convert_string() で置換してから * キャッシュファイルに書き込む。読み込み時のロックは省略。 * (file_get_contents() もファイルロックできるようにしてほしいなあ。) */ function convert_template($filename) { global $TEMPLATE_DIR; if (! file_exists($filename) && $TEMPLATE_DIR) $filename = "$TEMPLATE_DIR/$filename"; $cachename = $filename . '.cache'; if (! file_exists($cachename) || filemtime($cachename) < filemtime($filename)) { $s = file_get_contents($filename); $s = convert_string($s); file_put_contents($cachename, $s, LOCK_EX); // LOCK_EX サポートは 5.1.0 から } return $cachename; } /* * テンプレートの中身を置換する。 * - '#{...}' を 'echo ...;' に置換 * - '%{...}' を 'echo htmlspecialchars(...);' に置換 * - ついでにXML宣言も置換 */ 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); ?>', $s); return $s; } ?>
<?php require_once('OtokomaeTemplate.php'); $TEMPLATE_DIR = 'templates'; $LAYOUT_TEMPLATE = 'layout.php'; $context = array('list'=>array(10,'<A&B>',NULL)); include_template('template.php', $context); ?>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <body> <h1>%{$title}</h1> <div id="maincontent"> <!-- テンプレートの内容 --> <?php echo $_content; ?> <!-- /テンプレートの内容 --> </div> </body> </html>
<?php // レイアウトテンプレート名をテンプレート中で指定する場合 ?> <?php //$_context['_layout'] = 'mylayout.php'; ?> <?php // レイアウトで使用する変数をテンプレート中で指定する場合 ?> <?php $_context['title'] = 'レイアウトのサンプル'; ?> <table> <?php foreach ($list as $i=>$item): ?> <tr bgcolor="#{$i % 2 ? '#FFCCCC' : '#CCCCFF'}"> <td>#{$i}</td> <td>%{$item}</td> </tr> <?php endforeach ?> </table>
出力例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <body> <h1>レイアウトのサンプル</h1> <div id="maincontent"> <!-- テンプレートの内容 --> <table> <tr bgcolor="#CCCCFF"> <td>0</td> <td>10</td> </tr> <tr bgcolor="#FFCCCC"> <td>1</td> <td><A&B></td> </tr> <tr bgcolor="#CCCCFF"> <td>2</td> <td></td> </tr> </table> <!-- /テンプレートの内容 --> </div> </body> </html>
いくつか補足:
http://anond.hatelabo.jp/20071030034313 の二番煎じ
あまりのアホさに、作ってて気が狂いかけた
方針
using System; using System.CodeDom.Compiler; using System.Collections.Generic; using System.IO; using System.Reflection; using Microsoft.CSharp; delegate void ConvertTemplateDelegate(TextWriter tw, Dictionary<object, object> args); static class TemplateGenerator { public static ConvertTemplateDelegate Generate(string code) { CompilerParameters param = new CompilerParameters(); param.GenerateInMemory = true; param.ReferencedAssemblies.Add("System.Web.dll"); CompilerResults rs = new CSharpCodeProvider().CompileAssemblyFromSource(param, ParseTemplate(code)); if (0 < rs.Errors.Count) { StringWriter sw = new StringWriter(); sw.WriteLine("Compile Error..."); foreach (CompilerError err in rs.Errors) sw.WriteLine(err.ToString()); throw new Exception(sw.ToString()); } return (ConvertTemplateDelegate) Delegate.CreateDelegate(typeof(ConvertTemplateDelegate), rs.CompiledAssembly.GetType("Template", true).GetMethod("Convert")); } private static string ParseTemplate(string code) { using (StringWriter sw = new StringWriter()) { sw.WriteLine("using System; using System.Collections.Generic; using System.IO; using System.Web;"); sw.WriteLine("public static class Template {"); sw.WriteLine("public static void Convert(TextWriter tw, Dictionary<object, object> args) {"); int index = 0; while (0 <= index && index < code.Length) { int i = code.IndexOf("<%", index); sw.WriteLine("tw.Write(\"{0}\");", EscapeString(i < 0 ? code.Substring(index) : code.Substring(index, i - index))); if (0 <= i) { i += 2; int i2 = code.IndexOf("%>", i); if (0 <= i2) { string cc = code.Substring(i, i2 - i); if (cc.StartsWith("=")) sw.WriteLine("tw.Write(HttpUtility.HtmlEncode(\"\"+({0})));", cc.Substring(1)); else sw.WriteLine(cc); i = i2 + 2; } } index = i; } sw.WriteLine("}}"); return sw.ToString(); } } private static string EscapeString(string code) { return code.Replace("\\", "\\e").Replace("\"", "\\\"").Replace("\t", "\\t").Replace("\n", "\\n").Replace("\r", "\\r").Replace("\\e", "\\\\"); } }
サンプル C# コード。ためしにテンプレートから Xml 生成して、標準出力してみる。
class Program { static void Main(string[] args) { ConvertTemplateDelegate func = TemplateGenerator.Generate(TemplateEngine.Resource1.template); using (StringWriter sw = new StringWriter()) { Dictionary<object, object> arg = new Dictionary<object, object>(); arg["title"] = "template sample"; arg["data"] = new string[] { "foo", "fooo", "<strong>foooooooooo!</strong>" }; func(sw, arg); Console.WriteLine(sw); } } }
サンプルテンプレート
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title><%= args["title"] %></title> </head> <body> <h1><%= args["title"] %></h1> <table> <% string[] data = (string[]) args["data"]; %> <% for(int i = 0; i < data.Length; i++) { %> <tr bgcolor="<%= i % 2 == 0 ? "#FFCCCC" : "#CCCCFF" %>"> <td><%= i %></td> <td><%= data[i] %></td> </tr> <% } %> </table> </body> </html>
出力例
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>template sample</title> </head> <body> <h1>template sample</h1> <table> <tr bgcolor="#FFCCCC"> <td>0</td> <td>foo</td> </tr> <tr bgcolor="#CCCCFF"> <td>1</td> <td>fooo</td> </tr> <tr bgcolor="#FFCCCC"> <td>2</td> <td><strong>foooooooooo!</strong></td> </tr> </table> </body> </html>
CodeDom 使って動的コンパイル……って、このコードのままだとセキュリティ的に大問題な気がするな。
素直に ASP.NET 使ったほうが楽だと直感した。
あと EscapeString すっごく自信ない。たぶん修正が必要だと思うw
やってしまった・・・。
方針:
package SixtyLinesTemplate; use strict; use warnings; our $VERSION = '0.01'; sub convert { return unless defined(my $str = shift); $str =~ s{&}{&}gso; $str =~ s{<}{<}gso; $str =~ s{>}{>}gso; $str =~ s{\"}{"}gso; $str; } sub include_template { my $tmpl = shift; my %c = %{+shift}; eval convert_template($tmpl); die $@ if $@; } sub convert_template { my $tmpl = shift; my $cache = $tmpl.'.cache'; return scalar do { open my ($FH) , $cache; local $/; <$FH> } if ( -f $cache && (stat($tmpl))[9] <= (stat($cache))[9] ); my $out = do { open my ($FH) , $tmpl; local $/; <$FH> }; $out =~ tr/()/\x28\x29/; $out =~ s/\[%\s*(foreach|if|unless|end)\s*(.+?)\s*{?\s*%\]/");".(lc($1) eq 'end' ? '} print q(' : "$1 $2 { print q(")/ige; $out =~ s/\[%(.+?)%\]/);print $1; print q(/g; $out =~ s/\[#(.+?)#\]/);print SixtyLinesTemplate::convert($1); print q(/g; $out = 'print q('.$out.');'; open my ($FH) , '>' , $cache; print $FH $out; $out; } 1;
サンプルコード:
use SixtyLinesTemplate; my $context = { 'title' => 'Example', 'list' => [10,'<A&B>'] }; SixtyLinesTemplate::include_template('template.tmpl',$context);
サンプルテンプレート:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>[# $c{title} #]</title> </head> <body> <h1>[# $c{title} #]</h1> <table> [% foreach my $i (0..@{$c{list}}-1) %] <tr bgcolor="[% $i % 2 ? '#FFCCCC' : '#CCCCFF' %]"> <td>[% $i %]</td> <td>[# $c{list}[$i] #]</td> </tr> [% end %] </table> </body> </html>
出力例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Example</title> </head> <body> <h1>Example</h1> <table> <tr bgcolor="#CCCCFF"> <td>0</td> <td>10</td> </tr> <tr bgcolor="#FFCCCC"> <td>1</td> <td><A&amp;B></td> </tr> </table> </body> </html>
foreachんところが汚く見えるかもしれませんが、あれは添え字を取ろうとするとああなるんでご勘弁を。
普通にループするだけならforeach my $item (@$c{title}) でいけますゆえ。
あと存在しない変数とか使うと死んだり警告でたりするのでevalの前にno strictとno warningsをやった方がいいかもねぇ。
って何まじめに検証してんだ俺・・・orz
追記:
SixtyじゃなくてFortyだね。恥ずかし!
追追記:
でも&amp;の奴はちゃんと書いてるんだけども投稿すると勝手にエスケープされてしまってるんだよね。何でだろ?
ちなみにこのconvertの処理はCGI::Utilから拝借しました。
方針:
【追記】レイアウト機能を追加してみた
コード:
<?php /* * SixtyLinesTemplate.php - 60行しかないけどSmartyより速いテンプレートエンジン * * 使い方: * require_once('SixtyLinesTemplate.php'); * $TEMPLATE_DIR = 'templates'; // 省略可、パーミッションに注意 * $context = array('title'=>'Example', * 'list'=>array(10,'<A&B>',NULL)); * include_template('template.php', $context); * * ライセンス: public domain (自由に改造してね) */ /* * テンプレートを探すディレクトリ。 */ $TEMPLATE_DIR = NULL; /* * テンプレートを読み込んで実行する。 * $_context は変数名をキー、値を要素とする連想配列。 */ function include_template($_filename, $_context) { $_cachename = convert_template($_filename); extract($_context); include($_cachename); } /* * filename を読み込み、convert_string() で置換してから * filename.cache に書き込む。読み書きのロックは省略。 * (file_{get,put}_contents() はファイルロックできるようにすべきだ。) */ function convert_template($filename) { global $TEMPLATE_DIR; if (! file_exists($filename) && $TEMPLATE_DIR) $filename = "$TEMPLATE_DIR/$filename"; $cachename = $filename . '.cache'; if (! file_exists($cachename) || filemtime($cachename) < filemtime($filename)) { $s = file_get_contents($filename); $s = convert_string($s); file_put_contents($cachename, $s); } return $cachename; } /* * テンプレートの中身を置換する。 * - '#{...}' を 'echo ...;' に置換 * - '%{...}' を 'echo htmlspecialchars(...);' に置換 * - ついでにXML宣言も置換 */ 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); ?>', $s); return $s; } ?>
<?php require_once('SixtyLinesTemplate.php'); $TEMPLATE_DIR = 'templates'; // optional $context = array('title'=>'Example', 'list'=>array(10,'<A&B>',NULL)); include_template('template.php', $context); ?>
サンプルテンプレート:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>%{$title}</title> </head> <body> <h1>%{$title}</h1> <table> <?php foreach ($list as $i=>$item): ?> <tr bgcolor="#{$i % 2 ? '#FFCCCC' : '#CCCCFF'}"> <td>#{$i}</td> <td>%{$item}</td> </tr> <?php endforeach ?> </table> </body> </html>
出力例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>Example</title> </head> <body> <h1>Example</h1> <table> <tr bgcolor="#CCCCFF"> <td>0</td> <td>10</td> </tr> <tr bgcolor="#FFCCCC"> <td>1</td> <td><A&B></td> </tr> <tr bgcolor="#CCCCFF"> <td>2</td> <td></td> </tr> </table> </body> </html>
ごめん、さすがに何が言いたいのか
○○は××だよってのが飛躍した論理だから「それなら人類は魚類ってことだよね(だからおかしいよね)」って書いてるのに
「人は魚じゃねえよwwww」って指摘じゃ全然読めて無いんじゃん。
○○は××だよってのが人と魚が同じというぐらい飛躍していると思っているのは君でしょ?
そうではないよって指摘されてるんだよ?
これ書いた元増田ではないんだけどね。
http://anond.hatelabo.jp/20071019193836
こっちと、これを書いた都合上レスしとく。
http://anond.hatelabo.jp/20071019143819
http://anond.hatelabo.jp/20071019234154
ネット上にHTML形式などの「ブラウザで閲覧可能な形式」で公開した時点で、著作権者はある程度任意のスタイルで閲覧されることを承諾しているものと見なされる。常考。
別にこれは問題ないんじゃないの?
じゃないとインターネット成立しないしな。ある程度の改変は社会通念上認められるんじゃないか?
じゃあブラウザはデータをW3Cで世間的に合意したとみなせる仕様とも異なる方法で勝手に解釈して別形式に表示しなおすから著作者人格権を侵害してるわけだ
だからそれは著作者人格権じゃないってば。