<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:xhtml="http://www.w3.org/1999/xhtml" version="2.0">

<channel>
	<title>ゆっくりと…</title>
	
	<link>http://tokkono.cute.coocan.jp/blog/slow</link>
	<description>T.I.D. (Technologies Inspire Design)</description>
	<lastBuildDate>Fri, 24 Feb 2012 13:45:20 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/feed/" />
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/coocan/xwaf" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="coocan/xwaf" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>やっと理解できた！JSオブジェクト指向プログラミング再入門</title>
		<link>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/re-introduction-to-object-oriented-js/</link>
		<comments>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/re-introduction-to-object-oriented-js/#comments</comments>
		<pubDate>Mon, 06 Feb 2012 23:37:55 +0000</pubDate>
		<dc:creator>tokkonoPapa</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://tokkono.cute.coocan.jp/blog/slow/?p=1955</guid>
		<description><![CDATA[
既に多くの方が JavaScript のオブジェクト指向的側面についての解説を記事にされていますが、読み手側から見ると、例えばプログラミング言語への習熟度やオブジェクト指向自体に対する理解度がチマチなわけで、私自身、「 [...]]]></description>
			<content:encoded><![CDATA[<p>
既に多くの方が JavaScript のオブジェクト指向的側面についての解説を記事にされていますが、読み手側から見ると、例えばプログラミング言語への習熟度やオブジェクト指向自体に対する理解度がチマチなわけで、私自身、「おお、なるほど！」 っていう、頭の中のスイッチがパチンッ！と入るような境地には達していませんでした。
</p>
<p>
かつて私も <q><a href="http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/object-oriented-programming-by-javascript-1/">オブジェクト指向なJavaScriptプログラミングのススメ</a></q> なんていう翻訳記事を書いてはいるのですが、正直なところ <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/constructor" title="constructor - MDN"><code>prototype.constructor</code></a> の存在は知りませんでしたし、<a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call" title="call - MDN"><code>Function.call</code></a> や <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply" title="apply - MDN"><code>Function.apply</code></a> をどう使えばよいのかなどをちゃんと理解できてはいませんでした。
</p>
<p>
そんな中、2011年12月に書かれた <a href="https://developer.mozilla.org/ja/docs">Doc Center | Mozilla Developer Network</a> の記事 <q><a href="https://developer.mozilla.org/en/Introduction_to_Object-Oriented_JavaScript" title="Introduction to Object-Oriented JavaScript">オブジェクト指向 JavaScript 入門</a></q> は、オブジェクト指向の概念と JavaScript のプログラミング言語仕様をほどよくバランスさせながらも、「JavaScript のオブジェクト指向プログラミングはこうだ！」っていう大胆な書きっぷりが、私的にはスイッチが入ったのでした。
</p>
<p>
もちろんこの記事に目を留めてもらった人と私のバックグランド （仕事上は組み込み系の C → UML → C++ です） は違いますし、また優れた解説記事が多数ある中、私がこの記事を共有する価値があるのかどうか分かりません。が、私のように <q>クラス</q> に馴染んだ人間に教える良い方法でもあると思ったので、翻訳を中心に、その <q>感じ</q> を伝えるチャレンジを再度してみたいと思います <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  。
</p>
<p><span id="more-1955"></span></p>
<h3>オブジェクト指向 JavaScript 入門</h3>
<p>
JavaScript には強力なオブジェクト指向プログラミング能力が備わっていますが、他の言語と比べたときの違いによって、今まで様々な議論がなされてきました。
</p>
<p>
本稿では、まずオブジェクト指向プログラミングの入門的な解説から入り、次いで JavaScript のオブジェクトモデルを紹介します。そして最後に JavaScript におけるオブジェクト指向プログラミングの概念を、例を用いて示したいと思います。
</p>
<h3>JavaScriptの復習</h3>
<p>
もしあなたが、例えば変数や型、関数やスコープといった JavaScript の概念についての理解をより確かなものにしたいなら、<q><a href="https://developer.mozilla.org/ja/JavaScript/A_re-introduction_to_JavaScript" title="A re-introduction to JavaScript - MDN">JavaScript 再入門</a></q> を読むと良いでしょう。また <q><a href="https://developer.mozilla.org/ja/JavaScript/Guide" title="Core JavaScript 1.5 ガイド - MDN">Core JavaScript 1.5 ガイド</a></q> も参考になります。
</p>
<h3>オブジェクト指向プログラミング</h3>
<p>
オブジェクト指向プログラミングは、実世界に基づくモデルを構築する際に、抽象化という技法を用いるプログラミングのパラダイムです。そのために、既に確立されたパラダイムであるモジュール化やポリモーフィズム、カプセル化といった幾つかの技法を用います。今日、広く普及している多くのプログラミング言語 （Java、JavaScript、C#、C++、Python、PHP、Ruby、Objective-C など） がオブジェクト指向プログラミング （OOP） をサポートしています。
</p>
<p>
古典的なプログラムが、関数の集合、あるいは単なるコンピューターへの命令リストに過ぎないのとは対照的に、オブジェクト指向プログラミングは、オブジェクトの集合を用いるソフトウェア・デザイン手法と見なすことができます。OOP ではそれぞれのオブジェクトが、メッセージを受信し、データを処理し、他のオブジェクトにメッセージを送信することができます。どのオブジェクトも、異なる役割や責務を持つ独立した小さなマシンと見なすことができるのです。
</p>
<p>
オブジェクト指向プログラミングは、プログラミングにおける柔軟性や保守性を向上させることを意図していて、実際、大規模なソフトウェア・エンジニアリングの領域において広く普及しています。またモジュール化に強く重点が置かれているため、オブジェクト指向のコードはモジュラ・プログラミング手法 （訳者注：単一目的の小さなモジュールを単位とするプログラミング手法。OS などの構築手法としてよく言及されている） に比べ、開発がよりシンプルで、後々の理解がし易く、またより複雑な状況や手順を分析し、コーディングすることに適しているのです。
</p>
<h3>用語の解説</h3>
<dl>
<dt><strong>クラス</strong></dt>
<dd>
<p>オブジェクトの特性を定義したものです。</p>
</dd>
<dt><strong>オブジェクト</strong></dt>
<dd>
<p>クラスのインスタンス（実体）です。</p>
</dd>
<dt><strong>プロパティ</strong></dt>
<dd>
<p>例えば <q>色</q> といった、オブジェクトの特性です。</p>
</dd>
<dt><strong>メソッド</strong></dt>
<dd>
<p>例えば <q>歩く</q> といった、オブジェクトが持つ機能です。</p>
</dd>
<dt><strong>コンストラクタ</strong></dt>
<dd>
<p>オブジェクトが生成されるときに呼び出されるメソッドです。</p>
</dd>
<dt><strong>継承（インヘリタンス）</strong></dt>
<dd>
<p>あるクラスが別のクラスから特性を継承することができるという性質のことです。</p>
</dd>
<dt><strong>カプセル化</strong></dt>
<dd>
<p>クラスにはオブジェクトの特性だけを定義し、メソッドにはそのメソッドをどのように実行するかだけを定義します （訳者注：一般的なカプセル化の概念としてこの表現には違和感を感じますが、特に JavaScript の <abbr title="Object Oriented Programming">OOP</abbr> の場合、プロパティはコンストラクタで、メソッドはプロトタイプで定義するということを指しているのではないかと思います。もちろんコンストラクタ中でもメソッドは定義できますが、オブジェクトのインスタンス毎に定義されるためメモリ効率が良くありません。一方コンストラクタ中で定義すれば、後述するように各インスタンスはただ1つの関数を参照するようになり、また必要であればインスタンスごとにオーバーライドすることもでき、OOP 言語として自然な感じになります）。</p>
</dd>
<dt><strong>抽象化</strong></dt>
<dd>
<p>オブジェクトの継承やメソッド、プロパティなどの組み合わせを駆使し、問題領域のモデルをシミュレートできるようにすることです。</p>
</dd>
<dt><strong>ポリモーフィズム</strong></dt>
<dd>
<p>複数の異なるクラスに属するメソッドまたはプロパティを定義することができるという性質のことです。</p>
</dd>
</dl>
<p>
さらに詳しいオブジェクト指向プログラミングの定義については、Wikipedia の <q><a href="http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91" title="オブジェクト指向 - Wikipedia">オブジェクト指向</a></q> をご覧ください。
</p>
<h3>プロトタイプ・ベースのプログラミング</h3>
<p>
<a href="https://developer.mozilla.org/ja/Core_JavaScript_1.5_Guide/Class-Based_vs._Prototype-Based_Languages" title="Class-Based vs. Prototype-Based Languages - MDN">プロトタイプ・ベースのプログラミング</a> は、オブジェクト指向プログラミングの中でも、クラスを持たないスタイルをとります。オブジェクトの振る舞いの再利用 （クラス・ベースのプログラミング言語の継承に当たる） は、既に存在するオブジェクトをプロトタイプとして流用する形で行われます。このようなプログラミング・モデルは、<q>クラスレス</q>、<q>プロトタイプ指向</q> あるいは <q>インスタンス・ベース</q> のプログラミングとして知られています。
</p>
<p>
<a href="http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97%E3%83%99%E3%83%BC%E3%82%B9">プロトタイプ・ベース言語</a> の原型は、<a href="http://en.wikipedia.org/wiki/David_Ungar">David Ungar</a> と Randall Smith によって開発された <a href="http://ja.wikipedia.org/wiki/Self" title="Self - Wikipedia">Self</a> というプログラミング言語に見ることができます。しかしながら近年、クラスレスなプログラミング・スタイルが急激に広まりつつあります。例えば JavaScript、Cecil、NewtonScript、lo、MOO、REBOL、Kevo、<a href="http://ja.wikipedia.org/wiki/Squeak" title="Squeak - Wikipedia">Squeak</a> （訳者注：<a href="http://squeakland.jp/" title="ようこそ、スクイークランドへ!">スクイーク</a> は、学校教育でも取り入れられているメディア・オーサリング・ツールです） といったものがその代表ですが、<a href="http://en.wikipedia.org/wiki/Prototype-based_programming#Languages" title="Prototype-based programming - Wikipedia, the free encyclopedia">他にも多数</a> 存在します。
</p>
<h3>JavaScriptオブジェクト指向プログラミング</h3>
<h4>コア・オブジェクト</h4>
<p>
JavaScript はそのコアに、幾つかのオブジェクトを内包しています。例えば、<code>Math</code>、<code>Object</code>、<code>Array</code>、<code>String</code> といったものがあります。次の例は、<code>Math</code> オブジェクトの <code>ramdom()</code> というメソッドの使用例です。
</p>
<p>[javascript]<br />
alert(Math.random());<br />
[/javascript]</p>
<div class="note">
<strong>注：</strong> 本例以降で出てくる <code>alert</code> という名前の関数は、グローバルに定義されていると仮定します。実際には <code>alert</code> 関数は、JavaScript の一部ではなく、ブラウザに含まれる機能の1つです。
</div>
<p>
JavaScript に含まれるコア・オブジェクトのリストは、<a href="https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects" title="Global Objects - MDN">Core JavaScript 1.5 Reference: Global Objects</a> を参照してください。
</p>
<p>
JavaScript では、どのオブジェクトも <code>Object</code> のインスタンスの1つで、そのプロパティとメソッドを継承しています。
</p>
<h4>カスタム・オブジェクト</h4>
<p>
（訳者注：定義済みのコア・オブジェクトに対し、後から定義するオブジェクトを指しています。）
</p>
<h5>クラス</h5>
<p>
JavaScript は C++ や Java と異なり、クラス宣言を持たないプロトタイプ・ペースの言語です。これは、クラス宣言を持つ言語に慣れ親しんだプログラマにとっては混乱の元かも知れません。代わりに JavaScript では <q>関数</q> を <q>クラス</q> のごとく使います。クラスの定義は、関数の定義同様に簡単です。以下の例は、<code>Person</code> という新しいクラスを定義していることになります。
</p>
<p>[javascript]<br />
function Person() {}<br />
[/javascript]</p>
<p>
（訳者注：「<code>function</code> をクラス宣言と思え！」という大胆な書きっぷりが、私が気に入った最大の理由です <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  。これ以降、用語も含めて <q>クラス・ベース</q> の文脈で解説されています。）
</p>
<h5>オブジェクト（クラスのインスタンス）</h5>
<p>
オブジェクト <code>obj</code> の新しいインスタンスを作るためには、<code>obj</code> という型を後で参照できるよう <code>new</code> 宣言子を用いて変数に割り当てます。
</p>
<p>
次の例は、<code>Person</code> という名前のクラスを定義し、<code>person1</code> と <code>person2</code> という2つのインスタンスを作成しています。
</p>
<p>[javascript]<br />
function Person() { }<br />
var person1 = new Person();<br />
var person2 = new Person();<br />
[/javascript]</p>
<div class="note">
インスタンスを作成する新しいメソッド <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create" title="create - MDN"><code>Object.create</code></a> （訳者注：JavaScript 1.8.5） も参照すると良いでしょう。
</div>
<h5>コンストラクタ</h5>
<p>
コンストラクタは、オブジェクトの実体を生成するときに呼び出されます。コンストラクタはクラスのメソッドです。JavaScript では、関数がオブジェクトのコンストラクタとして機能するので、明示的にコンストラクタ・メソッドを定義する必要がありません。クラス内で定義されたどんなアクションも、インスタンス化のたびに実行されるのです。
</p>
<p>
コンストラクタは、オブジェクトのプロパティを設定したり、オブジェクトを準備するメソッドを呼び出すために使われます。クラスにメソッドを追加／定義する別な方法は、後ほど説明します。
</p>
<p>
次の例は、クラス <code>Person</code> のインスタンス生成時に、アラートを出すコンストラクタを定義しています。
</p>
<p>[javascript]<br />
function Person() {<br />
	alert(&#8217;Person instantiated&#8217;);<br />
}</p>
<p>var person1 = new Person();<br />
var person2 = new Person();<br />
[/javascript]</p>
<h5>プロパティ（オブジェクトの属性）</h5>
<p>
プロパティは、クラスに内包される変数です。どのオブジェクトのインスタンスもプロパティを持っています。また継承を正しく行うためには、プロパティはクラス （関数） の <code>prototype</code> プロパティの中で設定される必要があります。
</p>
<p>
クラスの内部でプロパティを機能させるためには、現在のオブジェクトを参照する <code>this</code> というキーワードを使います。クラスの外部からプロパティへ read/write アクセスするには、<code>InstanceName.Property</code> というシンタックスを使います。これは C++ や Java、その他多数の言語と同じ方法です （クラスの内部でプロパティの値を set/get するには、<code>this.Property</code> というシンタックスが使われます）。
</p>
<p>
次の例は、<code>Person</code> クラスに <code>gender</code> というプロパティを定義しています。
</p>
<p>[javascript]<br />
function Person(gender) {<br />
	this.gender = gender;<br />
	alert(&#8217;Person instantiated&#8217;);<br />
}</p>
<p>var person1 = new Person(&#8217;Male&#8217;);<br />
var person2 = new Person(&#8217;Female&#8217;);</p>
<p>//display the person1 gender<br />
alert(&#8217;person1 is a &#8216; + person1.gender); // person1 is a Male<br />
[/javascript]</p>
<h5>メソッド</h5>
<p>
メソッドは、プロパティと同じロジックに従います。違いは、メソッドは関数であり、関数として定義されるということです。メソッドの呼び出しはプロパティのアクセスと似ていますが、メソッド名の最後に <q><code>()</code></q> （カッコ） を付けなければなりませんし、必要であればそこに引数を指定することができます。メソッドを定義するには、クラスの <code>prototype</code> プロパティに <code>function</code> とい名前のプロパティを割り当てます。即ち関数に付けられた名前が、そのオブジェクトで呼び出すことのできるメソッドの名前になります。
</p>
<p>
次の例は、<code>Person</code> クラスにメソッド <code>sayHello()</code> を定義します。
</p>
<p>[javascript]<br />
function Person(gender) {<br />
	this.gender = gender;<br />
	alert(&#8217;Person instantiated&#8217;);<br />
}</p>
<p>Person.prototype.sayHello = function() {<br />
	alert (&#8217;hello&#8217;);<br />
};</p>
<p>var person1 = new Person(&#8217;Male&#8217;);<br />
var person2 = new Person(&#8217;Female&#8217;);</p>
<p>// call the Person sayHello method.<br />
person1.sayHello(); // hello<br />
[/javascript]</p>
<p>
JavaScript におけるメソッドは、プロパティとしてクラス（オブジェクト）にバインドされている通常の関数オブジェクトです。これが意味することは、メソッドはコンテキストの外で呼び出すことができるということです。次の例を見てください。
</p>
<p>[javascript]<br />
function Person(gender) {<br />
	this.gender = gender;<br />
}</p>
<p>Person.prototype.sayGender = function() {<br />
	alert (this.gender);<br />
};</p>
<p>var person1 = new Person(&#8217;Male&#8217;);<br />
var genderTeller = person1.sayGender;</p>
<p>person1.sayGender(); // &#8216;Male&#8217;<br />
genderTeller();      // undefined<br />
alert(genderTeller === person1.sayGender);          // true<br />
alert(genderTeller === Person.prototype.sayGender); // true<br />
[/javascript]</p>
<p>
上記例では、同時に幾つもの概念を表しています。その1つは、JavaScript には <q>オブジェクトごとのメソッド</q> というのはなく、メソッドへの全ての参照は、<code>prototype</code> で定義された、ただ1つの関数を指しているという点です。そしてもう1つは、関数がオブジェクトのメソッド （正確にはプロパティです） として呼び出されたとき、その時の <q>オブジェクトのコンテキスト</q> が <q><code>this</code></q> という特別な変数に <q>バインド</q> されるという点です。これは次のように関数オブジェクト （この場合 <code>genderTeller</code>） の <q><code>call</code></q> メソッドを通じて （この場合は <code>person1</code> の） <code>this</code>  を提供すること同じです。
</p>
<p>[javascript]<br />
genderTeller.call(person1); // alerts &#8216;Male&#8217;<br />
[/javascript]</p>
<div class="note">
より詳しくは、<a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call" title="call - MDN"><code>Function.call</code></a> や <a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply" title="apply - MDN"><code>Function.apply</code></a> を参照してください。
</div>
<p>
（訳者注：実際に試した方が良く理解できると思い、少しアレンジした Fiddle を作ってみました。<code>call</code> メソッドのメリットは、次の継承でより明らかになります。）
</p>
<p><iframe style="width: 100%; height: 300px;" src="http://jsfiddle.net/tokkonoPapa/hZk63/embedded/js,result/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<h5>継承（インヘリタンス）</h5>
<p>
継承は、1つ、あるいは複数クラスの派生バージョンのクラスを作る機構です （JavaScript の場合、単一クラスの継承だけがサポートされています）。派生クラスは一般に <em>子</em> と呼ばれ、その他のクラスは一般に <em>親</em> と呼ばれます。JavaScript では、親クラスのインスタンスを子クラスに割り当てることで実現させます。その後、派生部分を定義します。
</p>
<div class="note">
JavaScript では、子クラスの <code>prototype.constructor</code> プロパティを認識しないので、明示的に宣言しなければなりません。詳しくは <a href="https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Object/prototype" title="prototype - MDN">Core JavaScript 1.5 Reference: Global Objects: Object: prototype</a> を見てください。
</div>
<p>
次の例は、<code>Person</code> クラスの子クラスとして <code>Student</code> クラスを定義します。そして <code>sayHello()</code> メソッドを再定義 （オーバーライド） し、さらに <code>sayGoodBye()</code> メソッドを追加します。
</p>
<p><iframe style="width: 100%; height: 290px" src="http://jsfiddle.net/tokkonoPapa/45nh8/embedded/js,result/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<p>
（訳者注：<code>Student</code> のコンストラクタで <code>Person</code> のコンストラクタを呼び出す際、コンテキストを <code>Student</code> とするために <code>call</code> を用いています。このようにすれば、継承したメソッドをオブジェクトのインスタンスに合わせて呼び出すことができます。）
</p>
<h5>カプセル化</h5>
<p>
前述の例題では、<code>Student</code> クラスは <code>Person</code> クラスの <code>walk()</code> メソッドがどのように実装されているかを知らなくても、そのメソッドを使うことができました。即ち <code>Student</code> クラスは、そのメソッドを変えようと思わない限り、明示的に定義する必要がないということです。これはカプセル化と呼ばれており、どのクラスも親のメソッドを継承することができ、変えたいと望むときだけ定義すれば良いのです。
</p>
<h5>抽象化</h5>
<p>
抽象化とは、問題領域をモデリングするためのメカニズムのことです。このモデリングは、継承とコンポジション （集約＝あるオブジェクトの中に別なオブジェクトが構成要素として入る関係） によって成されます。JavaScript では継承によって派生が作られ、またクラスのインスタンスが他のオブジェクトの属性値となることでコンポジションが構成されます。
</p>
<p>
JavaScript の <code>Function</code> クラスは、<code>Object</code> クラスを継承しています （これはモデルの派生です）。そして <code>Function.prototype</code> プロパティは <code>Object</code> のインスタンスととなっています （この関係は、コンポジションです）。
</p>
<p><iframe style="width: 100%; height: 110px" src="http://jsfiddle.net/tokkonoPapa/ZNYMJ/embedded/js,result/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>
<h5>ポリモーフィズム</h5>
<p>
全てのメソッドとプロパティは <code>prototype</code> プロパティ内で定義されるため、異なるクラスで同じ名前のメソッドを定義することができます。つまり、メソッドはそれが定義されているクラスだけにスコープされているということです。これは、2つのクラスが親と子の関係 （継承チェーンにおいて、一方が他方を継承しない関係にあるとき） にない場合にのみ、真となります。
</p>
<h3>備考</h3>
<p>
本稿に記したオブジェクト指向プログラミングを実装するための技法は、JavaScript でだけ使われるものではありません。即ち、オブジェクト指向プログラミングがどのように実行されるかという点に関して言えば、他の言語にも適応性させることができます。
</p>
<p>
同様に、ここに示した技法はどんな言語のハックを使っているわけでもありませんし、他の言語のオブジェクト理論の実装を模倣したわけでもありません。
</p>
<p>
もちろんここで述べた以外にも、さらに高度な JavaScript のオブジェクト指向プログラミング技法がありますが、本稿のスコープ範囲外となりますので、ここまでにしたいと思います。
</p>
<h3>参考情報</h3>
<p>
（訳者注：<a href="https://developer.mozilla.org/ja/" title="Mozilla Developer Network">MDN</a> には、<a href="https://developer.mozilla.org/ja/JavaScript" title="JavaScript - MDN">JavaScript に関する日本語リソース</a> が多数ありますし、今回紹介した記事もいずれは日本語に翻訳されると期待しています。本記事の最後は、さらに理解を深めるために参照すると良いと思う MDN のリソースを順に紹介します。）
</p>
<ul>
<li><a href="https://developer.mozilla.org/ja/Web_Development/Introduction_to_Web_development" title="Introduction to Web development - MDN">Web開発の初歩</a></li>
<li><a href="https://developer.mozilla.org/ja/JavaScript/Guide" title="Core JavaScript 1.5 ガイド - MDN">Core JavaScript 1.5 ガイド &#8211; MDN</a></li>
<li><a href="https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference" title="JavaScript Reference - MDN">JavaScript 1.5 リファレンス &#8211; MDN</a></li>
<li><a href="https://developer.mozilla.org/ja/JavaScript/A_re-introduction_to_JavaScript" title="A re-introduction to JavaScript - MDN">JavaScript「再」入門 &#8211; MDN</a></li>
<li><a href="https://developer.mozilla.org/ja/search?q=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91&#038;sitesearch=developer.mozilla.org" title='Search Results for "オブジェクト指向"'>その他 <q>オブジェクト指向</q> に関する MDN の日本語リソース</a></li>
</ul>
<h3>参照元の記事に対する著作権およびライセンス表記</h3>
<ul>
<li>Author(s): Fernando Trasvina &lt;f_trasvina at hotmail dot com&gt;</li>
<li>Copyright Information: &copy; 1998-2005 by individual mozilla.org contributors; content available under a <a href="http://www.mozilla.org/foundation/licensing/website-content.html" title="Mozilla.org Site Licensing Policies">Creative Commons license</a></li>
</ul>
<h3>訳者あとがき</h3>
<p>
今回紹介した記事は、一見何の変哲もない「JavaScript オブジェクト指向プログラミング入門」ですが、その実、少なくとも私には目からウロコの記事でした。なぜなら今までは、プロトタイプ・ベースとクラス・ベースの違いを意識し過ぎていたからです。そういった目先の違いを強調するのではなく、「大して違いはないさ、ほうらネ、こう思えばいいんだょ」 と、この記事は訴えているのだと思います。
</p>
<p>
もちろん元記事にもある通り、言語実装上の違いが色々語られているのも事実です。なぜならさらに高度に使いこなすには、その違いをちゃんと意識しなければならないからでしょう。
</p>
<p>
しかし元々上位概念的には共通なわけで、大雑把でもいいから一旦自分の中に取り込んだ後、今度はその違いに目を向けるというハードルの超え方もアリだと思いますが、いかがでしょうか？</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=YOCH9njMujU:ecJhkjS4QxI:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=YOCH9njMujU:ecJhkjS4QxI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/re-introduction-to-object-oriented-js/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/re-introduction-to-object-oriented-js/" />
	</item>
		<item>
		<title>実践GitHub Pages運用のユースケースとワークフローの詳細</title>
		<link>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/github-pages-workflow/</link>
		<comments>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/github-pages-workflow/#comments</comments>
		<pubDate>Sun, 15 Jan 2012 14:27:06 +0000</pubDate>
		<dc:creator>tokkonoPapa</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[web service]]></category>

		<guid isPermaLink="false">http://tokkono.cute.coocan.jp/blog/slow/?p=1950</guid>
		<description><![CDATA[
前回、GitHub Pages 活用の概要を書きましたが、実際に運用していくと、master と gh-pages をどう使い分けるか、また両者の同期をどう行うかなど、いくつかの課題が浮かび上がってくると思います。
そ [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2012/01/GitHubPagesWorkflow.jpg" alt="GitHub Pages Workflow" title="GitHub Pages Workflow" width="512" height="200" class="aligncenter size-full wp-image-1951" /></p>
<p><a href="http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/github-pages-almost-perfect-guide/" title="GitHub Pagesホスティングサービス（ほぼ）完全活用ガイド">前回</a>、GitHub Pages 活用の概要を書きましたが、実際に運用していくと、<code>master</code> と <code>gh-pages</code> をどう使い分けるか、また両者の同期をどう行うかなど、いくつかの課題が浮かび上がってくると思います。</p>
<p>そこで今回は、GitHub Pages 上で実際に運用されている <a href="http://diveintohtml5.info/">Dive Into HTML5</a> をよく知る立場から書かれた記事 「<a href="http://oli.jp/2011/github-pages-workflow/">GitHub Pages Workflow and deleting git’s `master` branch &#8211; Oli.jp</a>」 の翻訳を中心に、関連するいくつかの記事から、ユースケースと運用のシナリオ、及びそれに応じたワークフローをまとめてみました。</p>
<p>以下は、その参考記事です。</p>
<ol>
<li id="ref1"><a href="http://get.inject.io/n/XxsZ6RE7">Git post-commit hook to keep master and gh-pages branch in sync</a> by <a href="http://paulirish.com/">Paul Irish</a></li>
<li id="ref2">2011年10月13日 <a href="http://lea.verou.me/2011/10/easily-keep-gh-pages-in-sync-with-master/">Easily keep gh-pages in sync with master | Lea Verou</a></li>
<li id="ref3">2011年10月13日 <a href="http://nicolasgallagher.com/git-checkout-specific-files-from-another-branch/">Quick tip: git checkout specific files from another branch</a></li>
<li id="ref4">2011年10月14日 <a href="http://oli.jp/2011/github-pages-workflow/">GitHub Pages Workflow and deleting git’s <code>master</code> branch &#8211; Oli.jp</a></li>
<li id="ref5">2011年11月29日 <a href="http://ryanfitzer.org/2011/11/easy-syncing-of-github-pages/">Ryan Fitzer &raquo; Easy Syncing of GitHub Pages</a></li>
</ol>
<p>これらの記事は、書かれた日付が近いのもそうですが、相互に参照したり、コメント欄で議論したりしていますので、それらをトラッキングしながら私なりの注釈も加えていきたいと思います <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  。</p>
<p>ちなみに GitHub Pages には、ユーザーページとプロジェクトページの2種類があることは前回説明した通りです。前者は基本的に <code>master</code> ブランチのみを管理すれば良いので、本記事では、<code>master</code> と <code>gh-pages</code> の2つのブランチを管理しなければならない後者を主な対象としています。<br />
<span id="more-1950"></span></p>
<h3><span style="font-size:160%; margin-right:8px;">1.</span><code>gh-pages</code>作成のワークフロー（おさらい）</h3>
<p><a href="http://pages.github.com/#project_pages" title="GitHub Pages - Home">GitHub Pages の作成</a> は少々特殊で、<a href="http://progit.org/book/ja/ch1-3.html#id15" title="Pro Git - Pro Git 1.3 使い始める Gitの基本">作業ディレクトリ</a> を <a href="http://progit.org/book/ja/ch2-2.html#id25" title="Pro Git - Pro Git 2.2 Git の基本 ファイルの状態の確認">クリーンな状態</a> （<a href="http://progit.org/book/ja/ch2-2.html#id29" title="Pro Git - Pro Git 2.2 Git の基本 変更内容のリポジトリへの記録"><code>commit</code></a> するか、<a href="http://progit.org/book/ja/ch6-3.html#id138" title="Pro Git - Pro Git 6.3 Git のさまざまなツール 作業を隠す"><code>stash</code></a> で隠す） にした上で、次のようにして <code>gh-pages</code> ブランチを作成します。</p>
<p>[text]<br />
cd /path/to/fancypants<br />
git symbolic-ref HEAD refs/heads/gh-pages<br />
rm .git/index<br />
git clean -fdx<br />
echo &#8220;My GitHub Page&#8221; > index.html<br />
git add .<br />
git commit -a -m &#8220;First pages commit&#8221;<br />
git push origin gh-pages<br />
[/text]</p>
<p>通常のブランチ作成 （例えば <q><a href="http://progit.org/book/ja/ch3-2.html#id60" title="Pro Git - Pro Git 3.2 Git のブランチ機能 ブランチとマージの基本"><code>git checkout -b gh-pages</code></a></q>） では、作業ディレクトリの内容が全て引き継がれることになりますが、上記により、親のない空の <code>gh-pages</code> が作成されます。独立した2つの異なるブランチの想定する使い方は以下の通りです。</p>
<ul>
<li><code>master</code> : プロジェクトのコード</li>
<li><code>gh-pages</code> : プロジェクトの PR サイト</li>
</ul>
<p>このような特別な作り方をする理由は、次の2つでしょう。</p>
<ul>
<li><code>master</code> と <code>gh-pages</code> を、マージされることのない独立したブランチとして管理・運用したい</li>
<li>リモート・リポジトリがクローンされた時でも、<code>gh-pages</code> はクローンされたくない</li>
</ul>
<p>試しに <code>gh-pages</code> ブランチのあるリモート・リポジトリをローカルにクローンしてみてください。デフォルトで <code>gh-pages</code> はクローンされません。</p>
<p>[text]<br />
$ git clone git@github.com:username/my_repo.git<br />
Cloning into &#8216;my_repo&#8217;&#8230;<br />
&#8230;<br />
$ git branch<br />
* master<br />
[/text]</p>
<p><code>gh-pages</code> をクローンするには、次のように <a href="http://progit.org/book/ja/ch3-5.html#id69" title="Pro Git - Pro Git 3.5 Git のブランチ機能 追跡ブランチ">追跡ブランチ</a> として明示的に指示しなければなりません。</p>
<p>[text]<br />
$ git checkout &#8211;track -b gh-pages origin/gh-pages<br />
Branch gh-pages set up to track remote branch gh-pages from origin.<br />
Switched to a new branch &#8216;gh-pages&#8217;<br />
$ git branch<br />
* gh-pages<br />
  master<br />
[/text]</p>
<p>これを応用すれば、クローンされたくないブランチを作ることもできますネ <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  。</p>
<h4>参考情報</h4>
<ul>
<li>2009年5月22日 <a href="http://stackoverflow.com/questions/895918/how-do-i-publish-to-me-github-com">git &#8211; How do I publish to <me>.github.com? &#8211; Stack Overflow</me></a>
<ul style="list-style-type:none">
<li>
			別PCに <code>gh-pages</code> を含めてクローンする方法が紹介されています。
		</li>
</ul>
</li>
<li>2011年2月21日 <a href="http://d.hatena.ne.jp/kanonji/20110221/1298263044">GithubのProject Pagesを作る手順を調べてみた。もしくはgitで空ブランチを作る方法を調べてみた。 &#8211; kanonjiの日記</a>
<ul style="list-style-type:none">
<li>
			<code>gh-pages</code> を作るコマンド列が、1行1行丁寧に分析されています。
		</li>
</ul>
</li>
</ul>
<h3><span style="font-size:160%; margin-right:8px;">2.</span>GitHub Pages運用のユースケースとワークフロー</h3>
<p>GitHubber 達が工夫を凝らしたワークフローを考案していますので、それらを紹介します。</p>
<h4><span style="font-size:125%; margin-right:6px;">2.1</span>プロジェクトのコードとPRサイトを1つのリポジトリとして運用する</h4>
<p><code>master</code> の最新版から一部のファイルをチェックアウトし、PR サイト側 （<code>gh-pages</code>） でデモを動かすという、まさに典型的な運用のシナリオです。</p>
<p>Lea Verou は <a href="#ref2" title="Easily keep gh-pages in sync with master | Lea Verou">参考記事2</a> で、<code>master</code> で作業している場合を想定した、次のようなワークフローを提案しています。</p>
<div id="workflow">
[text highlight="6"]<br />
git add .<br />
git status            # 変更されたコミットすべきファイルを確認します<br />
git commit -m &#8220;&#8230;&#8221;   # master でのコミットを行います<br />
git push              # 変更を GitHub の master ブランチに push します<br />
git checkout gh-pages # gh-pages ブランチに切り替えます<br />
git rebase master     # master ブランチの更新内容を gh-pages に適用します<br />
git push              # gh-pages ブランチの変更を GitHub に push します<br />
git checkout master   # master ブランチに戻ります<br />
[/text]
</div>
<p>1～4行目までは通常の更新作業です。5行目で <code>gh-pages</code> に切り替え、6行目で <code>master</code> と同期させています。</p>
<p>Nicolas Gallagher は、この提案の6行目に問題があることを指摘し、<a href="#ref3" title="Quick tip: git checkout specific files from another branch">参考記事3</a> を書いています。<q><a href="http://progit.org/book/ja/ch3-6.html#id71" title="Pro Git - Pro Git 3.6 Git のブランチ機能 - リベース"><code>git rebase master</code></a></q> は、<code>master</code> の歴史を含めて全てを <code>gh-pages</code> にミラーリングすることになります。元々2つのブランチがマージ可能（あるいは一方が他方の派生）であれば <code>rebase</code> が効果的な局面もありますが、一部の共通なファイルを異なるブランチで同期させる方法としては、次のように必要なファイルだけを更新する <q><code>git checkout master -- ...</code></q> の方が適切であるというのが彼の主張です。</p>
<p>[text highlight="6,7"]<br />
git add .<br />
git status            # 変更されたコミットすべきファイルを確認します<br />
git commit -m &#8220;&#8230;&#8221;   # master でコミットします<br />
git push              # 変更を GitHub の master ブランチに push します<br />
git checkout gh-pages # gh-pages ブランチに切り替えます<br />
git checkout master &#8212; files&#8230; # master のステージング・エリアから現在の作業ディレクトリにファイルをコピーします<br />
git commit -m &#8220;&#8230;&#8221;   # gh-pages でコミットします<br />
git push              # gh-pages ブランチの変更を GitHub に push します<br />
git checkout master   # master ブランチに戻ります<br />
[/text]</p>
<p>さて、いずれのワークフローでも <code>master</code> で何かコミットしたら、<code>gh-pages</code> への反映も自動的に行いたくなりますネ。こんな時には <a href="http://book.git-scm.com/5_git_hooks.html" title="Git Book - Git Hooks">post-commit フック</a> が便利です。</p>
<p>Paul Irish は <a href="#ref1" title="Git post-commit hook to keep master and gh-pages branch in sync">参考記事1</a> で、<a href="#workflow">Lea のワークフロー</a> を自動化するための shell スクリプトを Git リポジトリ中のファイル <code>.git/hooks/post-commit</code> に記述することを提案しています。</p>
<p>[text highlight="3"]<br />
#!/bin/sh<br />
git checkout gh-pages<br />
git rebase master<br />
git checkout master<br />
[/text]</p>
<p>このスクリプトにより、<a href="#workflow">Lea のワークフロー</a> の4行目以降を <q><code>git push --all</code></q> という1行に置き換えることができます。</p>
<p>[text highlight="4"]<br />
git add .<br />
git status            # 変更されたコミットすべきファイルを確認します<br />
git commit -m &#8220;&#8230;&#8221;   # master でのコミットを行います<br />
git push &#8211;all        # 全てのブランチの変更をリモートに push します<br />
[/text]</p>
<p>さらに Ryan Fitzer は、これらの議論をふまえた上で <code>rebase</code> を <code>merge</code> に置き換えた運用を <a href="#ref5" title="Ryan Fitzer &raquo; Easy Syncing of GitHub Pages">参考記事5</a> に記しました。おそらく <code>gh-pages</code> をテストサイトと位置づけ、一部ファイル修正もあり得るという運用シナリオを描いているのではないかと思います。</p>
<h4><span style="font-size:125%; margin-right:6px;">2.2</span>リモートの<code>gh-pages</code>を<code>master</code>のサブモジュールとして運用する</h4>
<p>Git の <a href="http://progit.org/book/ja/ch6-6.html#id153" title="Pro Git - Pro Git 6.6 Git のさまざまなツール サブモジュール">submodule</a> は、「ふたつのプロジェクトはそれぞれ別のものとして管理したい。だけど、一方を他方の一部としても使いたい」 時のコマンドです。ここでの想定は、ローカル上の <a href="http://jekyllrb.com/" title="jekyll">jekyll</a> で生成したブログを <code>gh-pages</code> に送り込むというシナリオです。</p>
<p>例えば jekyll が <code>_site</code> というディレクトリにサイトを構築する設定だとすると、この <code>_site</code> にリモートの <code>gh-pages</code> と同期するブランチを作成すれば、最もシンプルにプロジェクトのブログを運営することができるようになるでしょう。この辺はちょっとマニアックな内容になりますので、詳しくは以下の参考情報をご覧ください <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  。</p>
<h4>参考情報</h4>
<ul>
<li>2008年12月21日 <a href="https://github.com/blog/272-github-pages#comment-1091">GitHub Pages &#8211; GitHub</a>
<ul style="list-style-type:none">
<li>
			<code>master</code> 内で <code>gh-pages</code> を同期させる方法として submodule を使うことが提案されています。
		</li>
</ul>
</li>
<li>2010年3月10日 <a href="http://d.hatena.ne.jp/tokuhirom/20100310/1268189518">Doxygen を github-pages にあげるのをお気楽にやる方法 &#8211; ”&gt;&lt;xmp&gt;TokuLog 改メ tokuhirom’s blog</a>
<ul style="list-style-type:none">
<li>
			<code>gh-pages</code> をサブモジュールに設定し、Doxygen で流し込む方法が解説されています。
		</li>
</ul>
</li>
<li>2010年11月8日 <a href="http://blog.blindgaenger.net/generate_github_pages_in_a_submodule.html">Generate GitHub pages in a submodule &#8211; blindgaenger</a>
<ul style="list-style-type:none">
<li>
			GitHub Pages で jekyll のブログを設置する方法が解説されています。
		</li>
</ul>
</li>
<li>2011年2月9日 <a href="http://blog.kaihatsubu.com/?p=1836">GitHub 上に ページを作成する | Tanablog</a>
<ul style="list-style-type:none">
<li>
			<q>切り替えが面倒</q> （笑） は、ワークフローを工夫する上での最大のモチベーションです。サブモジュールの更新も重要です。
		</li>
</ul>
</li>
</ul>
<h4><span style="font-size:125%; margin-right:6px;">2.3</span><code>gh-pages</code>専用のリポジトリを作って運用する</h4>
<p>Nicolas Gallagher は、<a href="http://help.github.com/remotes/#pushing_a_branch" title="Help.GitHub - Remotes">GitHub ヘルプ</a> に掲載された方法にヒントを得て、ローカルの <code>master</code> を GitHub の <code>gh-pages</code> に <a href="http://progit.org/book/ja/ch3-5.html#id67" title="Pro Git - Pro Git 3.5 Git のブランチ機能 リモートブランチ"><code>[remotename] [localbranch]:[remotebranch]</code></a> の書式で push しています。</p>
<p>[text]<br />
$ git push origin master:gh-pages<br />
[/text]</p>
<p>これは、<a href="#workflow">Lea のワークフロー</a> の5行目以降を置き換えます。ローカルの <code>master</code> ブランチは、リモートの <code>gh-pages</code> ブランチのミラーかサブセットであることが要求されます。もし <code>gh-pages</code> をローカルに持っているなら、それは GitHub 上のバージョンのコピーとなることを意味しています。これにより、ローカルの <code>gh-pages</code> を無視する （あるいは持たなくても良い） ことになります。もしローカルの <code>gh-pages</code> で何かの push に失敗しても （<q><a href="http://help.github.com/remotes/#dealing_with_nonfastforward_errors" title="Dealing with “non-fast-forward” errors - Help.GitHub - Remotes">non-fast-foward updates were rejected</a></q>）、fetch と merge でローカルの <code>master</code> に取り込んだ後、再び push するだけです。</p>
<p>一方ここまで来ると、ローカルのブランチも <code>gh-pages</code> としてしまった方が便利でしょう。次の例は、新しく <code>gh-pages</code> ブランチを作成し、<code>master</code> ブランチを削除します。</p>
<p>[text]<br />
$ git checkout -b gh-pages<br />
Switched to a new branch &#8216;gh-pages&#8217;<br />
$ git branch -d master<br />
Deleted branch master (was xxxxxxx).<br />
$ git branch<br />
* gh-pages<br />
[/text]</p>
<h4>参考情報</h4>
<ul>
<li>2011年2月23日 <a href="https://gist.github.com/833223">Setup GitHub Pages &#8220;gh-pages&#8221; branch and &#8220;master&#8221; branch as subfolders of a parent project folder (&#8221;grandmaster&#8221;). — Gist</a>
<ul style="list-style-type:none">
<li>
			親プロジェクト（ディレクトリ）の下に、<code>master</code>、<code>gh-pages</code> それぞれのサブ・ディレクトリに作り、それぞれ別のリポジトリとして管理する方法が解説されています。
		</li>
</ul>
</li>
</ul>
<h4><span style="font-size:125%; margin-right:6px;">2.4</span>GitHub上の<code>master</code>を削除し、<code>gh-pages</code>だけで運用する</h4>
<p>前章最後の続きとも言えますが、もはや GitHub 上にさえ <code>master</code> が要らないというプロジェクトもあり得るでしょう。例えばドキュメント自体がプロジェクトの対象であるような場合です。</p>
<p>GitHub 上の <code>master</code> ブランチを削除するには、次のようにします。</p>
<ol>
<li>「Admin → Options → Settings」 で、Default Branch を <code>master</code> 以外に設定する</li>
<li>「<code>git push origin :master</code>」 を実行する （空のローカル・ブランチをリモートの <code>master</code> に push して <a href="http://progit.org/book/ja/ch3-5.html#id70" title="Pro Git - Pro Git 3.5 Git のブランチ機能 リモートブランチ - リモートブランチの削除">リモートブランチを削除する</a>）</li>
</ol>
<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2012/01/DefaultBranchSetting.png" alt="Default Branchの設定" title="Default Branchの設定" width="512" height="200" class="aligncenter size-full wp-image-1953" /></p>
<h3><span style="font-size:160%; margin-right:8px;">3.</span>CNAME（Canonical Name）で独自ドメインをGitHub Pagesに転送する</h3>
<p>オリジナルのドメインを持っている人で、DNS レコードの設定ができる環境にある方（そういうサービスを受けられる方）は、そのドメインあるいはサブドメインの別名を GitHub Pages に設定し、GitHub Pages にはそのドメイン名を記述した <q>CNAME</q> というファイルを設置することで、自分のドメイン内の URL で GitHub Pages にアクセスすることができます。</p>
<p>例えば、最近見つけたサイト <a href="http://nothub.org/" title="NotHub">nothub.org</a> は、GitHub のプロジェクトページ <a href="https://github.com/tricknotes/nothub.org" title="tricknotes/nothub.org - GitHub">tricknotes/nothub.org</a> （2.4章で述べた <code>gh-pages</code> ブランチしかないリポジトリです！） の GitHub Pages <q>http://tricknotes.github.com/nothub.org</q> （現在は 404 Not Found ですが、この理由と対応は後述します） に別名が設定されています。試しに <q>http://nothub.org/CNAME</q> にアクセスしてみましょう。nothub.org と書かれているハズです。</p>
<p>今回はプロジェクトページを主に扱いましたが、ユーザーページでも同様のことができます。CNAME の設定については、Glide Note さんの記事 「<a href="http://blog.glidenote.com/blog/2011/12/20/how-to-use-custom-domain-on-github-pages/">GitHub PagesでCustom Domainを利用する &#8211; Glide Note &#8211; グライドノート</a>」 が参考になると思います。元々は <a href="http://www.glidenote.com/" title="Glide Note - グライドノート">www.glidenote.com</a> で運用されていたブログを、<a href="http://blog.glidenote.com/" title="Glide Note - グライドノート">blog.glidenote.com</a> の別名として <a href="http://octopress.org/" title="Octopress">Octopress</a> を導入した GitHub Pages にマッピングされています。</p>
<h4>参考情報</h4>
<ul>
<li><a href="http://pages.github.com/#custom_domains">Custom Domains &#8211; GitHub Pages &#8211; Home</a></li>
<li><a href="http://itpro.nikkeibp.co.jp/word/page/10008954/">CNAMEレコード</a></li>
</ul>
<h3><span style="font-size:160%; margin-right:8px;">4.</span>GitHub Pagesの寿命と更新タイミングについて</h3>
<p>無料アカウントだからでしょうか、GitHub Pages はしばらくアクセスしないと <q>404 Not Found</q> 状態になります。</p>
<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2012/01/PageDoesNotFound.png" alt="Page does not exist" title="Page does not exist" width="512" height="312" class="aligncenter size-full wp-image-1952" /></p>
<p><code>gh-pages</code> を更新し、コミットし直せば再びアクセスできるようになります。おそらく何<br />
らかのキャッシュ機構が働いていて、アクセスのない古いキャッシュは削除され、<code>gh-pages</code> が更新されるまでは再作成されないのではないかと思います。</p>
<p>一方 CNAME を設定した場合、上記が発生していても、設定したオリジナル・ドメインにはちゃんとアクセスできることが <a href="#ref4" title="GitHub Pages Workflow and deleting git’s master branch - Oli.jp">参考記事4</a> で報告されています。</p>
<p>私の場合、一定時間ごとにアクセスする <abbr title="Common Gateway Interface">CGI</abbr> をサーバーの cron に設定し、GitHub Pages の寿命を延ばしています。もちろんこの方法は未保証ですので、あしからず <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_cool.gif' alt='8-)' class='wp-smiley' />  。</p>
<h4>参考情報</h4>
<ul>
<li>2009年11月30日 <a href="http://groups.google.com/group/github/browse_thread/thread/bc4f8bde14212425/fbcd02d31bf2ffd6">github pages setup not working &#8211; GitHub | Google グループ</a>
<ul style="list-style-type:none">
<li>
			1日か2日で GitHub Pages にアクセスできなくなる事象が報告されています。GitHub の技術サポートから 「再コミットせよ」 という返答が書き込まれています。
		</li>
</ul>
</li>
</ul>
<h3><span style="font-size:160%; margin-right:8px;">5.</span>まとめ</h3>
<p>GitHub Pages の典型的な使用方法以外にも、色々な使い方を 「ユースケースと運用のシナリオ」 という形で整理を試みてみました （<a href="http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%B9%E3%82%B1%E3%83%BC%E3%82%B9" title="ユースケース - Wikipedia">厳密な意味</a> でのツッコミはご勘弁願います <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ）。結果的にオリジナルの記事をアレンジしてしまうことにはなりましたが、柔軟な運用ができるのは、元々の Git の自由度の高さを活かす設計の良さが GitHub にあるからではないかと改めて知ることができたように思います。GitHub Pages を活用したいと思う方の参考になれば幸いですし、「もっとこういうシナリオがあるゾ」 というご意見を頂ければ、激しく喜びます <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  。</p>
<p>最後に、GitHub サポートからのアドバイスを&#8230;。</p>
<blockquote>
<p>
何が起きるか分からない時はいつでも、最初にバックアップとしてローカルにクローンを作成し、全てを fetch してから試してみることです。もし何か問題が起きたら、リポジトリを再度 push すれば良いのです。
</p>
</blockquote>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=5MaMBpEyR8E:9AeJAOByNiE:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=5MaMBpEyR8E:9AeJAOByNiE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/github-pages-workflow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/github-pages-workflow/" />
	</item>
		<item>
		<title>GitHub Pagesホスティングサービス（ほぼ）完全活用ガイド</title>
		<link>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/github-pages-almost-perfect-guide/</link>
		<comments>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/github-pages-almost-perfect-guide/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 06:41:38 +0000</pubDate>
		<dc:creator>tokkonoPapa</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://tokkono.cute.coocan.jp/blog/slow/?p=1890</guid>
		<description><![CDATA[GitHub がオープンソースの場として魅力的な理由は、Git という優れた分散・協調型リビジョン管理システムのリポジトリー・ザーバーとして誰でも利用できるということはもちろん、README などのドキュメント生成機能や [...]]]></description>
			<content:encoded><![CDATA[<p>GitHub がオープンソースの場として魅力的な理由は、Git という優れた分散・協調型リビジョン管理システムのリポジトリー・ザーバーとして誰でも利用できるということはもちろん、README などのドキュメント生成機能やコメンティング機能、問題のトラッキング機能など、Git を補助し、オープンな分散・協調開発を支えるサブシステムが充実している点が挙げられるでしょう。無料でもかなりのことができるのに、ビジネスとしてもちゃんと成立している理由はこんなところにあるように思います。</p>
<p>ただ、同種サービスの <a href="http://code.google.com/intl/ja/projecthosting/">Google Code</a> や <a href="https://bitbucket.org/">Bitbucket</a> と決定的に異なり、GitHub の最大の魅力となっているのは、<q><a href="http://pages.github.com/">GitHub Pages</a></q> という1種のホスティング・サービスではないかと思います。成果物をただずらずらと味気ないページに並べるのではなく、趣向を凝らした紹介ページを自由に作り、プロジェクトの成果を世界にアピールする − GitHub Pages は、そんなことのできるサービスです。</p>
<p><a href="https://github.com/blog/272-github-pages" title="GitHub Pages">2008年12月の GitHub Blog の記事</a> には、次のような GitHub Pages の紹介があります。</p>
<blockquote><p>
You can put anything here you like. Use it as a customizable home for your Git repos. Create a blog and spread your ideas. Whatever you want!<br />
（GitHub Pages 上にはお好みで何でも置くことができます。Git リポジトリのホームページとしてカスタマイズしても良し、ブログを設置してあなたのアイディアを広げても良し。あなた次第です！）
</p></blockquote>
<p>ということで今回は、この GitHub ページの活用方法をまとめてみたいと思います。</p>
<h4>目次</h4>
<ol>
<li><a href="#github-pages1">GitHub Pagesの概要</a></li>
<li><a href="#github-pages2">かんたん、カッコいいGitHub Pagesの作り方</a></li>
<li><a href="#github-pages3">GitHub Pagesプロジェクト・ギャラリー</a></li>
</ol>
<p><span id="more-1890"></span></p>
<h3 id="github-pages1"><span style="font-size: 160%; margin-right: 8px;">1.</span>GitHub Pagesの概要</h3>
<p><a href="http://pages.github.com/">GitHub Pages</a> では、Git のリポジトリ管理機能とホスティング・サーバー機能とが連携し、次の2つのサービスが提供されています。ちなみに冒頭で 「お好みで何でも置くことができます」 と紹介しましたが、静的ページのみのホスティングです。</p>
<h4>ユーザーページのホスティング</h4>
<p>GitHub でいうユーザーページとは、自分自身の活動を紹介するためのページです。</p>
<p>特別なリポジトリ <q><code><var>username</var>.github.com</code></q> を作成し、index.html や必要なリソースを push しておけば、<q><code>http://<var>username</var>.github.com/</code></q> という URL でそのページを閲覧することができます。</p>
<p>まずは、<a href="https://github.com/repositories/new">ユーザーページ用のリモートリポジトリを作成</a> しましょう。</p>
<div id="attachment_1904" class="wp-caption aligncenter" style="width: 510px"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/RepositoryInfo.png" alt="ユーザーページ用リモート Git リポジトリの設定" title="ユーザーページ用リモート Git リポジトリの設定" width="500" height="260" class="size-full wp-image-1904" /><p class="wp-caption-text">ユーザーページ用リモート Git リポジトリの設定</p></div>
<p>次は、ローカルの Git リポジトリの作成を促す画面です。</p>
<div id="attachment_1942" class="wp-caption aligncenter" style="width: 510px"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/CreateUserPage.png" alt="ユーザーページ用ローカル Git リポジトリの作成" title="ユーザーページ用ローカル Git リポジトリの作成" width="500" height="270" class="size-full wp-image-1942" /><p class="wp-caption-text">ユーザーページ用ローカル Git リポジトリの作成</p></div>
<p>「Next steps:」 を参考に、新しい index.html を含むローカル Git リポジトリを作ると良いでしょう （<q><code>username</code></q> は自分のユーザー名に差し替えてください）。</p>
<p>[text]<br />
mkdir username.github.com<br />
cd username.github.com<br />
git init<br />
echo &#8220;Hello&#8221; > index.html<br />
git add index.html<br />
git commit -m &#8220;first commit&#8221;<br />
git remote add origin git@github.com:username/username.github.com.git<br />
git push -u origin master<br />
[/text]</p>
<p>余談ですが、GitHub リモート・リポジトリへのプロトコル／パスは、1クリックでコピーすることができます。</p>
<div id="attachment_1894" class="wp-caption aligncenter" style="width: 510px"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/GitProtocolPath.png" alt="GitHubリモート・リポジトリへのパスを1クリックでコピー" title="GitHubリモート・リポジトリへのパスを1クリックでコピー" width="500" height="65" class="size-full wp-image-1894" /><p class="wp-caption-text">GitHubリモート・リポジトリへのパスを1クリックでコピー</p></div>
<p>もし <q><code>http://<var>username</var>.github.com/</code></q> にアクセスして、次のような画面になっても焦る必要はありません。一番下にあるように、初めて GitHub ページを作成したときには、反映されるまで10分程度かかるということなので、落ち着いて待ちましょう。</p>
<div id="attachment_1906" class="wp-caption aligncenter" style="width: 510px"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/FirstAccess.png" alt="最初は10分ぐらい待ちましょう" title="最初は10分ぐらい待ちましょう" width="500" height="300" class="size-full wp-image-1906" /><p class="wp-caption-text">最初は10分ぐらい待ちましょう</p></div>
<h4>各プロジェクト・ページのホスティング</h4>
<p>個別のプロジェクトを紹介するためのページです。</p>
<p>各プロジェクトのリポジトリで （例えば <code>myrepos</code>）、<q><code>gh_pages</code></q> という特別なブランチを作成し、必要なファイルを push しておけば、<q><code>http://<var>username</var>.github.com/<var>myrepos</var>/</code></q> という URL でそのページにアクセスすることができます。</p>
<p>まずはローカルの Git リポジトリ （<q><code>master</code></q> ブランチがあるはずですネ） に移動し、未 commit のファイルがないことを確認します （あれば push します）。そして以下を実行し、とりあえずの index.html を作成しましょう。</p>
<p>[text]<br />
cd /path/to/myrepos<br />
git symbolic-ref HEAD refs/heads/gh-pages<br />
rm .git/index<br />
git clean -fdx<br />
echo &#8220;My GitHub Page&#8221; > index.html<br />
git add .<br />
git commit -a -m &#8220;First pages commit&#8221;<br />
git push origin gh-pages<br />
[/text]</p>
<p>上記コマンドライン以外にも、「Admin → Options → Features」（プロジェクトページ右上の <img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/GotoAdminPage.png" alt="Adminボタン" title="Adminボタン" width="68" height="23" class="alignnone size-full wp-image-1898" />  ボタンから入る） で、紹介ページを自動作成することもできます。</p>
<div id="attachment_1907" class="wp-caption aligncenter" style="width: 510px"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/CreateGitHubPage.png" alt="プロジェクト用GitHubページの自動作成" title="プロジェクト用GitHubページの自動作成" width="500" height="380" class="size-full wp-image-1907" /><p class="wp-caption-text">プロジェクト用GitHubページの自動作成</p></div>
<div id="attachment_1900" class="wp-caption aligncenter" style="width: 510px"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/SetProjectInfo.png" alt="プロジェクトの情報を記入してページを作成" title="プロジェクトの情報を記入してページを作成" width="500" height="400" class="size-full wp-image-1900" /><p class="wp-caption-text">プロジェクトの情報を記入してページを作成</p></div>
<div id="attachment_1901" class="wp-caption aligncenter" style="width: 510px"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/AutoGitHubPage.png" alt="自動作成されたプロジェクト・ページ" title="自動作成されたプロジェクト・ページ" width="500" height="335" class="size-full wp-image-1901" /><p class="wp-caption-text">自動作成されたプロジェクト・ページ</p></div>
<p>自動作成したページは、次の git コマンドでローカルに持ってくることができるので、どんな項目を載せるべきなのかを知るためにも一度は作ってみるのが良いでしょう。</p>
<p>[text]<br />
git fetch<br />
git pull<br />
git checkout gh-pages<br />
[/text]</p>
<h4 id="github-pages-ref1">参考情報1</h4>
<ul>
<li><a href="http://pages.github.com/">GitHub Pages &#8211; Home</a></li>
<li><a href="http://d.hatena.ne.jp/marutanm/20110718/p1">github:pagesはもう使っているか？ &#8211; Meltdown Countdown</a></li>
</ul>
<h3 id="github-pages2"><span style="font-size: 160%; margin-right: 8px;">2.</span>かんたん、カッコいいGitHub Pagesの作り方</h3>
<p>ここから先はもちろん自由にページを作ってもらえれば良いのですが、おすすめの方法3つと、ページを彩るリソースを紹介します。</p>
<h4>HTML5 Boilerplate、Initializr 2 を利用する</h4>
<p>「カッコいい」という要求を「HTML5 + CSS3 + Web フォント + レスポンシブなページ + ソーシャル共有ボタン」という要件に置き換え、<a href="http://www.initializr.com/">Initializr 2</a> をベースに作ってみたのがこれです。</p>
<div id="attachment_1908" class="wp-caption aligncenter" style="width: 510px"><a href="http://tokkonopapa.github.com/doticker.js/" title="doticker.js"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/dotickerjs.jpg" alt="プロジェクトページの例" title="プロジェクトページの例" width="500" height="362" class="size-full wp-image-1908" /></a><p class="wp-caption-text">プロジェクトページの例</p></div>
<p><a href="http://html5boilerplate.com/">HTML5 Boilerplate</a> や <a href="http://www.initializr.com/">Initializr 2</a> 活用のコツやソーシャルボタンの設置については、拙作の <a href="#github-pages-ref2">参考情報2</a> をぜひ参照してください <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  。</p>
<h5 id="github-pages-ref2">参考情報2</h5>
<ul>
<li><a href="http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/5-fundamentals-when-using-h5bp/">HTML5 Boilerplate, Initializr 2をこれから使う人が押さえるべき5つの原則 | ゆっくりと…</a></li>
<li><a href="http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/asynchronous-loading-of-major-social-buttons/">最近海外で流行りのTwitter,Facebook,Google+1,Analyticsをまとめる非同期スクリプトにはてなを加えてみた | ゆっくりと…</a></li>
</ul>
<h4>jekyll を利用する</h4>
<p><a href="http://jekyllrb.com/">jekyll</a>（ジキル）は、テンプレートを使って静的な Web サイトを構築するための Ruby ベースのフレームワークです。プロジェクトページをいくつも作る場合に便利でしょう。通常はローカルに Ruby 環境を整え、RubyGems（Ruby のパッケージ管理システム）から jekyll をインストールするのですが、GitHub Pages 上でもこのフレームワークが機能しますので、必ずしもこのような環境を整える必要がありません。</p>
<p>まずはローカルの <code>gh-pages</code> ブランチに次のようなファイルを準備します。</p>
<p>[text]<br />
.<br />
├─ _layouts<br />
│ └─ default.html<br />
├─ css<br />
│ └─ style.css<br />
└─ index.md<br />
[/text]</p>
<p><code>default.html</code> はテンプレートで、最も簡単には次のように書きます。</p>
<p>[html]<br />
&lt;!doctype html&gt;<br />
&lt;html lang=&#8221;ja&#8221;&gt;<br />
&lt;head&gt;<br />
&lt;meta charset=&#8221;utf-8&#8243;&gt;<br />
&lt;title&gt;{{ page.title }}&lt;/title&gt;<br />
&lt;link rel=&#8221;stylesheet&#8221; href=&#8221;css/style.css&#8221;&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
{{ content }}<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
[/html]</p>
<p><code>{ ... }</code> で囲まれた部分は jekyll によって解釈されます。<code>{ content }</code> に相当する部分を、例えば <code>index.md</code> （マークダウン） に記述します。</p>
<p>[text]<br />
&#8212;<br />
layout: default<br />
title: プロジェクト・タイトル<br />
&#8212;</p>
<p>プロジェクト・タイトル<br />
===================<br />
ここにプロジェクトの紹介を書きます。<br />
&#8230;<br />
[/text]</p>
<p><code>layout</code> には先のテンプレートを指定します。そして <code>title</code> はテンプレート中の <code>{ page.title }</code> に置き換わるという仕組みです。実は、<a href="https://github.com/pages/pages.github.com">GitHub Pages の解説ページ自体</a> がこの仕組みで作られています。</p>
<p>また、ここでは <code>.md</code> の例を載せましたが、<code>.html</code> や <code>.textile</code> でも OK ですし、<code>demo.md</code> や <code>documents.html</code> といったファイルを置いても自動的にテンプレートを適用し、マークアップしてくれます。マークダウンや、さらに複雑なテンプレートの作り方については、<a href="#github-pages-ref3">参考情報3</a> をご覧ください。</p>
<h5 id="github-pages-ref3">参考情報3</h5>
<ul>
<li><a href="http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/markdown-skills-for-github-beginners/">脱GitHub初心者を目指す人のREADMEマークダウン使いこなし術 | ゆっくりと…</a></li>
<li><a href="http://mattn.kaoriya.net/software/lang/ruby/20090409185248.htm">Big Sky :: Jekyllで始める簡単ブログ</a></li>
<li><a href="http://www.ksr-it.net/pdf/kushiro-jekyll-text.pdf">Jekyllによる静的 Webサイト構築入門</a></li>
<li><a href="http://radiumsoftware.tumblr.com/post/10518849682">GitHub Pagesで楽々ホスティング &#8211; Radium Software</a></li>
<li><a href="http://tokkonopapa.github.com/blog/2011/12/28/easy-usage-of-jekyll-on-github/">jekyllで作る簡単GitHub Pages | T.I.D.</a></li>
</ul>
<h4>Octopress を利用する</h4>
<p><a href="http://octopress.org/">Octopress</a> は、jekyll を使って静的なブログを簡単に構築できるようにしたフレームワークです。副題に <q>A blogging framework for hackers.</q> とあるように、Gist や jsFiddle など、多彩なコードスニペットの埋め込みプラグインが提供され、また GitHub ととても親和性よく作られています。</p>
<p><a href="http://octopress.org/"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/Octopress.png" alt="Octopress" title="Octopress" width="500" height="170" class="aligncenter size-full wp-image-1909" /></a></p>
<p>Octopress を利用するには、<a href="http://www.ruby-lang.org/ja/" title="ruby-lang.org">Ruby</a>（1.9 2 以上）環境を整える必要があります。Mac の人は <a href="http://beginrescueend.com/rvm/install/">rvm</a>（Ruby Version Manager）で、Windows の人は <a href="http://rubyinstaller.org/">RubyInstaller</a> でインストールすることができます。個人的には Windows であれば <a href="http://www.cygwin.com/">Cygwin</a> を使うのが良いと思いますが、現時点では <a href="http://cygwin.com/packages/ruby/" title="Index of /packages/ruby">Ruby のパッケージ</a> が 1.8.7 と古いので、別途 <a href="http://www.ruby-lang.org/ja/downloads/">ソースコードを入手</a>、コンパイルが必要です。</p>
<p>さて、Octopress のインストール自体は 参考情報4 に譲り、ここではローカルに作成した Octopress リポジトリのおすすめ管理方法を紹介します。</p>
<p>Octopress で記事を書くときは、<q><code>source</code></q> というブランチで作業をするので、そのまま <code>origin</code> （つまり GitHub） に <code>git push</code> することもできるのですが、無料枠の GitHub では公開が原則なため、誰かにクローンされると、原稿 （Octopress の場合、マークダウン・ファイル） まで持っていかれることになり、ちょっとイヤ〜ンな感じです。そこで私は、無料でもリポジトリを非公開にできる <a href="https://bitbucket.org/">Bitbucket</a> にアカウントを作って原稿を管理しています。</p>
<p><a href="https://bitbucket.org/"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/12/Bitbucket.png" alt="Bitbucket" title="Bitbucket" width="500" height="257" class="aligncenter size-full wp-image-1910" /></a></p>
<p>こうすると、記事を投稿するときは <code>rake deploy</code> で GitHub へ、原稿をバックアップするときは <code>git push</code> で Bitbucket へ送ることができて、イヤ〜ンな感じがなくなります。皆さんも使い分けてみてはいかがでしょうか？ <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h5 id="github-pages-ref4">参考情報4</h5>
<ul>
<li><a href="http://mattn.kaoriya.net/software/lang/ruby/20111017205717.htm">Big Sky :: githubとjekyllとoctopressで作る簡単でモダンなブログ</a></li>
<li><a href="http://blog.glidenote.com/blog/2011/11/07/install-octopress-on-github/">GithubとOctopressでモダンな技術系ブログを作ってみる &#8211; Glide Note &#8211; グライドノート</a></li>
<li><a href="http://tokkonopapa.github.com/blog/2011/12/30/octopress-on-github-and-bitbucket/">Octopressのインストールから運用管理まで &#8211; T.I.D.</a></li>
</ul>
<h4>GitHub Pages を彩るためのリソース</h4>
<p>GitHub Pages が通常のホスティング・サービスと違うのは、公開リポジトリはフォークできるということです。つまり再配布が可能な状態となるため、画像などのリソースを載せる場合は要注意です。そこでパブリックドメインか GitHub で使えるリソースを紹介します。</p>
<ul>
<li><a href="http://coliss.com/articles/build-websites/operation/css/css3-github-buttons-by-nicolasgallagher.html">シンプルで使いやすいGitHub風のボタンを簡単に実装できるスタイルシート | コリス</a>
<ul>
<li style="list-style-type:none">GitHub リポジトリに登録された、CSS3 で装飾されたボタンを実装するためのスタイルシートとアイコン画像です。</li>
</ul>
</li>
<li><a href="https://github.com/blog/273-github-ribbons">GitHub Ribbons &#8211; GitHub</a>
<ul>
<li style="list-style-type:none">GitHub 公式のリボン画像。ものすごい長い URL の画像は透過 png 画像 （149px×149px） です。</li>
</ul>
</li>
<li>ダウンロードリンク用 <q>ファスナー付書類</q> <a href="https://github.com/images/modules/download/zip.png">zip 画像</a>、<a href="https://github.com/images/modules/download/tar.png">tar 画像</a>
<ul>
<li style="list-style-type:none">大きさが 144px × 142px とかなりデカいです。</li>
</ul>
</li>
<li><a href="https://github.com/github/media">GitHub 関連の素材</a>
<ul>
<li style="list-style-type:none">GitHub 公認のロゴやオクトキャット、リボン、創業者の写真（？）などの素材です。</li>
</ul>
</li>
<li><a href="http://unindented.org/articles/2009/10/github-ribbon-using-css-transforms/">GitHub Ribbon Using CSS Transforms § Unindented</a>
<ul>
<li style="list-style-type:none">画像を使わず CSS3 で実装する GitHub リボンです。</li>
</ul>
</li>
<li><a href="http://kachibito.net/web-design/open-icon-library.html">パブリックドメインやGPLライセンスの高品質なアイコンをパッケージで配布しているOpen Icon Library &#8211; かちびと. net</a>
<ul>
<li style="list-style-type:none">商用／非商用を問わず、無料で再配布可能なオープンソースなアイコンの他、一部はパブリックドメインのアイコンが公開されています。</li>
</ul>
</li>
<li><a href="http://kachibito.net/web-design/the-noun-project.html">パブリックドメイン/CCライセンスのピクトグラムアイコン素材のみを配布するThe Noun Project &#8211; かちびと. net</a>
<ul>
<li style="list-style-type:none">シンプルかつ高品質なアイコンが SVG フォーマットで公開されています。</li>
</ul>
</li>
<li><a href="http://code.google.com/p/google-code-prettify/">google-code-prettify</a>
<ul>
<li style="list-style-type:none">コードスニペットを載せる機会の多い GitHub Pages で活躍する、軽量なシンタックス・ハイライト用 JavaScript です。オリジナルなカラーリングも容易にできますし、各言語用に拡張可能なプラグインもあります。<a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> ですので、再配布が可能です。</li>
</ul>
</li>
</ul>
<h3 id="github-pages3"><span style="font-size: 160%; margin-right: 8px;">3.</span>GitHub Pagesプロジェクト・ギャラリー</h3>
<p>こだわりのある GitHub Pages を集めてみました。プロジェクトページ作りの参考にしてみてはいかがでしょうか。</p>
<ul style="list-style-type:none;">
<li><a href="http://epeli.github.com/underscore.string/"><img src="https://lh6.googleusercontent.com/-491FnOIXF5o/Tv5h-lYJ7oI/AAAAAAAAAHc/NKK3ZqiCR88/s250/01_underscore_string.jpg" alt="Underscore.string" title="Underscore.string" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://necolas.github.com/normalize.css/"><img src="https://lh6.googleusercontent.com/-aT_IFdGst7E/Tv5h74ucEiI/AAAAAAAAAHI/QV9eNorJssI/s250/02_normalize_css.png" alt="normalize.css" title="normalize.css" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://documentcloud.github.com/backbone/"><img src="https://lh6.googleusercontent.com/-C2cXw-6qkno/Tv5h6C53hfI/AAAAAAAAAHE/rLCO_woAYpw/s250/03_backbone_js.png" alt="Backbone.js" title="Backbone.js" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://petewarden.github.com/iPhoneTracker/"><img src="https://lh3.googleusercontent.com/-_V45E5yVE5Y/Tv5h-Oto15I/AAAAAAAAAHg/Uz2RDZJkxv0/s250/06_iPhone_Tracker.jpg" alt="petewarden/iPhoneTracker @ GitHub" title="petewarden/iPhoneTracker @ GitHub" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://benvanik.github.com/WebGL-Inspector/"><img src="https://lh5.googleusercontent.com/-oNCpkRIeTbA/Tv5h4Yh9gCI/AAAAAAAAAGk/b7LWf42nhm4/s250/07_WebGL_Inspector.png" alt="WebGL Inspector" title="WebGL Inspector" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://dbloete.github.com/ioctocat/"><img src="https://lh4.googleusercontent.com/-MB0JCjf_VTQ/Tv5h4LW1mFI/AAAAAAAAAGg/u_9V0x1eKxw/s250/08_iOctcat.jpg" alt="iOctocat is your GitHub companion for the iPhone and iPod Touch" title="iOctocat is your GitHub companion for the iPhone and iPod Touch" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://mnot.github.com/redbot/"><img src="https://lh3.googleusercontent.com/-v7TvY2m_I7Q/Tv5hy091BBI/AAAAAAAAAFc/PFE8rHTbxhw/s250/17_redbot.png" alt="mnot/redbot @ GitHub" title="mnot/redbot @ GitHub" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://mwbrooks.github.com/thumbs.js/"><img src="https://lh5.googleusercontent.com/-EgxV3N-nBI8/Tv5h3kTAS9I/AAAAAAAAAGY/MRJ_VYMtgQk/s250/10_thumbs_js.png" alt="thumbs.js @ github.com/mwbrooks" title="thumbs.js @ github.com/mwbrooks" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://mintdigital.github.com/asset_hat/"><img src="https://lh6.googleusercontent.com/-eveiOHW0daE/Tv5h3AhPqgI/AAAAAAAAAGQ/yVIAoFRI7z0/s250/11_asset_hat.png" alt="AssetHat: Load CSS &amp; JS faster. Your assets are covered." title="AssetHat: Load CSS &amp; JS faster. Your assets are covered." width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://fitzgen.github.com/zoolander/"><img src="https://lh6.googleusercontent.com/-Q6S4x_jA8Zk/Tv5h8DOHwnI/AAAAAAAAAHM/4t-jSLQfBSQ/s250/12_zoolander.png" alt="Zoolander" title="Zoolander" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://berklee.github.com/nbl/"><img src="https://lh5.googleusercontent.com/-Yqwa6AxYetE/Tv5h10tPTrI/AAAAAAAAAGE/T8NcMNIYwKI/s250/13_NBL_js.png" alt="NBL.js 2.0 – a tiny non-blocking JavaScript lazy loader" title="NBL.js 2.0 – a tiny non-blocking JavaScript lazy loader" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://xaviershay.github.com/tufte-graph/"><img src="https://lh3.googleusercontent.com/-Z48vC5cXNQs/Tv5h1DDgINI/AAAAAAAAAF0/-qi4lpAW_m0/s250/14_TufteGraph.png" alt="TufteGraph: beautiful charts with jQuery" title="TufteGraph: beautiful charts with jQuery" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://coreh.github.com/nide/"><img src="https://lh3.googleusercontent.com/-rSROhAU4_XY/Tv5h1bNffnI/AAAAAAAAAGA/lndH6HFfYJw/s250/15_nide.png" alt="nide - Beautiful IDE for Node.JS" title="nide - Beautiful IDE for Node.JS" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://socket.io/"><img src="https://lh6.googleusercontent.com/-E7k12-UaDj4/Tv5h0njlM4I/AAAAAAAAAFw/7wa59pB5-ac/s250/20_socket_io.jpg" alt="Socket.IO: the cross-browser WebSocket for realtime apps." title="Socket.IO: the cross-browser WebSocket for realtime apps." width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://camanjs.com/"><img src="https://lh4.googleusercontent.com/-5NthzKYBv_Y/Tv5hwOd9dqI/AAAAAAAAAE0/hG7cd2rME5Q/s250/23_Caman_js.png" alt="CamanJS - Image Manipulation in Javascript" title="CamanJS - Image Manipulation in Javascript" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://gitx.laullon.com/"><img src="https://lh3.googleusercontent.com/-a5r3ndIK4qQ/Tv5hvUEj90I/AAAAAAAAAEo/BeUkr-N-bNE/s250/25_GitX.png" alt="GitX (L)" title="GitX (L)" width="250" height="181" class="alignleft size-full" /></a></li>
<li><a href="http://twitter.github.com/hogan.js/"><img src="https://lh5.googleusercontent.com/-5BVdt2fKhtA/Tv5huU29p1I/AAAAAAAAAEQ/iG5FPxkDhoU/s250/30_TwitterHoganjs.jpg" alt="Hogan.js" title="Hogan.js" width="250" height="180" class="alignleft size-full" /></a></li>
<li><a href="http://senchalabs.github.com/philogl/"><img src="https://lh5.googleusercontent.com/-yZXuraC9qak/Tv5huEZiIXI/AAAAAAAAAEU/4CwZ611zHtU/s250/31_PhiloGL.jpg" alt="PhiloGL: A WebGL Framework for Data Visualization, Creative Coding and Game Development" title="PhiloGL: A WebGL Framework for Data Visualization, Creative Coding and Game Development" width="250" height="180" class="alignleft size-full" /></a></li>
</ul>
<div style="clear:both"></div>
<h3><span style="font-size: 140%; margin-right: 8px;">4.</span>あとがき</h3>
<p>従来からある <a href="http://sourceforge.net/">SourceForge.net</a> や <a href="http://sourceforge.jp/">SourceForge.JP</a>、<a href="http://code.google.com/intl/ja/projecthosting/">Google Code</a> に加え、GitHub の登場によってオープンソース化の流れがますます加速した感のある今日この頃。今までひっそりと自サイトで  （オレオレ的に） 公開していた人たちが、ここ数年で一斉に GitHub に流れ込んで来たように思います。そして今後は、単なるコーディング能力だけではなく、人を惹き付ける魅力的なプロジェクト・ページをデザインする能力や、さらには自分の成果を世に問いその発展や貢献をプロモートする能力も必要な時代になるという気がしています。</p>
<p>この記事は、そんなオープンソースの意義と醍醐味を一人でも多くの方が楽しんでくれれば良いなぁ、という気持ちを込めてまとめました <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=iASozBa7arI:PK-se6bHO1I:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=iASozBa7arI:PK-se6bHO1I:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/github-pages-almost-perfect-guide/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/github-pages-almost-perfect-guide/" />
	</item>
		<item>
		<title>HTML5 Boilerplate, Initializr 2をこれから使う人が押さえるべき5つの原則</title>
		<link>http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/5-fundamentals-when-using-h5bp/</link>
		<comments>http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/5-fundamentals-when-using-h5bp/#comments</comments>
		<pubDate>Mon, 21 Nov 2011 21:46:35 +0000</pubDate>
		<dc:creator>tokkonoPapa</dc:creator>
				<category><![CDATA[Webテクノロジ]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[site optimization]]></category>

		<guid isPermaLink="false">http://tokkono.cute.coocan.jp/blog/slow/?p=1878</guid>
		<description><![CDATA[
boilerplate とは、「再利用を意図した標準的な文例集」 だそうです。
その名の通り HTML5 Boilerplate は、Paul Irish が中心となり構築されてきた、HTML5 でサイトを構築するため [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/html5logo.jpg" alt="HTML5 logo" title="HTML5 logo" width="500" height="200" class="aligncenter size-full wp-image-1887" /></p>
<p><q><a href="http://ejje.weblio.jp/content/boilerplate" title="boilerplateの意味 - 英和辞典 Weblio辞書">boilerplate</a></q> とは、「再利用を意図した標準的な文例集」 だそうです。</p>
<p>その名の通り <a href="http://html5boilerplate.com/" title="A rock-solid default template for HTML5 awesome.">HTML5 Boilerplate</a> は、<a href="http://paulirish.com/">Paul Irish</a> が中心となり構築されてきた、HTML5 でサイトを構築するためのテンプレート、さらにはフレームワークをも含む内容となっており、その特徴は次のように語られています。</p>
<blockquote><p>
HTML5 Boilerplate は、HTML5 を扱う上で必要な数多くの機能強化を他のベスト・プラクティスの数々と組み合わせることで、最小限の先行投資でプロジェクトの磐石な基盤を提供します。<br />
<span style="float:right"><br />
<a href="http://www.ibm.com/developerworks/jp/web/library/wa-html5boilerplate/">2011年02月08日 HTML5 Boilerplate を使用して Web 開発を容易に始める | IBM developerWorks</a> より。<br />
</span>
</p></blockquote>
<div style="clear:both"></div>
<blockquote><p>
HTML5 Boilerplateをベースにすることで最初からベストプラクティスが適用されたサイトやページを構築できるという特徴がある。<br />
<span style="float:right"><br />
<a href="http://news.mynavi.jp/news/2011/08/15/006/index.html">2011年08月15日 待望のHTML5ベストプラクティス「HTML5 Boilerplate」バージョン2登場 | マイナビニュース</a> より。<br />
</span>
</p></blockquote>
<div style="clear:both"></div>
<p>ここで言う <q>ベストプラクティス</q> とは、ブラウザ違いを吸収し効率の良い JavaScript や CSS のコードを書くためのノウハウはもちろん、Yahoo! の 「<a href="http://developer.yahoo.com/performance/rules.html">Best Practices for Speeding Up Your Web Site</a>」 や Google の 「<a href="http://code.google.com/intl/ja/speed/page-speed/docs/rules_intro.html">Web Performance Best Practices</a>」 にまとめられている、主に応答性のよいサイトを作るためのフロントエンド改善策を指しているものと思われます。</p>
<p>また、HTML5 Boilerplate のお手軽なサブセットとなっている <a href="http://www.initializr.com/">Initialir 2</a> には、「<a href="http://dailynewsagency.com/2011/02/13/initializr/" title="作成時間15秒！HTML5サイトを目的に合わせて簡単に作成出来るサイト「Initializr」">簡単に</a>」 とか 「<a href="http://jp.html5collect.net/initializr/" title="サクサク作れるHTML5テンプレート『Initializr』の設定方法 | Html5 Collect">さくさく</a>」 とかの形容詞が付けられて紹介されています。</p>
<p>さて、実際にこれらのテンプレートを使ってみると、<q>ベストプラクティス</q> という一言で、または単に 「かんたん、サクサク」 という一言で終わらせるのはもったいない、という気がしました。そこで、近年の技術トレンドに照らし合わせて 「5つの原則」 という形にまとめ、それらがどのようにテンプレートに織り込んであるかを考えてみました。</p>
<p>これからテンプレートを使ってサイトを構築してみようという方の参考になれば幸いです <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  。<br />
<span id="more-1878"></span></p>
<h3>HTML5 BoilerplateとInitialir 2の構成</h3>
<p>それぞれもっともベーシックな構成をダウンロードすると、その構成は下図のようになっていることでしょう （2011年11月現在）。</p>
<div id="attachment_1879" class="wp-caption aligncenter" style="width: 560px"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/html5bpTree.png" alt="HTML5 Boilerplate の構成" title="HTML5 Boilerplate の構成" width="550" height="385" class="size-full wp-image-1879" /><p class="wp-caption-text">HTML5 Boilerplate の構成</p></div>
<div id="attachment_1884" class="wp-caption aligncenter" style="width: 560px"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/initializr2Tree.png" alt="initializr 2 の構成" title="initializr 2 の構成" width="550" height="205" class="size-full wp-image-1884" /><p class="wp-caption-text">initializr 2 の構成</p></div>
<p>HTML5 Boilerplate には、サイトを最適化してリリースするためのビルド用スクリプトとツール群、サーバーの設定ファイル等が含まれていますが、これらについては、冒頭の IBM の記事等をご参照ください。</p>
<p>一方 Initializr 2 の方は、HTML5 Boilerplate からインデックス・ページと <code>css</code>、<code>js</code> だけを抜き出したサブセット的な内容となっていることが分かります。</p>
<p>次に CSS と JavaScript ライブラリの構成モジュールについてです。それぞれは既に有名ですが、簡単なサマリを載せておきます。</p>
<table>
<thead>
<tr>
<th colspan="2">モジュール</th>
<th>内容</th>
</tr>
</thead>
<tbody>
<tr>
<td>CSS</td>
<td><a href="http://necolas.github.com/normalize.css/">normalize.css</a></td>
<td>デフォルト値が異なるプロパティを標準化すべく定義されたスタイルシートです。従来のリセット系 CSS を使ったスタイル定義に比べ、最終的な定義量が少なくなるというメリットがあります。</td>
</tr>
<tr>
<td rowspan="3">JavaScript</td>
<td><a href="http://www.modernizr.com/">Modernizr 2</a></td>
<td>HTML5、CSS3 の機能が使えるかどうかをテストし、その結果を <code>&lt;html&gt;</code> タグのクラス名に設定します。またバージョン2からは <a href="http://yepnopejs.com/">yepnope.js</a> を取り込み、非同期ローディング機能を持つようになりました。</td>
</tr>
<tr>
<td><a href="http://code.google.com/p/html5shiv/">html5shiv</a></td>
<td><a href="http://html5shim.googlecode.com/svn/trunk/html5.js">html5.js</a> として知られる、IE8 以下に HTML5 のタグを認識させスタイル設定できるようにするための <a href="http://remysharp.com/2009/01/07/html5-enabling-script/">HTML5 enabling script</a> です。また、HTML5 ドキュメントを正しく印刷させるためのスクリプト <a href="http://www.iecss.com/print-protector/">IE Print Protector</a> も内包しています。</td>
</tr>
<tr>
<td><a href="https://github.com/scottjehl/Respond">Respond.js</a></td>
<td>IE8 以下などのメディアクエリ未対応なブラウザに、その機能を提供するライブラリです。IE でも、その幅に合わせた <code>min-width</code>、<code>max-width</code> のスタイル設定が適用できるようになります。</td>
</tr>
</tbody>
</table>
<p>HTML5 Boilerplate では、「<code>js/libs/modernizr-2.0.6.min.js</code> = Modernizr 2 + html5shiv + Respond.js」 となっています。</p>
<p>一方 Initializr 2 では、「<code>js/libs/modernizr-2.0.min.js</code> = Modernizr 2 + html5shiv」 で、Respond.js は独立しています。</p>
<p>今のところトータルとして両者に機能的な違いはありませんが、HTML5 Boilerplate の Respond.js は、メディアクエリ判定に Modernizr のそれを流用している特別版ため、合計サイズが小さくなっています。</p>
<h3>押さえておくべき5つの原則</h3>
<p>さて、これらのテンプレートを使いこなすために押さえておくべき原則を、順に紹介していきます。</p>
<ol>
<li><a href="#fundamentals1">モバイル・ファースト</a></li>
<li><a href="#fundamentals2">レスポンシブ・デザイン</a></li>
<li><a href="#fundamentals3">プログレッシブ・エンハンスメント</a></li>
<li><a href="#fundamentals4">論理的でクリーンなコード</a></li>
<li><a href="#fundamentals5">プログレッシブ・レンダリング</a></li>
</ol>
<h4 id="fundamentals1"><span style="font-size:140%; margin-right:8px">1.</span>モバイル・ファースト</h4>
<p>要は 「スマホ → タブレット → デスクトップ」 の順にデザインしなさいという原則です。何を <q>デザイン</q> するかは <a href="#h5bp-ref1">参考情報1</a> をご覧ください。ここではテンプレート <code>css/style.css</code> に、どのように反映されているかを見てみます。</p>
<p><code>css/style.css</code> の前半は、<a href="http://necolas.github.com/normalize.css/" title="Make browsers render all elements more consistently.">normalize.css</a> によるブラウザの違いを標準化するための設定です。そして中盤以降 ～ 終盤にそれぞれ次のようなブロックがあります。</p>
<h5>テーマのスタイルを設定するブロック（中盤以降）</h5>
<p>[css]<br />
/* ===== primary styles =========================================<br />
   Author:<br />
   ============================================================== */<br />
&#8230;<br />
[/css]</p>
<h5>デバイス用のメディアクエリを設定するブロック（終盤）</h5>
<p>[css]<br />
/* ===== media queries ==========================================<br />
   PLACEHOLDER Media Queries for Responsive Design.<br />
   These override the primary (&#8217;mobile first&#8217;) styles<br />
   Modify as content requires.<br />
   ============================================================== */</p>
<p>@media only screen and (min-width: 480px) {<br />
  /* Style adjustments for viewports 480px and over go here */</p>
<p>}</p>
<p>@media only screen and (min-width: 768px) {<br />
  /* Style adjustments for viewports 768px and over go here */</p>
<p>}<br />
[/css]</p>
<p>メディアクエリの設定で、<q><code>min-width: 480px</code></q> は 「幅 480px 以上 （最小幅 480px）」 を、<q><code>min-width: 768px</code></q> は 「幅 768px 以上 （最小幅 768px）」 を意味しています。</p>
<p>つまり、最初の 「primary styles」 にはスマホ用スタイルを、<q><code>min-width: 480px</code></q> のブロックにはタブレット用を、<q><code>min-width: 768px</code></q> にはデスクトップ用スタイルを設定することが想定されています。</p>
<p>「かんたん、サクサク」 と、デスクトップ用のスタイルから設定していくと、最後のメディアクエリで設定を逆にしなければなりませんので、ご注意ください。（何を隠そう、この私です <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ）</p>
<p>また、これらの設定は、<code>index.html</code> の次のメタタグと対になっていることを覚えておくと吉です。</p>
<p>[html]<br />
&lt;meta name=&#8221;viewport&#8221; content=&#8221;width=device-width,initial-scale=1&#8243;&gt;<br />
[/html]</p>
<h5 id="h5bp-ref1">参考情報1</h5>
<ul>
<li>2011年2月4日 <a href="http://www.coprosystem.co.jp/blog/?p=901">モバイルファースト &raquo; 市場のお手入れ</a></li>
<li>2011年3月18日 <a href="http://all-web-blog.blogspot.com/2011/03/blog-post_18.html">allWebクリエイター塾 ブログ :「モバイルファースト」って何だ</a></li>
<li>2011年6月17日 <a href="http://web-tan.forum.impressrd.jp/e/2011/06/17/10487">アップルとマイクロソフトが採用をはじめた“モバイルファースト”とは？ | Web担当者Forum</a></li>
</ul>
<h5 id="h5bp-ref2">参考情報2</h5>
<p>メディアクエリや <code>viewport</code> の設定について参考になりそうな記事を下に挙げますが、本記事で紹介している <q>デザイン原則</q> と異なる趣旨で説明されているものを含みますので、ご注意下さい。</p>
<ul>
<li>2010年8月20日 <a href="http://coliss.com/articles/build-websites/operation/css/css3-media-queries.html">CSS3のMedia Queries（メディアクエリ）の使い方と実装例</a></li>
<li>2010年10月12日 <a href="http://coliss.com/articles/build-websites/operation/css/css-framework-hardboiled-css3-media-queries.html">Media Queries（メディア クエリ）を使用したデバイスごとの指定方法のまとめ</a></li>
<li>2011年5月30日 <a href="http://coliss.com/articles/build-websites/operation/css/css-tutorial-media-queries-by-webdesignerwall.html">スマフォ対応サイトのためにMedia Queriesをしっかり身につけるチュートリアル</a></li>
<li>2011年7月13日 <a href="http://webdesignrecipes.com/web-design-for-mobile-with-css3-media-queries/">CSS3 Media Queries を使って、Webサイトをスマートフォンに対応させるときの注意書き</a></li>
<li>2011年8月16日 <a href="http://coliss.com/articles/build-websites/operation/work/techniques-for-gracefully-degrading-media-queries-by-smashingmagazine.html">スマートフォン・デスクトップなど要件に合わせたMedia Queriesの実装方法のまとめ</a></li>
<li>2011年10月24日 <a href="http://coliss.com/articles/build-websites/operation/css/css-ipad-layout-with-landscape-portrait-modes-by-matthewjamestaylor.html">iPadの横向きと縦向きでレイアウトを変更するスタイルシート</a></li>
</ul>
<h4 id="fundamentals2"><span style="font-size:140%; margin-right:8px">2.</span>レスポンシブ・デザイン</h4>
<p>前章の <q>モバイル・ファースト</q> のデザイン原則を支え、様々な大きさのデバイスに最適なユーザー・エクスペリエンスを提供するために必要不可欠な原則です。ただし、古い IE などメディアクエリを解釈しないブラウザへの対応が必要で、HTML5 Boilerplate では <a href="https://github.com/scottjehl/Respond">Respond.js</a> を採用して対応しています。</p>
<p>Respond.js は、HTML5 Boilerplate では <code>js/libs/modernizr-2.0.6.min.js</code> に組み込まれ、HTTP リクエストの削減を図っています （Initializr 2 では単独の <code>js/libs/respond.min.js</code> です）。</p>
<p>さてこういった仕組みもさることながら、レスポンシブ・デザインで重要なのは、デバイスに合わせて最適なサイズの画像を提供することではないかと思います。モバイル用デバイスの通信速度はデスクトップ環境のそれに比べ、まだ十分とは言えない状況にあります。デスクトップ用画像をそのままモバイル端末に食わせ、スタイル設定で縮小表示しているようではベストプラクティスとは言えません。</p>
<p>かといって各デバイス用に異なる大きさの画像を用意しておくのも大変です。そこで、PHP と JavaScript でこの問題に対応するスクリプトを <a href="#h5bp-ref3">参考情報3</a> に紹介しておきます。</p>
<h5 id="h5bp-ref3">参考情報3</h5>
<ul>
<li>2011年9月2日 <a href="http://coliss.com/articles/build-websites/operation/work/js-and-php-adaptive-images.html">スマートフォン・デスクトップそれぞれに最適な画像を表示する -Adaptive Image</a></li>
<li><a href="https://github.com/jiolasa/Simple-RESS">Simple-RESS | Responsive Design + Server Side Components</a></li>
</ul>
<h4 id="fundamentals3"><span style="font-size:140%; margin-right:8px">3.</span>プログレッシブ・エンハンスメント</h4>
<p>最新のブラウザには最新のテクノロジを使ったコンテンツを提供し、そうでないブラウザにもそこそこのコンテンツを提供する、ちょっと乱暴な言い方ですが、<q>プログレッシブ・エンハンスメント</q> はそんな考え方です。</p>
<p>これを実現させるために HTML5 Boilerplate では、<a href="http://www.modernizr.com/">Modernizr</a> を取り入れています。<a href="#h5bp-ref4">参考情報4</a> に Modernizr の典型的な使い方がありますので、参考にして下さい。</p>
<p>ここでは、バージョン2から取り込まれた <a href="http://yepnopejs.com/">yepnope.js</a> の条件付き非同期ローディングを使い、CSS3 の <code>box-shadow</code> に対応する例を示しておきます。Modernizr が <a href="http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/all-brandnew-asynchronous-javascript-loader/" title="新参の超軽量JavaScript非同期ローダー3種を徹底比較">他の非同期ローダー</a> ではなく yepnope.js を選んだ理由は、こういう使い方を想定してのことだと思います。</p>
<p>[html]<br />
&lt;script&gt;<br />
Modernizr.load({<br />
	test: Modernizr.boxshadow,	// box-shadow が使えるかテストし、<br />
	nope: &#8220;path/to/PIE.js&#8221;,		// 使えなければ PIE.js を読み込み<br />
	complete: function() {		// 読み込みが完了したら実行する<br />
		$(&#8217;適用するタグとかクラスとか&#8217;).each(function() {<br />
			PIE.attach(this);<br />
		});<br />
	}<br />
});<br />
&lt;/script&gt;<br />
[/html]</p>
<p>（注：<code>PIE.js</code> で CSS3 に対応する方法は、本家の <a href="http://css3pie.com/" title="CSS3 decorations for IE">CSS3 PIE</a> では推奨されていません。良い例が思い付かなくてすみません <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_sad.gif' alt=':-(' class='wp-smiley' />  ）</p>
<h5 id="h5bp-ref4">参考情報4</h5>
<ul>
<li>2011年3月19日 <a href="http://all-web-blog.blogspot.com/2011/03/modernizr-20.html">絶対に使いたい、modernizr 2.0 </a></li>
</ul>
<h4 id="fundamentals4"><span style="font-size:140%; margin-right:8px">4.</span>論理的でクリーンなコード</h4>
<p><code>index.html</code> の先頭に、ひときわ目につくコンディショナル・コメントがあります （<code>lang="en"</code> は、<code>lang="ja"</code> に変えましょう）。</p>
<p>[html]<br />
&lt;!&#8211;[if lt IE 7]&gt;&lt;html class=&#8221;no-js ie6 oldie&#8221; lang=&#8221;en&#8221;&gt;&lt;![endif]&#8211;&gt;<br />
&lt;!&#8211;[if IE 7]&gt;   &lt;html class=&#8221;no-js ie7 oldie&#8221; lang=&#8221;en&#8221;&gt;&lt;![endif]&#8211;&gt;<br />
&lt;!&#8211;[if IE 8]&gt;   &lt;html class=&#8221;no-js ie8 oldie&#8221; lang=&#8221;en&#8221;&gt;&lt;![endif]&#8211;&gt;<br />
&lt;!&#8211;[if gt IE 8]&gt;&lt;!&#8211;&gt; &lt;html class=&#8221;no-js&#8221; lang=&#8221;en&#8221;&gt;&lt;!&#8211;&lt;![endif]&#8211;&gt;<br />
[/html]</p>
<p>これは従来の CSS ハックや、ただでさえ遅い IE に追加のスタイルシートを読み込ませる、次のようなコンディショナル・コメントを駆逐するものです。</p>
<p>[html]<br />
&lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; media=&#8221;screen&#8221; href=&#8221;css/style.css&#8221; /&gt;<br />
&lt;!&#8211;[if IE 7]&gt;&lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; media=&#8221;screen&#8221; href=&#8221;css/ie7.css&#8221; /&gt;&lt;![endif]&#8211;&gt;<br />
&lt;!&#8211;[if IE 6]&gt;&lt;link rel=&#8221;stylesheet&#8221; type=&#8221;text/css&#8221; media=&#8221;screen&#8221; href=&#8221;css/ie6.css&#8221; /&gt;&lt;![endif]&#8211;&gt;<br />
[/html]</p>
<p><a href="http://paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/" title="Conditional stylesheets vs CSS hacks? Answer: Neither!">Paul Irish が提唱する使い方</a> は、次のようになります。</p>
<p>[html]<br />
div.foo { color: inherit;}<br />
.ie6 div.foo { color: #ff8000; }<br />
[/html]</p>
<p>このようにすれば、CSS ハックを使わず Valid なスタイルシートが出来上がりますネ。</p>
<p>さて、こういった IE に対する手厚い扱いは、次のようなマークアップにも表れています。</p>
<p>[html]<br />
&lt;meta http-equiv=&#8221;X-UA-Compatible&#8221; content=&#8221;IE=edge,chrome=1&#8243;&gt;<br />
[/html]</p>
<p>上記メタタグにより、複雑怪奇な IE の動作モードを、常にもっとも問題の少ない <q>最新モード</q> にし、また可能であれば Chrome Frame を動作させます。</p>
<p>[html]<br />
&lt;!&#8211;[if lt IE 7 ]&gt;<br />
	&lt;script src=&#8221;//ajax.googleapis.com/ajax/libs/chrome-frame/1.0.3/CFInstall.min.js&#8221;&gt;&lt;/script&gt;<br />
	&lt;script&gt;window.attachEvent(&#8217;onload&#8217;,function(){CFInstall.check({mode:&#8217;overlay&#8217;})})&lt;/script&gt;<br />
&lt;![endif]&#8211;&gt;<br />
[/html]</p>
<p>
<img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/chromeframe.jpg" alt="Google Chrome Frame" title="Google Chrome Frame" width="320" height="279" class="alignright size-full wp-image-1882" /></p>
<p>上記は、IE6 に対して、右のような <a href="http://code.google.com/intl/ja/chrome/chromeframe/">Google Chrome Frame</a> のインストールを促すポップアップを表示するスクリプトです。
</p>
<p>ちなみに、<q><code>X-UA-Compatible</code></q> のメタタグは、HTML5 Boilerplate に同梱されている <code>.htaccess</code> の設定を用いれば <code>index.html</code> からは削除することができます。</p>
<p>何だかこの章は、「IE に対する特別待遇」 というタイトルがピッタリの内容ですが、あくまでも本来的な <q>目的</q> を原則としてみました <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  。</p>
<div style="clear:both"></div>
<h4 id="fundamentals5"><span style="font-size:140%; margin-right:8px">5.</span>プログレッシブ・レンダリング</h4>
<p><q>プログレッシブ・レンダリング</q> を簡単に言えば、「イニシャル・ペイロード （ページを読み込みの初期負荷） を最小にし、かつ主要な要素から可能な限り早期に描画を行わせることにより、ユーザーが感じるサイト速度の向上を目指すこと」 です。</p>
<p>この原則は、Modernizr と他のスクリプトの読み込み位置の違いに端的に表れています。</p>
<p>[html]<br />
&#8230;<br />
	&lt;script src=&#8221;js/libs/modernizr-2.0.6.min.js&#8221;&gt;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&#8230;<br />
&lt;script src=&#8221;//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js&#8221;&gt;&lt;/script&gt;<br />
&#8230;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
[/html]</p>
<p>つまり、Modernizr はレンダリングが開始される前までに実行されていなければならず、単に <q><a href="http://developer.yahoo.com/performance/rules.html#js_bottom">Put Scripts at the Bottom</a></q> や <q><a href="http://code.google.com/intl/ja/speed/page-speed/docs/payload.html#DeferLoadingJS">Defer loading of JavaScript</a></q> に従ってしまうと、レスポンシブな機能が働かなくなるので注意しましょう。</p>
<p>ところで、最初に読み込まれる Modernizr が CDN にアップされているともっとウレシイと思いませんか？ 実は、<a href="http://www.cdnjs.com/">CloudFlare がスポンサーの CDN</a> にあります！</p>
<pre>
<a href="http://cdnjs.cloudflare.com/ajax/libs/modernizr/2.0.6/modernizr.min.js">http://cdnjs.cloudflare.com/ajax/libs/modernizr/2.0.6/modernizr.min.js</a>
</pre>
<p><a href="http://www.asp.net/ajaxlibrary/cdn.ashx#Modernizr_Releases_on_the_CDN_6">Microsoft の CDN にも登録されています</a> が、minify 版ではないので、デバッグ時などに使うにとどめるのが良いでしょう。</p>
<p>最後に、この原則に関する他のベストプラクティスを <a href="#h5bp-ref5">参考情報5</a> に挙げました。色々コマゴマとありますネ。</p>
<h5 id="h5bp-ref5">参考情報5</h5>
<ul>
<li>Princeton
<ul>
<li>
2007年10月25日 <a href="http://www.vbulletin.org/forum/showthread.php?t=161099">How Design Affects Performance : Progressive Rendering</a>
		</li>
</ul>
</li>
<li>Stoyan Stefanov
<ul>
<li>
2009年12月21日 <a href="http://www.phpied.com/progressive-rendering-via-multiple-flushes/">Progressive rendering via multiple flushes</a>
		</li>
<li>
2010年10月25日 <a href="http://www.slideshare.net/stoyan/progress-all">Progressive Downloads and Rendering &#8211; take #2</a>
		</li>
<li>
2010年10月19日 <a href="http://vimeo.com/15981041">Progressive Downloads and Rendering | Fronteers 2010</a>
		</li>
</ul>
</li>
<li>Steve Souders
<ul>
<li>
2010年10月12日 <a href="http://www.slideshare.net/souders/web-directions-south-even-faster-web-sites">Web Directions South &#8211; Even Faster Web Sites</a>
		</li>
<li>
2011年5月11日 <a href="http://vimeo.com/29267808">Even faster web sites &#8211; JSDay2011</a>
		</li>
</ul>
</li>
</ul>
<h3>まとめ</h3>
<p>Web パフォーマンスに関するベストプラクティスが凝縮されているという HTML5 Boilerplate を、近年の技術トレンドに照らし合わせて、その中身を具体的に追いかけてみました。もちろんテンプレートという性質上、それ自体は単なる出発点でしかありません。そこにコンテンツを構築するためには、さらに細かなベストプラクティスを積み重ねていかなければならないでしょう。</p>
<p>しかし、基本的な原則を知った上でその仕組みをうまく活用していけば、それこそ 「簡単に、サクサクと」 スジの良いページを作ることができ、よりコンテンツ（中身）の制作に集中できるのではないかと思います。</p>
<h3>おまけ</h3>
<p>HTML5 Boilerplate と Initializr 2 の <code>index.html</code> を比較してみると、それぞれに考え方の違いがあるようです。</p>
<h5>HTML5 Boilerplate</h5>
<p><code>&lt;header&gt;</code> ～ <code>&lt;footer&gt;</code> までが、<code>container</code> で囲まれています。</p>
<p>[html]<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;div id=&#8221;container&#8221;&gt;<br />
	&lt;header&gt;</p>
<p>	&lt;/header&gt;<br />
	&lt;div id=&#8221;main&#8221; role=&#8221;main&#8221;&gt;</p>
<p>	&lt;/div&gt;<br />
	&lt;footer&gt;</p>
<p>	&lt;/footer&gt;<br />
&lt;/div&gt; &lt;!&#8211;! end of #container &#8211;&gt;<br />
&#8230;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
[/html]</p>
<h5>Initializr 2</h5>
<p>全体を囲むラッパーはなく、<code>&lt;header&gt;</code>、<code>&lt;article&gt;</code>、<code>&lt;footer&gt;</code> が個別のブロックで構成されています。</p>
<p>[html]<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
	&lt;div id=&#8221;header-container&#8221;&gt;<br />
		&lt;header class=&#8221;wrapper&#8221;&gt;<br />
			&lt;nav&gt; &#8230; &lt;/nav&gt;<br />
		&lt;/header&gt;<br />
	&lt;/div&gt;<br />
	&lt;div id=&#8221;main&#8221; class=&#8221;wrapper&#8221;&gt;<br />
		&lt;aside&gt; &#8230; &lt;/aside&gt;<br />
		&lt;article&gt;<br />
			&lt;header&gt; &#8230; &lt;/header&gt;</p>
<p>			&lt;footer&gt; &#8230; &lt;/footer&gt;<br />
		&lt;/article&gt;<br />
	&lt;/div&gt;<br />
	&lt;div id=&#8221;footer-container&#8221;&gt;<br />
		&lt;footer class=&#8221;wrapper&#8221;&gt;<br />
		&lt;/footer&gt;<br />
	&lt;/div&gt;<br />
&#8230;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
[/html]</p>
<p>パフォーマンス上に違いは無く、単に好みの問題だとは思いますが&#8230;。私は後者の方が好きです。なぜなら、既に <code>&lt;body&gt;</code> ～ <code>&lt;/body&gt;</code> で囲われているって考える方が自然に思えるからです。</p>
<h5>参考情報6</h5>
<ul>
<li>2010年3月31日 <a href="http://camendesign.com/code/developpeurs_sans_frontieres">How to Centre and Layout Pages Without a Wrapper</a></li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=0-nKklj665Q:9Fet5_efAtk:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=0-nKklj665Q:9Fet5_efAtk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/5-fundamentals-when-using-h5bp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/5-fundamentals-when-using-h5bp/" />
	</item>
		<item>
		<title>最近海外で流行りのTwitter,Facebook,Google+1,Analyticsをまとめる非同期スクリプトにはてなを加えてみた</title>
		<link>http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/asynchronous-loading-of-major-social-buttons/</link>
		<comments>http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/asynchronous-loading-of-major-social-buttons/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 22:09:37 +0000</pubDate>
		<dc:creator>tokkonoPapa</dc:creator>
				<category><![CDATA[XHTML/CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[site optimization]]></category>

		<guid isPermaLink="false">http://tokkono.cute.coocan.jp/blog/slow/?p=1876</guid>
		<description><![CDATA[ひょんなことから normalize.css のページを覗いていたら、Google Analytics、Google +1、Twitter、Facebook の各 JavaScript をまとめて非同期で読み込んでいるス [...]]]></description>
			<content:encoded><![CDATA[<p>ひょんなことから <a href="http://necolas.github.com/normalize.css/">normalize.css</a> のページを覗いていたら、Google Analytics、Google +1、Twitter、Facebook の各 JavaScript をまとめて非同期で読み込んでいるスクリプトが使われているのを見つけました。</p>
<p>「<a href="http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/non-blocking-asynchronous-loading-of-css-javascript/">CSS/JavaScriptのAsynchronous Loadingをめぐる熱い論議</a>」 でも書きましたが、スクリプトの非同期読み込みは、<a href="http://code.google.com/intl/ja/apis/analytics/docs/tracking/asyncTracking.html" title="サイト アクティビティのトラッキング - Google アナリティクス - Google Code">Google Analytics のコードスニペット</a> で一応の決着を見た感じで （実は、標準化を巡って第2ラウンドが始まってはいますが&#8230;）、今や Google+1 はもちろん、Facebook も同様の手法を推奨しています。</p>
<p>調べてみたら、「それなら Twitter のスクリプトだって同じように読めばいいじゃないか」 という感じでどんどん <q>まとめスクリプト</q> の改良が進んできたようです。</p>
<p>我が日本としてはこれに 「はてな」 を加えるしかない！、ということで作ってみましたので、公開したいと思います。<br />
<span id="more-1876"></span></p>
<h3>背景と経緯</h3>
<p>事の発端は、冒頭の <a href="http://necolas.github.com/normalize.css/">normalize.css</a> の作者であり <a href="http://html5boilerplate.com/">HTML5 Boilerplate</a> の開発者でもある <a href="http://nicolasgallagher.com/">Nicolas Gallagher</a> が2011年6月 Gist に投稿した <a href="https://gist.github.com/1025811/65668ebcf5f85e61cc0c3ba042e3bbb871d4e7c3">次のスクリプト</a> です。</p>
<p>[javascript]<br />
(function(d,e){<br />
	var u = [<br />
		('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js', // Google Analytics<br />
		'https://apis.google.com/js/plusone.js', // Google +1 Button<br />
		'//connect.facebook.net/en_US/all.js' // Facebook JS SDK<br />
	],<br />
	f = d.createDocumentFragment(),<br />
	s = d.createElement(e),<br />
	t = d.getElementsByTagName(e)[0],<br />
	i = u.length,<br />
	z;</p>
<p>	while(i&#8211;){<br />
		z = s.cloneNode(true);<br />
		z.src = u[i];<br />
		z.async = 1;<br />
		f.appendChild(z);<br />
	}</p>
<p>	t.parentNode.insertBefore(f,t);<br />
}(document,&#8217;script&#8217;));<br />
[/javascript]</p>
<p>その日のうちに、同じく HTML5 Boilerplate 開発メンバーでもある <a href="http://mathiasbynens.be/">Mathias Bynens</a> が乱入し、コードが洗練されていきました。彼は、2010年4月のブログ記事 「<a href="http://mathiasbynens.be/notes/async-analytics-snippet">Optimizing the asynchronous Google Analytics snippet</a>」 で、Google Analytics のコードスニペットに関して、これでもかというぐらいに無駄なコードをそぎ落とす記事を書いていますので、この手のスクリプトにかけては造詣が深いのです。</p>
<p>ただこの時点ではまだ、Google Analytics、Google +1、Facebook の3つだけが非同期読み込みの対象でした。</p>
<p>一方、<a href="http://www.amazon.com/Object-Oriented-JavaScript-Stoyan-Stefanov/dp/1847194141/?tag=w3clubs-20">Object-Oriented JavaScript</a> の著者である <a href="http://www.phpied.com/">Stoyan Stefanov</a> は、2011年9月にブログ記事 「<a href="http://www.phpied.com/social-button-bffs/">Social button BFFs</a>」 で類似のスクリプトを発表しました。おもしろいことに彼は、Google Analytics は対象とせず、Facebook、Google +1、Twitter を対象としています。</p>
<p>そこに先の Mathias が乱入し、再び Gallagher にフィードバックされ、2011年10月に出来上がったのが次のスクリプトです。Google Analytics はもちろん、Facebook、Google +1、Twitter の4つが統合されました。</p>
<p>[javascript]<br />
/*<br />
 * Updated to use the function-based method described in http://www.phpied.com/social-button-bffs/<br />
 * but retaining the use of a document fragment to minimise the number of times objects are<br />
 * written to the DOM. Also, better handling of scripts without supplied ids.<br />
 *<br />
 * N.B. Be sure to include Google Analytics&#8217;s _gaq and Facebook&#8217;s fbAsyncInit prior to this function.<br />
 */</p>
<p>(function(doc, script) {<br />
    var js,<br />
        fjs = doc.getElementsByTagName(script)[0],<br />
        frag = doc.createDocumentFragment(),<br />
        add = function(url, id) {<br />
            if (doc.getElementById(id)) {return;}<br />
            js = doc.createElement(script);<br />
            js.src = url;<br />
            js.id = id || null;<br />
            frag.appendChild( js );<br />
        };</p>
<p>    // Google Analytics<br />
    add((&#8217;https:&#8217; == location.protocol ? &#8216;//ssl&#8217; : &#8216;//www&#8217;) + &#8216;.google-analytics.com/ga.js&#8217;, &#8216;ga&#8217;);<br />
    // Google+ button<br />
    add(&#8217;https://apis.google.com/js/plusone.js&#8217;);<br />
    // Facebook SDK<br />
    add(&#8217;//connect.facebook.net/en_US/all.js&#8217;, &#8216;facebook-jssdk&#8217;);<br />
    // Twitter SDK<br />
    add(&#8217;//platform.twitter.com/widgets.js&#8217;);</p>
<p>    fjs.parentNode.insertBefore(frag, fjs);<br />
}(document, &#8217;script&#8217;));<br />
[/javascript]</p>
<p>上記以外にも、似たような時期に類似の話題が出ていたのを拾ってみました。興味があれば読んでみて下さい。</p>
<ul>
<li>2011年7月12日 <a href="http://stackoverflow.com/questions/6662845/is-it-possible-to-unite-several-async-social-button-loaders-into-one">javascript &#8211; is it possible to unite several async social button loaders into one? &#8211; Stack Overflow</a></li>
<li>2011年7月22日 <a href="http://blog.caraldo.net/2011/07/googleanalytics_twitter_faceboo.php">GoogleAnalyticsで+1やTwitter、Facebookのソーシャルトラッキングを行う方法｜caraldo.net | WebとiPhoneとロードバイクが大好き！</a></li>
</ul>
<h3>「はてな」を加えたスクリプト</h3>
<p>先のスクリプトを元に、Google +1 への日本語設定と、はてなブックマークボタンを加え、またコード自体も <a href="http://closure-compiler.appspot.com/home">Clusure Compiler</a> を通して最適化した後、<a href="http://jsfiddle.net/">jsfiddle</a> の <a href="http://www.jslint.com/">JSLint</a> が通る程度には整形してみました。</p>
<p>[html]<br />
&lt;script&gt;<br />
(function(w,d){<br />
	w._gaq=[["_setAccount","UA-XXXXXXXX-X"],["_trackPageview"]];<br />
	w.___gcfg={lang:&#8221;ja&#8221;};<br />
	var c,e=d.createDocumentFragment(),f=d.getElementsByTagName(&#8221;script&#8221;)[0],<br />
	a=function(a,b){if(!d.getElementById(b)){c=d.createElement(&#8221;script&#8221;);<br />
	c.src=a;c.id=b||null;c.async=true;e.appendChild(c);}};<br />
	a((&#8221;https:&#8221;==location.protocol?&#8221;//ssl&#8221;:&#8221;//www&#8221;)+&#8221;.google-analytics.com/ga.js&#8221;);<br />
	a(&#8221;https://apis.google.com/js/plusone.js&#8221;);<br />
	a(&#8221;//b.st-hatena.com/js/bookmark_button_wo_al.js&#8221;);<br />
	a(&#8221;//platform.twitter.com/widgets.js&#8221;);<br />
	a(&#8221;//connect.facebook.net/ja_JP/all.js#xfbml=1&#8243;,&#8221;facebook-jssdk&#8221;);<br />
	f.parentNode.insertBefore(e,f);<br />
})(this,document);<br />
&lt;/script&gt;<br />
[/html]</p>
<p><q><code>UA-XXXXXXXX-X</code></q> の部分は、トラッキングコードの ID を設定します。他の箇所にトラッキングコードを仕掛けている場合には、この行は削除し従来の設定を使用します。また、スクリプト以外の構成要素は、次のサンプルを参照してください。</p>
<div style="margin-left:70px; width:530px; height:576px;">
<script type="text/javascript" src="http://jsdo.it/blogparts/xCDa/js?view=design"></script>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a href="http://jsdo.it/tokkonopapa/xCDa" title="まとめて非同期読み込み(Social+Analytics)">まとめて非同期読み込み(Social+Analytics) &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a></p>
</div>
<p>各ソーシャルサービスとも複数の実装方法を提供しているため、従来はページの中が乱雑になりがちでしたが、これで少しはすっきりとするのではないでしょうか？</p>
<p>また、公式サイトの設置方法通りでは得られない、このスクリプトのメリットは次の2つとなります。</p>
<ul>
<li>Twitter が非同期読み込みになる</li>
<li>はてなでは HTML5 対応のブラウザのみ非同期読み込みになっているが、IE8 以下でも速度向上が期待できる</li>
</ul>
<h3>おまけ：ソーシャルボタンの公式サイト設置方法まとめ</h3>
<p>今回の記事を作成するに当たり、参考とした公式サイトの解説ページをまとめておきます。各ボタンとも、幾つかのオプションがありますので、参考にしてください。</p>
<ul>
<li><a href="http://twitter.com/about/resources/tweetbutton">Twitter / ツイートボタン</a>
<ul style="list-style-type:none">
<li>
Web サイト上にツィートボタンを設定するスクリプトを生成してくれるページです。各パラメータの詳細な解説が、「<a href="https://dev.twitter.com/docs/tweet-button">Tweet Button | Twitter Developers</a>」 にあります。
		</li>
</ul>
</li>
<li><a href="http://developers.facebook.com/docs/reference/plugins/like">Like Button &#8211; Facebook開発者</a>
<ul style="list-style-type:none">
<li>
Like ボタンを設置するためのスクリプトを生成したり、各パラメータの解説をしてくれるページです。<a href="http://facebook-docs.oklahome.net/">oklahomer</a> さんの日本語訳「<a href="http://facebook-docs.oklahome.net/archives/51894138.html">Like Button : Facebook開発者向けドキュメントの日本語訳とTips</a>」 がイイ感じです。
		</li>
</ul>
</li>
<li><a href="http://www.google.com/webmasters/+1/button/">プラスワン ボタン</a>
<ul style="list-style-type:none">
<li>
+1 ボタンをサイトに設置するためのスクリプトを生成してくれますが、<del>なんだか 「<a href="http://www.google.com/intl/en/webmasters/+1/button/">英語版</a>」 の方が非同期スクリプトなんかも表示してくれて、イイ感じです。</del> ← 日本語版も非同期コードに更新されました！ またパラメータの詳細な解説が、「<a href="https://developers.google.com/+/plugins/+1button/">+1 Button &#8211; Google+ Platform &#8211; Google Developers</a>」 にあります。
		</li>
</ul>
</li>
<li><a href="http://code.google.com/intl/ja/apis/analytics/">Google アナリティクス &#8211; Google Code</a>
<ul style="list-style-type:none">
<li>
トラッキングコードを設置するためのスタートページです。具体的なトラッキングコードは、「<a href="http://code.google.com/intl/ja/apis/analytics/docs/tracking/asyncTracking.html">サイト アクティビティのトラッキング &#8211; Google アナリティクス &#8211; Google Code</a>」 にあります。また、トラッカーの内部オブジェクトやメソッドの詳細な解説が 「<a href="http://code.google.com/intl/ja/apis/analytics/docs/gaJS/gaJSApi.html">Google Analytics トラッキング コード &#8211; Google アナリティクス &#8211; Google Code</a>」 にあります。
		</li>
</ul>
</li>
<li><a href="http://b.hatena.ne.jp/guide/bbutton">はてなブックマークボタンの作成・設置について</a>
<ul style="list-style-type:none">
<li>
必要な事項を入力していくと、ボタンを設置するためのコードを生成してくれます。どんなパラメータが使用可能かを知るには、色々入力してみるとよいでしょう。また、クッキーによる追跡を行わないバージョンが 「<a href="http://b.hatena.ne.jp/guide/bbutton?al=0#bbutton-generator">オプトアウト版はてなブックマークボタン</a>」 に、その解説が 「<a href="http://b.hatena.ne.jp/help/bbutton#audience-data">行動情報の取得について</a>」 にあります。
		</li>
</ul>
</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=Sctepjme03U:9l7gWM1vxNc:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=Sctepjme03U:9l7gWM1vxNc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/asynchronous-loading-of-major-social-buttons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/asynchronous-loading-of-major-social-buttons/" />
	</item>
		<item>
		<title>脱GitHub初心者を目指す人のREADMEマークダウン使いこなし術</title>
		<link>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/markdown-skills-for-github-beginners/</link>
		<comments>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/markdown-skills-for-github-beginners/#comments</comments>
		<pubDate>Sun, 06 Nov 2011 22:35:48 +0000</pubDate>
		<dc:creator>tokkonoPapa</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://tokkono.cute.coocan.jp/blog/slow/?p=1855</guid>
		<description><![CDATA[
README がキチッと書かれているプロジェクトって、どんなに小さくても立派に見えますよネ。
GitHub の場合、大抵はマークダウン記法で書かれた README.md とか README.markdown とかいう名 [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/GitHubRM.jpg" alt="GitHub README" title="GitHub README" width="512" height="200" class="aligncenter size-full wp-image-1874" /></p>
<p>README がキチッと書かれているプロジェクトって、どんなに小さくても立派に見えますよネ。</p>
<p>GitHub の場合、大抵はマークダウン記法で書かれた <code>README.md</code> とか <code>README.markdown</code> とかいう名前のファイルが、HTML に変換 （マークアップ） されて表示されていることはご存知でしょう。</p>
<p>マークダウン記法自体はとても簡単なのですが、GitHub では <q><a href="http://github.github.com/github-flavored-markdown/">GitHub Flavored Markdown</a></q> （略して <q>GFM</q>） という GitHub 用にアレンジされたマークダウン・エンジンが採用されていて、一般のマークダウン・エディタでチェックしてからコミットしても、意図通りの見た目にならないことが多々あります。私 （もちろん GitHub 初心者です！） の場合、README ファイルだけで10回以上もコミットしてしまいました。「マークアップ （レンダリング） を気にして書くマークダウン」 なんて、何ともナンセンスですよネ。</p>
<p>ということで、私の二の舞にならないよう、スマートに README ファイルをコミットする方法を共有してみたいと思います。<br />
<span id="more-1855"></span></p>
<h3>マークダウンのこころ</h3>
<p>GFM のノウハウにいく前に、そもそもマークダウンの 「こころ」 を知っておくのが良いと思います。マークダウンの発案者 <a href="http://daringfireball.net/projects/markdown/syntax" title="Daring Fireball: Markdown Syntax Documentation">John Gruber</a> 本人は、その哲学を次のように語っています。</p>
<blockquote><p>
マークダウンは、簡単に書けるということを重視しながらも、プレーンなテキストとしても読み易くするために、そこに使われる記号は、それ自体で何を意味しているかが分かるよう慎重に選ばれなければならない。
</p></blockquote>
<p>例えば強調を表すシンタックスは、単語をアスタリスクで囲い <q><code>*強調する単語*</code></q> と表したり、<code>blockquote</code> を表す引用は、電子メールでよく使われる <q><code>&gt;&nbsp;引用する文章</code></q> といった具合です。</p>
<p>マークダウンのシンタックスには、合計で11個の基本構成要素 （段落、改行、見出し、強調、リスト、引用、コード、リンク、画像、水平線、HTML タグ） が登場します。それぞれのシンタックスは非常に簡単なので、初めての方は一度、学習をしておくとよいでしょう。</p>
<h4>お勧めの文献</h4>
<ul>
<li><a href="http://ja.wikipedia.org/wiki/Markdown">Markdown &#8211; Wikipedia</a>
<ul>
<li style="list-style-type:none">HTML タグを除く10個の要素がシンプルに解説されています。まずこちらを読んでから、本家の解説を読むのがお勧めです。</li>
</ul>
</li>
<li><a href="http://blog.2310.net/archives/6">Markdown文法の全訳</a>
<ul>
<li style="list-style-type:none">John Gruber による文法解説の日本語訳です。</li>
</ul>
</li>
<li><a href="http://pamgau.net/showdown/">Syntax Guideの日本語訳</a>
<ul style="list-style-type:none">
<li><a href="http://www.ctrlshift.net/project/markdowneditor/">Showdown</a> というオンラインツールに付属する Syntax Guide が、本家の解説をさらに詳しく補ってくれます。ツール右上のリストから <q>Syntax Guide</q> を選択すると、右側ペインに表れます。</li>
</ul>
</li>
</ul>
<h3>README.md作成のワークフロー</h3>
<p>ローカル側で README.md を書きながらプレビューで確認し、OK となったらリモート側にコミットをプッシュする、というのを1つのワークフローとするなら、その方法は次のいずれかでしょう。</p>
<ol>
<li>一般的なマークダウン・エディタを使う
<ul>
<li style="list-style-type:none">
<a href="#mdeditor">参考情報</a> に挙げたように、世の中にはたくさんのマークダウン・エディタが存在します。しかし、私がハマったように、これらのエディタで OK だったからといって、GFM で OK になるとは限りません。やはりその方言を掴むまでは、GFM 専用のマークダウン・エンジンを探す方が良さそうです。
		</li>
</ul>
</li>
<li>GFM のマークダウン・エンジンをローカルにインストールする
<ul>
<li style="list-style-type:none">
<a href="https://github.com/github/markup">github/markup &#8211; GitHub</a> に情報がある通り、<a href="https://github.com/tanoku/redcarpet"><code>redcarpet</code></a> をインストールすればよさそうなのですが、実はコレ、<a href="http://fossil.instinctive.eu/libupskirt/index"><code>upskirt</code></a> （現在では <a href="https://github.com/tanoku/sundown"><code>sundown</code></a> という名前になっている模様） のラッパーだったりして、これらをひも解きながらのインストールは、初心者にはハードルが高いです。
		</li>
</ul>
</li>
<li>GMF の Live Preview を使う
<ul>
<li style="list-style-type:none">
<a href="http://github.github.com/github-flavored-markdown/preview.html">GitHub Flavored Markdown &#8211; Live Preview</a> は、リアルタイムなプレビュー機能を持つオンライン・エディタなのですが、理解に苦しむほど性能が悪く （仕様が古い、多分）、使えたものではありません。私はコレでもハマりました。
		</li>
</ul>
</li>
<li>GitHub Wiki のマークダウン・エンジンを使う
<ul>
<li style="list-style-type:none">
結局たどり着いた方法がコレです。ご存知の通り、Wiki もマークダウンを採用しています。GitHub の Wiki は、リポジトリ作成後にあらためて開設しなければなりませんが、一旦開設してしまえば、プレビュー機能はもちろん、GUI ベースのリッチ・エディタやヘルプまで付いた GFM 専用のマークダウン・エンジンが使えるようになります！
		</li>
</ul>
</li>
</ol>
<p>ということで、以下、GitHub Wiki を活用した README.md 作成のワークフローを提案してみたいと思います。</p>
<h4 id="mdeditor">参考情報</h4>
<ul>
<li>2011年9月20日 <a href="http://www.calmtech.net/2011/09/20/online-markdown-editor/">オンラインマークダウンエディタいろいろ比較</a>
<ul>
<li style="list-style-type:none">
本家の Perl スクリプト <a href="http://daringfireball.net/projects/markdown/dingus">Markdown: Dingus</a> とマークアップ結果が （メールアドレスの難読化以外は） ぴったり一致する <a href="https://github.com/coreyti/showdown">Showdown.js</a> を用いた <a href="http://www.ctrlshift.net/project/markdowneditor/">Online Markdown Editor</a> が使い易いと思います（日本語バージョンは <a href="http://pamgau.net/showdown/">こちら</a>）。
		</li>
</ul>
</li>
<li>2011年10月2日 <a href="http://veadardiary.blog29.fc2.com/blog-entry-3492.html">リアルタイムプレビューができるMarkdownエディタ『Mou』</a>
<ul>
<li style="list-style-type:none">
Mac 用です。
		</li>
</ul>
</li>
<li>2011年10月20日 <a href="http://www.forest.impress.co.jp/docs/review/20111020_485035.html">リアルタイムプレビューにも対応、Markdown専用のエディター「MarkdownPad」</a>
<ul>
<li style="list-style-type:none">
Windows 用です。
		</li>
</ul>
</li>
</ul>
<h3>GitHub Wiki を活用したマークダウン作成のワークフロー</h3>
<p>提案するのは、GitHub Wiki 上のリッチ・エディタを使ってマークダウンを作成、ローカル側の README.md ファイルにコピペするという方法で、次のようなステップで作業するのがよいと思います。</p>
<ol>
<li><a href="#ghtemp">GitHub 用マイ・テンプレートを作成する</a></li>
<li><a href="#ghwiki">GitHub Wiki を開設する</a></li>
<li><a href="#ghhelp">GitHub マークダウンのヘルプを参照する</a></li>
<li><a href="#ghspec">GitHub 独自のマークダウンを活用する</a></li>
<li><a href="#ghedit">プッシュ後にちょっとだけ修正する</a></li>
</ol>
<h4 id="ghtemp"><span style="font-size:120%; margin-right:8px;">1.</span>GitHub 用マイ・テンプレートを作成する</h4>
<p>まずは、基本となる自分用のテンプレートを作っておくのが良いと思います。簡単なチュートリアルも兼ね、ほぼ10個の基本構成要素を入れた <a href="https://github.com/tokkonopapa/Markdown" title="実際の GitHub ページ">サンプル</a> を作ってみましたので、参考にしてください。</p>
<p>[text]<br />
プロジェクト・タイトル<br />
======================<br />
ここにプロジェクトの概要を書きます。<br />
行末にスペースを2つ入れると<br />
改行されます。</p>
<p>段落を分けるには、[空行](http://example.com/) を入れます。</p>
<p>使い方<br />
&#8212;&#8212;<br />
### インライン ###<br />
インラインのコードは、**バッククォート** (&#8220; ` &#8220;) で囲みます。</p>
<p>### ブロックレベル ###<br />
    function f () {<br />
        alert(0);  /* 先頭に4文字のスペース、<br />
                      もしくはタブを挿入します */<br />
    }</p>
<p>パラメータの解説<br />
&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
リストの間に空行を挟むと、それぞれのリストに `&lt;p&gt;` タグが挿入され、行間が<br />
広くなります。</p>
<p>    def MyFunction(param1, param2, &#8230;)</p>
<p>+   `param1` :<br />
    _パラメータ1_ の説明</p>
<p>+   `param2` :<br />
    _パラメータ2_ の説明</p>
<p>関連情報<br />
&#8212;&#8212;&#8211;<br />
### リンク、ネストしたリスト<br />
1. [リンク1](http://example.com/ &#8220;リンクのタイトル&#8221;)<br />
    * ![画像1](http://github.com/unicorn.png &#8220;画像のタイトル&#8221;)<br />
2. [リンク2][link]<br />
    &#8211; [![画像2][image]](https://github.com/)</p>
<p>  [link]: http://example.com/ &#8220;インデックス型のリンク&#8221;<br />
  [image]: http://github.com/github.png &#8220;インデックス型の画像&#8221;</p>
<p>### 引用、ネストした引用<br />
&gt; これは引用です。<br />
&gt;<br />
&gt; &gt; スペースを挟んで `&gt;` を重ねると、引用の中で引用ができますが、<br />
&gt; &gt; GitHubの場合、1行前に空の引用が無いと、正しくマークアップされません。</p>
<p>ライセンス<br />
&#8212;&#8212;&#8212;-<br />
Copyright &amp;copy; 2011 xxxxxx<br />
Licensed under the [Apache License, Version 2.0][Apache]<br />
Distributed under the [MIT License][mit].<br />
Dual licensed under the [MIT license][MIT] and [GPL license][GPL].</p>
<p>[Apache]: http://www.apache.org/licenses/LICENSE-2.0<br />
[MIT]: http://www.opensource.org/licenses/mit-license.php<br />
[GPL]: http://www.gnu.org/licenses/gpl.html<br />
[/text]</p>
<p>マークダウンでは、11個目の要素である HTML タグも使うことができます。例えば <code>&lt;table&gt;</code> や <code>&lt;dl&gt;&lt;dt&gt;&lt;dd&gt;</code> などを使いたいこともあるでしょう。その場合、次の3つの注意事項があります。</p>
<ul style="margin-left:20px">
<li><code>&lt;u&gt;</code> や <code>&lt;del&gt;</code> などのインライン要素中では、マークダウン記法が使える。</li>
<li>ただし <code>&lt;font&gt;</code> は使えない。</li>
<li><code>&lt;div&gt;</code> などのブロック要素中では、マークダウン表記は無視される。</li>
</ul>
<p>ただし 「マークダウンのこころ」 からは外れてしまうので、Wiki 以外では極力使わないようにしましょう。</p>
<h4 id="ghwiki"><span style="font-size:120%; margin-right:8px;">2.</span>GitHub Wiki を開設する</h4>
<p>特に難しくはありませんが、Wiki の開設 〜 リッチ・エディタまでの概略を以下に示します。各リポジトリ毎に開設するのも手ですが、無料枠でのリソース消費を抑える意味も含め、マークダウン専用のリポジトリで Wiki を開設、前章のテンプレートを載せておくという手もあるかと思います。</p>
<ul style="list-style-type:none">
<li><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh01.png" alt="①Wikiをクリック" title="① Wiki をクリック" width="512" height="200" class="aligncenter size-full wp-image-1857" /></li>
<li><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh02.png" alt="② Wiki を作成" title="② Wiki を作成" width="512" height="200" class="aligncenter size-full wp-image-1858" /></li>
<li><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh03.png" alt="③ New Page を作成" title="③ New Page を作成" width="512" height="200" class="aligncenter size-full wp-image-1859" /></li>
<li><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh04.png" alt="④ OK をクリック" title="④ OK をクリック" width="512" height="200" class="aligncenter size-full wp-image-1860" /></li>
<li><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh05.png" alt="⑤ プレビューで確認" title="⑤ プレビューで確認" width="512" height="200" class="aligncenter size-full wp-image-1861" /></li>
<li><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh06.png" alt="⑥ レンダリング結果を確認" title="⑥ レンダリング結果を確認" width="512" height="200" class="aligncenter size-full wp-image-1862" /></li>
<li><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh07.png" alt="⑦ 不要になったら Delete this Page" title="⑦ 不要になったら Delete this Page" width="512" height="200" class="aligncenter size-full wp-image-1863" /></li>
</ul>
<h4 id="ghhelp"><span style="font-size:120%; margin-right:8px;">3.</span>GitHub マークダウンのヘルプを参照する</h4>
<p>Wiki のリッチ・エディタで 「?」 を押すと、ヘルプを表示させることができます。基本構成要素の10個が、ブロック要素とインライン要素とに分けて参照することができます。</p>
<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh08.png" alt="⑧ ヘルプを見る" title="⑧ ヘルプを見る" width="512" height="200" class="aligncenter size-full wp-image-1864" /></p>
<p>GitHub マークダウンは、README だけでなく、コメント欄でも使うことができます。GitHub のどのページでも良いので、キーボードの &#8216;<code>m</code>&#8216; を押してみましょう。使いたいときにいつでも呼び出せる、マークダウンのチートシートを表示させることができます。</p>
<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh09.png" alt="⑨ mキーでチートシートを表示" title="⑨ mキーでチートシートを表示" width="512" height="256" class="aligncenter size-full wp-image-1865" /></p>
<p>余談ですが、&#8217;<code>?</code>&#8216; キーを押すと、ショートカット・キーのチートシートが表示できます。お試しあれ。</p>
<h4 id="ghspec"><span style="font-size:120%; margin-right:8px;">4.</span>GitHub 独自のマークダウンを活用する</h4>
<p>知ってるとちょっと GitHub 通を気取れる Tips です。</p>
<ul>
<li>コードブロックのハイライト
<ul>
<li style="list-style-type:none">
<p>
コードブロックを 「<code>```<em>lang</em></code>」 ～ 「<code>```</code>」 で囲むと、指定の言語に合わせてハイライトされます。通常マークダウンでは、コードの先頭にスペース4つか1つのタブを挿入しますが、この記法を使うとブロックが丸ごとそのまま 「&lt;pre&gt;&lt;code&gt;」 〜 「&lt;/code&gt;&lt;/pre&gt;」 で囲われるため、余計な空白ができてしまいます。注意しましょう。
</p>
<p>
また公式ドキュメントには <code><em>lang</em></code> に指定可能な言語の解説がないので何とも言えませんが、<code>html</code>、<code>css</code>、<code>javascript</code>、<code>ruby</code>、<code>python</code> などは指定可能なようです。
</p>
<p>[text]<br />
&#8220;`html<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;jquery.min.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
$(function() {<br />
    alert($); /* 先頭に4文字のスペース、<br />
                 もしくはタブを挿入します */<br />
});<br />
&lt;/script&gt;<br />
&#8220;`</p>
<p>&#8220;`python<br />
def MyFunction(param, &#8230;)<br />
&#8220;`<br />
[/text]</p>
<p>
この機能を使うと、現状ではコメントなどの日本語が化けてしまいます。ユニコード化すれば回避できると思いますが、プレーンなテキストを見たときに何が書いてあるか分からなくなるので、日本語は避けましょう。</p>
<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh10.png" alt="日本語は化けてしまう" title="日本語は化けてしまう" width="512" height="224" class="aligncenter size-full wp-image-1866" />
</p>
</li>
</ul>
</li>
<li>issue リストへの自動リンク
<ul>
<li style="list-style-type:none">
<p>
「<code>#番号</code>」 で、該当の issue リストへのリンクが自動的に生成されます。この機能は、README や Wiki ページでは働きませんが、コミット時や他のコメント欄では有効です。</p>
<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh11.png" alt="issueリストへの自動リンク" title="issueリストへの自動リンク" width="512" height="250" class="aligncenter size-full wp-image-1867" />
</p>
</li>
</ul>
</li>
</ul>
<h4 id="ghedit"><span style="font-size:120%; margin-right:8px;">5.</span>プッシュ後にちょっとだけ修正する</h4>
<p>前章までで、Wiki 上で作成したマークダウンがローカル側の README.md にコピペされコミット、GitHub 側のリポジトリにもプッシュされているものとします。その後ちょっと直したい／プレビューも確認したい、という時には、次のように GitHub 上で修正・確認をすることができます。</p>
<ul style="list-style-type:none">
<li><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh12.png" alt="コミット済みのファイルをエディット開始" title="コミット済みのファイルをエディット開始" width="512" height="200" class="aligncenter size-full wp-image-1868" /></li>
<li><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/gh13.png" alt="修正しながらプレビューで確認" title="修正しながらプレビューで確認" width="512" height="200" class="aligncenter size-full wp-image-1869" /></li>
</ul>
<p>最後に <code>git pull</code> で、ローカル・リポジトリの更新も忘れずに。</p>
<h3>速攻追記！</h3>
<p><a href="http://b.hatena.ne.jp/kei-s/">kei-s</a> さんからハテぶ経由で、「よければご利用ください」 というコメントとともに、<q><a href="http://github-preview.herokuapp.com/">Github Preview</a></q> をご紹介いただきました。このツールがまたすばらしい！ GFM と同じ <code>redcarpet</code> を使っていながら、Ajax でリアルタイムなプレビュー機能が実装されていて、作業効率が格段にアップします！ 私は速攻で、ブックマークに叩き込みました。kei-s さん、ありがとうございます！！</p>
<p>ちなみにこの Github Preview で、<q><a href="http://d.hatena.ne.jp/thinca/20110813/1313215131">Github Wiki の Markdown エンジンが腐ってる件について &#8211; 永遠に未完成</a></q> にダメなケースとして挙っているパターンを再現させてみました。<code>bar</code> の先頭にスペースを4つ入れれば、正しく変換されます。私がハマっていたのは、正にこういうバッド・ノウハウ的な所です。詳しくは述べませんでしたが、もちろん冒頭のテンプレートにもこの手のノウハウは投入してあります。皆さんも試してみて下さい！</p>
<p><a href="http://github-preview.herokuapp.com/"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/GithubPreview.png" alt="Github Preview" title="Github Preview" width="512" height="325" class="aligncenter size-full wp-image-1872" /><br />
</a></p>
<h3>脱初心者を目指すなら、最後にもう1つ&#8230;</h3>
<p>個人利用のマークダウンであればどのように書いても自由ですが、GitHub では、いつ誰に fork されてもよいように、1行に記述する文字数にも気を配りましょう。</p>
<p>かつて <a href="http://ja.wikipedia.org/wiki/VT100">VT100</a> のようなキャラクター端末しかなかった時代は、80桁×24行の表示が一般的でした。それゆえドキュメントは1行の文字数が80桁に収まるように記されたものです。1920桁×1440行といった巨大なモニターさえ手に入る現代でも、プレーンなテキストファイルは、横スクロールしなくても読めるようにするのがココロ遣いと言うものでしょう。</p>
<p>「オッ、コイツできるな」 と思われること請け合いです <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  。</p>
<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/11/terminal.png" alt="今も端末エミュレータは80桁×24行" title="今も端末エミュレータは80桁×24行" width="512" height="320" class="aligncenter size-full wp-image-1870" /></p>
<h3>おまけ</h3>
<p>今回の記事を作成するために、マークダウンの本家仕様と方言を幾つか調べていた中で見つけた、興味深い記事を紹介しておきます。本家仕様の曖昧さゆえ、色々とあるようです。</p>
<ul>
<li>2008年6月24日 <a href="http://blog.stackoverflow.com/2008/06/three-markdown-gotcha/">Three Markdown Gotchas</a>
<ul>
<li style="list-style-type:none">
書いた意図と違う変換がなされてしまうパターンが3つ指摘されています。
		</li>
</ul>
</li>
<li>2009年10月15日 <a href="http://blog.stackoverflow.com/2009/10/markdown-one-year-later/">Markdown, One Year Later</a>
<ul>
<li style="list-style-type:none">
本家仕様と GFM や Stack Overflow のマークダウン仕様の違いが述べられています。
		</li>
</ul>
</li>
<li>2009年10月23日 <a href="http://daringfireball.net/linked/2009/10/23/github-flavored-markdown">GitHub Flavored Markdown</a>
<ul>
<li style="list-style-type:none">
John Gruber 本人が、本家仕様と GFM が異なる点を3つほど挙げています。具体的には <q><a href="http://github.github.com/github-flavored-markdown/">GitHub Flavored Markdown &#8211; Introduction</a></q> に記述がありますが、現在の GFM 仕様と多少違う （古い） 部分があるようです。
		</li>
</ul>
</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=vaiRsy5ogPY:jic1pSGcsSA:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=vaiRsy5ogPY:jic1pSGcsSA:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/markdown-skills-for-github-beginners/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/markdown-skills-for-github-beginners/" />
	</item>
		<item>
		<title>jsdo.itの最新マイコードをブログに流すjQueryプラグインdoticker.js</title>
		<link>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/dotickerjs/</link>
		<comments>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/dotickerjs/#comments</comments>
		<pubDate>Wed, 26 Oct 2011 00:47:22 +0000</pubDate>
		<dc:creator>tokkonoPapa</dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://tokkono.cute.coocan.jp/blog/slow/?p=1853</guid>
		<description><![CDATA[Twitter 公式のプロフィールウィジェット のように、jsdo.it で公開したコードをブログでプチ紹介してくれるティッカーのようなものがあればなぁと思い立ち、作りましたので公開したいと思います。Twitter の  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://twitter.com/about/resources/widgets/widget_profile">Twitter 公式のプロフィールウィジェット</a> のように、<a href="http://jsdo.it/">jsdo.it</a> で公開したコードをブログでプチ紹介してくれるティッカーのようなものがあればなぁと思い立ち、作りましたので公開したいと思います。Twitter の JavaScript は、スタンドアロンで動作するようにできていますが、そのソースコードを <a href="http://jsbeautifier.org/">jsbeautifier</a> などで整形すると2000行近くもあり、こんなプログラミングは私にはとても無理です。そこでお手軽に jQuery のプラグインとています。</p>
<p>ほとんど jQuery バージョン 1.0 のルーチンを使っているので、古い jQuery でも動くと思います （1.3.2 までは動作することを確認をしています）。</p>
<p>ブラウザは、IE6 〜 8 (IETesterで）、IE9、Firefox 7、Chrome 15 （いつの間に！）、Safari 5 での動作を確認済みです。</p>
<p>プラグイン本体は、<a href="https://github.com/tokkonopapa/doticker.js" title="tokkonopapa/doticker.js">GitHub</a> に上げました （MIT ライセンス）。良かったら使ってやって下さい。またバグなどの報告は、<a href="https://github.com/tokkonopapa/doticker.js/issues">issues</a> に挙げてもらうと助かります。</p>
<p>また、デモを <a href="http://jsdo.it/tokkonopapa/eep7">jsdo.it</a> に上げてありますので、ご覧ください。本記事では、使い方、オプションの解説と共に、ほんの少し中身についても書いておきますので、カスタマイズの参考にでもして下さい。<br />
<span id="more-1853"></span></p>
<div style="margin-left:70px; width:530px; height:576px;">
<script type="text/javascript" src="http://jsdo.it/blogparts/eep7/js?view=design"></script>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a href="http://jsdo.it/tokkonopapa/eep7" title="jsdo.it my codes ticker jQuery plugin">jsdo.it my codes ticker jQuery plugin &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a></p>
</div>
<h3>How to use ?</h3>
<p>まずはウィジェットをラップするマークアップを書きます。ラッパーとなる要素には、高さを指定しておくのが吉です。</p>
<p>[html]<br />
&lt;div id=&#8221;ticker&#8221; style=&#8221;height:400px&#8221;&gt;&lt;/div&gt;<br />
[/html]</p>
<p>次にウィジェットの起動です。引数には、振る舞いを指定するオプションと、スタイルを設定するオプションを指定します。<code>name</code> 以外のオプションはすべてデフォルト値を持っていますので、必要なものだけを指定すれば OK です。</p>
<p>[javascript]<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;text/javascript&#8221; src=&#8221;doticker.min.js&#8221;&gt;&lt;/script&gt;<br />
&lt;script type=&#8221;text/javascript&#8221;&gt;<br />
$(function() {<br />
	$(&#8221;#ticker&#8221;).doticker({<br />
		// Behavior options<br />
		name: &#8216;tokkonopapa&#8217;,<br />
		loop: true,<br />
		maxCodes: 10,<br />
		interval: 6000,<br />
		scrollbar: false,<br />
		duration: &#8216;normal&#8217;,<br />
		// Style options<br />
		width: &#8216;auto&#8217;,<br />
		height: &#8216;300px&#8217;,<br />
		background: &#8216;#9bc6f2&#8242;,<br />
		bodyground: &#8216;#fff&#8217;,<br />
		bordercolor: &#8216;#888&#8242;<br />
	});<br />
});<br />
&lt;/script&gt;<br />
[/javascript]</p>
<h3>Synopsys</h3>
<dl>
<dt>$(&#8221;#some-element&#8221;).doticker({options, &#8230;})</dt>
<dd>
<p>各オプションの解説です （カッコ内はデフォルト値）。</p>
<dl>
<dt>name [ 必須 ]</dt>
<dd>jsdo.it のユーザー名を指定します。</dd>
<dt>loop [ <code>true</code> ]</dt>
<dd>一定間隔毎に表示を更新する場合には <code>true</code> を、一気に表示させるには <code>false</code> を指定します。</dd>
<dt>maxCodes [ <code>10</code> ]</dt>
<dd>表示するコードの最大数を指定します。</dd>
<dt>interval [ <code>6000</code> ]</dt>
<dd>表示を更新する間隔をミリ秒で指定します。</dd>
<dt>scrollbar [ <code>false</code> ]</dt>
<dd>スクロールバーを表示させる場合には <code>true</code> を指定します。</dd>
<dt>duration [ <code>'slow'</code> ]</dt>
<dd>アニメーションの遷移時間をミリ秒、または <code>'slow'</code>、<code>'normal'</code>、<code>'fast'</code> で指定します。</dd>
<dt>width [ <code>'auto'</code> ]</dt>
<dd>横幅のスタイルを、<code>px</code> または <code>'auto'</code>、<code>'100%'</code> （ラッパー要素の横幅に応じて中央に配置される）で指定します。</dd>
<dt>height [ <code>'300px'</code> ]</dt>
<dd>ウィジェットは上から順にヘッダー （ユーザー名が表示される部分）、ボディー  （コードが紹介される部分）、フッター （jsdo.it へのリンク） の3つのブロックで構成されていますが、そのうちボディー部分の高さを <code>px</code> で指定します。ヘッダーおよびフッターは、横幅に合わせて高さが変わります。</dd>
<dt>background [ <code>'9bc6f2'</code> ]</dt>
<dd>ヘッダー、フッターの背景スタイルを設定します。書式は CSS の <code>background</code> プロパティと同じです。</dd>
<dt>bodyground [ <code>'#fff'</code> ]</dt>
<dd>ボディーの背景スタイルを設定します。書式は <code>background</code> と同じす。</dd>
<dt>bordercolor [ <code>'#888'</code> ]</dt>
<dd>ボディー中の各記事を区切る点線の色を指定します。</dd>
</dl>
</dd>
</dl>
<h3>Plugin description</h3>
<p>基本的には、起動時に1回だけ <a href="http://api.jquery.com/jQuery.ajax/">$.ajax</a> で <a href="http://jsdo.it/apidoc/">jsdo.it の API</a> 経由でコード情報の書かれた jsonp を読み込み、表示をしているだけのスクリプトです。ここではそれ以外の部分についての情報を若干記しておきます。</p>
<h4>スタイルの設定</h4>
<p>外部スタイルシートを設置しなくてよいように、スタイル設定はすべてスクリプトに内蔵しており、下記コードによってページの <code>&lt;head&gt;</code> に <code>&lt;style&gt;</code> として挿入されます。いまどき、<code>&lt;head&gt;</code> のないブログはないと思いますので&#8230;</p>
<p>[html]<br />
var e = document.createElement(&#8217;style&#8217;);<br />
e.type = &#8216;text/css&#8217;;<br />
if (e.styleSheet) {<br />
	e.styleSheet.cssText = s; /* IE */<br />
} else {<br />
	e.innerHTML = s; /* 他のモダンブラウザ */<br />
}<br />
document.getElementsByTagName(&#8221;head&#8221;)[0].appendChild(e);<br />
[/html]</p>
<h4>アニメーションを始める前に&#8230;</h4>
<p>コンテンツをある DOM 要素中に挿入し、アニメーションで表示するコードは次の様なものです。</p>
<p>[javascript]<br />
var e = $(&#8217;#some-element&#8217;);<br />
e.append(contents).hide().slideDown();<br />
[/javascript]</p>
<p>しかし、このコードは場合によってはアニメ開始時と終了時の位置計算が合わずに飛んでしまうことがあります。この問題の回避策として、次のように、要素の高さを予め計算するコードを入れてあります。</p>
<p>[javascript]<br />
var e = $(&#8217;#some-element&#8217;);<br />
e.append(contents).height(e.height()); /* 高さを計算する */<br />
e.hide().slideDown();<br />
[/javascript]</p>
<h5>参考情報</h5>
<ul>
<li><a href="http://blog.pengoworks.com/index.cfm/2009/4/21/Fixing-jQuerys-slideDown-effect-ie-Jumpy-Animation">Fixing jQuery&#8217;s slideDown() effect (i.e. Jumpy Animation)</a></li>
</ul>
<h4>アニメーションの種類</h4>
<p>Twitter 公式ウィジェットのように、スライドダウン後に、フワッとフェードインする効果は、次のコードで出すことができます。</p>
<p>[javascript]<br />
var e = $(&#8217;#some-element&#8217;);<br />
e.height(elem.height()) /* 高さを計算する */<br />
 .hide()<br />
 .css({opacity: 0})<br />
 .slideDown()<br />
 .animate({opacity: 1});<br />
[/javascript]</p>
<p><del>しかし、なぜか IE8 でアニメ終了時に文字の位置が微妙にずれるという現象が出ます。まだ細かな要素のサイズ計算が合っていないのかもしれません。問題が解決するまでは、単純なスライドダウンの実装にとどめておきたいと思います。</del></p>
<p>↑ この問題は、フォントを指定することで解決しました。アニメーションの開始時と終了時で、適用されるフォントスタイルが異なることが問題でした。</p>
<h3>Wish list</h3>
<p>ToDo リストではありません。誰かが fork して実装してくれるのを願いつつ、あったら良いと思うものを記しておきます。よいアイディア （コード） は取り込ませて頂きたいと思います！ （なんと他力本願な <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ）</p>
<ul>
<li><del>滑らかなアニメーション。よく見ると、スライドダウンだけでもまだ飛んでいます。</del> ← アニメーションをさせるブロックの、親要素の <code>padding</code> 分だけ飛んでいましたので、<code>padding</code> がゼロになる様に構成し Fix しました （この問題は、前章で述べている 「高さを計算させる」 問題とは異なります）。</li>
<li><del>更新のインターバルの最中にコンテンツを DOM に挿入し、コードのサンプル画像をプリロードする。次の表示のときに、画像読み込み中のマークが出ないようにする。これがちゃんと機能すれば、アニメーションの問題も解決するかも。</del> ← 更新の毎に無駄な HTTP リクエストを発行しないように修正しました。</li>
<li><a href="http://stefangabos.ro/jquery/jquery-plugin-boilerplate/">jQuery Plugin Boilerplate</a> を参考に、ビシッとしたプラグインにする。</li>
<li>人気順にコードを表示する機能なんかあったら良いと思いません？ でもこれはサーバーサイドでやった方が良いかもしれませんネ。WordPress のプラグインとか。</li>
</ul>
<h3>変更履歴</h3>
<dl>
<dt>2011年10月26日 v0.9.0</dt>
<dd>初版公開。</dd>
<dt>2011年10月27日 v0.9.1</dt>
<dd>滑らかなアニメーションのために、CSS の構成を変更しました。</dd>
<dt>2011年10月28日 v0.9.2</dt>
<dd>アニメーション終了時にボーダーが消える問題を修正しました。</dd>
<dt>2011年10月29日 v1.0.0</dt>
<dd>キャプチャ画像のプリロードに対応しました。</dd>
<dt>2011年11月3日 v1.0.1</dt>
<dd>IE8 と SyntaxHightlighter の組み合わせで起きる 「オブジェクトでサポートされていないプロパティまたはメソッドです」 のエラーを回避するため、<code>opacity</code> によるフェードイン効果を止めました。</dd>
</dl>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=We7ODjnO4wM:LRs0usUl2Pg:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=We7ODjnO4wM:LRs0usUl2Pg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/dotickerjs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/programming/dotickerjs/" />
	</item>
		<item>
		<title>IPアドレスからアクセス元サーバーの位置情報を調べるjQueryプラグイン</title>
		<link>http://tokkono.cute.coocan.jp/blog/slow/index.php/bbs-spam/ip-geolocation-jquery-plugin/</link>
		<comments>http://tokkono.cute.coocan.jp/blog/slow/index.php/bbs-spam/ip-geolocation-jquery-plugin/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 17:16:30 +0000</pubDate>
		<dc:creator>tokkonoPapa</dc:creator>
				<category><![CDATA[掲示板スパム]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[web service]]></category>

		<guid isPermaLink="false">http://tokkono.cute.coocan.jp/blog/slow/?p=1851</guid>
		<description><![CDATA[
2000年代前半、荒らし や 掲示板スパム に悩まされていた頃、JPNIC やら RIPE やらの WHOIS データベースで IP アドレスの出所を調べ、「また関西からだよ」 とか 「お、役所からだゾ、串刺されてんの [...]]]></description>
			<content:encoded><![CDATA[<p>
2000年代前半、<q>荒らし</q> や <q>掲示板スパム</q> に悩まされていた頃、<a href="http://www.nic.ad.jp/">JPNIC</a> やら <a href="https://www.ripe.net/">RIPE</a> やらの WHOIS データベースで IP アドレスの出所を調べ、「また関西からだよ」 とか 「お、役所からだゾ、串刺されてんのかな」 とかやっていたわけですが、アクセス元を調べたところで結局のところ IP を弾くイタチゴッコを続けていたものでした。当時は、WHOIS にわざわざ <q>アドレスをコピペしてクリック</q> じゃなく、自サイトからオンラインで調べられたら便利だなぁと思っていました。
</p>
<p>
さて今もそんなニーズがあるのかわかりませんが、<a href="http://plugins.jquery.com/">jQuery Plugins</a> にそんな思いを実現してくれる <a href="http://plugins.jquery.com/project/jqIpLocation">jqIpLocation</a> というプラグインが紹介されていたので、試してみました。
</p>
<p>
実はこのプラグイン、<a href="http://ipinfodb.com/">IPInfoDB</a> が無料で提供する DB サービスを利用して、IP アドレスからアクセスポイントの位置情報を引っ張ってきます。他にも同様のサービスがありましたので、そういった情報も共有してみたいと思います。
</p>
<p><span id="more-1851"></span></p>
<h3><a href="http://jquery-plugins.net/jqIpLocation/jqIpLocation.html">jqIpLocation</a></h3>
<p>
IP アドレスを指定すると、IPInfoDB の DB から <code><a href="http://api.jquery.com/jQuery.getJSON/">$.getJSON()</a></code> で国情報、国コード、都市名、地域名、緯度経度を引っ張ってくる簡単なラッパーとなっています。<a href="http://jquery-plugins.net/jqIpLocation/jqIpLocation_demo.html">本家のデモ</a> もあるのですが、（jQuery 1.5 から） <code>$.getJSON()</code> は <a href="http://api.jquery.com/jQuery.ajax/#jqXHR">jqXHR オブジェクト</a> を <a href="http://api.jquery.com/category/deferred-object/">Deferred オブジェクト</a> でラップして返すので、これを活用したサンプルを作ってみました。
</p>
<div style="margin-left:70px; width:530px; height:576px;">
<script type="text/javascript" src="http://jsdo.it/blogparts/tbfM/js?view=design"></script>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a href="http://jsdo.it/tokkonopapa/tbfM" title="IPアドレスから所在地を調べるjQueryプラグイン">IPアドレスから所在地を調べるjQueryプラグイン &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a></p>
<div style="margin-left:70px; width:530px; height:576px;">
<h3><a href="http://ipinfodb.com/">IPInfoDB</a></h3>
<p>
IP アドレスと位置情報の DB を元に、有料・無料のサービスを展開している会社です。アクセス元の国を指定してブロック丸ごとブロックする <code>.htaccess</code> の生成サービス、クレジットカードの不正利用をチェックする API などもあります。
</p>
<p>
先の jqIpLocation はこれらのうち、簡易的な位置情報を調べる無料の API を利用しています。この API には、利用する上で次のような注意事項があります。
</p>
<ul style="margin-left: 20px;">
<li>API を利用するためにはキーが必要で、無料のアカウントを登録することで取得できます。jqIpLocation では、作者が取得したであろうキーが埋め込まれています （先の jsdo.it の例は、これとは別に新たにキーを取得しています）。</li>
<li>1度に大量のリクエストは処理できません。1秒間に処理されるリクエストは2つまでで、それ以上はキューに溜められ、1秒に1つずつ処理されます。</li>
</ul>
<p>
今回は JavaScript から利用しましたが、他にも Ruby や Python の使用例や <a href="http://wordpress.org/extend/plugins/ip-intelligence/">WordPress 用プラグイン</a> なども公開されています。詳しくは <q><a href="http://ipinfodb.com/ip_location_api.php">IP Location API</a></q> を参照してください。
</p>
<h3><a href="http://www.maxmind.com/">MaxMind</a></h3>
<p>
<a href="http://www.maxmind.com/app/ip-location">GeoIP</a> という類似のサービスを提供している会社ですが、直接オンラインで利用するタイプではなく、サーバーにインストールして使う <a href="http://www.maxmind.com/app/perl">Perl</a> や <a href="http://www.maxmind.com/app/php">PHP</a>、<a href="http://www.maxmind.com/app/mod_geoip">Apache</a> 用のモジュールと、簡易的な位置情報を記録した DB が公開されています。Perl 用モジュール、PHP 用モジュールはそれぞれ <a href="http://www.maxmind.com/app/c">C ライブラリ</a> の利用でさらに高速実行が可能となります。
</p>
<p>
注意事項ですが、これらの無料版を利用したページを公開する場合には、「This product includes GeoLite data created by MaxMind, available from <a href="http://www.maxmind.com/">http://www.maxmind.com/</a>」 のクレジットを表示しなければなりません。
</p>
<p>
とりあえず私は Pure PHP 版と DB をダウンロードし試用してみましたが、IPInfoDB と若干異なる結果が得られる場合がありました。どちらが正しいのかは分かりません&#8230;
</p>
<h4>Pure PHP版の利用手順</h4>
<p>
<a href="http://geolite.maxmind.com/download/geoip/api/php/">Pure PHP版のフォルダ</a> から以下をダウンロードし、適当なフォルダに格納します。
</p>
<ul style="margin-left: 20px;">
<li><a href="http://geolite.maxmind.com/download/geoip/api/php/geoip.inc">geoip.inc</a></li>
<li><a href="http://geolite.maxmind.com/download/geoip/api/php/geoipcity.inc">geoipcity.inc</a></li>
<li><a href="http://geolite.maxmind.com/download/geoip/api/php/geoipregionvars.php">geoipregionvars.php</a></li>
<li><a href="http://geolite.maxmind.com/download/geoip/api/php/sample_city.php">sample_city.php</a></li>
</ul>
<p>
また、<a href="http://geolite.maxmind.com/download/geoip/database/">DB フォルダ</a> から <a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz">GeoLiteCity.dat.gz</a> をダウンロードし、先のフォルダに解凍します。
</p>
<p>
次に sample_city.php を開き、（CGI として実行されるのでなければ） 先頭の <q><code>#!/usr/bin/php -q</code></q> を削除、また <code>geoip_open()</code> に指定されている DB を <code>'GeoLiteCity.dat'</code> に書き換えます。
</p>
<p>
最後に <code>geoip_record_by_addr()</code> に指定されているサンプルの IP アドレスを適当に設定し （例えば PHP のサーバー変数 <code>$_SERVER["REMOTE_ADDR"]</code> など）、サーバーにアップロード、sample_city.php にアクセスして次のように表示されれば成功です。
</p>
<blockquote><p>
US USA United States NY New York Binghamton 42.1393 -75.8798 502 607 NA
</p></blockquote>
<p>
サーバーへのインストール方法は、<q><a href="http://www.phppro.jp/phptips/archives/vol52/2">IPアドレスから所在地探し &#8211; PHPプロ！TIPS+</a></q> にも説明がありますので、参考にしてください。
</p>
<h3>その他</h3>
<p>
ブラウザベースのオンラインツールになってしまいますが、参考記事を拾ってみました。
</p>
<ul>
<li><a href="http://gigazine.net/news/20070413_myipaddress/">IPアドレスから住所を割り出して地図表示するサービスいろいろ</a></li>
<li><a href="http://q.hatena.ne.jp/1228877108">whoisの情報から取得できる情報を秀逸なビジュアルで結果表示するオンライン検索サイトがあったと思うのですが、見つかりません。どなたか探していただけませんでしょうか。</a></li>
</ul>
</div>
</div>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=eweqcPhkvnI:jcwNAM6CZ0o:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=eweqcPhkvnI:jcwNAM6CZ0o:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://tokkono.cute.coocan.jp/blog/slow/index.php/bbs-spam/ip-geolocation-jquery-plugin/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/bbs-spam/ip-geolocation-jquery-plugin/" />
	</item>
		<item>
		<title>CCV.jsで顔検出</title>
		<link>http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/face-detection-using-ccvjs/</link>
		<comments>http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/face-detection-using-ccvjs/#comments</comments>
		<pubDate>Thu, 29 Sep 2011 04:31:35 +0000</pubDate>
		<dc:creator>tokkonoPapa</dc:creator>
				<category><![CDATA[Webテクノロジ]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[review]]></category>

		<guid isPermaLink="false">http://tokkono.cute.coocan.jp/blog/slow/?p=1844</guid>
		<description><![CDATA[
CCV.js （C-based Computer Vision Library） は、オープンソースな画像処理ライブラリ OpenCV の純粋なアルゴリズム部分を一部 JavaScript に移植したライブラリです。し [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/09/face-detection.jpg" alt="Face Detection Using CCV.js" title="Face Detection Using CCV.js" width="512" height="256" class="aligncenter size-full wp-image-1848" /></p>
<p><a href="https://github.com/liuliu/ccv">CCV.js （C-based Computer Vision Library）</a> は、オープンソースな画像処理ライブラリ <a href="http://opencv.jp/">OpenCV</a> の純粋なアルゴリズム部分を一部 JavaScript に移植したライブラリです。しかも元のライブラリではかなりの仮想化・階層化されていた画像処理用メモリ管理部分を簡素化し、Canvas で扱えるようにしてありますので、現在のモダンブラウザでも動作する軽量なライブラリとなっています。</p>
<p>ライブラリとはいうものの、現時点はまだ物体検出のアルゴリズムしか移植されていないようなのですが、顔検出のサンプルがありましたので試してみました。<br />
<span id="more-1844"></span></p>
<h3>サンプル</h3>
<div style="margin-left:70px; width:530px; height:576px;">
<script type="text/javascript" src="http://jsdo.it/blogparts/yvzY/js?view=design"></script>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a href="http://jsdo.it/tokkonopapa/yvzY" title="CCV.jsで顔検出">CCV.jsで顔検出 &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a></p>
</div>
<h3>JavaScriptライブラリの中身</h3>
<p>ccv を GitHub から落とすと、<code>js</code> ディレクトリに顔検出のサンプルが入っています。ccv.js には Canvas を画像処理用メモリとして扱うためのコア部分と、物体検出処理を呼び出すための API が実装されています。また軽量とはいえ、画像が大きくなるとそれなりに処理時間がかかるため、Web Worker で処理させるための API もあります。</p>
<p>顔検出部分は face.js に実装されていますが、プログラムというよりパラメータの固まりです。というのも、物体検出としていわゆる <q>機械学習</q> のアルゴリズムが用いられており、face.js は顔検出用に学習されたパラメータのセットとなっているからです。</p>
<p>とはいえ、OpenCV の顔検出用サンプルコードに添付されている学習済みパラメータセット haarcascade_frontalface_default.xml とも中身が異なるので、アルゴリズムが違うのかもしれません （詳しい方にフォローして頂けると助かります <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ）。</p>
<p>ただし、世の中ではあたかも JavaScript による顔検出がすぐに使える、完成した技術として紹介されている気がしてなりません（本エントリーもそのように受け止められるかもしれません） が、OpenCV に添付されている学習セットは正面を向いた顔用の単なるサンプルに過ぎませんし、事実 CCV.js も、どんな顔でも検出できると言うわけではなく、かなり限定された性能を示します。</p>
<p>いずれにしても物体検出の性能はこの 「学習」 の過程にかなり依存しますので、今後、強化された学習セットや、車や人を検出する学習セット、あるいは笑顔や我が子を検出する学習セットなどが出現してくれば、Web アプリケーションの幅がさらに広がる、そんな可能性を秘めているのではないかと思います。</p>
<h3>応用</h3>
<p><a href="http://wesbos.com/html5-video-face-detection-canvas-javascript/" title="JavaScript Face Detection + Canvas + Video = HTML5 Glasses!"><img src="http://tokkono.cute.coocan.jp/blog/slow/wp-content/uploads/2011/09/html5-glasses.jpg" alt="顔検出で遊んじゃおう！" title="顔検出で遊んじゃおう！" width="250" height="400" class="alignright size-full wp-image-1847" /></a></p>
<p>Canvas で画像処理が出来るのなら、HTML5/Video タグから映像を Canvas に取り込んでリアルタイムに顔検出して、さらに遊んじゃおうという強者がいましたので、紹介します。</p>
<p>Video から映像データを Canvas に取り込むスクリプトは、本サイトの記事 「<a href="http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/ambilight-jquery-plugin-for-canvas-video/">Canvasを使ったグロー効果が幻想的!!HTML5/Videoタグ用jQuery Plugin</a>」 でも紹介した通りそれほど難しくはありませんし、顔の検出結果を赤枠で囲う代わりにヒゲメガネをオーバーレイしただけの他愛もないものですが、「変装できるビデオチャット」 なんてアプリもまた一興かと思います <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  。</p>
<p>作者は将来、ビデオストリームをリアルタイムで処理するソフトを作ると言っているので、そのうちそんなアプリにお目にかかれるかもしれませんネ <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  。</p>
<h3 class="clear">参考情報</h3>
<p>OpenCV の顔検出はかなり有名で、ちょっと検索すれば優れたリソースを多数見つけることが出来きます。ここでは本記事で紹介した文脈につながり、かつ分かり易く解説してくれている情報を掲載しておきます。</p>
<ul>
<li><a href="http://gihyo.jp/dev/feature/01/opencv/0003">OpenCVで学ぶ画像認識：第3回　オブジェクト検出してみよう｜gihyo.jp … 技術評論社</a></li>
<li><a href="http://opencv.jp/sample/object_detection.html">opencv.jp &#8211; OpenCV: 物体検出（Object Detection）サンプルコード -</a></li>
<li><a href="http://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0">ブースティング &#8211; Wikipedia</a></li>
</ul>
<h4>追記</h4>
<p>今気づいたんですが、このネタって１年ぐらい前に話題になった <a href="http://badassjs.com/">Badass JavaScript</a> の <cite><a href="http://badassjs.com/post/1461943420/face-detection-in-javascript-via-html5-canvas">Face Detection in JavaScript via HTML5 Canvas</a></cite> と同じだったんですネ。当時はライブラリへのリンクが切れていたので、てっきり別物かと思ってしまいました。既出ネタですみません <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  。</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=8cem1YeIkDA:mofaYcQSW54:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=8cem1YeIkDA:mofaYcQSW54:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/face-detection-using-ccvjs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/web-technology/face-detection-using-ccvjs/" />
	</item>
		<item>
		<title>意外と要注意 HTML5データ属性とjQuery Data APIの関係まとめ</title>
		<link>http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/html5-data-attributes-vs-jquery-data-api/</link>
		<comments>http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/html5-data-attributes-vs-jquery-data-api/#comments</comments>
		<pubDate>Tue, 06 Sep 2011 22:57:11 +0000</pubDate>
		<dc:creator>tokkonoPapa</dc:creator>
				<category><![CDATA[XHTML/CSS]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://tokkono.cute.coocan.jp/blog/slow/?p=1841</guid>
		<description><![CDATA[前の記事「HTML5でモダンブラウザのCSS3バグを回避するためのハック方法」に関連して、HTML5 データ属性にユーザーエジェントを格納するスクリプトに jQuery を使う方法を調べていました。その結果、ちょっと整理 [...]]]></description>
			<content:encoded><![CDATA[<p>前の記事「<a href="http://tokkono.cute.coocan.jp/blog/slow/index.php/web-design/css3-hack-for-html5-modern-browsers/">HTML5でモダンブラウザのCSS3バグを回避するためのハック方法</a>」に関連して、HTML5 データ属性にユーザーエジェントを格納するスクリプトに jQuery を使う方法を調べていました。その結果、ちょっと整理をしておいた方が良いかなと思う点を共有したいと思います。</p>
<p>ご存知の方も多いと思いますが、jQuery には <code>.data()</code> や <code>jQuery.data()</code> という、DOM 要素に <q>データ</q> を紐付けて記憶しておく仕組みが元々ありました。jQuery 1.4.3 からは、 API レベルでの <q>親和性</q> が考慮された形で HTML5 <code>data-*</code> 属性を取り込む仕様が導入されました。</p>
<p>HTML5 時代では、クライアント・サイドで実行されるコード量も増え、データ属性を扱う機会もちょくちょく出てくるのではないでしょうか。そこで今回は、</p>
<ol style="margin-left:20px">
<li>HTML5 data-* 属性のおさらい</li>
<li>jQuery Data API の経緯</li>
<li>jQuery Data API と HTML5 data-* 属性の共通点と違いまとめ</li>
</ol>
<p>といった順にまとめておきたいと思います。<br />
<span id="more-1841"></span></p>
<h3><span style="font-size: 160%; padding-right: 8px;">1.</span>HTML5 data-* 属性のおさらい</h3>
<p><a href="http://www.w3.org/TR/html5/elements.html#embedding-custom-non-visible-data-with-the-data-attributes" title="3.2.3.8 Embedding custom non-visible data with the data-* attributes">W3C ドラフト</a> で、ポイントとなる仕様は次の2つでしょう。</p>
<ul>
<li><code>data-*</code> 属性は HTML 要素中の <code>id</code> や <code>title</code>、<code>class</code> といったグローバル属性中の、カスタム属性に位置づけられます。従って <q><code>*</code></q> に使える文字は HTML 要素の定義に準じます。（<a href="#caution1841">注</a>）</li>
<li>JavaScript から DOM 要素を通してアクセスする方法は次の2通りです。
<ul>
<li>Attribute 関連の関数によるアクセス&nbsp;：&nbsp;<a href="https://developer.mozilla.org/ja/DOM/element.getAttribute"><code>getAttribute()</code></a>、<a href="https://developer.mozilla.org/ja/DOM/element.setAttribute"><code>setAttribute()</code></a>、<a href="https://developer.mozilla.org/ja/DOM/element.hasAttribute"><code>hasAttribute()</code></a> 等に、属性名をそのまま文字列として指定します。</li>
<li><code>dataset</code> <a href="http://suika.fam.cx/~wakaba/wiki/sw/n/IDL%20attribute">IDL 属性</a> によるアクセス&nbsp;：&nbsp;先頭の <q><code>data-</code></q> を取り除き、<q><code>-</code></q>（ハイフン）で分割した単語をキャメル・ケース化（先頭文字を大文字に）してつなげ、<code>dataset</code> の子要素としてアクセスします。</li>
</ul>
</li>
</ul>
<p style="margin-left:20px" id="caution1841">
<strong>注&nbsp;：&nbsp;</strong>正確には <q><code>:</code></q>（セミコロン）と英大文字を除く <a href="http://www.w3.org/TR/html5/infrastructure.html#xml-compatible" title="2 Common infrastructure - HTML5">XML-compatible</a>、かつ最初の3文字が <q><code>xml</code></q> であってはならないというのが定義です。<q><a href="http://www.w3.org/TR/REC-xml/#NT-Name" title="Extensible Markup Language (XML) 1.0">XML-compatible な文字</a></q> とは、先頭が英文字または <q><code>_</code></q>（アンダースコア）で始まり、2文字目以降が <q><code>-</code></q>（ハイフン）と <q><code>.</code></q>（ピリオド）を含む英数字 （さらにいくつかの <a href="http://ja.wikipedia.org/wiki/Unicode">Unicode文字</a> を含む） です。ただし <q><code>.</code></q>（ピリオド）を含めてしまうと、<code>dataset</code> を介した際におかしくなるので、やめた方が良いでしょう。</p>
<h4>具体例</h4>
<p>次の様な HTML に対し、</p>
<p>[html]<br />
&lt;div id=&#8217;test&#8217; data-foo-bar=&#8217;hoge&#8217;&gt;&lt;/div&gt;<br />
[/html]</p>
<p>データ属性にアクセスする方法は以下の通りです。</p>
<p>[javascript]<br />
var e = document.getElementById(&#8217;test&#8217;);<br />
console.log(e.getAttribute(&#8217;data-foo-bar&#8217;));<br />
console.log(e.dataset.fooBar);<br />
[/javascript]</p>
<p>う～ん、キャメル・ケース化とかややこしいですよネ。HTML 要素の定義と DOM 要素の定義の両面を満足させる、苦肉の策って感じです <img src='http://tokkono.cute.coocan.jp/blog/slow/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  。</p>
<h3><span style="font-size: 160%; padding-right: 8px;">2.</span>jQuery Data API の経緯</h3>
<p>2008年2月7日、<a href="http://docs.jquery.com/Release:jQuery_1.2.3">jQuery 1.2.3</a> で初めて <a href="http://api.jquery.com/jQuery.data/"><code>jQuery.data()</code></a> および <a href="http://api.jquery.com/data/"><code>jQuery.fn.data()</code></a> が公開されました。DOM 要素に <q>何らかのデータ</q> を紐付たいというニーズは昔からあったのでしょう。キーとオブジェクト （文字列、数値、配列、関数など） をペアにして、特定の DOM に紐付ることができます。そもそもは、（文法的には間違いだが） HTML 要素の何かしらの不可視属性に （文字列の） データを埋め込こんだとき、うかつに DOM を操作すると IE がメモリー・リークを起こすという不具合があったため、jQuery で DOM を操作している限りはそういった問題が起きないようにするためだったようです。</p>
<p>さらに <a href="http://blog.jquery.com/2010/10/16/jquery-143-released/">jQuery 1.4.3</a> では、HTML5 data-* 属性の属性名をキーとして指定すると、その属性値を jQuery 内のキャッシュに <q>オブジェクトとしてコピーする</q> という仕様が取り入れられました。例えば</p>
<p>[html]<br />
&lt;div data-text=&#8217;hoge&#8217; data-boolean=&#8217;true&#8217; data-object-value=&#8217;{&#8221;name&#8221;:&#8221;John&#8221;}&#8217;&gt;&lt;/div&gt;<br />
[/html]</p>
<p>に対し、次が成立します。</p>
<p>[javascript]<br />
$(&#8217;div&#8217;).data(&#8217;text&#8217;) === &#8216;hoge&#8217;;<br />
$(&#8217;div&#8217;).data(&#8217;boolean&#8217;) === true;<br />
$(&#8217;div&#8217;).data(&#8217;objectValue&#8217;).name === &#8216;John&#8217;;<br />
$(&#8217;div&#8217;).data(&#8217;object-value&#8217;).name === &#8216;John&#8217;; // この書式はHTML5と違う<br />
[/javascript]</p>
<p>つまり、<code>dataset</code> を介してアクセスする時のルールとほぼ同じです （<a href="http://bugs.jquery.com/ticket/7328" title="Ticket #7328">キャメル・ケースの仕様が正しく実装された</a> のは <a href="http://blog.jquery.com/2011/05/03/jquery-16-released/">jQuery 1.6</a> からです）。</p>
<p>気を付けるべきは、一旦コピーされた HTML5 データ属性は、元の値 （こちらは単なる文字列で、相変わらず HTML 要素上に存在しています） とは独立に評価され、それぞれの型を持つオブジェクトになるという点です。つまり、</p>
<p>[html]<br />
&lt;div data-value=&#8217;1e3&#8242;&gt;&lt;/div&gt;<br />
[/html]</p>
<p>に対しては、<q>1e3</q> が浮動小数点として評価されることになります。</p>
<p>[javascript]<br />
console.log(typeof $(&#8217;div&#8217;).data(&#8217;value&#8217;)); // &#8216;number&#8217;<br />
[/javascript]</p>
<p>もしコピーされたキャッシュではなく、元のデータ属性自体にアクセスしたいのであれば、<a href="http://api.jquery.com/attr/"><code>jQuery.fn.attr()</code></a> を使う必要があります （結果は文字列となります）。使い方は、ネイティブな関数 <code>getAttribute()</code>、<code>setAttribute()</code> などと同様です。 </p>
<h3><span style="font-size: 160%; padding-right: 8px;">3.</span>jQuery Data API と HTML5 data-* 属性の共通点と違いまとめ</h3>
<p>それぞれに都合や経緯があるのは <a href="http://www.weblio.jp/content/%E8%87%B4%E3%81%97%E6%96%B9%E3%81%AA%E3%81%84">致し方ない</a> ことですが、意識した上でなるべく混乱のないように使うべきです。もっとも、割り切って両者は違うものと考えるのも手ですが&#8230;。</p>
<h4>共通点</h4>
<p>はっきり言って HTML 要素から data-* 属性の値を読み出す時のルールだけです。</p>
<p>[html]<br />
&lt;div id=&#8217;test&#8217; data-foo-bar=&#8217;hoge&#8217;&gt;&lt;/div&gt;<br />
[/html]</p>
<p>[javascript]<br />
var p = document.getElementById(&#8217;test&#8217;);<br />
var q = $(&#8217;#test&#8217;);<br />
console.log(p.getAttribute(&#8217;data-foo-bar&#8217;));<br />
console.log(q.attr(&#8217;data-foo-bar&#8217;));<br />
console.log(p.dataset.fooBar);<br />
console.log(q.data(&#8217;fooBar&#8217;));<br />
[/javascript]</p>
<h4>相違点</h4>
<p>データを紐付ける対象が違うってことと、jQuery の場合、データ属性への最初のアクセス以降は、HTML （あるいは DOM） 要素とは独立に jQuery 内部にデータを格納するってところが最大のポイントだと思います。</p>
<table style="margin-left: auto; margin-right: auto;">
<caption>HTML5 データ属性と jQuery Data API との相違点</caption>
<thead>
<tr>
<th></th>
<th>HTML5 data-*</th>
<th>jQuery Data API</th>
</tr>
</thead>
<tbody>
<tr>
<th>紐付けの対象</th>
<td>HTML 要素</td>
<td>DOM 要素</td>
</tr>
<tr>
<th>データの格納先</th>
<td>HTML （DOM） 要素</td>
<td>jQuery 内部</td>
</tr>
<tr>
<th>データの形式</th>
<td>文字列</td>
<td>オブジェクト</td>
</tr>
</tbody>
</table>
<h4>属性名の命名規則について</h4>
<p>HTML5 データ属性名にどんな文字が使えるか、幾つかのパターンを試してみました。その結果、混乱をなくすためには</p>
<blockquote><p>
アルファベット小文字で始まり、アルファベット小文字と数字からなる文字列を <q>-</q> （ハイフン） でつなげる
</p></blockquote>
<p>がよろしいかと思います （要は、小文字の変数名をハイフンでつなげるって感じ）。</p>
<p>参考までに <a href="http://jsdo.it/tokkonopapa/aFbm">jsdo.it で試したスクリプト</a> を置いておきます。あるタグに W3C の定義に則った data-* カスタム属性を定義し、それぞれの方法で読み出します。スクリプトのいい加減さは、ご勘弁を。</p>
<div style="margin-left:70px; width:530px; height:576px;">
<script type="text/javascript" src="http://jsdo.it/blogparts/aFbm/js?view=design"></script>
<p class="ttlBpJsdoit" style="width: 465px; margin: 0; text-align: right; font-size: 11px;"><a href="http://jsdo.it/tokkonopapa/aFbm" title="HTML5 data-* VS jQuery Data API">HTML5 data-* VS jQuery Data API &#8211; jsdo.it &#8211; share JavaScript, HTML5 and CSS</a></p>
</div>
<h3>参考情報</h3>
<ul>
<li><a href="http://www.w3.org/TR/html5/elements.html#embedding-custom-non-visible-data-with-the-data-attributes">Embedding custom non-visible data with the data-* attributes</a>
<ul style="list-style-type:none">
<li>W3C の HTML5 data-* 属性のドラフトです。</li>
</ul>
</li>
<li><a href="http://api.jquery.com/data/">.data() &#8211; jQuery API</a>
<ul style="list-style-type:none">
<li>jQuery Data API のマニュアルです。</li>
</ul>
</li>
<li><a href="http://api.jquery.com/jQuery.data/">jQuery.data() &#8211; jQuery API</a>
<ul style="list-style-type:none">
<li>jQuery Data API のマニュアルです。<code>.data()</code> に対しては、下位関数の位置づけですが、その分高速に動作します。</li>
</ul>
</li>
<li><a href="http://www.learningjquery.com/2011/09/using-jquerys-data-apis">2011年9月2日 Using jQuery&#8217;s Data APIs</a>
<ul style="list-style-type:none">
<li>jQuery Data API と HTML5 data-* 属性の違いや <q>混乱を防ぐためのシンプルなルール</q> を解説してくれています。</li>
</ul>
</li>
<li><a href="http://www.ibm.com/developerworks/jp/web/library/wa-domjquery/">2011年2月22日 jQuery を使用し、DOM に基づいてデータを格納、取得する</a>
<ul style="list-style-type:none">
<li>私のこのエントリーがなくても、コレを読めば全てわかる、ってぐらいの記事です。</li>
</ul>
</li>
</ul>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=4yIGBrcYysI:ALh8Eb14J0I:bcOpcFrp8Mo"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=bcOpcFrp8Mo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/coocan/xwaf?a=4yIGBrcYysI:ALh8Eb14J0I:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/coocan/xwaf?d=qj6IDK7rITs" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/html5-data-attributes-vs-jquery-data-api/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://tokkono.cute.coocan.jp/blog/slow/index.php/xhtmlcss/html5-data-attributes-vs-jquery-data-api/" />
	</item>
	</channel>
</rss><!-- Dynamic page generated in 1.529 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-02-24 22:47:29 --><!-- Compression = gzip -->

