<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	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/"
	>

<channel>
	<title>Ajax &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/ajax/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Sun, 15 Dec 2013 01:18:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>&#034;Pjax&#034; &#8211; Alphabetical Advent Calendar 2013</title>
		<link>https://blog.mach3.jp/2013/12/15/jaac2013-p-pjax.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sun, 15 Dec 2013 01:18:38 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Advent Calendar 2013]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[History]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Pjax]]></category>
		<category><![CDATA[pushState]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3736</guid>

					<description><![CDATA[&#8220;P&#8221; は Pjax の &#8220;P&#8221;。 Pjax Pjax とは、pushState + Ajax から作られた言葉で、 History の pushState メソッドでUR [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>&#8220;P&#8221; は Pjax の &#8220;P&#8221;。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-rG5GncLn5AI/UqR4kF1SVpI/AAAAAAAACYg/65EXIw2yj30/s400/ac2013-p.png" alt="P"/></figure>



<p></p>



<span id="more-3736"></span>



<h2 class="wp-block-heading">Pjax</h2>



<p><strong>Pjax</strong> とは、<strong>pushState</strong> + <strong>Ajax</strong> から作られた言葉で、 History の <strong>pushState</strong> メソッドでURLを管理しつつ、 コンテンツの遷移を Ajax を使って行う手法です。</p>



<p>おおまかな流れはこのような感じ。</p>



<ol class="wp-block-list">
<li>ページ内のリンクをクリックした時にページ遷移を行わずに、 対象のHTMLファイルの内容を Ajax で取得します。</li>



<li>取得に成功したら <strong>History.pushState</strong> でURLを変更して履歴に追加します。</li>



<li>ファイルの内容から必要なコンテンツ部分を抽出して、コンテンツのコンテナに流し込みます。</li>
</ol>



<p>ページごと遷移しない為余計な部分の再描画が必要なく、 遷移時に好みのエフェクトをかけられる点などが特徴です。 また、サイト全体に共通にかかるような JavaScript などの処理をページ移動毎に行わなくて済む為、 高速化にも一役かっています。</p>



<p>その実用性についてはこちらにまとまっていましたので、ご参考までに。</p>



<ul class="wp-block-list">
<li><a href="http://d.hatena.ne.jp/fatwebstudy/20131015/1381780122">pjaxの実用性 &#8211; fatのWEB開発メモ</a></li>
</ul>



<h2 class="wp-block-heading">Pjax コンテンツを習作してみる</h2>



<p>実装の仕方は様々あると思いますが、ここで一例習作してみましょう。 （例をシンプルにする為にjQueryを使用します）</p>



<h3 class="wp-block-heading">HTML構造を共通化する</h3>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"navi"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/"</span> <span class="hljs-attr">data-pjax</span>&gt;</span>Home<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/foo.html"</span> <span class="hljs-attr">data-pjax</span>&gt;</span>Foo<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/bar.html"</span> <span class="hljs-attr">data-pjax</span>&gt;</span>Bar<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">li</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">a</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"/baz.html"</span> <span class="hljs-attr">data-pjax</span>&gt;</span>Baz<span class="hljs-tag">&lt;/<span class="hljs-name">a</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">li</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"content"</span>&gt;</span>
    <span class="hljs-comment">&lt;!-- ここの内容を差し替えます --&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Hello, Pjax<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></span></pre>


<p>まずこのようなHTMLを想定します。 上のナビゲーション部分のリンクをクリックすると Ajax でリンク先のHTMLファイルを取得し、 <strong>#content</strong> の内容を差し替えます。</p>



<p>HTMLの構造は、遷移元・遷移先共に共通にしておきましょう。 例えば下のコードは Foo をクリックした時に表示する為の <strong>foo.html</strong> です。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-comment">&lt;!-- foo.html --&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Page Foo<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>
...
<span class="hljs-tag">&lt;<span class="hljs-name">ul</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"navi"</span>&gt;</span>...<span class="hljs-tag">&lt;/<span class="hljs-name">ul</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"content"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">h1</span>&gt;</span>Foo<span class="hljs-tag">&lt;/<span class="hljs-name">h1</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">p</span>&gt;</span>Lorem ipsum ...<span class="hljs-tag">&lt;/<span class="hljs-name">p</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
</code></span></pre>


<h3 class="wp-block-heading">pushState のサポートをチェックする</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">if</span>(! history.pushState || ! history.replaceState){
    <span class="hljs-keyword">return</span>;
}
</code></span></pre>


<p>この例では <strong>pushState</strong> / <strong>replaceState</strong> 共に実装されていなければ正常に動かないので、 サポートしていない環境では以降の処理をスキップし、そのままネイティブの機能でページを移動してもらいます。</p>



<h3 class="wp-block-heading">リンクの制御</h3>



<p>クリックの制御は <strong>イベントのバブリング</strong> を利用して <strong>document</strong> にて行う事にします。 これならば、コンテンツ部分に新たに生成されるリンクも制御できます。 Pjax で遷移するリンクを明示する為に、ここでは <strong>data-pjax</strong> 属性を使用しています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-built_in">document</span>).on(<span class="hljs-string">"click"</span>, <span class="hljs-string">"&#91;data-pjax]"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    e.preventDefault();
    <span class="hljs-keyword">var</span> href = e.currentTarget.href;
    $.<span class="hljs-keyword">get</span>(href, function(html, status, xhr){
        <span class="hljs-comment">// コンテンツを更新する</span>
        updateContent(html);
        <span class="hljs-comment">// 履歴に追加する</span>
        history.pushState({<span class="hljs-attr">url</span>: href, <span class="hljs-attr">html</span>: html}, <span class="hljs-string">""</span>, href);
    }, <span class="hljs-string">"html"</span>);
});
</code></span></pre>


<h3 class="wp-block-heading">コンテンツの更新</h3>



<p>上のコードで使用している <strong>updateContent()</strong> 内でHTML文字列から必要な部分を抽出してコンテンツを更新します。 今回必要とするのは <strong>#content</strong> の中身と <strong>title</strong> です。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> updateContent = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">html</span>)</span>{
    <span class="hljs-keyword">var</span> title = (<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">var</span> m = html.match(<span class="hljs-regexp">/&lt;title.*?&gt;(&#91;\s\S]+?)&lt;\/title&gt;/i</span>);
        <span class="hljs-keyword">return</span> m ? m&#91;<span class="hljs-number">1</span>] : <span class="hljs-string">""</span>;
    }());
    <span class="hljs-keyword">var</span> content = (<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">var</span> m = html.match(<span class="hljs-regexp">/&lt;body.*?&gt;(&#91;\s\S]+?)&lt;\/body&gt;/i</span>);
        <span class="hljs-keyword">if</span>(m){
            <span class="hljs-keyword">var</span> content = $(<span class="hljs-string">"&lt;div&gt;"</span>).append(m&#91;<span class="hljs-number">1</span>]).find(<span class="hljs-string">"#content"</span>);
            <span class="hljs-keyword">return</span> content.length ? content.html() : <span class="hljs-string">""</span>;
        }
        <span class="hljs-keyword">return</span> <span class="hljs-string">""</span>;
    }());
    <span class="hljs-built_in">document</span>.title = title;
    $(<span class="hljs-string">"#content"</span>).hide().html(content).fadeIn();
};
</code></span></pre>


<p>content のパースは厄介なので、jQueryで一時的に要素を生成してフィルタリングしています。 遷移時にはコンテンツ部分がフェードインするようにしてみました。</p>



<h3 class="wp-block-heading">popstate イベントの設定</h3>



<p>これだけではリンクをクリックした時だけしかコンテンツが変わらないので、 ブラウザの進む・戻るボタン等で履歴を移動した場合にもコンテンツが切り替わるように、 <strong>popstate</strong> イベントの設定をします。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-built_in">window</span>).on(<span class="hljs-string">"popstate"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    <span class="hljs-keyword">var</span> state = e.originalEvent.state;
    <span class="hljs-keyword">if</span>(state &amp;&amp; state.html){
        updateContent(state.html);
    }
});
</code></span></pre>


<p>jQuery.fn.on でイベント設定した場合は e.state ではなく e.originalEvent.state と辿らなければいけないので注意が必要です。 pushState で登録しておいた <strong>html</strong> が state から取得出来るので、それを使用してコンテンツをその時の状態に戻します。</p>



<h3 class="wp-block-heading">現在いるページで初期化をする</h3>



<p>一番最初に訪れたページの内容で、state の初期化を行います。 そうしなければ、ページ遷移を行ったあとに一番はじめのページまで履歴をさかのぼった時に state が空っぽな為、コンテンツを更新してくれません。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">history</span><span class="hljs-selector-class">.replaceState</span>({<span class="hljs-attribute">url</span>: location.href, html: $(<span class="hljs-string">"html"</span>).<span class="hljs-built_in">html</span>()}, "", <span class="hljs-selector-tag">location</span><span class="hljs-selector-class">.href</span>);
</code></span></pre>


<h3 class="wp-block-heading">ファイナルコード</h3>



<p>シンプルな構成ですが、こんな感じになりました。 実際にはエラー時の処理や、コンテンツのキャッシュ等も入るかもしれません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{

    <span class="hljs-keyword">if</span>(! history.pushState || ! history.replaceState){
        <span class="hljs-keyword">return</span>;
    }

    <span class="hljs-keyword">var</span> updateContent = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">html</span>)</span>{
        <span class="hljs-keyword">var</span> title = (<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
            <span class="hljs-keyword">var</span> m = html.match(<span class="hljs-regexp">/&lt;title.*?&gt;(&#91;\s\S]+?)&lt;\/title&gt;/i</span>);
            <span class="hljs-keyword">return</span> m ? m&#91;<span class="hljs-number">1</span>] : <span class="hljs-string">""</span>;
        }());
        <span class="hljs-keyword">var</span> content = (<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
            <span class="hljs-keyword">var</span> m = html.match(<span class="hljs-regexp">/&lt;body.*?&gt;(&#91;\s\S]+?)&lt;\/body&gt;/i</span>);
            <span class="hljs-keyword">if</span>(m){
                <span class="hljs-keyword">var</span> content = $(<span class="hljs-string">"&lt;div&gt;"</span>).append(m&#91;<span class="hljs-number">1</span>]).find(<span class="hljs-string">"#content"</span>);
                <span class="hljs-keyword">return</span> content.length ? content.html() : <span class="hljs-string">""</span>;
            }
            <span class="hljs-keyword">return</span> <span class="hljs-string">""</span>;
        }());
        <span class="hljs-built_in">document</span>.title = title;
        $(<span class="hljs-string">"#content"</span>).hide().html(content).fadeIn();
    };

    $(<span class="hljs-built_in">document</span>).on(<span class="hljs-string">"click"</span>, <span class="hljs-string">"&#91;data-pjax]"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        e.preventDefault();
        <span class="hljs-keyword">var</span> href = e.currentTarget.href;
        $.<span class="hljs-keyword">get</span>(href, function(html, status, xhr){
            updateContent(html);
            history.pushState({<span class="hljs-attr">url</span>: href, <span class="hljs-attr">html</span>: html}, <span class="hljs-string">""</span>, href);
        }, <span class="hljs-string">"html"</span>);
    });

    $(<span class="hljs-built_in">window</span>).on(<span class="hljs-string">"popstate"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        <span class="hljs-keyword">var</span> state = e.originalEvent.state;
        <span class="hljs-keyword">if</span>(state &amp;&amp; state.html){
            updateContent(state.html);
        }
    });

    history.replaceState({<span class="hljs-attr">url</span>: location.href, <span class="hljs-attr">html</span>: $(<span class="hljs-string">"html"</span>).html()}, <span class="hljs-string">""</span>, location.href);

}());
</code></span></pre>


<h2 class="wp-block-heading">ライブラリを利用する</h2>



<p>上の説明用のコードは単機能で汎用性にも欠け、いささか面倒です。 既に Pjax のライブラリは多くの方が公開していると思いますので、 それを利用させてもらいましょう。</p>



<h3 class="wp-block-heading">jquery-pjax</h3>



<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://github.com/defunkt/jquery-pjax
</div></figure>



<p>jquery-pjax は名前の通り Pjax の面倒な処理ひと通りこなしてくれるjQueryプラグインです。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-built_in">document</span>).pjax(<span class="hljs-string">"a&#91;data-pjax]"</span>, <span class="hljs-string">"#container"</span>);
</code></span></pre>


<p>jquery-pjax は Ajaxのリクエストに <strong>X-PJAX</strong> というヘッダを追加してくれます。 サーバサイドでそのヘッダを検知して、共通レイアウトを省いたコンテンツ部分のみを出力するようにすれば、 データ量の節約になるという寸法です。</p>



<p>レイアウトを省かないHTMLを読み込んで部分だけ使用したい場合（上であげたコードのようなケース）は、 <strong>fragment</strong> オプションでセレクタを指定する必要がありますので注意しましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-built_in">document</span>).pjax(<span class="hljs-string">"a&#91;data-pjax]"</span>, <span class="hljs-string">"#container"</span>, {
    <span class="hljs-attr">fragment</span>: <span class="hljs-string">"#container"</span>
});
</code></span></pre>


<h2 class="wp-block-heading">参考資料</h2>



<ul class="wp-block-list">
<li><a href="http://d.hatena.ne.jp/fatwebstudy/20131015/1381780122">pjaxの実用性 &#8211; fatのWEB開発メモ</a></li>



<li><a href="https://developer.mozilla.org/ja/docs/Web/Guide/DOM/Manipulating_the_browser_history">Manipulating the browser history &#8211; Web developer guide | MDN</a></li>



<li><a href="https://github.com/defunkt/jquery-pjax">defunkt/jquery-pjax</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Googleスプレッドシートを簡易DBとして利用する -　PHP+Ajax編</title>
		<link>https://blog.mach3.jp/2013/06/04/spreadsheet-as-db-for-php-ajax.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 04 Jun 2013 01:32:29 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3114</guid>

					<description><![CDATA[このお題は以前にも何度か関連記事を書いていますが、 いずれの方法もパフォーマンスがあまり良くなかったり、安定性に問題があるなどしました。 今回はその辺を解決する為のライブラリを考えてみるお話です。 「新しくなったスプレッ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>このお題は以前にも何度か関連記事を書いていますが、 いずれの方法もパフォーマンスがあまり良くなかったり、安定性に問題があるなどしました。 今回はその辺を解決する為のライブラリを考えてみるお話です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-b119hG32ePU/Uaya83uGA_I/AAAAAAAACEc/uPRWuhOEpX8/s400/20130603-00.png" alt="Googleスプレッドシートを簡易DBとして利用する -　PHP+Ajax編"/></figure>



<p></p>



<span id="more-3114"></span>



<ol class="wp-block-list">
<li>やりたい事</li>



<li>書いてみたもの</li>



<li>基本的な使い方</li>



<li>Ajaxで利用する</li>



<li>JSONPで利用する</li>



<li>その他オプション・機能など</li>



<li>必ず気をつけなければならないこと</li>



<li>まとめ : Googleスプレッドシートの活用について</li>
</ol>



<p class="caution">
  「<a href="/2014/07/29/ghostsheet2.html">新しくなったスプレッドシートと簡易データベース化</a>」でGhostsheetが使えなくなったと書きましたが、新スプレッドシートでもAPIが整備された様で、2014年11月20日現在では正常に動作する事を確認しています。但し、スクリーンショット類は古い物なのでご注意ください。（スプレッドシートIDの取得はURLを参照されるのが良いでしょう）
</p>



<h2 class="wp-block-heading">やりたい事</h2>



<ul class="wp-block-list">
<li>Googleスプレッドシートからデータを利用して展開したい</li>



<li>データは分かりやすい形に加工しておきたい</li>



<li>直接JSONで読めるけど、毎回読みに行くのは非効率なのでなんとかしたい</li>



<li>スプレッドシートがメンテ中の時も対応したい</li>
</ul>



<p>つまり、サーバ上に加工したデータをキャッシュとして保存しておけば良いわけですね。</p>



<h2 class="wp-block-heading">書いてみたもの</h2>



<h3 class="wp-block-heading"><a href="http://mach3.github.io/ghostsheet/">Ghostsheet by mach3</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-pr-h46UEJYA/Uaya84RKCmI/AAAAAAAACEc/pu9nQ2r6_Ps/s500/20130603-01.png" alt="Ghostsheet"/></figure>



<p><a href="http://mach3.github.io/ghostsheet/">  </a></p>



<p>今回はPHPで書いてみました。こんな感じにはたらきます。</p>



<ol class="wp-block-list">
<li>渡されたIDを頼りにスプレッドシートをJSONで読み込んできます</li>



<li>加工したデータをキャッシュに保存し、返します</li>



<li>二回目以降のリクエストは、キャッシュの期限内であればキャッシュから返します</li>



<li>キャッシュが期限切れならば再度リモートから読み込んできます</li>
</ol>



<h2 class="wp-block-heading">基本的な使い方</h2>



<h3 class="wp-block-heading">1. スプレッドシートを作る</h3>



<p><a href="https://drive.google.com/">Googleドライブ</a> で、簡易DBにするスプレッドシートを作成します。 一行目はフィールドのキーで構成されるヘッダ行にします。これらのキーを元にデータは加工されます。</p>



<p><iframe width="600" height="200" frameborder="0" src="https://docs.google.com/spreadsheet/pub?key=0Ark6jIWYcmkLdGtva1M4elh4SHFrM3FaM1pVNGJ1QWc&amp;output=html&amp;widget=true"></iframe></p>



<p>キーの末尾に書かれている <em>:integer</em> 等の文字は、値の型です。 これを指定しておくと、データを加工する際に値をその型にキャストするように頑張ってくれます。 省略時の初期設定は&#8221;string&#8221;です。 &#8220;integer&#8221;, &#8220;boolean&#8221;, &#8220;float&#8221;等が使用できるほか、&#8221;array&#8221; ではカンマで区切った配列が、 &#8220;json&#8221; ではJSON文字列としてパースされた結果が格納されます。</p>



<h3 class="wp-block-heading">2. スプレッドシートを公開 &amp; IDを取得する</h3>



<p>「ファイル」→「ウェブに公開」でシートの公開設定ができます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-CamIwrT18Bo/Uaya8yPN2DI/AAAAAAAACEc/9OFxyke1FoE/s518/20130603-02.png" alt="ウェブに公開"/></figure>



<p></p>



<ol class="wp-block-list">
<li>「公開開始」ボタンを押して公開します</li>



<li>「公開データへのリンクを取得」で「RSS」を選択します。</li>
</ol>



<p>すると、次のようなURLが表示されるので、</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<figure class="wp-block-embed"><div class="wp-block-embed__wrapper">
https://spreadsheets.google.com/feeds/list/XXxxxxXXXxxxXx/od6/public/basic?alt=rss
</div></figure>
</blockquote>



<p>太文字の &#8220;XXxxxxXXXxxxXx/od6&#8221; にあたる部分をコピーします。 これはこの後スプレッドシートのIDとして使用されます。</p>



<h3 class="wp-block-heading">3. Ghostsheetで読み込む</h3>



<p>Ghostsheet.php を任意の場所に設置してrequireし、初期化してスプレッドシートを読み込みます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">require</span> <span class="hljs-string">"Ghostsheet.php"</span>;

$gs = <span class="hljs-keyword">new</span> Ghostsheet();

<span class="hljs-comment">// キャッシュ用のディレクトリを設定しておきます</span>
<span class="hljs-comment">// config() で配列を渡すこともできます</span>
$gs-&gt;set(<span class="hljs-string">"cacheDir"</span>, <span class="hljs-string">"./gscache/"</span>);

$mySpreadsheetId = <span class="hljs-string">"XXxxxxXXXxxxXx/od6"</span>;
$data = $gs-&gt;load($mySpreadsheetId); <span class="hljs-comment">// $dataに加工されたデータが格納されます</span>
</code></span></pre>


<p>あとは、読み込まれたデータを好きな様に料理してください。</p>



<h2 class="wp-block-heading">Ajaxで利用する</h2>



<p>Ghostsheetには、Ajaxで簡単に利用する為の <code>ajax()</code> メソッドが用意されています。 <code>ajax()</code> は引数の配列（省略時のデフォルトは <code>$_GET</code>）を使用して処理し、JSON形式でレスポンスを返します。</p>



<h3 class="wp-block-heading">ajax.php</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">require</span> <span class="hljs-string">"Ghostsheet.php"</span>;

$gs = <span class="hljs-keyword">new</span> Ghostsheet();
$gs-&gt;set(<span class="hljs-string">"cacheDir"</span>, <span class="hljs-string">"./gscache/"</span>);
$gs-&gt;ajax();
</code></span></pre>


<h3 class="wp-block-heading">jQueryによる読み込み例</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.getJSON(<span class="hljs-string">"ajax.php"</span>, {
    <span class="hljs-attr">id</span> : <span class="hljs-string">"XXxxxxXXXxxxXx/od6"</span>
})
.then(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{
    <span class="hljs-built_in">console</span>.log(data.items);
});
</code></span></pre>


<h2 class="wp-block-heading">JSONPで利用する</h2>



<p>Ajax同様にJSONPでレスポンスを返すことも出来ます。 あまりおすすめできる機能ではないので、初期設定では無効化されています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">require</span> <span class="hljs-string">"Ghostsheet.php"</span>;

$gs = <span class="hljs-keyword">new</span> Ghostsheet();
$gs-&gt;config(<span class="hljs-keyword">array</span>(
    <span class="hljs-string">"cacheDir"</span> =&gt; <span class="hljs-string">"./gscache"</span>,
    <span class="hljs-string">"jsonp"</span> =&gt; <span class="hljs-keyword">true</span> <span class="hljs-comment">// JSONP機能を有効に</span>
));
$gs-&gt;ajax();
</code></span></pre>


<p>受け取るidのホワイトリストを作ったり、 キャッシュディレクトリを非公開にするなどの対策をして使用した方が良いかな、と思います。</p>



<h2 class="wp-block-heading">その他のオプション・機能など</h2>



<p>ざっくりとしか書いてませんが、APIドキュメントをどうぞ。</p>



<p><a href="https://github.com/mach3/ghostsheet/blob/master/doc/api.md">Ghostsheet : API Doc</a></p>



<h2 class="wp-block-heading">必ず気をつけなければならないこと</h2>



<p>Googleスプレッドシートを簡易的なCMSとして使用する上で、気をつければならないこと。</p>



<h3 class="wp-block-heading">非公開情報は載せない</h3>



<p>「Webで公開」機能を利用しないと使えないライブラリなので、 そのスプレッドシートの内容は全て公開されてしまいます。</p>



<h3 class="wp-block-heading">共有設定に気をつけて</h3>



<p>第三者が編集できるような状態にしない。 クライアントと共有したい場合は、限定公開でユーザーを決め打ちしましょう。</p>



<h3 class="wp-block-heading">「変更が加えられると自動的に再公開する」のチェックはオフに</h3>



<p>編集途中の状態で公開されて恥ずかしい思いをする可能性があります。 自動公開ではなく、編集が終わったら都度「今すぐ再公開」ボタンを押すようにしましょう。</p>



<h2 class="wp-block-heading">まとめ : Googleスプレッドシートの活用について</h2>



<p>私は、優秀なクローンでも出ない限り、テーブルの編集でGoogleスプレッドシートの右に出るサービスは無いと思っています。 そして、WYSIWIGではなくテーブルでの管理をしたいWebコンテンツというのも多くあるでしょう。 例えば、</p>



<ul class="wp-block-list">
<li>お店のメニュー表</li>



<li>製品リスト</li>



<li>詳細画面の要らないニュースリスト</li>



<li>その他リストコンテンツ</li>
</ul>



<p>などなど。このようなデータコレクション的なコンテンツは、 CMSでがんばって実装したりするよりはテーブルで管理出来たほうが メンテナンスの効率も良いと感じるのです。</p>



<p>また、WordPressはわからないけどExcelならいつもつかってるからわかるよ！ というWeb担当者も多くいらっしゃると思います。 （専任の枠を割けずに総務の方が兼任しているようなケースでは特に）</p>



<p>そんなわけで、私はこのお題を執拗に探求しているのであります。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>2010年に出会った愛すべきリソース達*11</title>
		<link>https://blog.mach3.jp/2010/12/29/lovely-resources-2010.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 29 Dec 2010 08:46:00 +0000</pubDate>
				<category><![CDATA[WebClip]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Resources]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Yahoo]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1284</guid>

					<description><![CDATA[2010年も残りわずか。CS5やらHTML5やらiナントカやら忙しい1年でしたが、 せっかくなので今年出会った素晴らしいリソースを振り返ってみます。 @anywhere Welcome to @Anywhere &#124; de [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>2010年も残りわずか。CS5やらHTML5やらiナントカやら忙しい1年でしたが、<br />
せっかくなので今年出会った素晴らしいリソースを振り返ってみます。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh3.ggpht.com/_JJkNs5Ixl70/TRrzte8LnJI/AAAAAAAABH4/5TZJ_Ar76fI/201012291739.png" alt="Great Resources 2010"/></figure>



<p></p>



<span id="more-1284"></span>



<h2 class="wp-block-heading">@anywhere</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh3.ggpht.com/_JJkNs5Ixl70/TI-FvKGTMFI/AAAAAAAABB4/DWq3p5mDXQM/201009142322.png" alt="@anywhere"/></figure>



<p></p>



<h3 class="wp-block-heading"><a href="http://dev.twitter.com/anywhere">Welcome to @Anywhere | dev.twitter.com</a></h3>



<p>Twitterの機能がどのサイトでも活用出来るようになるJavaScriptリソース。<br />
認証からタイムライン読み込み、パーツのレンダリングまで。<br />
連携サービスを組むならおさえておきたい。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/04/twitter-anywhere.html">ブログで@anywhereを試してみた！ ～ どこでもTwitter | Mach3.laBlog</a></li>



<li><a href="/2010/09/auth-anywhere.html">@anywhereで認証してみる備忘録 | Mach3.laBlog</a></li>
</ul>
</blockquote>



<h2 class="wp-block-heading">jsLint</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh4.ggpht.com/_JJkNs5Ixl70/TAuiwlC67MI/AAAAAAAAA7k/f0V7_v6GCEM/s800/201006062143.png" alt="jsLint"/></figure>



<p></p>



<h3 class="wp-block-heading"><a href="http://www.jslint.com/">JSLint, The JavaScript Code Quality Tool</a></h3>



<p>JavaScriptをストリクトに書く為のチェックツール。<br />
前はWSH版がダウンロード出来たんですけど見つからなくなってますね。<br />
<a href="https://github.com/douglascrockford/JSLint">Github</a>のを使ってなんやかんやするんでしょうか。こんど試してみよう。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/06/jslint.html">JSLintでストリクトなJavaScriptを書く | Mach3.laBlog</a></li>
</ul>
</blockquote>



<h2 class="wp-block-heading">LESS</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/TC9OtbZAqRI/AAAAAAAAA9c/UGfbYnLsdWc/s800/201007032351.png" alt="LESS"/></figure>



<p></p>



<h3 class="wp-block-heading"><a href="http://lesscss.org/">LESS &#8211; Leaner CSS</a></h3>



<p>変数に代入したり、ネストしたり、ミックスインしたり…<br />
CSSコーディングが素晴らしくスピードアップするCSS開発キット。<br />
エディタからも簡単に呼び出せるので重宝しています。<br />
似たようなプロジェクトに「<a href="http://sass-lang.com/">Sass</a>」というのもあります。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/07/less-on-ruby-windows.html">ゼロから導入する、Ruby LESS for Windows ～素晴らしいCSSソリューション | Mach3.laBlog</a></li>



<li><a href="/2010/08/css3-snippet-for-less.html">CSS3対応の為のLESSスニペットメモ | Mach3.laBlog</a></li>
</ul>
</blockquote>



<h2 class="wp-block-heading">jsDoc Toolkit</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh6.ggpht.com/_JJkNs5Ixl70/TExlCdWAOSI/AAAAAAAAA_Y/oT60gg9HcrM/s800/201007260122.png" alt="jsDoc Toolkit"/></figure>



<p></p>



<h3 class="wp-block-heading"><a href="http://code.google.com/p/jsdoc-toolkit/">jsdoc-toolkit &#8211; Project Hosting on Google Code</a></h3>



<p>JavaScript版のドキュメント生成ツール。<br />
こちらもエディタから使うと大変便利。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/07/jsdoctoolkit-from-notepad.html">エディタ（Notepad++）からJSDoc Toolkitを使ってみる | Mach3.laBlog</a></li>
</ul>
</blockquote>



<h2 class="wp-block-heading">Modernizr</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh3.ggpht.com/_JJkNs5Ixl70/TEb6RR1X0LI/AAAAAAAAA-4/_5uGmJsiuwg/s800/201007212239.png" alt="Modernizr"/></figure>



<p></p>



<h3 class="wp-block-heading"><a href="http://www.modernizr.com/">Modernizr</a></h3>



<p>HTML5の新機能等が使用可能かどうかを判別してくれるライブラリ。<br />
判別の結果はhtml要素のクラスとして出力してくれる他、<br />
メンバを直接参照する事でも結果を知ることが出来ます。</p>



<p>便利なスクリプトなのですが、最近<a href="http://headjs.com/">Head.js</a>に持って行かれた感が…<br />
こちらは未検証なのでまた後ほどレポートを。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/07/modernizr-js.html">「Modernizr」 モダンなクロスブラウザCSSの為の支援スクリプト | Mach3.laBlog</a></li>
</ul>
</blockquote>



<h2 class="wp-block-heading">Raphael / gRaphael</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/TDwr1qEithI/AAAAAAAAA-Q/6t9diGuL98g/s800/201007131656.png" alt="gRaphael"/></figure>



<p></p>



<h3 class="wp-block-heading"><a href="http://g.raphaeljs.com/">gRaphaël—Charting JavaScript Library</a></h3>



<p><a href="http://raphaeljs.com/index.html">Raphael</a>は、ベクターグラフィックを簡単に扱うためのJavaScriptライブラリ。<br />
gRaphaelはそれをグラフ描画用に拡張する為のプラグインです。<br />
投稿した時はまだドキュメントが不備でしたが…今見に行きましたがまだありませんでした！</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/07/graphael.html">実験室: gRaphaëlでインタラクティブなグラフを描いてみる | Mach3.laBlog</a></li>
</ul>
</blockquote>



<h2 class="wp-block-heading">IE9.js</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh6.ggpht.com/_JJkNs5Ixl70/TJLUD970GRI/AAAAAAAABCU/oxPr4vt8h9U/201009171134.png" alt="IE9.js"/></figure>



<p></p>



<h3 class="wp-block-heading"><a href="http://code.google.com/p/ie7-js/">ie7-js &#8211; Project Hosting on Google Code</a></h3>



<p>プロジェクト名としては「IE7.js」ですが、<br />
その中に含まれるIE8.js、IE9.jsやie7-squish.jsが結構便利。<br />
JavaScriptが動く事が前提になりますが、擬似クラスやHTML5の新要素の対応もしてくれます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/09/ie9js-clearfix.html">IE9.jsで実現するシンプルなclearfixとその他の恩恵 | Mach3.laBlog</a></li>
</ul>
</blockquote>



<h2 class="wp-block-heading">YUI Compressor</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/TMmzBvs9ayI/AAAAAAAABEs/ZY7JUy71f0w/201010290014.png" alt="YUI Compressor"/></figure>



<p></p>



<h3 class="wp-block-heading"><a href="http://developer.yahoo.com/yui/compressor/">YUI Compressor</a></h3>



<p>Yahoo!がおくる、JavaScriptやCSSを圧縮するツール。<br />
Webページのパフォーマンス向上を図るのに欠かせません。<br />
ご一緒に<a href="http://developer.yahoo.com/yslow/">YSlow</a>（Firebugプラグイン）も是非。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/10/yui-compressor-bat.html">YUI Compressorをお手軽にするバッチファイルを書いてみる | Mach3.laBlog</a></li>



<li><a href="/2010/11/quick-tip-for-site-performance.html">今すぐ出来る、ちょこざいなサイトパフォーマンスアップ | Mach3.laBlog</a></li>
</ul>
</blockquote>



<h2 class="wp-block-heading">mustache</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/TKnnq0vc63I/AAAAAAAABDE/OOIY9hnndPo/201010042339.png" alt="mustache"/></figure>



<p></p>



<h3 class="wp-block-heading"><a href="http://mustache.github.com/">{{ mustache }}</a></h3>



<p>マルチランゲージテンプレートエンジン！（言い切った！）<br />
様々な言語に対応する、シンプルで使いやすいテンプレートエンジンです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/10/mustache-template-engine.html">どこでも活躍できるテンプレートエンジン「Mustache」 | Mach3.laBlog</a></li>
</ul>
</blockquote>



<h2 class="wp-block-heading">Sammy.js</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh6.ggpht.com/_JJkNs5Ixl70/TJjDmzzS06I/AAAAAAAABCw/rriMLBnT_6c/201009212338.png" alt="Sammy.js"/></figure>



<p></p>



<h3 class="wp-block-heading"><a href="http://code.quirkey.com/sammy/">Sammy.js</a></h3>



<p>Ajaxコンテンツのセッションを操る為のjQueryプラグイン。<br />
要するに、location.hashによるルーティングをウマイこと処理してくれるスクリプトです。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/09/sammy-js.html">Sammy.jsでAjaxコンテンツのセッションを操る | Mach3.laBlog</a></li>
</ul>
</blockquote>



<h2 class="wp-block-heading">jQueryMobile</h2>



<figure class="wp-block-image"><img decoding="async" src="http://lh4.ggpht.com/_JJkNs5Ixl70/TOIVnTG4iGI/AAAAAAAABFc/mpVknEjCqqU/201011161309.png" alt="jQueryMobile"/></figure>



<p></p>



<ul class="wp-block-list">
<li><a href="http://jquerymobile.com/">jQuery Mobile | jQuery Mobile</a></li>
</ul>



<p>jQueryの作者が送る、スマートフォン向けのjQueryUIのようなもの。<br />
ルールに従ったマークアップをするだけで、各要素をそれっぽくレンダリングしてくれます。<br />
1月に正式版がリリースされる予定。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ul class="wp-block-list">
<li><a href="/2010/11/jquery-mobile-for-beginner.html">はじめてのjQueryMobile | Mach3.laBlog</a></li>
</ul>
</blockquote>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>結構色々ありましたね、2010年。<br />
来年もまた素晴らしい技術に出会えますように。</p>



<p>皆様よいお年を！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>jQueryはJSONPの理解の妨げになるか？</title>
		<link>https://blog.mach3.jp/2010/10/19/jquery-jsonp.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 19 Oct 2010 02:17:15 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=922</guid>

					<description><![CDATA[コンパクトで汎用的な「JSON」は、今やWebサービスの連携になくてはならない存在ですね。 各種APIもXML以上にJSON対応が必要とされていると思います。 今日はそんなJSON/JSONPと、jQueryが便利すぎて [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>コンパクトで汎用的な「JSON」は、今やWebサービスの連携になくてはならない存在ですね。<br />
各種APIもXML以上にJSON対応が必要とされていると思います。<br />
今日はそんなJSON/JSONPと、jQueryが便利すぎて逆に困ってしまう！というお話。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh3.ggpht.com/_JJkNs5Ixl70/TLxuJgDsHdI/AAAAAAAABD0/NNWrpvho1qw/201010190055.png" alt="jQueryはJSONPの理解の妨げになるか？"/></figure>



<p></p>



<span id="more-922"></span>



<h2 class="wp-block-heading">JSON</h2>



<p><em>JSON</em>とは「JavaScript Object Node」の略で、<br />
その名の通りJavaScriptのオブジェクトを表した物。<br />
中身は勿論JavaScriptのオブジェクトリテラルです。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"status"</span> : <span class="hljs-string">"success"</span>,
    <span class="hljs-attr">"content"</span> : &#91; <span class="hljs-string">"hoge"</span>, <span class="hljs-string">"fuga"</span>, <span class="hljs-string">"foo"</span>, <span class="hljs-string">"bar"</span> ]
}
</code></span></pre>


<p>昨今はXMLにかわって情報をやり取りする際のフォーマットとして<br />
頻繁に使われるようになりました。</p>



<p>ただ、外部サービスと通信する際に、<br />
AjaxでJSONをやり取りするには「<em>クロスドメイン</em>」という壁があります。<br />
つまり、他ドメインに属するファイルはAjaxでは基本的に取得出来ないのです。</p>



<p>そこでJSONPの出番です。</p>



<h2 class="wp-block-heading">JSONP</h2>



<p><em>JSONP(JSON with Padding）</em>というのは、<br />
<em>コールバック関数</em>を介してJSONのデータを受け取る手法です。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">myfunc({
    <span class="hljs-string">"status"</span> : <span class="hljs-string">"success"</span>,
    <span class="hljs-string">"content"</span> : &#91; <span class="hljs-string">"hoge"</span>, <span class="hljs-string">"fuga"</span>, <span class="hljs-string">"foo"</span>, <span class="hljs-string">"bar"</span> ]
});
</code></span></pre>


<p>JSONを出力する側では、こんな感じに関数の引数に渡してやります。</p>



<p>上では関数名が「<em>myfunc</em>」になっていますが、<br />
APIを公開している多くのサービスは、<br />
大抵この関数名をパラメータで指定出来るようになっています。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span>&gt;</span><span class="javascript">
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">myfunc</span>(<span class="hljs-params">data</span>)</span>{
    <span class="hljs-built_in">console</span>.log( data );
}
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"http://example.com/hoge.json?callback=myfunc"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>コールバック関数を宣言したら、あとはscript要素でAPIにアクセスする。<br />
「<em>myfunc</em>」内でJSONのデータを受け取り、煮たり焼いたりしましょう。<br />
思いのほかシンプル。</p>



<p>そんなJSONPですが、<br />
jQueryを通すとJSONPの仕組みが隠蔽されたような形になります。</p>



<h2 class="wp-block-heading">jQueryでJSONPを使うと…</h2>



<h3 class="wp-block-heading">jQuery.ajax</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.ajax({
    <span class="hljs-attr">url</span>:<span class="hljs-string">"http://example.com/hoge.json"</span>,
    <span class="hljs-attr">dataType</span>:<span class="hljs-string">"jsonp"</span>,
    <span class="hljs-attr">jsonp</span>:<span class="hljs-string">"callback"</span>,
    <span class="hljs-attr">success</span>:<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data</span>)</span>{
        <span class="hljs-built_in">console</span>.log( data );
    }
});
</code></span></pre>


<p>上の例と同じ処理をしているわけですが、<br />
普通のAjaxとほぼ同じ書式で出来てしまいますね。<br />
違うのは、<em>dataType</em>パラメータと<em>jsonp</em>パラメータぐらい。</p>



<p><em>script要素の追加</em>、<em>コールバック関数の指定</em>等は、<br />
jQueryが勝手に代理で行ってくれます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"http://example.com/hoge.json?calback=jsonp1287411860619"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>DOMを見ていると、こんな感じのscript要素が生成されています。<br />
コールバック関数名も動的に生成し、その中身を<em>success</em>で設定した関数にしているわけですね。</p>



<h2 class="wp-block-heading">まずは生JSで書いてみた方が良いと思う</h2>



<p>前半で紹介したとおり、JSONPは全くもってシンプルな手法なのですが、<br />
このようにjQueryを用いることで得体の知れない物になってしまっていませんか？<br />
面倒な処理を代理で行ってくれるのがフレームワークなのですが、<br />
その親切が学習する上での妨げになってしまう事があります。<br />
（JSONPの例に限った話ではなく）</p>



<p>まずは、フレームワークに頼らない生のスクリプトで実験してみる。</p>



<p>そうする事が、その技術に対する理解を深められるだけでなく、<br />
フレームワークをより上手く活用出来るようになる為の近道になるのではないかと<br />
自戒の意も含めてここに記しておきます。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Sammy.jsでAjaxコンテンツのセッションを操る</title>
		<link>https://blog.mach3.jp/2010/09/22/sammy-js.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 22 Sep 2010 02:25:21 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Sammy.js]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=735</guid>

					<description><![CDATA[この記事の情報は古くなっています。 Sammy.js はAPIも一新されてより強力なフレームワークになっています。 公式ドキュメントをご参照ください。 ページを移動させずにサクサクと展開していくのがAjaxコンテンツの魅 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="caution">
  この記事の情報は古くなっています。<br /> <a href="http://sammyjs.org/">Sammy.js</a> はAPIも一新されてより強力なフレームワークになっています。<br /> <a href="http://sammyjs.org/docs">公式ドキュメント</a>をご参照ください。
</p>



<p>ページを移動させずにサクサクと展開していくのがAjaxコンテンツの魅力ですが、<br />
移動しないが故にURLとしてセッションを保持出来ないという弱点があります。<br />
オーソドックスな解決法は「location.hash」を用いる物ですが、<br />
その処理を簡単にしてくれるのがSammy.jsです。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh6.ggpht.com/_JJkNs5Ixl70/TJjDmzzS06I/AAAAAAAABCw/rriMLBnT_6c/201009212338.png" alt="Sammy.js"/></figure>



<p></p>



<span id="more-735"></span>



<h2 class="wp-block-heading">おおざっぱな話</h2>



<h3 class="wp-block-heading">Sammy.js</h3>



<p><a href="http://code.quirkey.com/sammy/">Sammy :: Quirkey.com</a></p>



<p>Sammy.jsは、location.hashを用いたルーティングを<br />
効率化してくれるjQueryプラグインです。</p>



<h3 class="wp-block-heading">location.hashとは</h3>



<p>通常ページ内リンク等に使用される、<br />
URL末尾の<em>#</em>に続く文字列の事。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://www.example.com/hoge.html<em>#foobar</em></p>
</blockquote>



<h2 class="wp-block-heading">簡単な使い方</h2>



<p>先ず、<em>$.sammy()</em>を使用してルーティングを定義します。<br />
myRouteにはSammyオブジェクトが渡されます。<br />
※あとで初期化を行う為に格納しておきます</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> myRoute = $.sammy(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">this</span>.get(<span class="hljs-string">"#/home"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-comment">// #/homeにアクセスした時の処理</span>
    });
    <span class="hljs-keyword">this</span>.get(<span class="hljs-string">"#/profile"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-comment">// #/profileにアクセスした時の処理</span>
    });
    <span class="hljs-keyword">this</span>.get(<span class="hljs-string">""</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-comment">// location.hashが空だった時の処理</span>
    });
});
</code></span></pre>


<p>定義する為に用意された<em>get</em>メソッドには、<br />
第一引数に<em>location.hashの値</em>、<br />
第二引数に<em>実行したい処理（function）</em>を渡します。<br />
※get以外にもpost等がありますが、公式に任せて割愛</p>



<p>ルーティングを初期化する為には、<em>run</em>メソッドを呼びます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    myRoute.run();
});
</code></span></pre>


<p>とても簡単ですね。</p>



<h2 class="wp-block-heading">正規表現を使って一括管理</h2>



<p>getメソッドの第一引数は、文字列の他に正規表現も渡せます。<br />
これを使用して一つのfunctionで一括管理する事も出来ますね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">this</span>.get( <span class="hljs-regexp">/^#\/&#91;a-zA-Z0-9_-]+$/</span> , <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">switch</span>( <span class="hljs-keyword">this</span>.path ){
        <span class="hljs-keyword">case</span> <span class="hljs-string">"#/home"</span> :
            <span class="hljs-comment">// do something</span>
            <span class="hljs-keyword">break</span>;
        <span class="hljs-keyword">case</span> <span class="hljs-string">"#/profile"</span> :
            <span class="hljs-comment">// do something</span>
            <span class="hljs-keyword">break</span>;
        <span class="hljs-keyword">default</span>:
            <span class="hljs-keyword">this</span>.redirect(<span class="hljs-string">"#/home"</span>);
            <span class="hljs-keyword">break</span>;
    }
});
</code></span></pre>


<p>さりげなく使ってる、<em>this.path</em>と<em>this.redirect()</em>ですが、<br />
function内のスコープはSammyオブジェクトになっていて、<br />
色々な便利な機能が使えます。</p>



<dl>
<dt>path</dt>
<dd>location.hashの値が格納されています</dd>
<dt>redirect()</dt>
<dd>文字通り、別のlocation.hashにリダイレクトします</dd>
</dl>



<p>他にも色々ありますが、詳しくは公式のドキュメントをご参照ください。<br />
<a href="http://code.quirkey.com/sammy/docs/index.html">Sammy &#8211; Documentation &#8211; API :: Quirkey.com</a></p>



<h2 class="wp-block-heading">デモページ</h2>



<p class="caution">
    デモページは閉鎖しています。
</p>



<p>内容はやや複雑化してますが、<br />
基本的にはそれぞれのリンクに相応するファイルをAjaxで読み込んでいるだけです。<br />
ファイルが見つからない場合はconfirmでHomeにリダイレクトするか、<br />
history.back()させるかを選択させています。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p>postメソッド等を利用することでAjaxで展開するカートなんかが作れるようで、<br />
チュートリアルも公式に掲載されていました。<br />
<a href="http://code.quirkey.com/sammy/tutorials/index.html">Sammy &#8211; Tutorials :: Quirkey.com</a></p>



<p>似たような働きをするライブラリにFlash向けのswfaddressなんていうのもありましたね。<br />
Sammy.jsはjQueryプラグインということもあって導入しやすく、期待大です。<br />
色々試してみよう…</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
