<?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>API &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/api/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Wed, 13 Aug 2025 06:02:36 +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>Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする（3）</title>
		<link>https://blog.mach3.jp/2015/09/18/google-spreadsheet-api-03.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 18 Sep 2015 10:32:36 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Drive]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4126</guid>

					<description><![CDATA[前回までは Google APIs Client Library for PHP を使って直接Googleスプレッドシートにアクセスしていましたが、 今回は読み書きを簡略化できるクライアントライブラリを書いてみました。  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>前回までは Google APIs Client Library for PHP を使って直接Googleスプレッドシートにアクセスしていましたが、 今回は読み書きを簡略化できるクライアントライブラリを書いてみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-5cK6TgCsp0U/Vff-k7Z0c1I/AAAAAAAAC_A/77Y7KGEzqBc/s400-Ic42/2015-0915-00.png" alt="Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする"/></figure>



<p></p>



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



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



<p><a href="https://github.com/mach3/google-spreadsheet.php">mach3/google-spreadsheet.php @ GitHub</a></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Google Spreadsheet Client for PHP. This requires &#8220;google/apiclient&#8221; package.</p>
</blockquote>



<h3 class="wp-block-heading">導入方法</h3>



<p>Composer で導入出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"require"</span>: {
        <span class="hljs-attr">"mach3/google-spreadsheet"</span>: <span class="hljs-string">"*"</span>
    }
}
</code></span></pre>


<p>Composer を使わない場合は Github からソースをダウンロードしますが、 その場合は、<a href="https://github.com/google/google-api-php-client">google/google-api-php-client</a> に依存していますのでそちらも一緒に導入します。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>

<span class="hljs-comment">// Composer の場合</span>
<span class="hljs-keyword">require</span> <span class="hljs-string">"vendor/autoload.php"</span>;

<span class="hljs-comment">// ソースを直接ダウンロードした場合</span>
<span class="hljs-keyword">require</span> <span class="hljs-string">"the/path/to/google/apiclient/src/Google/autoload.php"</span>;
<span class="hljs-keyword">require</span> <span class="hljs-string">"the/path/to/google-spreadsheet/src/autoload.php"</span>;
</span></code></span></pre>


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



<p>今までの例と同様に鍵ファイルを使用して認証をしますので、 <a href="https://console.developers.google.com/">Google Developper Console</a> で鍵ファイルを生成しておきましょう。</p>



<h3 class="wp-block-heading">認証してスプレッドシートを開く</h3>



<p>シートを開いた時点でシート内のデータは取得されています。 なお、シートの1行目はヘッダ行としてフィールド名を連ねるようにしてください。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// 鍵ファイルでクライアントを初期化</span>
$client = Google_Spreadsheet::getClient(<span class="hljs-string">"the/path/to/key.json"</span>);
<span class="hljs-comment">// スプレッドシートのIDでファイルを取得</span>
$file = $client-&gt;file(<span class="hljs-string">"XXXxxxXXXXxxxXXXX"</span>);
<span class="hljs-comment">// シートのタイトルでシートを取得</span>
$sheet = $file-&gt;sheet(<span class="hljs-string">"Sheet1"</span>);

var_dump($sheet-&gt;items);
</code></span></pre>


<h3 class="wp-block-heading">条件で行を選択する</h3>



<p>クロージャまたは配列で条件を指定してリストを取得します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// クロージャ</span>
$items = $sheet-&gt;select(<span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">($row)</span></span>{
    <span class="hljs-keyword">return</span> $row&#91;<span class="hljs-string">"email"</span>] === <span class="hljs-string">"foo@example.com"</span>;
});
<span class="hljs-comment">// 配列</span>
$items = $sheet-&gt;select(<span class="hljs-keyword">array</span>(
    <span class="hljs-string">"id"</span> =&gt; <span class="hljs-number">23</span>
));
<span class="hljs-comment">// 条件がない場合は全部返ってきます</span>
$items = $sheet-&gt;select();
</code></span></pre>


<h3 class="wp-block-heading">行を追加する</h3>



<p>シートに新しい行を追加します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$sheet-&gt;insert(<span class="hljs-keyword">array</span>(
    <span class="hljs-string">"name"</span> =&gt; <span class="hljs-string">"Bob"</span>,
    <span class="hljs-string">"age"</span> =&gt; <span class="hljs-number">23</span>,
    <span class="hljs-string">"email"</span> =&gt; <span class="hljs-string">"bob@example.com"</span>
));
</code></span></pre>


<h3 class="wp-block-heading">セルの値を変更する</h3>



<p>行番号と列番号（またはフィールド名）を指定して値を変更します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// 8行目の"name"の値を"Tom"に変更します</span>
$sheet-&gt;update(<span class="hljs-number">8</span>, <span class="hljs-string">"name"</span>, <span class="hljs-string">"Tom"</span>);

<span class="hljs-comment">// 8行目の2カラム目を"50"に変更します</span>
$sheet-&gt;update(<span class="hljs-number">8</span>, <span class="hljs-number">2</span>, <span class="hljs-number">50</span>);
</code></span></pre>


<h3 class="wp-block-heading">キャッシュを保存する</h3>



<p>サーバ上にファイルとしてキャッシュを保存する事ができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$client-&gt;config(<span class="hljs-keyword">array</span>(
    <span class="hljs-string">"cache"</span> =&gt; <span class="hljs-keyword">true</span>,
    <span class="hljs-string">"cache_dir"</span> =&gt; <span class="hljs-string">"cache"</span>,
    <span class="hljs-string">"cache_expires"</span> =&gt; <span class="hljs-number">3600</span>
));
</code></span></pre>


<h3 class="wp-block-heading">データを最新の情報に更新する</h3>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// キャッシュを無視したい場合は引数にTRUEを渡します</span>
$sheet-&gt;fetch(<span class="hljs-keyword">true</span>);
</code></span></pre>


<h2 class="wp-block-heading">どこで使えるのか</h2>



<p>スプレッドシートをお手軽な簡易データベースとして使うことが出来ますが、 毎度リクエストを飛ばす関係でパフォーマンスはどうしても落ちてしまいます。 また、データを丸ごと引っ張って来ているので大きなデータを扱うのには全く適していません。</p>



<ul class="wp-block-list">
<li>サーバーの都合でデータベースが使用出来ない</li>



<li>データベースを使うほどのものではない</li>



<li>エクセルライクなインターフェースで簡単にコンテンツを更新したい！</li>
</ul>



<p>といったようなニーズにお応えする物でしょうか。 簡単なアンケート集計等にも使えるかもしれませんね。</p>



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



<p>スプレッドシートについてはひとまずこれでやりきった感がありますね。 もっと便利なAPIの使い方があるかもしれないので、 都度ライブラリは改善していきたいと思っています。</p>



<p>良い使い道がある事を祈って。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする（2）</title>
		<link>https://blog.mach3.jp/2015/09/17/google-spreadsheet-api-02.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 17 Sep 2015 07:28:10 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Drive]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4122</guid>

					<description><![CDATA[前回につづいて、Googleのライブラリを使ってスプレッドシートと連携する実験です。 軽いおさらい 前回は Google Developper Console で鍵ファイルを取得し、 それを使って認証してアクセストークン [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>前回につづいて、Googleのライブラリを使ってスプレッドシートと連携する実験です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-5cK6TgCsp0U/Vff-k7Z0c1I/AAAAAAAAC_A/77Y7KGEzqBc/s400-Ic42/2015-0915-00.png" alt="Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする"/></figure>



<p></p>



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



<h2 class="wp-block-heading">軽いおさらい</h2>



<p>前回は <a href="https://console.developers.google.com">Google Developper Console</a> で鍵ファイルを取得し、 それを使って認証してアクセストークンを取得、 APIにリクエストを投げてスプレッドシートの情報を引っ張るところまでやりました。</p>



<p>以降のコードは下記の変数が宣言されている前提で書かれています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$accessToken; <span class="hljs-comment">// アクセストークン文字列</span>
$listfeed; <span class="hljs-comment">// listfeedのURL</span>
$cellsfeed; <span class="hljs-comment">// cellsfeedのURL</span>
</code></span></pre>


<h2 class="wp-block-heading">シートのデータを取得する（listfeed）</h2>



<p><strong>listfeed</strong> はテーブルの内容を一行ずつまとめて出力する形式です。 セルの住所（A1, C6等）に特に興味がなく、とりあえず一覧用のデータが欲しい場合はこちらの形式が便利ですね。</p>



<p>先ほど取得しておいた <strong>&#8220;listfeed&#8221;</strong> のURLへ、同じ要領でリクエストを投げてみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$request = <span class="hljs-keyword">new</span> Google_Http_Request(
    $listfeed . <span class="hljs-string">"?alt=json"</span>,
    <span class="hljs-string">"GET"</span>,
    <span class="hljs-keyword">array</span>(<span class="hljs-string">"Authorization"</span> =&gt; <span class="hljs-string">"Bearer {$accessToken}"</span>)
);
$data = json_decode($curl-&gt;executeRequest($request)&#91;<span class="hljs-number">0</span>]);
</code></span></pre>


<p>例えば次のようなシートを読み込んだ場合…</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>name</th><th>age</th><th>email</th></tr></thead><tbody><tr><td>John</td><td>26</td><td>john@example.com</td></tr></tbody></table></figure>



<p>次のようなデータが返されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"feed"</span>: {
        <span class="hljs-attr">"entry"</span>: &#91;
            {
                <span class="hljs-attr">"title"</span>: {
                    <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                    <span class="hljs-attr">"$t"</span>: <span class="hljs-string">"john"</span>
                },
                <span class="hljs-attr">"content"</span>: <span class="hljs-string">"age:26, email:john@example.com"</span>
                <span class="hljs-string">"gsx$name"</span>: {<span class="hljs-attr">"$t"</span>: <span class="hljs-string">"John"</span>},
                <span class="hljs-attr">"gsx$age"</span>: {<span class="hljs-attr">"$t"</span>: <span class="hljs-string">"26"</span>},
                <span class="hljs-attr">"gsx$email"</span>: {<span class="hljs-attr">"$t"</span>: <span class="hljs-string">"john@example.com"</span>}
            }
        ]
    }
}
</code></span></pre>


<p><strong>&#8220;title&#8221;</strong> は1カラム目の情報が、<strong>&#8220;content&#8221;</strong> は2カラム以降の情報が &#8220;key:value, key:value&#8221; の形式で格納されますが、 とりあえずこれらは無視して、<strong>&#8220;gsx$&#8221;</strong> の接頭辞が付いている物だけを見ていけば十分でしょう。 接頭辞が邪魔で扱いづらい場合は加工してあげましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// データ加工の例</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_parse_listfeed</span> <span class="hljs-params">($entries)</span></span>{
    $list = <span class="hljs-keyword">array</span>();
    <span class="hljs-keyword">foreach</span>($entries <span class="hljs-keyword">as</span> $entry){
        $item = <span class="hljs-keyword">array</span>();
        <span class="hljs-keyword">foreach</span>($entry <span class="hljs-keyword">as</span> $key =&gt; $value){
            <span class="hljs-keyword">if</span>(preg_match(<span class="hljs-string">'/^gsx\$(.+)$/'</span>, $key, $m)){
                $item&#91;$m&#91;<span class="hljs-number">1</span>]] = $value-&gt;{<span class="hljs-string">"\$t"</span>};
            }
        }
        array_push($list, $item);
    }
    <span class="hljs-keyword">return</span> $list;
}

$list = _parse_listfeed($data-&gt;feed-&gt;entry);
</code></span></pre>


<p>結果をJSONではなくXMLで取得した場合、gsx名前空間の要素を取得するのが少々面倒になります。</p>



<p>cf) <a href="/2010/12/14/various-xml-on-php.html">PHPでXMLの名前空間つきタグを読み込む色々 – Mach3.laBlog</a></p>



<h2 class="wp-block-heading">シートのデータを取得する（cellsfeed）</h2>



<p><strong>cellsfeed</strong> は、セルの値を1つずつ出力してくれる形式です。 <strong>listfeed</strong> のように一行ずつエントリーとしてまとめたい場合には加工が必要ですが、 行・列番号を取得しておきたい場合などにはこちらを使うと良いでしょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$request = <span class="hljs-keyword">new</span> Google_Http_Request(
    $cellsfeed . <span class="hljs-string">"?alt=json"</span>,
    <span class="hljs-string">"GET"</span>,
    <span class="hljs-keyword">array</span>(<span class="hljs-string">"Authorization"</span> =&gt; <span class="hljs-string">"Bearer {$accessToken}"</span>)
);
$data = json_decode($curl-&gt;executeRequest($request)&#91;<span class="hljs-number">0</span>]);
</code></span></pre>


<p>結果は次のようなデータが返されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"feed"</span>: {
        <span class="hljs-attr">"entry"</span>: &#91;
            {
                <span class="hljs-attr">"title"</span>: {
                    <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                    <span class="hljs-attr">"$t"</span>: <span class="hljs-string">"A1"</span>
                },
                <span class="hljs-attr">"content"</span>: {
                    <span class="hljs-attr">"type"</span>: <span class="hljs-string">"text"</span>,
                    <span class="hljs-attr">"$t"</span>: <span class="hljs-string">"name"</span>
                }
            }
        ]
    }
}
</code></span></pre>


<p><strong>&#8220;title&#8221;</strong> にはセルの住所、<strong>&#8220;content&#8221;</strong> にはその値が格納されています。 このエントリーが入力されているセルの数だけ羅列されます。</p>



<p>例えば、（あまり賢い選択とは言えませんが）このデータをリスト形式に整理してみましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// データ加工の例</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_parse_cellsfeed</span> <span class="hljs-params">($entries)</span></span>{
    $fields = <span class="hljs-keyword">array</span>();
    $list = <span class="hljs-keyword">array</span>();

    <span class="hljs-keyword">foreach</span>($entries <span class="hljs-keyword">as</span> $entry){
        preg_match(<span class="hljs-string">"/^(&#91;A-Z]+)(\d+)$/"</span>, $entry-&gt;title-&gt;{<span class="hljs-string">"\$t"</span>}, $m);
        $content = $entry-&gt;content-&gt;{<span class="hljs-string">"\$t"</span>};
        $r = (int) $m&#91;<span class="hljs-number">2</span>];
        $c = $m&#91;<span class="hljs-number">1</span>];

        <span class="hljs-keyword">if</span>($r === <span class="hljs-number">1</span>){
            $fields&#91;$c] = $content;
            <span class="hljs-keyword">continue</span>;
        }
        <span class="hljs-keyword">if</span>(array_key_exists($c, $fields)){
            $list&#91;$r] = is_array($list&#91;$r]) ? $list&#91;$r] : <span class="hljs-keyword">array</span>();
            $list&#91;$r]&#91;$fields&#91;$c]] = $content;
        }
    }

    <span class="hljs-keyword">return</span> $list;
}

$list = _parse_cellsfeed($data-&gt;feed-&gt;entry);
</code></span></pre>


<h2 class="wp-block-heading">シートに新しいデータを追加する</h2>



<p>読み込みの次は、データの書き込みをしてみましょう。 <strong>listfeed</strong> のURLにXMLの本文付きでPOSTすると、新しい行が追加されます。</p>



<p>既存のテーブルに次のようなデータを追加してみましょう。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>name</th><th>age</th><th>email</th></tr></thead><tbody><tr><td>Tom</td><td>32</td><td>tom@example.com</td></tr></tbody></table></figure>



<p>本文の形式は <strong>&#8220;application/atom+xml&#8221;</strong> になります。 listfeed の読み込みの際に使用した <strong>gsx</strong>名前空間を活用して本文を作成しましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$postBody = &lt;&lt;<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">EOS</span>
&lt;<span class="hljs-attr">entry</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2005/Atom"</span> <span class="hljs-attr">xmlns:gsx</span>=<span class="hljs-string">"http://schemas.google.com/spreadsheets/2006/extended"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">gsx:name</span>&gt;</span>Tom<span class="hljs-tag">&lt;/<span class="hljs-name">gsx:name</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">gsx:age</span>&gt;</span>32<span class="hljs-tag">&lt;/<span class="hljs-name">gsx:age</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">gsx:email</span>&gt;</span>tom@example.com<span class="hljs-tag">&lt;/<span class="hljs-name">gsx:email</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">entry</span>&gt;</span>
EOS;
</span></code></span></pre>


<p>作成した本文と Content-Type ヘッダを付加してリクエストを投げます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$request = <span class="hljs-keyword">new</span> Google_Http_Request(
    $listfeed
    <span class="hljs-string">"POST"</span>,
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"Authorization"</span> =&gt; <span class="hljs-string">"Bearer {$accessToken}"</span>,
        <span class="hljs-string">"Content-Type"</span> =&gt; <span class="hljs-string">"application/atom+xml"</span>
    ),
    $postBody
);

$res = $curl-&gt;executeRequest($request);
</code></span></pre>


<p>成功するとシートの最後の行にデータが追加されます。</p>



<p><strong>&lt;, &gt;</strong> を含む値を扱う際、そのまま入力するとXMLの文法が不正になりますので、 <strong>htmlspecialchars</strong> 等を使って特殊文字を変換してあげると良いでしょう。</p>



<h2 class="wp-block-heading">行・列番号を指定してセルの値を更新する</h2>



<p>行単位ではなく、セル単位で値を変更する場合には <strong>cellsfeed</strong> を使用します。 データの追加と同じく、XMLの本文を作成してPOSTします。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$postBody = &lt;&lt;<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">EOS</span>
&lt;<span class="hljs-attr">entry</span> <span class="hljs-attr">xmlns</span>=<span class="hljs-string">"http://www.w3.org/2005/Atom"</span> <span class="hljs-attr">xmlns:gs</span>=<span class="hljs-string">"http://schemas.google.com/spreadsheets/2006"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">gs:cell</span> <span class="hljs-attr">row</span>=<span class="hljs-string">"3"</span> <span class="hljs-attr">col</span>=<span class="hljs-string">"2"</span> <span class="hljs-attr">inputValue</span>=<span class="hljs-string">"33"</span>/&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">entry</span>&gt;</span>
EOS;
</span></code></span></pre>


<p>使用する名前空間は <strong>gs</strong> になります。ここでは、<strong>「3行目の2列目の値を&#8221;33&#8243;に変更」</strong>しています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$request = <span class="hljs-keyword">new</span> Google_Http_Request(
    $cellsfeed,
    <span class="hljs-string">"POST"</span>,
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"Authorization"</span> =&gt; <span class="hljs-string">"Bearer {$accessToken}"</span>,
        <span class="hljs-string">"Content-Type"</span> =&gt; <span class="hljs-string">"application/atom+xml"</span>
    ),
    $postBody
);

$res = $curl-&gt;executeRequest($request);
</code></span></pre>


<p>成功するとスプレッドシートのセルの内容が書き換えられます。こちらも値の特殊文字の変換はお忘れなきよう。</p>



<h2 class="wp-block-heading">めんどくさいですか？</h2>



<p>毎度こんな事をしているのは些か面倒なので、 この辺の処理を簡略化したライブラリを書いてみました。 次回はその紹介となります。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする（1）</title>
		<link>https://blog.mach3.jp/2015/09/16/google-spreadsheet-api-01.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 16 Sep 2015 01:30:05 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Drive]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4118</guid>

					<description><![CDATA[以前より公開されたスプレッドシートの読み込みについて記事をしたためてまいりましたが、 拙作の Ghostsheet 等はスプレッドシートを公開しなければならない、書き込みが出来ないといった欠点がありました。 今回は、Go [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>以前より公開されたスプレッドシートの読み込みについて記事をしたためてまいりましたが、 拙作の <a href="http://mach3.github.io/ghostsheet/">Ghostsheet</a> 等はスプレッドシートを公開しなければならない、書き込みが出来ないといった欠点がありました。 今回は、Google製のPHPクライアントを利用して認証し、読み書きの実験を行ってみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-5cK6TgCsp0U/Vff-k7Z0c1I/AAAAAAAAC_A/77Y7KGEzqBc/s400-Ic42/2015-0915-00.png" alt="Google APIs Client Library for PHP を使ってスプレッドシートを読み書きする"/></figure>



<p></p>



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



<h2 class="wp-block-heading">下準備</h2>



<p>まず必要な物をまとめます。</p>



<ol class="wp-block-list">
<li>サービスアカウントの鍵ファイル</li>



<li>1のアカウントに編集権限を与えたスプレッドシート</li>



<li>Google製のクライアント（PHP）</li>
</ol>



<h3 class="wp-block-heading">サービスアカウントの鍵ファイル</h3>



<ol class="wp-block-list">
<li><a href="https://console.developers.google.com">Google Developper Console</a> でプロジェクトを作成します。</li>



<li>「認証情報」→「認証情報の追加」から「サービスアカウント」を選択</li>



<li>鍵ファイルをJSON形式で取得します。</li>
</ol>



<p>このファイルは認証情報が記載されている大変重要なファイルなので、 サーバー上に設置する際には公開される状態にしないように配慮しましょう。</p>



<h3 class="wp-block-heading">新規スプレッドシートの作成</h3>



<ol class="wp-block-list">
<li><a href="https://drive.google.com">Google Drive</a> で新しいスプレッドシートを作成します。</li>



<li>前工程の鍵ファイル内の「client_email」のメールアドレスに「編集者」の権限を与えます</li>



<li>アドレスバーからスプレッドシートのIDをコピーしておきます</li>
</ol>



<h3 class="wp-block-heading">google/apiclient のインストール</h3>



<p>ここでは認証に <a href="https://github.com/google/google-api-php-client">google-api-php-client</a> を使用します。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p><strong>Google APIs Client Library for PHP</strong><br />
  The Google API Client Library enables you to work with Google APIs such as Google+, Drive, or YouTube on your server.</p>
</blockquote>



<p><a href="https://getcomposer.org/">Composer</a> でインストールするか、直接ソースをダウンロードするかお好みでどうぞ。</p>



<p><strong>Composer の場合</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">require</span> <span class="hljs-string">"vendor/autoload.php"</span>;
</code></span></pre>


<p><strong>直接ダウンロードして設置した場合</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-built_in">require</span> <span class="hljs-string">"the/path/to/google-api-php-client/src/Google/autoload.php"</span>;
</code></span></pre>


<h2 class="wp-block-heading">認証してアクセストークンを取得する</h2>



<p>APIにリクエストを投げるにはアクセストークンが必要なので、 まずはこれを取得します。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-comment">// クライアントを新たに生成</span>
$client = <span class="hljs-keyword">new</span> Google_Client();
$client-&gt;setApplicationName(<span class="hljs-string">"DemoApp"</span>);
<span class="hljs-comment">// 証明書を生成して</span>
$credentials = $client-&gt;loadServiceAccountJson(<span class="hljs-string">"./keys.json"</span>, <span class="hljs-keyword">array</span>(
    Google_Service_Drive::DRIVE
));
<span class="hljs-comment">// クライアントに読ませる</span>
$client-&gt;setAssertionCredentials($credentials);

<span class="hljs-comment">// アクセストークンをリフレッシュする</span>
$client-&gt;getAuth()-&gt;refreshTokenWithAssertion();
<span class="hljs-comment">// アクセストークンを取得</span>
$accessTokenJson = $client-&gt;getAccessToken();
$accessToken = json_decode($accessTokenJson)-&gt;access_token;
</code></span></pre>


<p>本来ならばこのアクセストークンはセッションに保存して再利用するのですが、 ここでは例をシンプルにするためにそのくだりは省いています。</p>



<h2 class="wp-block-heading">スプレッドシートファイルの情報を取得する</h2>



<p>google/apiclientにスプレッドシートを色々触れるAPIが用意されていればよかったのですが、 ちょっと見当たらなかったので、<strong>Google_Http_Request</strong> と <strong>Google_IO_Curl</strong> を使って直接リクエストを飛ばします。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$sheet_id = <span class="hljs-string">"XXXxxxXX-XXXxxxxxXXXXXX"</span>;
$request = <span class="hljs-keyword">new</span> Google_Http_Request(
    <span class="hljs-string">"https://spreadsheets.google.com/feeds/worksheets/{$sheet_id}/private/full?alt=json"</span>,
    <span class="hljs-string">"GET"</span>,
    <span class="hljs-keyword">array</span>(<span class="hljs-string">"Authorization"</span> =&gt; <span class="hljs-string">"Bearer {$accessToken}"</span>)
);
$curl = <span class="hljs-keyword">new</span> Google_IO_Curl($client);
$res = $curl-&gt;executeRequest($request);

$data = json_decode($res&#91;<span class="hljs-number">0</span>]);
</code></span></pre>


<p>URLに <strong>alt=json</strong> パラメータを付加しておくことでJSONでレスポンスが返ってくるので、デコードしましょう。 （デフォルトではAtomなのですが、PHPでは少々扱いづらい為JSONにしています）</p>



<p>かなり多くの情報が格納されているので目が回りそうですが、 スプレッドシートAPIでは共通して、概ね必要な情報は <strong>&#8220;feed&#8221;</strong> オブジェクト内の <strong>&#8220;entry&#8221;</strong> の中に入っています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-string">"entry"</span>: &#91;
    {
        <span class="hljs-string">"id"</span>: {...},
        <span class="hljs-string">"category"</span>: {...},
        <span class="hljs-string">"title"</span>: {...},
        <span class="hljs-string">"content"</span>: {...},
        <span class="hljs-string">"link"</span>: {...},
        ...
    }
]
</code></span></pre>


<p>こんな感じの構造になっていて、 <strong>&#8220;entry&#8221;</strong> の中にはそのスプレッドシートに含まれるシートの数だけオブジェクトが連ねてあります。 ここで肝になるのは <strong>&#8220;link&#8221;</strong> の部分で、それぞれのシートを読み書きする際にリクエストを飛ばすエンドポイントURLが記されています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-string">"link"</span>: &#91;
    {
        <span class="hljs-string">"rel"</span>: <span class="hljs-string">"http://schemas.google.com/spreadsheets/2006#listfeed"</span>,
        <span class="hljs-string">"type"</span>: <span class="hljs-string">"application/atom+xml"</span>,
        <span class="hljs-string">"href"</span>: <span class="hljs-string">"https://spreadsheets.google.com/feeds/list/XXXxxxXX-XXXxxxxxXXXXXX/od6/private/full"</span>
    },
    {
        <span class="hljs-string">"rel"</span>: <span class="hljs-string">"http://schemas.google.com/spreadsheets/2006#cellsfeed"</span>,
        <span class="hljs-string">"type"</span>: <span class="hljs-string">"application/atom+xml"</span>,
        <span class="hljs-string">"href"</span>: <span class="hljs-string">"https://spreadsheets.google.com/feeds/cells/XXXxxxXX-XXXxxxxxXXXXXX/od6/private/full"</span>
    },
    ...
]
</code></span></pre>


<p>読み書きに必要な <strong>&#8220;listfeed&#8221;</strong> と <strong>&#8220;cellsfeed&#8221;</strong> を変数等に格納しておきましょう。</p>



<h2 class="wp-block-heading">続きは次回</h2>



<p>今回はスプレッドシートの情報を取得する所までこぎつけました。 次回はいよいよ実際に読み書きの処理を行ってみます。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Youtube IFrame API を使って遊んでみよう</title>
		<link>https://blog.mach3.jp/2015/07/27/youtube-iframe-api.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 27 Jul 2015 07:44:32 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[YouTube]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=4094</guid>

					<description><![CDATA[Webページで動画を活用したコンテンツもかなり増えてきた昨今ですが、如何お過ごしでしょうか。 今回はYoutubeの動画をJavaScriptで操作する Youtube IFrame API を使って色々遊んでみましょう [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Webページで動画を活用したコンテンツもかなり増えてきた昨今ですが、如何お過ごしでしょうか。 今回はYoutubeの動画をJavaScriptで操作する Youtube IFrame API を使って色々遊んでみましょう。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-tY3hAtMis80/VdLp0b9LA5I/AAAAAAAAC9g/3c1afy9i_60/s400-Ic42/2015-0727-00.png" alt="Youtube IFrame API を使ってみよう"/></figure>



<p></p>



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



<ol class="wp-block-list">
<li>Youtube IFrame API とは</li>



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



<li>動的にスクリプトをロードする</li>



<li>見た目・挙動・イベントを設定する</li>



<li>動画再生のイベントトラッキング</li>



<li>動画の再生の任意のタイミングでアクションを起こす</li>



<li>埋め込みプレイヤーでAPIを利用可能にする</li>



<li>まとめ</li>
</ol>



<h2 class="wp-block-heading">Youtube IFrame API とは</h2>



<ul class="wp-block-list">
<li><a href="https://developers.google.com/youtube/iframe_api_reference">iframe 組み込みの YouTube Player API リファレンス | YouTube IFrame API | Google Developers</a></li>
</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>IFrame Player API を使うと、YouTube 動画プレーヤーをウェブサイトに埋め込み、JavaScript でプレーヤーを制御できます。</p>
</blockquote>



<p>Youtube の埋め込み動画プレーヤーは <strong>iframe</strong> 要素でパブリッシュされますが、 それを動的に生成したり、プレーヤーの再生等を操作したり、イベントを検知して何かアクションを起こしたりする事が出来ます。 動画を軸にしたコンテンツ作りに大活躍しそうですね。</p>



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



<p>プレーヤーの生成は <strong>YT.Player</strong> というクラスを利用して行います。 引数にはプレイヤーを表示する為のコンテナ要素と、オプションを渡します。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">div</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"movie"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">div</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="actionscript">
<span class="hljs-keyword">var</span> onYouTubeIframeAPIReady = <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">()</span></span>{
    <span class="hljs-keyword">var</span> player = <span class="hljs-keyword">new</span> YT.Player(<span class="hljs-string">"movie"</span>, {
        videoId: <span class="hljs-string">"c5kmKO_gGsc"</span>,
        width: <span class="hljs-number">1600</span>,
        height: <span class="hljs-number">900</span>
    });
};
</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p><strong>onYouTubeIframeAPIReady</strong> という関数は、APIのJavaScriptの準備が完了した段階で自動でコールされます。 そして、APIのJavaScript本体を読み込みましょう。</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">src</span>=<span class="hljs-string">"//www.youtube.com/iframe_api"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>これで <strong>#movie</strong> 要素内にプレーヤーが生成されます。とても簡単ですね。</p>



<p>ここでは第一引数に要素のid名を渡していますが、HTMLElementその物でも構いません。 なんでしたら、新たに生成した空要素でもよいでしょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">new</span> YT.Player(<span class="hljs-built_in">document</span>.getElementById(<span class="hljs-string">"movie"</span>), {...});
<span class="hljs-keyword">new</span> YT.Player(<span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">"div"</span>), {...});
</code></span></pre>


<h2 class="wp-block-heading">動的にスクリプトをロードする</h2>



<p><strong>onYouTubeIframeAPIReady</strong> は、スクリプトのロードが完了された時に一度しか実行されません。 つまり既にスクリプトが読み込まれて初期化された状態で onYouTubeIframeAPIReady を設定したとしても、 その処理は行われずに何も起こらない事になります。</p>



<p>そこで、「既にロードされている場合は即時実行、まだの場合はスクリプトを読み込んでから実行」という処理を関数にまとめてみます。 （jQuery使用）</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.youtubeReady = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">callback</span>)</span>{
    <span class="hljs-keyword">var</span> EVENT_READY = <span class="hljs-string">"youtubeready"</span>;

    <span class="hljs-keyword">if</span>(<span class="hljs-built_in">window</span>.YT &amp;&amp; <span class="hljs-built_in">window</span>.YT.Player){
        <span class="hljs-keyword">return</span> callback();
    }
    $(<span class="hljs-built_in">window</span>).on(EVENT_READY, callback);
    <span class="hljs-built_in">window</span>.onYouTubeIframeAPIReady = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        $(<span class="hljs-keyword">this</span>).trigger(EVENT_READY);
        <span class="hljs-built_in">window</span>.onYouTubeIframeAPIReady = <span class="hljs-keyword">void</span> <span class="hljs-number">0</span>;
    };
    $(<span class="hljs-string">"&lt;script&gt;"</span>, {<span class="hljs-attr">src</span>: <span class="hljs-string">"//www.youtube.com/iframe_api"</span>}).appendTo(<span class="hljs-string">"body"</span>);
};
</code></span></pre>


<p>$.youtubeReady には実行したいコールバック関数を渡します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$.youtubeReady(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> player = <span class="hljs-keyword">new</span> YT.Player(...});
});
</code></span></pre>


<h2 class="wp-block-heading">見た目・挙動・イベントを設定する</h2>



<p>オプションの <strong>playerVars</strong> プロパティでプレーヤーの見た目・挙動を、 また同じく <strong>events</strong> プロパティでイベントハンドラの設定をする事が出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> player = <span class="hljs-keyword">new</span> YT.Player(<span class="hljs-string">"movie"</span>, {
    <span class="hljs-attr">videoId</span>: <span class="hljs-string">"c5kmKO_gGsc"</span>,
    <span class="hljs-attr">width</span>: <span class="hljs-number">1600</span>,
    <span class="hljs-attr">height</span>: <span class="hljs-number">900</span>,
    <span class="hljs-attr">playerVars</span>: {
        <span class="hljs-attr">autoplay</span>: <span class="hljs-number">1</span>, <span class="hljs-comment">// 自動再生する・しない</span>
        <span class="hljs-attr">controls</span>: <span class="hljs-number">0</span>, <span class="hljs-comment">// コントロールを表示する・しない</span>
        <span class="hljs-attr">showinfo</span>: <span class="hljs-number">0</span>, <span class="hljs-comment">// 動画の情報テキストを表示する・しない</span>
        <span class="hljs-attr">theme</span>: <span class="hljs-string">"light"</span> <span class="hljs-comment">// テーマの選択（dark|light）</span>
    },
    <span class="hljs-attr">events</span>: {
        <span class="hljs-attr">onReady</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
            <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"--APIの準備が整いました--"</span>);
        }
        <span class="hljs-attr">onStateChange</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
            <span class="hljs-keyword">if</span>(e.data === YT.PlayerState.PLAYING){
                <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"--再生中--"</span>);
            }
        }
    }
});
</code></span></pre>


<p>playerVars では非常に細かい設定が可能です。 詳しくは<a href="https://developers.google.com/youtube/player_parameters?playerVersion=HTML5#Parameters">公式のドキュメント</a>でお探しください。</p>



<p>YT.Player で動画を操作する為には、APIの準備を待たなければなりません。 初期化時に動画を操作するためのアクションは <strong>onReady</strong> 内に書くと良いでしょう。</p>



<h2 class="wp-block-heading">動画再生のイベントトラッキング</h2>



<p>このAPIを調べるきっかけになったテーマなのですが、 例えばユーザーがプレイヤーをクリックしてビデオを再生した時に、Google Analyticsにイベントを一度だけ送信したい場合。</p>



<p>onStateChange イベントを利用する事で実現できますが、 再生中何度もPLAYING（再生中）ステートに切り替わる可能性がありますので、 一度イベントを送信したらその処理を無効化する必要があります。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> playerTrackEvent = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-comment">// 一度だけトラッキングイベントを送信</span>
    <span class="hljs-keyword">if</span>(ga){
        ga(<span class="hljs-string">"send"</span>, <span class="hljs-string">"event"</span>, <span class="hljs-string">"video"</span>, <span class="hljs-string">"play"</span>, <span class="hljs-string">"My Video"</span>);
        playerTrackEvent = <span class="hljs-literal">undefined</span>;
    }
};

<span class="hljs-keyword">var</span> player = <span class="hljs-keyword">new</span> YT.Player(<span class="hljs-string">"movie"</span>, {
    ...
    events: {
        <span class="hljs-attr">onStateChange</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
            <span class="hljs-keyword">if</span>(e.data === YT.PlayerState.PLAYING &amp;&amp; playerTrackEvent){
                playerTrackEvent();
            }
        }
    }
});
</code></span></pre>


<h2 class="wp-block-heading">動画再生の任意のタイミングでアクションを起こす</h2>



<p>例えば「再生時間1:00のタイミングで背景を暗転させたい」など、動画の再生の経過時間をトリガーにしてアクションを起こしたい場合は、 イベントを活用したい所ではありますが、events には <strong>onProgress</strong> のような物は用意されていません。 その為、監視する関数を自前で書く必要があります。</p>



<p>（もっともそのような物を常に発火させていたらコスト的にもよろしくないでしょう）</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// 再生時間が1:00を超えたらページ背景を黒くする</span>
<span class="hljs-keyword">var</span> player, timer, playerProgress;

playerProgress = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    clearTimeout(timer);
    <span class="hljs-keyword">if</span>(
        player.getPlayerState() === YT.PlayerState.PLAYING
        &amp;&amp; player.getCurrentTime() &gt; <span class="hljs-number">60</span>
    ){
        $(<span class="hljs-string">"body"</span>).css(<span class="hljs-string">"background-color"</span>, <span class="hljs-string">"#000"</span>);
        <span class="hljs-keyword">return</span>;
    }
    timer = setTimeout(playerProgress, <span class="hljs-number">100</span>);
};

player = <span class="hljs-keyword">new</span> YT.Player(<span class="hljs-string">"movie"</span>, {
    ...
    events: {
        <span class="hljs-attr">onReady</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
            playerProgress();
        }
    }
});
</code></span></pre>


<p>多用するのはあまり良くなさそうですが、 動画の再生にあわせてページに演出効果を加えたりするなど、ちょっと面白そうですね。</p>



<h2 class="wp-block-heading">埋め込みプレーヤーでAPIを利用可能にする</h2>



<p>Youtube のビデオ再生画面で取得できる「埋め込みコード」による埋込プレーヤーでも、APIが利用可能です。 つまりHTMLに埋め込みコードの <strong>iframe</strong> を直書きして、それを元にインスタンスを生成して操作する事が出来ます。</p>



<p>下の例では、準備が完了した時点でプレーヤーをフェードインさせてみます。</p>



<h3 class="wp-block-heading">HTML/CSS</h3>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">style</span>&gt;</span><span class="css">
<span class="hljs-selector-id">#movie</span> {
    <span class="hljs-attribute">transition</span>: opacity <span class="hljs-number">1s</span> ease <span class="hljs-number">0s</span>;
    <span class="hljs-attribute">opacity</span>: <span class="hljs-number">0</span>;
}
<span class="hljs-selector-id">#movie</span><span class="hljs-selector-class">.show</span> {
    <span class="hljs-attribute">opacity</span>: <span class="hljs-number">1</span>;
}
</span><span class="hljs-tag">&lt;/<span class="hljs-name">style</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">iframe</span>
    <span class="hljs-attr">width</span>=<span class="hljs-string">"320"</span>
    <span class="hljs-attr">height</span>=<span class="hljs-string">"180"</span>
    <span class="hljs-attr">id</span>=<span class="hljs-string">"movie"</span>
    <span class="hljs-attr">src</span>=<span class="hljs-string">"https://www.youtube.com/embed/c5kmKO_gGsc?rel=0<span class="hljs-symbol">&amp;amp;</span>controls=0<span class="hljs-symbol">&amp;amp;</span>showinfo=0<span class="hljs-symbol">&amp;amp;</span>enablejsapi=1"</span>
    <span class="hljs-attr">frameborder</span>=<span class="hljs-string">"0"</span>
    <span class="hljs-attr">allowfullscreen</span>
&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">iframe</span>&gt;</span>
</code></span></pre>


<h3 class="wp-block-heading">JavaScript</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> player = YT.Player(<span class="hljs-string">"movie"</span>, {
    <span class="hljs-attr">events</span>: {
        <span class="hljs-attr">onReady</span>: <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
            $(e.target).addClass(<span class="hljs-string">"show"</span>);
        }
    }
});
</code></span></pre>


<p>埋め込みプレーヤーのURLに <strong>enablejsapi=1</strong> のパラメータを付加しなければならない点に注意しましょう。</p>



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



<p>動画の活用は負荷もそれなりなので使い所は考えなければなりませんが、 訴求力を高めるには中々良い手段なので、上手に活用していきたいですね。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TumblrPosts.js が新しくなりました</title>
		<link>https://blog.mach3.jp/2012/11/26/tumblrposts-js-1-3.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 26 Nov 2012 04:35:12 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Tumblr]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2784</guid>

					<description><![CDATA[だいぶ前に書いた&#8221;TumblrPosts.js&#8220;ですが、意外と使われる方がいらっしゃったのと、 わりと適当だったり、よろしくない部分も多く見られたので少し見直しを行いました。 TumblrPost [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>だいぶ前に書いた&#8221;<a href="/2010/10/js-tumblrposts.html">TumblrPosts.js</a>&#8220;ですが、意外と使われる方がいらっしゃったのと、 わりと適当だったり、よろしくない部分も多く見られたので少し見直しを行いました。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/TLff5hpTJ3I/AAAAAAAABDs/okRSs8lEXPM/201010151358.png" alt="TumblrPosts.js が新しくなりました"/></figure>



<p></p>



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



<h2 class="wp-block-heading">TumblrPostsとは</h2>



<ul class="wp-block-list">
<li><a href="http://mach3.github.com/js-tumblrposts.js/">Js-tumblrposts.js by mach3</a></li>
</ul>



<p>TumblrPostsは、「<a href="/2010/10/js-tumblrposts.html">Tumblrでタグリスト/新規投稿リストを出力してみる</a>」で紹介したjQueryプラグインです。</p>



<p>TumblrのAPIでは、最新のポストのリストを取得する事ができますが、 タグの一覧を取得する方法が無かった為、それを可能にする為のライブラリです。</p>



<h2 class="wp-block-heading">新しいTumblr APIについて</h2>



<p>今現在、Tumblrからは新しいAPIが提供されています。</p>



<ul class="wp-block-list">
<li><a href="http://www.tumblr.com/docs/en/api/v2">API | Tumblr</a> : 新しいAPI</li>



<li><a href="http://www.tumblr.com/docs/en/api/v1">Tumblr API v1 | Tumblr</a> : 古いAPI</li>
</ul>



<p>（投稿リストを取得する上で）大きく変わったのは<em>API Keyを必要とするようになった</em>点、 それから<em>最大取得件数が50件から20件に減った</em>点です。タグ自体のリストの取得機能は今見る限りではなさそうです。</p>



<p>TumblrPostsはAPIへのリクエストを繰り返して投稿リストをまとめていくタイプのライブラリなので、 最大取得件数が半分未満に減る事で、リクエスト回数が倍以上に膨れ上がる事になります。 投稿数が多いブログではパフォーマンスに大きな影響を与えるので、ちょっとまずそうですね。</p>



<p>そういったわけで、今回のTumblrPostsでも引き続き旧バージョンのAPIを使用します。 旧バージョンの提供がなくなったり、新バージョンでの機能強化があったらその時にまた考えます。</p>



<h2 class="wp-block-heading">新しいTumblrPostsの主な変更点</h2>



<p>基本的な使い方はそのままに、下記の点を修正しています。</p>



<ol class="wp-block-list">
<li>依存ライブラリをjQueryのみに（jquery.class.jsから切り離しました）</li>



<li>jQuery.on/off に対応（bind/unbindも引き続き使えます）</li>



<li>取得件数の設定を詳細に</li>



<li>getTags()のソートの初期設定を変更</li>
</ol>



<p>4について、旧バージョンでは投稿数での降順にソートされていましたが、 デフォルトではソートなしで、引数でソートの方向を指定出来るようにしました。</p>



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



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



<p>旧バージョンから大きな変更はありません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// インスタンスを生成</span>
<span class="hljs-keyword">var</span> myTumblrPosts = <span class="hljs-keyword">new</span> TumblrPosts();

<span class="hljs-comment">// 読み込み完了時のイベントハンドラを設定</span>
myTumblrPosts.on(<span class="hljs-string">"complete"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> $ul, tags;

    <span class="hljs-comment">// getTags() : タグリストを取得</span>
    tags = <span class="hljs-keyword">this</span>.getTags();
    $ul = $(<span class="hljs-string">"&lt;ul&gt;"</span>);
    $.each(tags, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">i, tag</span>)</span>{
        $ul.append(
            $(<span class="hljs-string">"&lt;li&gt;"</span>).text(tag.name + <span class="hljs-string">" ("</span> + tag.count + <span class="hljs-string">")"</span>)
        );
    });

    $ul.appendTo( $(<span class="hljs-string">"#your-own-container"</span>) );
});

<span class="hljs-comment">// 読み込みを開始</span>
myTumblrPosts.run();
</code></span></pre>


<h3 class="wp-block-heading">タグリストのソート</h3>



<p><em>getTags()</em> の引数に <em>&#8220;asc&#8221;</em> または <em>&#8220;desc&#8221;</em> を渡すと、投稿数でソートを行います。<br />
引数がない場合は、ソートを行いません。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">myTumblrPosts.getTags(<span class="hljs-string">"asc"</span>); <span class="hljs-comment">// &lt;= 投稿数の少ない順にソート</span>
myTumblrPosts.getTags(<span class="hljs-string">"desc"</span>); <span class="hljs-comment">// &lt;= 投稿数の多い順にソート</span>
</code></span></pre>


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



<p>TumblrPosts.js のダウンロードはこちらから。</p>



<p>» <a href="http://mach3.github.com/js-tumblrposts.js/">Js-tumblrposts.js by mach3</a></p>



<p>昔書いた物の粗が見えるようになるのは、成長の証でしょうか。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>GoogleスプレッドシートをJSONPで利用する（後編）</title>
		<link>https://blog.mach3.jp/2012/03/09/get-spreadsheet-as-json-02.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 09 Mar 2012 09:37:51 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[JSONP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2313</guid>

					<description><![CDATA[『GoogleスプレッドシートをJSONPで利用する（前編）』の続きです。 一連の処理をまとめてみたスクリプトを紹介します。 書いてみたもの SpreadSheetLoader mach3/js-spreadsheetl [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>『<a href="/2012/03/get-spreadsheet-as-json.html">GoogleスプレッドシートをJSONPで利用する（前編）</a>』の続きです。<br />
一連の処理をまとめてみたスクリプトを紹介します。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-wdd_L9degVk/T1IymJTfKtI/AAAAAAAABdk/YZrFvGpXApA/s400/201203032357.png" alt="GoogleスプレッドシートをJSONPで利用する（後編）"/></figure>



<p></p>



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



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



<h3 class="wp-block-heading">SpreadSheetLoader</h3>



<p><a href="https://github.com/mach3/js-spreadsheetloader">mach3/js-spreadsheetloader via GitHub</a></p>



<ul class="wp-block-list">
<li>スプレッドシートのJSONを読み込みます</li>



<li>読み込んだデータを整理します</li>



<li>jQuery 1.7+ が必要です</li>
</ul>



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



<h3 class="wp-block-heading">1. URLを取得</h3>



<p>まず<a href="">前編</a>の記事を参考にしてURLを取得してきましょう。<br />
形式は「Atom」または「RSS」の、「セル」を選択してください。<br />
こんな感じの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/cells/**********/***/public/basic
</div></figure>
</blockquote>



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



<p>まずはインスタンスを初期化し、URLを渡し、読み込みます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// 1. インスタンス初期化</span>
<span class="hljs-keyword">var</span> myloader = <span class="hljs-keyword">new</span> SpreadSheetLoader( &#91;your_url] );

<span class="hljs-comment">// 2. readyイベントハンドラを登録</span>
myloader.on(<span class="hljs-string">"ready"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">var</span> data = <span class="hljs-keyword">this</span>.getData();
});

<span class="hljs-comment">// 3. load()</span>
myloader.load();
</code></span></pre>


<ol class="wp-block-list">
<li>コンストラクタの引数にURLを渡して初期化します。<br /><br />URLは後から<em>setUrl()</em>で渡すことも出来ます。</li>



<li><em>on()</em>で<em>ready</em>イベントへのハンドラを設定します。<br /><br /><em>ready</em>イベントは、スプレッドシートが読み込まれ、データが整理された時点で発火します。</li>



<li><em>load()</em>で読み込み開始</li>
</ol>



<h3 class="wp-block-heading">3. データを利用する</h3>



<p>readyイベントハンドラの中では、自由にデータを利用する事ができます。<br />
あとは煮るなり焼くなり。<br />
データの利用の仕方は…</p>



<h2 class="wp-block-heading">データを取得する</h2>



<p>整理されたデータを取得して利用する為には、幾つかの方法が用意されています。</p>



<dl>
<dt>getData() : Array</dt>
<dd>データがまるごと配列で返されます。</dd>
</dl>



<pre class="wp-block-preformatted">myloader.on("ready", function(){
    var data = this.getData();
    console.log(data[3]); // 4番目のデータ
});
</pre>



<dl>
<dt>getItem(condition) : Array</dt>
<dd>条件に合うデータのみを配列で返します。<br />
条件はオブジェクトで渡します。</dd>
</dl>



<pre class="wp-block-preformatted">myloader.on("ready", function(){
    var myItems = this.getItem({color:"red", price:800}); // 色がredで、価格が800の物を抽出
});
</pre>



<dl>
<dt>each(callback)</dt>
<dd>データに対して繰り返し処理を行います。（中身はjQuery.fn.eachです）</dd>
</dl>



<pre class="wp-block-preformatted">myloader.on("ready", function(){
    var total = 0;
    this.each(function(){
      total += this.price;
    });
    console.log( "Total price:", total ); // 全データのpriceの合計
});
</pre>



<h2 class="wp-block-heading">試してみる</h2>



<h3 class="wp-block-heading">ソース</h3>



<p>例えば、<a href="https://docs.google.com/spreadsheet/ccc?key=0Ark6jIWYcmkLdEIyTURIVTAwdTM2Z00wUkpfY2hyRlE#gid=0">こんな表</a>を読み込んでみます。</p>



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



<h3 class="wp-block-heading">デモ</h3>



<p><iframe width="100%" height="300" src="http://jsfiddle.net/rCj9B/1/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>



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



<p>前記事の通り、使える場面というのはわりと限られてそうではありますが、<br />
何かの折に使ってみようかなと思っております。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>GoogleスプレッドシートをJSONPで利用する（前編）</title>
		<link>https://blog.mach3.jp/2012/03/07/get-spreadsheet-as-json.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 07 Mar 2012 09:52:12 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JSON]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2286</guid>

					<description><![CDATA[以前Yahoo! pipesで似たような事をやりましたが、 どうやらGoogleスプレッドシートそのものがJSON出力に対応していたので、 それをJSから利用してみようという試みです。 URLの取得 現在の「新しいスプレ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>以前<a href="/2011/02/cms-with-yahoopipes.html">Yahoo! pipesで似たような事をやりました</a>が、<br />
どうやらGoogleスプレッドシートそのものがJSON出力に対応していたので、<br />
それをJSから利用してみようという試みです。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-wdd_L9degVk/T1IymJTfKtI/AAAAAAAABdk/YZrFvGpXApA/s400/201203032357.png" alt="GoogleスプレッドシートをJSONPで利用する（前編）"/></figure>



<p></p>



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



<ol class="wp-block-list">
<li>URLの取得</li>



<li>「リスト」と「セル」</li>



<li>JSONPしてみる</li>



<li>どんな時に使えそうか</li>



<li>デメリットなど</li>



<li>後半へ</li>
</ol>



<h2 class="wp-block-heading">URLの取得</h2>



<p class="caution">
現在の「新しいスプレッドシート」では「公開データのリンクを取得」のUIがありませんが、APIは一応整備されていてJSONPでも利用できます。<br />
URL: <strong>https://spreadsheets.google.com/feeds/list/[A]/[B]/public/basic?alt=json</strong><br />
[A]にはスプレッドシートID、[B]にはワークシートIDが入ります。
</p>



<p>まずは対象となるスプレッドシートをJSONで出力する事からスタート。<br />
現時点でJSONは選択肢には出てこないので、ちょっと自分で書き換える必要があります。</p>



<ol class="wp-block-list">
<li>「ファイル」→「ウェブに一般公開」→「公開開始」で公開する。</li>



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



<li>末尾の「alt=rss」を「alt=<em>json</em>」に変更してコピー。</li>
</ol>



<p>コピーしたらアドレスバーに入力して内容をチェックしてみましょう。</p>



<h2 class="wp-block-heading">「リスト」と「セル」</h2>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-eJTAufGfAmM/T1IymLL0dLI/AAAAAAAABdk/KCozZR85UCA/s500/201203040001.png" alt="「リスト」と「セル」"/></figure>



<p></p>



<p>「公開データへのリンクを取得」では、<em>「リスト」</em>と<em>「セル」</em>というラジオボタンがありますが、<br />
これはデータ出力の方法を設定する物です。</p>



<dl>
<dt>「リスト」</dt>
<dd>データの1カラム目をタイトルとし、行を一つのコンテンツとして出力。</dd>
<dt>「セル」</dt>
<dd>内容を含むセルを全て順番に出力していきます。</dd>
</dl>



<h3 class="wp-block-heading">例</h3>



<p>例えば、次のようなテーブルの場合。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>id</th><th>name</th><th>content</th></tr></thead><tbody><tr><td>1</td><td>hoge</td><td>this is hoge</td></tr></tbody></table></figure>



<p>「リスト」の場合は次のように出力されます。<br />
行ごとに「entry」がある感じですね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">{
    <span class="hljs-string">"version"</span>: <span class="hljs-string">"1.0"</span>,
    <span class="hljs-string">"encoding"</span>: <span class="hljs-string">"UTF-8"</span>,
    ...
    <span class="hljs-string">"feed"</span>: {
        ...
        <span class="hljs-string">"entry"</span>: &#91;{
            ...
            <span class="hljs-string">"title"</span>: {
                <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                <span class="hljs-string">"$t"</span>: <span class="hljs-string">"1"</span>
            },
            <span class="hljs-string">"content"</span>: {
                <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                <span class="hljs-string">"$t"</span>: <span class="hljs-string">"name: hoge, content: this is hoge"</span>
            }
        }]
    }
}
</code></span></pre>


<p>一方「セル」の場合は、内容を含むセル毎にentryを出力します。<br />
現在地はtitleの「A1」「B1」「A2」などで取得できる他、<br />
id属性にあるURLの末尾にRC方式で記載されています。</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/cells/[document_id]/od6/public/basic/R1C3
</div></figure>
</blockquote>


<pre class="wp-block-code"><span><code class="hljs language-javascript">{
    <span class="hljs-string">"version"</span>: <span class="hljs-string">"1.0"</span>,
    <span class="hljs-string">"encoding"</span>: <span class="hljs-string">"UTF-8"</span>,
    ...
    <span class="hljs-string">"feed"</span>: {
        <span class="hljs-string">"entry"</span>: &#91;
            {
                ...
                <span class="hljs-string">"title"</span>: {
                        <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                        <span class="hljs-string">"$t"</span>: <span class="hljs-string">"A1"</span>
                },
                <span class="hljs-string">"content"</span>: {
                        <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                        <span class="hljs-string">"$t"</span>: <span class="hljs-string">"id"</span>
                }
            },
            {
                ...
                <span class="hljs-string">"title"</span>: {
                        <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                        <span class="hljs-string">"$t"</span>: <span class="hljs-string">"B1"</span>
                },
                <span class="hljs-string">"content"</span>: {
                        <span class="hljs-string">"type"</span>: <span class="hljs-string">"text"</span>,
                        <span class="hljs-string">"$t"</span>: <span class="hljs-string">"name"</span>
                }
            },
            <span class="hljs-comment">/* セルの分繰り返し */</span>
        ]
    }
}
</code></span></pre>


<h3 class="wp-block-heading">どっちがいいの？</h3>



<p>一見すると「リスト」の方が扱いやすそうなのですが、<br />
「リスト」は区切り文字に使用される「,」および「:」がセルの内容に含まれていても、<br />
エスケープ等はしてくれないのでパースが少々厄介になります。</p>



<p>つまり、セル内容に区切り文字を含む可能性がある場合は<br />
「セル」方式を整理して利用した方が安全そうです。</p>



<h2 class="wp-block-heading">JSONPしてみる</h2>



<p>jQueryを使ってJSONPで取得してみます。<br />
コールバック用のパラメータは「callback」なのでデフォルトでOK。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> url = <span class="hljs-string">"&#91;your_url]"</span>;

$.ajax({
    <span class="hljs-attr">url</span> : url,
    <span class="hljs-attr">dataType</span> : <span class="hljs-string">"jsonp"</span>,
    <span class="hljs-attr">success</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">data, status</span>)</span>{
        $.each(data.feed.entry, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">i, item</span>)</span>{
            <span class="hljs-built_in">console</span>.log(item);
        });
    }
});
</code></span></pre>


<p>渡されたオブジェクトをdataとして、data.feed.entryと辿ると各アイテムが取得できます。</p>



<h2 class="wp-block-heading">どんな時につかえそうか</h2>



<p>CMSは数あれど、ニュース記事や静的なページは編集出来ても、<br />
表形式の内容の編集には基本的には向いていません。<br />
また、「MTやWordPressはわからないけどExcelなら使えるよ！」<br />
という方も、一般企業のWeb担当さんにはいらっしゃるかもしれません。</p>



<p>例えば、</p>



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



<li>ショップリスト</li>



<li>スライダーの画像リスト</li>
</ul>



<p>といったコンテンツをクライアントが更新担当する場合は導入検討の余地がありそうですね。<br />
表形式は、ページというより簡易データベースとして活躍しそうです。</p>



<p>私は先日、JavaScriptから商品リストを読み込みたい案件があり、<br />
定期的にメンテナンスもある関係上管理しやすくする為、導入してみました。</p>



<h2 class="wp-block-heading">デメリットなど</h2>



<h3 class="wp-block-heading">アクセシビリティの問題</h3>



<p>JavaScriptでの出力となると、当然アクセシビリティの問題が生じます。<br />
そこらへんが気になる性格のコンテンツにはあまり適切な手法ではないと思います。<br />
それでも導入したい場合はクライアント側のJavaScriptではなくサーバサイドでの処理、<br />
且つキャッシュの保持等を検討した方が良いかもしれません。</p>



<h3 class="wp-block-heading">オーナー情報に注意</h3>



<p>出力結果を見るとわかりますが、gmailのアカウント名が思いっきり出力されます。<br />
気になる場合は専用のアカウントを使うか、<br />
開発が終わったら担当者のアカウントに移譲した方が良いでしょう。</p>



<h2 class="wp-block-heading">後半へ</h2>



<p>後半は、これを単純化するライブラリを書いてみたので、そのご紹介です。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PEARのServices_Twitterで未定義のエンドポイントを利用する</title>
		<link>https://blog.mach3.jp/2011/10/18/add-endpoints-to-services_twitte.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 18 Oct 2011 05:31:42 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[PEAR]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Services_Twitter]]></category>
		<category><![CDATA[Twitter]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2082</guid>

					<description><![CDATA[この記事の情報は古くなっています。 Twitter APIのバージョンも上がり、Services_Twitterは現在メンテナンスされていない様です。 「Services_Twitter」は、簡単にTwitterAPIを [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="caution">
    この記事の情報は古くなっています。<br />
    Twitter APIのバージョンも上がり、Services_Twitterは現在メンテナンスされていない様です。
</p>



<p>「<a href="http://pear.php.net/package/Services_Twitter">Services_Twitter</a>」は、簡単にTwitterAPIを利用する為のPEARパッケージです。<br />
今回の記事は、このパッケージでサポートされていないエンドポイントを使う方法の備忘録です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/-gw3047B-bIA/Tp0OnuC4ktI/AAAAAAAABYA/5E_EXhAF310/s400/201110181428.png" alt="PEARのServices_Twitterで未定義のエンドポイントを利用する"/></figure>



<p></p>



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



<h2 class="wp-block-heading">Services_Twitterで利用できない物</h2>



<p>例えば、<em>statuses/following_timeline</em>や、<em>statuses/media_timeline</em>等、<br />
公式のREST APIドキュメントに記載されていないものは、<br />
初期状態のServices_Twitterでは使用する事ができません。</p>



<ul class="wp-block-list">
<li><a href="https://dev.twitter.com/docs/api">REST API Resources | Twitter Developers</a></li>
</ul>



<p>※公式でアナウンスされていない物を使うわけですから、使用は勿論自己責任になります。</p>



<h2 class="wp-block-heading">Services_Twitterにエンドポイントを追加する方法</h2>



<p>Services_Twitterは、XMLで使用できるエンドポイントを管理していて、<br />
そこに定義されていない物を呼びだそうとすると例外を吐く作りになっています。</p>



<h3 class="wp-block-heading">api.xmlの所在</h3>



<p>エンドポイントの定義ファイルである「api.xml」は、<br />
PEARのインストールディレクトリ内の</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>data/Services_Twitter/data/api.xml</p>
</blockquote>



<p>に置いてあります。<br />
これに<endpoint>を追加してやれば、エンドポイントを使えるようになる仕組み。<br />
ただ、これを直接編集するのもちょっとアレだなぁと思い…</endpoint></p>



<h2 class="wp-block-heading">XMLを指定してエンドポイントを追加出来るように拡張してみる</h2>



<p>自前のxmlファイルのパスを引数に突っ込んで、<br />
未定義のエンドポイントを足せるようにServices_Twitterクラスを拡張してみます。</p>



<h3 class="wp-block-heading">書いてみた物</h3>



<ul class="wp-block-list">
<li><a href="https://gist.github.com/1292371">Servces_Twitterを拡張して定義ファイルを追加で読み込めるようにする。 — Gist</a></li>
</ul>



<pre class="wp-block-preformatted"><!--?php
require_once( "Services/Twitter.php" );

class MY_Services_twitter extends Services_twitter {

    public function __construct(){
        parent::__construct();
    }

    public function addAPI( $xml ){
        if( !file_exists( $xml ) ){
            throw new Exception( "'{$xml}' is not found." );
        }
        $xmlApi = simplexml_load_file( $xml );
        foreach ($xmlApi--->category as $category) {
            $catName = (string)$category['name'];
            if( !is_array( $this-&gt;api[$catName] ) ){
                $this-&gt;api[$catName] = array();
            }
            foreach ($category-&gt;endpoint as $endpoint) {
                $this-&gt;api[$catName][(string)$endpoint['name']] = $endpoint;
            }
        }
    }
}
</pre>



<p>うん、ものすごくたいした拡張ではないですね。<br />
使い方は、addAPIメソッドにXMLへのパスを突っ込むだけ。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="php"><span class="hljs-meta">&lt;?php</span>

$foo = <span class="hljs-keyword">new</span> MY_Services_twitter();
$foo-&gt;addAPI( <span class="hljs-string">"/the/path/to/your/api.xml"</span> );
</span></code></span></pre>


<h2 class="wp-block-heading">試しにエンドポイントを追加してみたXML</h2>



<p>試しにfollowing_timelinとmedias_timelineを追加する為のXMLを記述してみます。</p>



<p>仕様は未公開のうえ、パラメータの試験とかはやってないので、<br />
繰り返しますがご使用は自己責任で。<br />
以下の例のパラメータは、公式のWebサイトで使われている物を<br />
それっぽく適当に突っ込んでいます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">api</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">category</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"statuses"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">endpoint</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"following_timeline"</span> <span class="hljs-attr">method</span>=<span class="hljs-string">"GET"</span> <span class="hljs-attr">auth_required</span>=<span class="hljs-string">"false"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">formats</span>&gt;</span>xml,json,rss,atom<span class="hljs-tag">&lt;/<span class="hljs-name">formats</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"include_entities"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"boolean"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"include_available_feature"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"boolean"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"contributor_details"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"boolean"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"user_id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"id_or_screenname"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"screen_name"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"id_or_screenname"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">endpoint</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">endpoint</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"media_timeline"</span> <span class="hljs-attr">method</span>=<span class="hljs-string">"GET"</span> <span class="hljs-attr">auth_required</span>=<span class="hljs-string">"false"</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">formats</span>&gt;</span>xml,json,rss,atom<span class="hljs-tag">&lt;/<span class="hljs-name">formats</span>&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"offset"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"integer"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"count"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"integer"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"score"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"boolean"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"filter"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"boolean"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"include_entities"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"boolean"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"user_id"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"id_or_screenname"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
            <span class="hljs-tag">&lt;<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"screen_name"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"id_or_screenname"</span> <span class="hljs-attr">required</span>=<span class="hljs-string">"false"</span> /&gt;</span>
        <span class="hljs-tag">&lt;/<span class="hljs-name">endpoint</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">category</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">api</span>&gt;</span>
</code></span></pre>


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



<p>Services_Twitterではエンドポイントへのアクセスを__callで実装していて、<br />
目新しかったので参考になりました。<br />
今度機会があったら使ってみよう。オーバーロード。</p>



<ul class="wp-block-list">
<li><a href="http://php.net/manual/ja/language.oop5.overloading.php">PHP: オーバーロード &#8211; Manual</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Anywhereのクラスを使ってユーザをフォローさせてみる</title>
		<link>https://blog.mach3.jp/2011/06/16/follow-user-with-anywhere.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 16 Jun 2011 02:46:02 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Anywhere]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Twitter]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1856</guid>

					<description><![CDATA[Twitterの@anywhereは既に提供を終了していますので、本記事の内容も利用出来ません。 Sunsetting @Anywhere &#124; Twitter Developers 先日、Twitter公式から「フォロー [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="caution">
  Twitterの@anywhereは既に提供を終了していますので、本記事の内容も利用出来ません。<br /> <a href="https://dev.twitter.com/blog/sunsetting-anywhere">Sunsetting @Anywhere | Twitter Developers</a>
</p>



<p>先日、Twitter公式から「<a href="http://twitter.com/about/resources/followbutton">フォローボタン</a>」がリリースされましたね。<br />
とても便利そうなのですが、今日はそのボタンのお話ではなく、<br />
<a href="http://dev.twitter.com/anywhere">@anywhere</a>を使ってユーザをフォローさせるスクリプトのお話です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-vJVWN8ZLy2s/TfloJNz0uUI/AAAAAAAABSs/-45ltvs2EWs/201106161116.png" alt="User.follow"/></figure>



<p></p>



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



<h2 class="wp-block-heading">currentUser.follow()について</h2>



<p>AnywhereのTwitterオブジェクトに生えているcurrentUserにfollowメソッドがあるのですが、<br />
これは、「このユーザーで誰かをフォローする」ためのメソッドではなく、<br />
「このユーザーをフォローする」ためのメソッドです。<br />
つまり、</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">twttr.anywhere(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">tw</span>)</span>{
    <span class="hljs-keyword">if</span>( tw.isConnected() ){
        tw.currentUser.follow();
    } <span class="hljs-keyword">else</span> {
        <span class="hljs-comment">// ログインボタン表示</span>
    }
});
</code></span></pre>


<p>こんなふうにしても自分で自分をフォローしようとしてるだけで何も起きません。<br />
引数とか渡してみても変わらず。<br />
じゃぁどうするの。</p>



<h2 class="wp-block-heading">currentUserのidをすり替える例</h2>



<p>が、こちらに掲載されていました。<br />
<a href="http://www.polidog.jp/2010/07/17/anywhere%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%95%E3%82%A9%E3%83%AD%E3%83%BC%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%8A/">@Anywhereを使ってフォローしてみたり | polidog lab++</a></p>



<p>要するに、idを参照してフォローの処理を行っているなら、<br />
フォローの時だけidを差し替えて別人になってもらえば良いと。<br />
なるほど参考になりました。</p>



<h2 class="wp-block-heading">別のインスタンスを作る例</h2>



<p>上の記事を読んでから気付いたのですが、<br />
currentUserと同じクラスのインスタンスを作った方が理にかなっているのではないかと。<br />
探してみたら、TwitterオブジェクトにUserというクラスが生えていました。</p>



<h3 class="wp-block-heading">Userクラスの使い方</h3>



<p>オブジェクトでオプションを渡してnewしてやればもう使えます。<br />
そしてfollow()すれば、今サインインしてるユーザ(currentUser)から<br />
目的のユーザ（myUser）をフォローさせられるわけですね。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">twttr.anywhere(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">tw</span>)</span>{
    <span class="hljs-keyword">if</span>( tw.isConnected() ){
        <span class="hljs-keyword">var</span> myUser = <span class="hljs-keyword">new</span> tw.User({ <span class="hljs-string">"id"</span> : <span class="hljs-string">"XXXXXXXX"</span> }); <span class="hljs-comment">// IDを入れてね！</span>
        <span class="hljs-comment">// ↓これでid:XXXXXXXXのユーザをフォロー出来ます</span>
        myUser.follow(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">success</span>)</span>{
            <span class="hljs-keyword">if</span>( success ){ alert(<span class="hljs-string">"フォローしたよ！"</span>); }
            <span class="hljs-keyword">else</span> { alert(<span class="hljs-string">"なんか失敗したよ！"</span>); }
        });
    } <span class="hljs-keyword">else</span> {
        <span class="hljs-comment">// ログインボタン表示</span>
    }
});
</code></span></pre>


<p>follow()の引数に渡せるコールバック関数には、<br />
フォローが成功したか否かのboolが引数として渡されます。</p>



<h2 class="wp-block-heading">既にフォローされているかを確認してからフォローさせる</h2>



<p>既にフォローされている場合はfollow()する必要がないので、<br />
currentUser.isFollowing()で条件分岐をしてみます。</p>



<p>第一引数にフォロー済みかどうかを調べたいID、<br />
第二引数に結果を受け取る為のコールバック関数を渡して使います。<br />
コールバック関数にはフォロー済みか否か真偽値で渡されます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">twttr.anywhere(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">tw</span>)</span>{
    <span class="hljs-keyword">var</span> id_str, callback;
    id_str = <span class="hljs-string">"XXXXXXXX"</span>, <span class="hljs-comment">//フォローさせたいID</span>
    callback = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">f</span>)</span>{
        <span class="hljs-keyword">if</span>( f ){ alert(<span class="hljs-string">"フォロー済みだよ！"</span>); }
        <span class="hljs-keyword">else</span> { alert( <span class="hljs-string">"まだフォローしてないよ！"</span>); }
    };
    tw.currentUser.isFollowing( id_str, callback );
});
</code></span></pre>


<h2 class="wp-block-heading">もろもろまとめてみた例</h2>



<p>サインインの条件分岐も併せてまとめてみる。</p>



<p><strong>HTML</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">input</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"button"</span> <span class="hljs-attr">id</span>=<span class="hljs-string">"follow-me-button"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"フォローしてね！"</span> /&gt;</span>
</code></span></pre>


<p><strong>JavaScript</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">twttr.anywhere( <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">tw</span>)</span>{
    <span class="hljs-keyword">var</span> id_str, followMe;
    id_str = <span class="hljs-string">"XXXXXXXXX"</span>;
    followMe = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">if</span>( !tw.isConnected() ){
            <span class="hljs-comment">// サインインしてなければしてもらおう</span>
            tw.bind( <span class="hljs-string">"authComplete"</span>, followMe );
            tw.signIn();
            <span class="hljs-keyword">return</span>;
        }
        tw.currentUser.isFollowing( id_str, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> f </span>)</span>{
            <span class="hljs-keyword">if</span>( f ){
                alert( <span class="hljs-string">"もう既にフォローしています"</span> );
            } <span class="hljs-keyword">else</span> {
                <span class="hljs-keyword">if</span>( confirm( <span class="hljs-string">"本当にフォローしちゃっていいですか？"</span> ) ){
                    ( <span class="hljs-keyword">new</span> tw.User({ <span class="hljs-attr">id</span>:id_str }) ).follow(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
                        alert( <span class="hljs-string">"フォローしました"</span> );
                    });
                }
            }
        });
    };
    $(<span class="hljs-string">"#follow-me-button"</span>).click( followMe );
});
</code></span></pre>


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



<p>単純にフォローさせるだけなら公式のボタンで事足りますが、<br />
例えばキャンペーンサイト等でツイートさせるついでにフォローしてもらう、<br />
みたいな処理をしたい場合に使える機能ですね。</p>



<p>ここらへんの情報がドキュメントになって公開されていれば幸せになれるのですが、<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>
	</channel>
</rss>
