「W3C」を含む日記 RSS

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

2013-06-18

http://anond.hatelabo.jp/20130618085832

ブラウザでいえば、いちおうW3Cはあるけど別にW3Cブラウザを推進してるわけでも何でもない。

今は時代はフラットデザインに流れているけど、別に誰かがフラットデザイン委員会みたいなものを作ってるわけじゃない。

 

べつに海外のほうがいいということが言いたいわけじゃないけど、ここは注意して欲しいけど

アメリカだと協調はするけど団結はしない

日本だと団結はするけど協調はしない。

 

今の日本必要なのは団結ではなく協調性では?

2013-06-03

SEOが次にどうなっていくか

SEOが次にどうなっていくのかを考えてみた。

社内でSEOについて話しても

あれはスパムだそれはスパムだこれもスパム

リンク作れリンク作れ安くて上がるリンク作れ

順位上がればペナルティきてもいいか

けどペナルティきたら何でそんなスパムやったんだ責任取れよ。

この繰り返しなので話が進まない。

ここ1年の間で大きく話題になったペンギンアップデート

ビックデータを扱う時に行うデータクレンジングを強化してスキーム化したものだと思ってる。

こんなのをいちいち手作業を基本としてやってたらコスト無限大なので

ペンギンかい名前で一括処理。

パンダアップデートはほんとどうても良くてこんなの対処できないウェブマスターとか

中規模以上のシステム担当者チェンジしてもらったほうが世のためになる。

このレベルウェブマスター適当なこと吹き込んで状況を悪化させる

ホワイトハットSEO業者も同列。

で、次にどうなっていくかを考えると

リアルタイムレコメンドの性質が強化されそう。パーソナライズとは関係ない。

いまの検索結果はキーワードに対するレコメンド

これにセマンティック強化の流れがかみ合うと

リアルタイムキーワード意味合いを解釈して

それに対する結果もリアルタイムレコメンドされると思う。

パーソナライズ広告で使われまくってるのを見ていて

それが検索結果にも同じく入ってくるのかと考えると

そんな顧客満足度を下げるような事はしない。

ここから具体的にSEOとして何をして行くのか。

まずGoogle定義した仕様の通りにサイトを作ること。W3CじゃなくてGoogle

Google解釈できるサイトになっている事が基本、

これは仕様を読んで実装できるスキルがある人ならできる。

次にデータクレンジングトレンドリアルタイムに把握すること。

ようするにペンギンにやられないように先手を打つこと。

これにはバックリンク解析が必要になってくる。

10とか20とかじゃ意味がなく、統計で使うので母数に最低1000は欲しい。

この母数となるのは怪しげなSEOをやっているサイト

母数として利用で出来るサイト抽出するのにさら10倍以上のサイト数が必要

これを実現できるのはデータマイニングできるスキルがある人。

技術に理解のない会社データマイニングエクセルでやりたがるけど、無謀。

次にリアルタイムレコメンドに表示されるように仕向けるために

何が必要になってくるのか、ここが分からない。

どんなにサイトホワイトハットで言う所のクリーンな状態にしたって

検索結果の上位には表示されない。

キーワード解釈され方の傾向を掴むのは統計じゃ出来ないのは必然

SEOパイが決まっている中での席取りゲーム

どの状態であればGoogleから好意的に解釈されるかを意思決定するAIの出番なんだろうか?

検索結果は過去の1面を切り抜いたものなので、

先読みして何かする部類のものはないと思ってる。

過去投影される自身をどのように操作するか。

リアルタイムインデックス更新されるようになって

ペンギンパンダ適用されてから

地球教みたいなホワイトハット集団が出始めたり

ツールベンダーが多数出てきたり。

SEOはすごく面白くなった。

2013-04-05

JavaScript Lover

いっせーの!

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、超愛してる!!

「Girlish Lover」 PV

2012-08-21

http://anond.hatelabo.jp/20120821105940

お前は何がやりたいんだ?まずそれから話そうか?

やりたいことによって使用するソフトが違うのだよ。わかるかい

DTPをやりたいのにpremiereを紹介してもダメだろう。

えっとwebデザインDTPか...

DTPは、デファクトスタンダードイラストレーターから最終的にそれを生業とするならイラレから逃げられないぞ。

Webデザインは、紙とペンだな。あとW3CHTML5勉強して生産性が悪いかもしれないがテキストエディタでよいんじゃないか

2010-05-01

Appleは善良な企業

http://jp.techcrunch.com/archives/20100430joe-hewitt-web-development/

アンチMSは聞くけど、アンチAppleは聞かない

MSは囲い込み戦略を、その決して洗練されていないソフトウェア品質から叩かれることがあるけど、

確かに、独自技術特許で固めることはしていなかったように思う。

現に、Ajaxテクノロジーは、基礎をIEの独自拡張から始め、firefoxなど他のブラウザの実装に発展してきた。

Adobe Flashも同じくユーザーに何一つ強制はしていない。

そして事実上今日の一般的なミドルウェアとして使われている。

そのFlashプラットホームを、Appleは否定しているものの、

では、代替となりえる技術Appleが開発して W3C標準化を求めるかというと

そんなことはしていない(HTML5Appleが推進していたのかどうかは知らないけど)

ただ、ネットをもっとオープンで誰もが自由に使えるものにしようとしている気がした。

Mecabがこれから iPhoneプラットホームで使えなくなる(広義)という話を聞いて

珍しくApple非難が一般デベロッパ・一般ユーザーからも出てきたな、と思ったところではたと気づいた。

iPod移行、Apple には Google よりもクリーンイメージ自分の中にあったのだ、と。

では Appleは善良な企業か、Google のように「悪いことはしない」という企業哲学に基づいた経営なのかというと

それは分からない。

Apple は善良な企業なんだろうか

2010-02-19

新世ウェブスタンダード

第壱話 HTML5、襲来

第弐話 見知らぬ、ブラウザ

第参話 鳴らない、Audio

第四話 WAI-ARIA、逃げ出した後

第伍話 Safari、心の向こうに

第六話 決戦、第3のブラウザOpera

第七話 WWWの造りしもの

第八話 Chrome、来日

第九話 瞬間、Canvas、重ねて

第拾話 セクションダイバー

第拾壱話 静止したACID3の中で

第拾弐話 先行実装の価値

第拾参話 バグ、混入

第拾四話 Firefox、魂の座

第拾伍話 バグとハック

第拾六話 死に至る非標準、そして

第拾七話 四人目のECMAScriptエンジン

第拾八話 DTDの選択を

第拾九話 ベンダーの戰い

第弐拾話 XMLのかたち、SGMLのかたち

第弐拾壱話 WHATWG誕生

第弐拾弐話 せめて、マイクロフォーマットらしく

第弐拾参話 IE

第弐拾四話 最後のCSS

第弐拾伍話 終わるXHTML2

第弐拾六話 世界の中心でセマンティックを叫んだけもの

劇場版 W3C新生

劇場版 WebKit/世界標準を、君に

2010-01-13

http://okajima.air-nifty.com/b/2010/01/post-abc6.html

少し遅れた感があるけど、解いてみた。

出力がテキストでないけど・・・。

仕事の合間を使ってやったものの、昼前に始めたのが5時頃にようやくできる程度。

これを25分とは尋常じゃないな、大口叩くだけあってよっぽど優秀なんだろう。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;

<html&gt;

<head&gt;
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis"&gt;
<meta http-equiv="Content-Language" content="ja"&gt;
<meta http-equiv="Content-Script-Type" content="text/javascript"&gt;
<meta http-equiv="Content-Style-Type" content="text/css"&gt;
<style type="text/css"&gt;
<!--

pre {
  font-family: monospace;
}

--&gt;
</style&gt;
<script type="text/javascript"&gt;
<!--

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 &gt; 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;&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;&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;
};

// --&gt;
</script&gt;
<title&gt;経路探索:A*</title&gt;
</head&gt;
<body&gt;

<pre&gt;&amp;nbsp;</pre&gt;

</body&gt;
</html&gt;

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-06-07

http://anond.hatelabo.jp/20090607123602

よく言えば、バナー制作者が工夫してる。

こればっかりは規制の線引きが難しいから、なくならないんじゃない?

2ちゃん自体もだけど、コピペブログでも普通エロゲとか18禁商品への広告が貼ってあるのは、疑問だわ。

AVでも18禁コーナーってゾーニングがある。借りる時点で18歳未満かどうかは確認できるんだから、

単純に18歳未満には貸し出さないって意味だけなら、ゾーニングは不要なはず。

普通ネットやってても、そういう「誘惑」に出逢うことは多い気がする。

まあ2ちゃんコピペブログ普通かといわれるとなんだが。

W3Cで18歳未満禁止のmetaでも作って、エロ暴力的なコンテンツがある場合はそれを記載義務があるようにして、

そのタグセキュリティソフトが関知してアクセスブロックするとかなっても良いと思う。

2009-02-27

http://anond.hatelabo.jp/20090227164616

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と設定ファイルオリジナルも作れそうだ。

また、詳細設定で静的ファイルでの設定も出来るかもしれない。

2009-02-22

http://anond.hatelabo.jp/20090222100251

HTMLは基本テキストエディタで手書きなweb制作屋だけどASPerlPHP自分で書いてるYo

むしろHTMLエディタ使ってるやつのほうが単なるHTMLコーダー多くないか

w3cとか全然知らずに定義意味も知らずに見た目だけで書いてる

2009-02-04

http://anond.hatelabo.jp/20090204145855

いわゆるW3C厨に属する人間だが全面的に同意したい。

バリバリFLASHなページはSEOの面から考えても圧倒的に不利。マーケティングの面ではブランドシグナリング程度の効果しかないと思うんだよね。

2009-01-21

ゾウさんが好きです。でもW3Cのほうがもーっと好きです。

http://www.w3.org/

マークアップに困ったときは、ちゃんとマークアップしてそうなサイトを参考にしているんだけど、(なんで今までやらなかったんだろう)初めて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要素ってイメージマップに使う要素じゃないの?

http://www.zspc.com/html40/structure/object.html#map

タイトルhttp://pha22.net/hotentry/

2009-01-12

韓国サイトIEマンセーで酷い。

仕事韓国企業サイトデザインすることになった。

担当者である社長と打ち合わせをしたが、彼は日本企業サイトはあまり好きではないらしい。

ターゲット日本人なので、日本人向けのデザインの方がいいと思うのだが、

それを説明した上でも、韓国っぽいものの方がいいという。

じゃー韓国サイトデザインで調べて参考にするかと、.co.krでググってみた。

韓国ではFirefox 3が使い物にならない理由

とあるので、そこそこ覚悟はしていたが、やはり酷かった。

とりあえず、制作の役に立ちそうな特徴からピックアップしてみる。

・ページ毎にメインカラーを変える傾向が強い。

例:http://www.grandhotel.co.kr/

・とにかくFLASHを使う。グローバルナビでは、FLASH必須。しかもサブナビが下一列に出る。

例:http://www.sst.co.kr/

・各ページのメインイメージFLASHにしてる。文字がハデに出てくる。

例:http://www.zalman.co.kr/jpn/WTB/Area.asp

・「TOPへ戻る」ボタンが上下する。

以下悪い点。

・なぜかフレームを使って、ページを移動してもURLが変わらないようにしている。

例:http://www.wonbinus.co.kr/japan/

ポップアップ大好き。

コーディングが雑。テキストにすべき所も画像になってる。

 ハングルは読めないから何書いてるかわからないが、あんまSEO概念がないのか?

ロールオーバー?何それおいしいの?

Firefox?何それ(以下略

・(x)htmlcss?何(以下略

一言でいうと、FLASH使ってカラフルならよさげで(かなり乱暴なまとめだ)、Firefoxなんて動作確認しない。

韓国サイトを見てる韓国人オーナーのクライアントがいたら、

酷い部分は置いといて、カラフルなのとかを真似たら、きっと満足してくれると思うよ!


以下、各サイトの寸評。

http://www.byj.co.kr/

言わずと知れたペヨンジュンfxで見ると、

\n'); document.write (' \n')

コードが丸見え。

http://www.grandhotel.co.kr/

ホテル

普通ポップアップが二つ出やがるwウゼエ。

fxだと普通に表示がオカシイ。しかもFLASHの所が。

cssを外してみるとFLASHの上にFLASHを乗せてる。

ロゴメインイメージ、ナビ、サブナビで合計4つのFLASHを使い、

さらにフッタ部分でもうねうねするFLASH

http://www.wonbinus.co.kr/japan/

ウォンビンサイト

ページを移動してもURLが変わらないと思ったら、何故かフレームを使っていた。

フレームを使う必要性がわからない。

ページ毎に色が変わる。

http://www.hello7.co.kr/

SE7ENサイト。フルフラッシュ

まあふつう

http://www.seoulroyal.co.kr/

ソウルロイヤルホテル

デザインは個人的に好き。

fxだとセンタリングがずれるだけでなく、左側ナビ部分に謎のFLASHが登場する。

ここもフレームを使っていて、URLが動かないようにしている。

FLASHのナビ以外、ロールオーバーしないという潔い仕様

「ROOM」内のローカルナビをクリックすると、ポップアップで部屋の紹介が出るという仕様。なんだそりゃ。

パンくずリンクリンクになってない。

http://www.seoulcasino.co.kr/

韓国版はポップアップが出る。

ハデ。PIPかと思いきや、お辞儀してるだけで話さない。

カジノだけに金かけていて、全ページFLASH

各ページでメインカラーが違う。

http://www.seoulcasino.co.kr/Kor/gaming/slot.asp

ここなんかではajaxを使っている。

何故か本文はコーディングされていない。

右下にフローティングの「TOPへ戻る」ボタンがある。

これ、韓国人好きみたい。

http://www.bonstyle.co.kr/

BON。ファッション雑誌サイトだろうか。

他のページに飛ぶが、やっぱりURLが変わらない。

fxだと当然のようにレイアウトが崩れる。

IEだと右側にFLASHローカルナビが上下するが、fxだと左側でしょんぼりしている。

フッタのデザインと、そのFLASHマウスの位置に反応する遊び心はいい。

http://www.sst.co.kr/

ソウルシニアスタワー。

江南区とその周辺で高齢者向け高層住宅及び痴呆高齢者グループホームを運営。施設、 サービスの紹介、入居案内。」

だそうだ。なんと日本サービス

お約束のようにグローバルナビがFLASHで、下横一列にサブナビが出てくる。

メインイメージFLASHの下のアイコンロールオーバーしない。

TOPへ戻る」ボタンがやっぱりある。

fxで見ると、フッタ部分がむやみに延びている。

酷いのが、勝手にしゃべり出すハタ迷惑なサイト

サウンドオフは当然ないし、

それどころかちっこいメディアプレーヤーが埋め込まれていて、それが勝手再生する。

つまり音声が二重になる。何考えてんだ?

コピーライトが「1981-2005」てどーゆーことだよ。

ふつーサイトオープン時からだろ?

インターネット韓国が作ったニダ!」というセリフがふと頭をよぎった。

音声の件にしろ、コピーライトにしろ、なんかものすごくこの企業自己主張を感じる。

どうでもいいが、flashに出てくる女性がどう見てもブ×だろ。

もう少しいい素材はないのか?

一枚だけなんか見たことある写真だと思ったら、

http://www.sozaijiten.com/cdrom/imagedetail.asp?pid=316&fid=00017007&i=1

だったorz

http://www.daraelaw.co.kr/index.php

「多来」。弁護士事務所でいいのかな。

高級感がある。ナビがFLASHで、やっぱり下にサブナビ。

fxだと「TOPへ戻る」が上下しない。

パンくずリンクリンクしてない。

http://www.wjis.co.kr/

(株)宇進産電。

IE7で見てもfxでみても、かわいそうなことになっている。

グローバルナビはflashで(以下略

ページによってメインカラーが違う。

ヘッダ部分はフレームで分けてあり、コンテンツ部分のみ変わるようにしてある。

IEだとローカルナビが上下するが、fxだとNG

さらに、fxで見てたら、右から2番目のボタン日本語だと「研究書紹介」)をクリックすると、

「攻撃サイトとして報告されています!」と表示された。

こんなの初めて見たよ。

http://www.zalman.co.kr/jpn/main.asp

「ZALMAN」

自動的に日本語サイトに飛ばされてしまうが、まあいい。

企業ロゴがヘボいわりには、サイトの内容自体はしっかりしている。

グローバルナビ、ローカルナビ、メインイメージFLASH

ここが一番見やすい。

追記:30ブクマくらいはいくかと思ったけど、思った以上に反応があって驚いた。

ブクマで書かれてたけど、各国のサイトを調べたら面白いかもね。

韓国って、国定教科書が一つしかないんだっけ。

今回調べてみてそれを思い出した。

自由なはずのインターネットでも選択権がなくて、IEでしか見られないってのは、けっこう悲惨な状況だと俺は思う。

視野が狭すぎる。

IEのみ対応ってのは、シェアを考えればたしかに「合理的」ではあるんだけど、

こんな状況だとIE8がリリースされたら、どんだけまともに閲覧できるんだろう?

(β版は全然試してない)

その時はその時で作り直していくんだろうけど、結局将来的に無駄リスクを抱えるわけだ。

単純に見た目のデザインとしては、

グローバルナビがFLASHだったりFLASHもハデで見た目はまあいいんだけど、

フレーム使ってURL固定してたり、ロールオーバーなかったりと、ディティールがすごい雑なんだよね。

topへ戻る」は利便性もあるだろうけど、見た目的に上下するのがカッコイイからつけてる気がしてしまう。

アクセシビリティなんて概念はなさそう。

もちろん各国によってブラウザシェア現実的なコストの問題もあるが、

そもそもweb制作って、W3C標準に準拠すべきものじゃないのか?

そういう観点から言っても、どうなのかなーと疑問に思わざるを得ない。

特徴として追加で、

・色であんまゾーニングしない。レイアウトの枠を感じさせないデザインが多い。

写真じゃなくて、写実的なイラストを使ってるのが多い。

てところか。

あ、ZALMANのデザイナーじゃないんで、よろしくw

2009-01-11

バナナはおやつに入りますか(HTML的に)

HTML2.0時代

ネットユーザバナナおやつに入りますか」

IETFの人「我々のネットワークでは日本語使用できません」

ネットユーザ「だからおやつに入るのか入らないのか」

IETFの人「誠に申し訳ない」

HTML3.2時代

ネットユーザバナナおやつに入りますか」

W3Cの人「当然バナナおやつです。見た目はタグで整形して下さいね」

ネットユーザ「ああ其れはいい事を聞いた気がする」

W3Cの人「尤も細かいデザインはテーブルタグで巧く微調整してね。腕の見せ所だよ」

HTML4.01時代

ネットユーザバナナおやつに入りますか」

W3Cの人「此の度バナナおやつから分離されました」

ネットユーザ「えー、何でそんな殺生なー(怒)」

W3Cの人「おやつHTML要素で論理マークアップして、バナナCSSで整形するのが推奨されます」

HTML5時代

ネットユーザバナナおやつに入りますか」

W3Cの人「すみませんバナナとは何の事ですか」

ネットユーザ「あのー、美味しいバナナで綺麗に飾りたいんですが」

W3Cの人「……お客様おやつを其処に置いて頂くだけで、此方で御用意した様々な機能が御利用頂けるのですがまだお判りではありませんか」

2008-10-12

ブログW3CのValid画像つけてみた

XHTML1.0 tradisionalとCSS3で満点とれたからそれぞれ画像をつけてみた。かっけー

2008-07-29

女子クラスで理解するウェブ業界

こんなところかな。異論は認める。


追記

確かに、写真部Flickrたんは忘れていたけど、キャラ付けが思いつかないね。six apartwordpressは迷ったけど、どっちでもいいかな、と。EITFものど元まででかかったけど、思い出せなくてRFCにした。それ以上は、きつくなるだけなので、ここまでで。

それにしても、マジでみんな列挙型ネタ、好き過ぎ。こういうネタやったらウケるだろうなぁ、と思ったらほぼそのまんまはてブに反映されててワロタ。「○○するための××をN個」なんてすぐにはてブホットエントリ入りするし。例えば、ネタ系列でも、同じような事をプログラミング言語とかでやってみたら、またすぐにエントリ入りするだろうね。戦国時代な数の多いジャンルでやると、すぐにウケると思うよ。

私立T女子学園は、正にその通り(個人的にあずまんがよりもT女だったので)。ああいうギャグ群像劇モデル

Google信者なので、世界征服ネタは思いつかなかったけど、普段は良い顔しているけど、自分に批判的な言動には「な・ん・だ・っ・て?」みたいに目を光らせてみるというのも良いかも。あとは、Googleモテネタとか。

  1. バレンタインでみんな断っているGoogle
  2. 「なんでみんな断っちゃうの? 可哀想じゃん」
  3. Google「だって、自分と釣り合わない人と付き合っている事がわかったら、相手に失礼でしょ?
  4. (みんなが睨みをきかせている間に一人悩むGoogle)

とか、そんな感じ。

ちなみに、この手のマンガを考えるときに、超大金持ちを混ぜておくというのは、話を膨らませるための一種の王道こち亀中川とか、うる星やつらの面堂終太郎とか、そういうの。御坊茶魔くんとか、有閑倶楽部なんて、それだけをネタにしたような作品だし。ここで言えば、microsoftがT女の田中小夏みたいな立場。例えば、

  1. 「みんなで富士山とか登ってみたいねー」
  2. 「あんなところ無理だよー」
  3. Microsoft「ふ、そんなこともあろうかと、学校から山頂までの道を全て買収しておいたわ」
  4. (みんなでタクシーで山頂に到達して)「こんなんじゃ、登山にならないよー」「あんな立派なビルがあったら、標高、計り直さないとね...」

とか、そんな感じ。富豪刑事とか、デスノートのL絡みも似たようなもんでしょう。同じようなシチュエーションは、発明家でも使えるので、そちらで考えてみても面白いです。上記で言えば、

  1. 「みんなで富士山とか登ってみたいねー」
  2. 「あんなところ無理だよー」
  3. Apple「というわけで、みんなのために、登山が楽になるマシンを作ってみたわ」
  4. (みんなで戦車みたいのに乗りながら)「楽なのは、いいけど、みんな更地になってない?」「いいんじゃない、富士山の高さの方がかわったということで?」

とか、そんな感じ。ネタ振りがYouTubeで、たしなめるのがGoogleかな。話の切っ掛けは、性格の幼いキャラにして、その後、やや大人なキャラ突っ込み入れて、その後、別の展開と言うのがセオリーTwitterとか、YouTubeがそういう先陣を切るキャラでしょう。

あとは、三段論法を壊すというオチもこの手のギャグでありがち。ここで言えば、TechCrunchが、矛盾する情報に悩んであさっての方向で結論を出したりとか、Wikipediaが、あまりの情報の多さに、却ってとんちんかんなことを言い出したり。ちょっとひねらないと面白くないけどね。

というわけで、皆さん、楽しんでいただけだでしょうか。ネタが当たって、僕は楽しかったです。

2008-06-06

http://anond.hatelabo.jp/20080606204654

あんま関係無いけど、<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

2008-02-04

http://anond.hatelabo.jp/20080128165759

長いので一行まとめ:便利になる前の試行錯誤の時点で潰されてるんじゃないかって思った。

昔、まだダイヤルアップの人とか 800*600 の人とかが普通にいた頃、自サイトコンパクトにする試みを色々やっていた。何かそういう実験をひそやかにやるのが主な目的サイトだった。ナビゲーションリンクを各ページに埋め込む代わりに JavaScript に記述して呼び出せばキャッシュが効いて効率が上がるんじゃないか、とか。(JavaScript の効かないブラウザ・切ってるブラウザ向けに、総目次になっているトップへのリンクを表記しといて最低限のアクセシビリティは保ってた。アクセシビリティなんて言葉知らなかったけど。)

フレームや段組に貴重な画面領域をごそっと持って行かれるのを避けたかった。でもマウスホイールが付いてないマウスもザラにあったり、ましてやマウスジェスチャーなんて誰も使ってなかった時代背景から、スクロールも最小限に抑えたい気持ちもあった。そこで、普段は隠れてるけど、ある簡単な操作(画面右下にマウスを移動させるとか)でナビゲーションリンクが出て来る仕組みを色々考案しては試していた。

その中のひとつとして、右クリック(コンテキストメニュー)にナビゲーションを仕込むという試みをした時があった。本来のコンテキストメニューに戻す項目をそのメニュー内と画面の端っこにつけて、トップページで使用法をアナウンスする形でリリースした。

その後間もなく、どういう経緯で目をつけられたのかは分からないけど、今で言うモヒカン族くずれの方々が「ユーザービリティ!ユーザービリティ!」と雄叫びを上げながらわらわらとサイト狩りに来たのでびびってやめた。相当びびったのでその後数年間 W3C 教(というか某方面教)に入信して狩られないお作法を学んだ。

あれから数年、別腹で試みて、当時はノーリアクションだったり難色を示されてた「JavaScript でお絵かき」とか「送信中は押せない送信ボタン」とか「記事を貼り付ける位置を自由に決められる掲示板」とかが、世間様に受け入れられたり色んな人が改良してたりするのを見て、土壌が大分変わってるように感じた。だもんでコンテキストメニューいじりも何か進展があったんじゃないかとおぼろげに思ってたりしたけど、具体的には Flashコンテキストメニューいじるくらいのノリでグリグリやってるんじゃないかなあと思ってたけど、その辺はみたとこ昔と変わらないんだね。

もしかしたら今もまだ「右クリック」に過剰反応して、そういう狩りをして芽を摘んでる人がいるんじゃないのかなあとか思った。そんな自分も document.body に付いてるイベントハンドラは根こそぎ削除して閲覧してたりして、評価する機会をふいにしてるから、人の事言えた義理でもないけど。

ちなみに単純な右クリック禁止自体はやる意味が無いのでやったことがない。6年くらい前に「右クリック禁止解除」ってブックマークレット作ってたくらいだから(当時はブックマークレットって言葉も知らなかったけど)やりたくないっていうアドバンスな気持ちも持ち合わせてたんだと思う。

2008-01-18

はてなブックマークの収集スクリプトを書いてみた

ので、その結果を貼ってみます。とりあえず、はてなブックマークが始まってから1ヶ月(2005/2/10〜2005/3/9,1033エントリ)の、ブックマーク数によるベスト10を出しました。

ここで皆さんにお願いがあるのですが、今回のベストX以外にどういう観点でデータを抽出したら良いか(どういう一覧がほしいか)、コメントをいただけませんか?データは集めてみたものの、活用方法に困ってます。

1位:Ajax: Web アプリケーション開発の新しいアプローチ
2位:Google検索コマンドと演算子一覧/Web検索! メタサーチ/
3位:Wikipedia
4位:Google
5位:通知表の所見欄に書きたいけど書けない(性格を表す)言葉を書きかえる一覧表
6位:正しい知識を得たい人の爲のCSS2リファレンス
7位:Jess : Automated Japanese Essay Scoring System
8位:窓の杜 - 【特集】「Firefox」プラグイン特集 第1回
9位:ITmedia
10位:スラッシュドット ジャパン

====================

でした。

当時はまだ「有名サイトトップページにとりあえず貼っておく」みたいな使われ方をしていますね。ブックマークをどう使うか、というスタイルを探していたんでしょうか。

ちなみにこのときのキーワード出現回数のベスト20は

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回)」

で、タグベスト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回)」

でした。当時から「ネタタグって多かったんですかね(タグキーワード現在の付与状況しか分からないので、当時の本当の状態が分からない)。

2007-11-08

60行テンプレートエンジンがパワーアップしてレイアウト機能に対応

前の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&amp;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, &amp;$_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) &amp;&amp; $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コード:

<?php
require_once('OtokomaeTemplate.php');
$TEMPLATE_DIR    = 'templates';
$LAYOUT_TEMPLATE = 'layout.php';
$context = array('list'=>array(10,'<A&amp;B>',NULL));
include_template('template.php', $context);
?>

レイアウトテンプレート(layout.php):

<?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>

テンプレート(template.php):

<?php // レイアウトテンプレート名をテンプレート中で指定する場合 ?>
<?php //$_context['_layout'] = 'mylayout.php'; ?>
<?php // レイアウトで使用する変数テンプレート中で指定する場合 ?>
<?php $_context['title'] = 'レイアウトのサンプル'; ?>
<table>
<?php foreach ($list as $i=>$item): ?>
  <tr bgcolor="#{$i % 2 ? '#FFCCCC' : '#CCCCFF'}">
    <td&gt;#{$i}</td&gt;
    <td&gt;%{$item}</td&gt;
  </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&gt;0</td&gt;
    <td&gt;10</td&gt;
  </tr>
  <tr bgcolor="#FFCCCC">
    <td&gt;1</td&gt;
    <td&gt;&lt;A&amp;B&gt;</td&gt;
  </tr>
  <tr bgcolor="#CCCCFF">
    <td&gt;2</td&gt;
    <td&gt;</td&gt;
  </tr>
</table>
<!-- /テンプレートの内容 -->
    </div>
  </body>
</html>

いくつか補足:

2007-10-30

[]55行で作るC#テンプレートエンジン

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 &amp;&amp; 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>&lt;strong&gt;foooooooooo!&lt;/strong&gt;</td>
      </tr>

    </table>
  </body>
</html>

CodeDom 使って動的コンパイル……って、このコードのままだとセキュリティ的に大問題な気がするな。

素直に ASP.NET 使ったほうが楽だと直感した。

あと EscapeString すっごく自信ない。たぶん修正が必要だと思うw

40行で作るPerlテンプレートエンジン

60行で作るPHP用テンプレートエンジン

やってしまった・・・。

方針:

  • PHPのように<?php・・・?>が無いのでそのまま表示と(foreach|if|unless)に対応。
  • [% $c{title} %]で普通に表示(TTっぽい?)
  • [# $c{title} #]でHTMLエスケープ表示

package SixtyLinesTemplate;

use strict;
use warnings;
our $VERSION = '0.01';

sub convert {
    return unless defined(my $str = shift);
    $str =~ s{&amp;}{&amp;}gso;
    $str =~ s{<}{&lt;}gso;
    $str =~ s{>}{&gt;}gso;
    $str =~ s{\"}{&quot;}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 &amp;&amp; (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&amp;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&gt;
    <title>[# $c{title} #]</title>
  </head&gt;
  <body>
    <h1>[# $c{title} #]</h1>
    <table>
[% foreach my $i (0..@{$c{list}}-1) %]
      <tr bgcolor="[% $i % 2 ? '#FFCCCC' : '#CCCCFF' %]">
        <td&gt;[% $i %]</td&gt;
        <td&gt;[# $c{list}[$i] #]</td&gt;
      </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>&lt;A&amp;amp;B&gt;</td>
      </tr>

    </table>
  </body>
</html>

foreachんところが汚く見えるかもしれませんが、あれは添え字を取ろうとするとああなるんでご勘弁を。

普通ループするだけならforeach my $item (@$c{title}) でいけますゆえ。

あと存在しない変数とか使うと死んだり警告でたりするのでevalの前にno strictとno warningsをやった方がいいかもねぇ。

って何まじめに検証してんだ俺・・・orz

追記:

SixtyじゃなくてFortyだね。恥ずかし!

追追記:

danさんに添削頂いたYO!

でも&amp;の奴はちゃんと書いてるんだけども投稿すると勝手エスケープされてしまってるんだよね。何でだろ?

ちなみにこのconvertの処理はCGI::Utilから拝借しました。

60行で作るPHPテンプレートエンジン

唐突に、PHP用のテンプレートエンジンを作ってみる。

方針:

  • ふつうのPHPファイルテンプレートとして使う。
  • <?php echo $var; ?> は面倒なので #{$var} と書けるようにする。
  • <?php echo htmlspecialchars($var); ?> はもっと面倒なので %{$var} と書けるようにする。
  • ついでにXML宣言も <<?php ?>?xml ... に自動置換する。

【追記】レイアウト機能を追加してみた

コード

<?php
/*
 *  SixtyLinesTemplate.php - 60行しかないけどSmartyより速いテンプレートエンジン
 *
 *  使い方:
 *     require_once('SixtyLinesTemplate.php');
 *     $TEMPLATE_DIR = 'templates'; // 省略可、パーミッションに注意
 *     $context = array('title'=>'Example',
 *                      'list'=>array(10,'<A&amp;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) &amp;&amp; $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コード

<?php
require_once('SixtyLinesTemplate.php');
$TEMPLATE_DIR = 'templates'; // optional
$context = array('title'=>'Example', 'list'=>array(10,'<A&amp;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>&lt;A&amp;B&gt;</td>
      </tr>
      <tr bgcolor="#CCCCFF">
        <td>2</td>
        <td></td>
      </tr>
    </table>
  </body>
</html>

2007-10-20

http://anond.hatelabo.jp/20071019235405

ごめん、さすがに何が言いたいのか

○○は××だよってのが飛躍した論理だから「それなら人類魚類ってことだよね(だからおかしいよね)」って書いてるのに

「人は魚じゃねえよwwww」って指摘じゃ全然読めて無いんじゃん。

○○は××だよってのが人と魚が同じというぐらい飛躍していると思っているのは君でしょ?

そうではないよって指摘されてるんだよ?

これ書いた元増田ではないんだけどね。

http://anond.hatelabo.jp/20071019193836

こっちと、これを書いた都合上レスしとく。

http://anond.hatelabo.jp/20071019143819

http://anond.hatelabo.jp/20071019234154

ネット上にHTML形式などの「ブラウザで閲覧可能な形式」で公開した時点で、著作権者はある程度任意のスタイルで閲覧されることを承諾しているものと見なされる。常考

別にこれは問題ないんじゃないの?

じゃないとインターネット成立しないしな。ある程度の改変は社会通念上認められるんじゃないか?

じゃあブラウザデータW3Cで世間的に合意したとみなせる仕様とも異なる方法で勝手に解釈して別形式に表示しなおすから著作者人格権を侵害してるわけだ

だからそれは著作者人格権じゃないってば。

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