<?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>PHP &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/php/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>新しくなったスプレッドシートと簡易データベース化</title>
		<link>https://blog.mach3.jp/2014/07/29/ghostsheet2.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 29 Jul 2014 06:11:18 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Drive]]></category>
		<category><![CDATA[Grunt]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Spreadsheet]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3862</guid>

					<description><![CDATA[いつであったかあまり記憶は定かではないですが、去年ぐらいに Google スプレッドシートが新しくアップデートされました。 今回は、新しい Google スプレッドシートでも旧バージョンと同じようにAjaxで簡易データベ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>いつであったかあまり記憶は定かではないですが、去年ぐらいに Google スプレッドシートが新しくアップデートされました。 今回は、新しい Google スプレッドシートでも旧バージョンと同じようにAjaxで簡易データベース化出来ないかと考えてみた話です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/--dZVIvAjb_M/U9c2b8IXzcI/AAAAAAAAChE/rZNY_b3qe0o/s400/2014-0729-00.png" alt="新しくなったスプレッドシートと簡易データベース化"/></figure>



<p></p>



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



<h2 class="wp-block-heading">新しくなった Google スプレッドシート</h2>



<p>今までは個人設定をいじる事で旧バージョンのスプレッドシートを使い続ける事ができたのですが、 先日からそのオプションが設定画面から消えていて、特別な方法をとらないと<strong>旧バージョンのスプレッドシートを新規作成出来なくなりました</strong>。 （すでに作成したスプレッドシートは変更されない様です）</p>



<p>刷新された Google スプレッドシートにどのような素晴らしい機能が追加されたかは未だあまり把握していませんが、 現状で確かな事は、<del style="text-decoration:line-through">旧バージョンで使えたRSSやJSONでの公開APIが実装されていないという事です。 今後実装されるかどうかはわかりません。</del></p>



<p><a href="/2013/06/04/spreadsheet-as-db-for-php-ajax.html">以前書いたGhostsheet</a>はそれらの公開APIを利用した物だったので、<del style="text-decoration:line-through">新しいスプレッドシートでは使用する事ができません</del>。</p>



<dl>
<dt>2014/11/20 追記</dt>
<dd>現在ではAPIが整備された様で、新しいスプレッドシートでも旧Ghostsheetが正常に動作する事を確認しました。<br />
<a href="https://blog.mach3.jp/2013/06/04/spreadsheet-as-db-for-php-ajax.html">Googleスプレッドシートを簡易DBとして利用する -　PHP+Ajax編</a></dd>
</dl>



<h2 class="wp-block-heading">Ghostsheet も新しくしました</h2>



<p>とはいえ、pubhtml（Webページの公開）APIは利用可能なので、それをスクレイピングしてデータ化する物を新たに書きました。 全く別物になったのでリポジトリも改めています。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/mach3/ghostsheet2">mach3/ghostsheet2 @ GitHub</a></li>
</ul>



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



<p>以前と同様に、スプレッドシートを作成して「Webに公開」します。</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>name</th><th>age:integer</th><th>email</th><th>active:bool</th></tr></thead><tbody><tr><td>John</td><td>23</td><td>john@example.com</td><td>true</td></tr><tr><td>Tom</td><td>18</td><td>tom@example.com</td><td>false</td></tr></tbody></table></figure>



<p>一行目のヘッダ部分でデータの型を指定する事が出来ます。 上記にある <strong>integer</strong>、<strong>bool</strong> の他に、<strong>float</strong>、<strong>json</strong> が利用出来ます。 省略時は <strong>string</strong> になります。</p>



<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://docs.google.com/spreadsheets/d/00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX/edit#gid=0
</div></figure>
</blockquote>



<p>このキーをそのまま引数にしてメソッドの呼び出しをします。</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-keyword">require</span> <span class="hljs-string">"the/path/to/ghostsheet/phplib/Ghostsheet.php"</span>;

$gs = <span class="hljs-keyword">new</span> Ghostsheet();
$gs-&gt;config(<span class="hljs-string">"cache_dir"</span>, <span class="hljs-string">"./cache"</span>);
$data = $gs-&gt;load(<span class="hljs-string">"00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"</span>);
var_dump($data);
</span></code></span></pre>


<p>結果は連想配列で返され、&#8221;sheets&#8221; の中に各シートのデータが格納されるようになっています。</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">array</span>(<span class="hljs-number">3</span>) {
  &#91;<span class="hljs-string">"title"</span>]=&gt;
  string(<span class="hljs-number">4</span>) <span class="hljs-string">"My Spreadsheet"</span>
  &#91;<span class="hljs-string">"key"</span>]=&gt;
  string(<span class="hljs-number">44</span>) <span class="hljs-string">"00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"</span>
  &#91;<span class="hljs-string">"sheets"</span>]=&gt;
  <span class="hljs-keyword">array</span>(<span class="hljs-number">2</span>) { ... }
}
</code></span></pre>


<h3 class="wp-block-heading">旧版との大きな違い</h3>



<p>旧版ではスプレッドシートに含まれるシート名で引くためには複数回リクエストしなければなりませんでしたが、 pubhtmlでは全てのシートがひとつのWebページで公開される為、一回のリクエストで済みます。 あまり大量のデータになると辛そうですが、そういった大きなデータでは利用すべきではないと思うので、 結果的には効率が良くなったと言えそうです。</p>



<h3 class="wp-block-heading">メソッドの使い分け</h3>



<p>Ghostsheet にはデータを取得する為に4つのメソッドがあります。</p>



<ul class="wp-block-list">
<li><strong>load</strong>
<ul class="wp-block-list">
<li>キャッシュファイルが期限切れでなければそれを使用</li>



<li>そうでなければリモートから最新のデータを取得し、キャッシュファイルを更新</li>
</ul>
</li>



<li><strong>cache</strong>
<ul class="wp-block-list">
<li>キャッシュの生死に関わらずキャッシュのデータを返す</li>
</ul>
</li>



<li><strong>fetch</strong>
<ul class="wp-block-list">
<li>キャッシュの生死に関わらずリモートからデータを取得</li>



<li>キャッシュの更新は行わない</li>
</ul>
</li>



<li><strong>update</strong>
<ul class="wp-block-list">
<li>キャッシュの生死に関わらずリモートからデータを取得</li>



<li>キャッシュの更新を行う</li>
</ul>
</li>
</ul>



<p>一見すると <strong>load</strong> で良さそうですが、その場合、キャッシュの期限が切れるたびにレスポンスが遅くなるタイミングが出てきてしまいます。 対策としてはデータの取得は常にキャッシュから行い、非同期で <strong>load</strong> を呼び出すのがレスポンスに優しそうです。</p>



<h3 class="wp-block-heading">（おまけ） Gruntタスク</h3>



<p>おまけ機能としてGruntタスクをつけておきました。 スプレッドシートのデータを引っ張ってJSONファイルとしてローカルに保存するだけの簡単な物です。 シートのデータを元に静的サイトをジェネレートしたい場合などに使えたり、使えなかったり。</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">grunt</span><span class="hljs-selector-class">.initConfig</span>({
    <span class="hljs-attribute">ghostsheet</span>: {
        dev: {
            files: {
                <span class="hljs-string">"./data/mydata.json"</span>: <span class="hljs-string">"00X_xxxXX_0xXxxXx00XXXxx-xxXXxX0-XxXxXx0XxxX"</span>
            }
        }
    }
});

<span class="hljs-selector-tag">grunt</span><span class="hljs-selector-class">.loadNpmTasks</span>("<span class="hljs-selector-tag">ghostsheet2</span>");
</code></span></pre>


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



<p>わりと力技なパースなので、できれば用意されたAPIを使いたい気持ちもありますが…</p>



<p>ちなみに一応旧版でも新規作成する方法は残されていて、下記指定のURLにアクセスするだけで可能です。 旧版のデータが残されている以上、当面は使えそうです。</p>



<ul class="wp-block-list">
<li><a href="https://g.co/oldsheets">https://g.co/oldsheets</a></li>
</ul>



<p>cf) <a href="https://support.google.com/docs/answer/3541068?hl=ja">新しい Google スプレッドシートについて &#8211; ドキュメント エディタ ヘルプ</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PHPのビルトインウェブサーバーを活用して動作確認を捗らす話</title>
		<link>https://blog.mach3.jp/2014/06/13/php54-builtin-server.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 13 Jun 2014 01:52:47 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[mod_rewrite]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Virtual Machine]]></category>
		<category><![CDATA[VM]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3844</guid>

					<description><![CDATA[PHPのビルトインウェブサーバーについては以前も軽く触れたのですが、 今回はもう少し細かく噛み砕きつつ、仮想マシンからホストOS（Win/Mac）のサーバーにアクセスして動作確認を捗らせてみます。 まえおき やりたいこと [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHPのビルトインウェブサーバーについては<a href="https://blog.mach3.jp/2012/09/21/check-html-with-simple-server.html">以前も軽く触れた</a>のですが、 今回はもう少し細かく噛み砕きつつ、仮想マシンからホストOS（Win/Mac）のサーバーにアクセスして動作確認を捗らせてみます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-EOcn2k67Ig4/U5fvKKdSu3I/AAAAAAAACfo/qKn6R_tP4-o/s400/2014-0611-00.png" alt="PHPのビルトインウェブサーバーをもっと活用して動作確認を捗らす話"/></figure>



<p></p>



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



<h2 class="wp-block-heading">まえおき</h2>



<h3 class="wp-block-heading">やりたいこと</h3>



<ul class="wp-block-list">
<li>仮想マシン（Windows）で、ローカルで制作中のWebサイトの動作確認をしたい。</li>



<li>せっかくなのでhttpアクセスで閲覧したい。</li>



<li>でもどこかにアップロードしたりローカルサーバ構築したりするのはめんどう。</li>



<li>せっかちなのでDropboxの同期をまっている心の余裕がない。</li>
</ul>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-erUouvs_1s0/U5fvKWgAgEI/AAAAAAAACfo/TT13XDUstMw/s500/2014-0611-01.png" alt="やりたいこと"/></figure>



<p></p>



<p>こういう時にはPHPビルトインウェブサーバーが簡単でおすすめです。</p>



<ul class="wp-block-list">
<li>好きなディレクトリをドキュメントルートにしてコマンド一発で即時に簡易Webサーバが立ち上がります。</li>



<li>ログがターミナルに流れるのでわかりやすく、どことなくテンションがあがります。</li>



<li>ちょっとしたPHPのスクリプトを確認できるオマケつき。</li>



<li>ルータースクリプトも使える。</li>
</ul>



<h3 class="wp-block-heading">別にやりたくないこと</h3>



<ul class="wp-block-list">
<li>PHPの動作確認はちゃんと仮想マシン上のLinux等の開発環境で行います。<br /><br />（できるだけ本番環境にあわせてチェックを行いたいですし、 PHPを弄る様な方ならば素直にLinux環境のVMで環境構築した方が断然楽だと思います。）</li>
</ul>



<h2 class="wp-block-heading">ビルトインウェブサーバーの使い方</h2>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-1dPYOnf5kTU/U5fwS_jMYDI/AAAAAAAACf8/EAFwnJWQfU8/s500/2014-0611-02.png" alt="PHPビルトインウェブサーバー"/></figure>



<p><a href="http://www.php.net/manual/ja/features.commandline.webserver.php">  </a></p>



<h3 class="wp-block-heading">PHP5.4+ の導入</h3>



<p>ここでは詳しく触れませんが、ビルトインウェブサーバーを使用するにはPHP5.4以降が必要です。 Windowsでもすぐに動くバイナリが配布されていますし、Macならmacportsやhomebrewで導入も容易だと思います。</p>



<ul class="wp-block-list">
<li><a href="http://windows.php.net/download/">PHP For Windows: Binaries and sources Releases</a></li>



<li><a href="http://www.macports.org/">The MacPorts Project &#8212; Home</a></li>



<li><a href="http://brew.sh/index_ja.html">Homebrew — OS X用パッケージマネージャー</a></li>
</ul>



<h3 class="wp-block-heading">ビルトインウェブサーバーの起動</h3>



<ul class="wp-block-list">
<li><a href="http://www.php.net/manual/ja/features.commandline.webserver.php">PHP: ビルトインウェブサーバー &#8211; Manual</a></li>
</ul>



<p>詳しくは上のURLにある通りです。<code>php</code> コマンドに <code>-S</code> オプションを渡す事でウェブサーバーを起動することができます。 その他オプションの書式は下記のようになります。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml">$ php -S <span class="hljs-tag">&lt;<span class="hljs-name">ホスト名</span>&gt;</span>:<span class="hljs-tag">&lt;<span class="hljs-name">ポート番号</span>&gt;</span> -t <span class="hljs-tag">&lt;<span class="hljs-name">ドキュメントルートのパス</span>&gt;</span>
</code></span></pre>


<p>例えば、localhostの8080番ポートで、 &#8220;public_html&#8221; ディレクトリをドキュメントルートとしてWebサーバを立ち上げる場合は次のようになります。</p>


<pre class="wp-block-code"><span><code class="hljs">$ php -S localhost:8080 -t public_html
</code></span></pre>


<h3 class="wp-block-heading">仮想マシンから確認する</h3>



<p>ホスト名がlocalhostでは仮想環境からアクセスする事ができません。 そこで、次のようにホスト名を <strong>&#8220;0.0.0.0&#8221;</strong> にして起動する事で外部から接続できるようになります。</p>


<pre class="wp-block-code"><span><code class="hljs">$ php -S 0.0.0.0:8080 -t public_html
</code></span></pre>


<p>例えばサーバを起動するマシンのローカルIPアドレスが 192.168.10.3 などだった場合、 仮想マシンのゲストOSから &#8220;http://192.168.10.3:8080&#8221; へアクセスすれば直接動作確認をする事ができるようになります。 （これはあくまで一例で、アクセス先のアドレスは仮想マシンのネットワーク設定によって様々なので注意しましょう）</p>



<p>IEの確認には、Microsoft提供の <a href="http://modern.ie/ja-jp">modern.ie</a> が便利です。 昔はVrtualPC用のイメージだけだったのですが、modern.ie になってからはVirtualBox、VMWare、Parallels等、 様々なプラットフォーム用の仮想マシンイメージを配布しています。</p>



<ul class="wp-block-list">
<li><a href="http://modern.ie/ja-jp">Internet Explorer のテストが簡単に | modern.IE</a></li>
</ul>



<h3 class="wp-block-heading">ルータースクリプトを使う</h3>



<p>このビルトインウェブサーバーの素敵なポイントの一つに、<strong>ルータースクリプト</strong> を簡単に使用出来るという利点があります。 ざっくり言うと、Apacheのmode_rewriteのような処理がPHPスクリプトを通じて行えるようになる代物です。</p>



<p>例えばこれは、Wordpress の .htaccess にある mod_rewrite の記述です。 この記述のおかげで WordPress はURLをデザインする事が出来るわけですね。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"># BEGIN WordPress
<span class="hljs-tag">&lt;<span class="hljs-name">IfModule</span> <span class="hljs-attr">mod_rewrite.c</span>&gt;</span>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php &#91;L]
<span class="hljs-tag">&lt;/<span class="hljs-name">IfModule</span>&gt;</span>
# END WordPress
</code></span></pre>


<p>ここで記述されているルールは非常に単純で、 「アクセスされたURLにあたるファイルやディレクトリが存在しない場合は、index.phpでレスポンスを返す」だけです。 同様の処理をPHPのルータースクリプトで記述してみましょう。</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">/* _router.php */</span>
<span class="hljs-keyword">if</span>(file_exists($_SERVER&#91;<span class="hljs-string">"REQUEST_FILENAME"</span>])){
    <span class="hljs-comment">// false を返すとリクエストされたリソースをそのまま返します</span>
    <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
} <span class="hljs-keyword">else</span> {
    <span class="hljs-keyword">require</span> <span class="hljs-string">"index.php"</span>;
}
</span></code></span></pre>


<p>あとは、この内容を記述した &#8220;_router.php&#8221; をコマンドに渡すだけです。</p>


<pre class="wp-block-code"><span><code class="hljs">$ php -S 0.0.0.0:8080 -t public_html public_html/_router.php
</code></span></pre>


<p>mod_rewrite のような処理を簡単にテストしたい場合や、 History.pushState を使った構成で制作を進める時などに重宝しています。</p>



<h2 class="wp-block-heading">Gruntタスクで起動する</h2>



<p>Gruntを使って開発をされている方は、<a href="https://github.com/gruntjs/grunt-contrib-connect">grunt-contrib-connect</a> のような感じで開発用サーバを起動したいと考えるでしょう。 ちょうどそのようなプラグインが公開されていたので、ここはひとつ活用させて頂きます。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/sindresorhus/grunt-php">sindresorhus/grunt-php @ Github</a></li>
</ul>



<p>タスク設定例:</p>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">grunt</span><span class="hljs-selector-class">.initConfig</span>({
    <span class="hljs-attribute">php</span>: {
        dist: {
            options: {
                port: <span class="hljs-number">8080</span>,
                hostname: <span class="hljs-string">"0.0.0.0"</span>,
                base: <span class="hljs-string">"public_html"</span>,
                router: <span class="hljs-string">"_router.php"</span>,
                keepalive: true
            }
        }
    }
});
</code></span></pre>


<p>router のパスは base からの相対パスになります。</p>



<p>JavaScriptやCSSのコンパイル等で <strong>watch</strong> タスクを利用している場合は、サーバーの起動と同時に行えるようにしたいですね。 その際には <code>keepalive</code> を <strong>false</strong> にし、次のように watch の前に登録して起動します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// `$ grunt dev` で起動</span>
grunt.registerTask(<span class="hljs-string">"dev"</span>, &#91;<span class="hljs-string">"php:dist"</span>, <span class="hljs-string">"watch"</span>]);
</code></span></pre>


<p>Grunt で php を扱うプラグインにはこの他にも <a href="https://github.com/ddprrt/connect-php">ddprrt/connect-php</a> があります。 こちらは grunt-conrib-connect のミドルウェアとして動かすタイプのライブラリで、 5.4+ でなくても動くかわりに、ルータースクリプト等は使えなさそうです。gruntベースで自前で書けという事でしょう。</p>



<p>また、プラグインを探していた当初、<strong>grunt-php</strong> が見つからなかった為、 ほぼ同じような動作をする物を自前で書いて使っていたのは<a href="https://github.com/mach3/grunt-phps">秘密</a>です。 私が書いた物よりも grunt-php の方が優秀そうなので、何も書かなかった事にしました。 grunt-php に無くて自前の物にある機能といえばアクセスログの出力ぐらいで、オプションの名前などもほとんど同じでした。 どちらも grunt-contrib-connect を参考にしているので当たり前ですね。</p>



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



<p>単純に確認用のサーバを起動したいのならば grunt-contrib-connect で十分なのですが、 URLのリライト等をしたい場合などはPHPビルトインウェブサーバーの方が楽に設定出来る気がします。 Gruntを使わない人でも簡単に扱えるは大きなメリットですね。</p>
]]></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>シンプルなOAuth認証ライブラリ「HybridAuth」を試してみた</title>
		<link>https://blog.mach3.jp/2012/10/03/hybridauth.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 02 Oct 2012 23:12:10 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2701</guid>

					<description><![CDATA[以前「Opauth」による簡単な認証を記事にしましたが、 またさらにシンプルな認証ライブラリ「HybridAuth」を知ったので試用してみました。 HybridAuthとは HybridAuth, Open Source [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>以前「<a href="http://opauth.org/">Opauth</a>」による簡単な認証を<a href="/2012/08/opauth-and-tmhoauth-for-twitter.html">記事にしました</a>が、 またさらにシンプルな認証ライブラリ「<a href="http://hybridauth.sourceforge.net/">HybridAuth</a>」を知ったので試用してみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-GWtM7s04cXw/UGrvefjOH1I/AAAAAAAABnI/uEvq40SKWpk/s400/20121002-00.png" alt="シンプルなOAuth認証ライブラリ「HybridAuth」を試してみた"/></figure>



<p></p>



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



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



<h3 class="wp-block-heading"><a href="http://hybridauth.sourceforge.net/index.html">HybridAuth, Open Source Social Sign On PHP Library</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-6_NT7AZXQmQ/UGrv4PFQhGI/AAAAAAAABng/YrxLwnTR8oo/s500/20121002-01.png" alt="HybridAuth"/></figure>



<p></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>HybridAuth enable developers to easily build social applications to engage websites vistors and customers on a social level by implementing social signin, social sharing, users profiles, friends list, activities stream, status updates and more.</p>
</blockquote>



<p>WebサイトにOAuth認証を簡単に設置する為のPHPライブラリです。 Twitter、Facebook等をはじめとした様々なサービスに対応しています。 サポートされているサービスは、現時点で32。</p>



<p>また、CodeIgniterやCake、Zend等のFWはもちろん、 WordPressやJoomula等のCMSのプラグインとしても利用できます。</p>



<ul class="wp-block-list">
<li><a href="http://hybridauth.sourceforge.net/download.html">II. Third-party Plugins | Download HybridAuth</a></li>
</ul>



<h2 class="wp-block-heading">HybridAuth と Opauth の違い</h2>



<p>HybridAuthはOpauthと似たタイプのライブラリですが、 この2者で大きく異る点、というよりはHybridAuthのメリットを2つご紹介します。</p>



<ol class="wp-block-list">
<li>自由にカスタマイズ可能なURL</li>



<li>APIにアクセスするメソッド</li>
</ol>



<h3 class="wp-block-heading">自由にカスタマイズ可能なURL</h3>



<p>Opauthは、ログインURLの一部にサービス名を含んでいないと正常に動きません。 URLの文字列から認証するサービスを判別する為です。 （ここらへん、前回の記事では説明不足でしたね。すみません。）</p>



<p>例えば、「http://www.example.com/login/twitter」ならtwitterの認証画面へ、 「http://www.example.com/login/facebook」ならFacebookの認証画面へ飛ぶわけですね。</p>



<p>一方HybridAuthには、そういった縛りはありません。 そのかわり、認証メソッドの引数にサービス名を渡す事になります。</p>



<h3 class="wp-block-heading">APIにアクセスするメソッド</h3>



<p>Opauthは認証するだけでしたが、HybridAuthは認証した後にAPIにアクセスしてgetしたりpostしたりできます。 これ一本で全部面倒見切れそうですね。</p>



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



<p>HybridAuthを hybirdauth/ ディレクトリに保存したと想定して、 次のようなファイル構成にしてみます。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>login.php (ユーザーがアクセスするページ)<br />
  config.php (設定ファイル)<br />
  hybridauth/ (ダウンロードしたHybridAuthの構成ファイル)<br />
       ├ config.php<br />
       ├ index.php<br />
       ├ install.php<br />
       └ Hybrid/</p>
</blockquote>



<h3 class="wp-block-heading">設定ファイルを作る</h3>



<p>hybridauth/config.php を参考にして、config.phpを作って必要事項を明記しましょう。 ここでは、Twitterのログインに必要な物だけを記載しておきます。</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-keyword">return</span> <span class="hljs-keyword">array</span>(
    <span class="hljs-string">"base_url"</span> =&gt; <span class="hljs-string">"http://localhost:8080/hybridauth/"</span>,
    <span class="hljs-string">"providers"</span> =&gt; <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"Twitter"</span> =&gt; <span class="hljs-keyword">array</span>(
            <span class="hljs-string">"enabled"</span> =&gt; <span class="hljs-keyword">true</span>,
            <span class="hljs-string">"keys"</span> =&gt; <span class="hljs-keyword">array</span>(
                <span class="hljs-string">"key"</span> =&gt; <span class="hljs-string">"&#91;your app's consumer key]"</span>,
                <span class="hljs-string">"secret"</span> =&gt; <span class="hljs-string">"&#91;your app's consumer secret]"</span>
            )
        )
    )
);
</span></code></span></pre>


<dl>
<dt>base_url</dt>
<dd>実際にOAuthのやり取りをしてくれるスクリプトを指します。 多くの場合HybridAuthをインストールしたディレクトリになります。</dd>
<dt>providers</dt>
<dd>認証したいサービスの設定を列挙していきます。 Twitterの場合は、作成したアプリケーションの<em>consumer key</em>と<em>consumer secret</em>を記載します。</dd>
</dl>



<h3 class="wp-block-heading">ログイン処理を書く</h3>



<p>./login.php を用意して、ログイン処理を書いてみます。</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">// 設定ファイルを引数にして初期化する（配列でもOK）</span>
$auth = <span class="hljs-keyword">new</span> Hybrid_Auth( <span class="hljs-string">"./config.php"</span> );

<span class="hljs-comment">// 認証の実行（未認証の場合はここでリダイレクトされ、認証済みの場合はスルーされます）</span>
$twitter = $auth-&gt;authenticate(<span class="hljs-string">"Twitter"</span>);

<span class="hljs-comment">// ↓ ここから認証済みの場合の処理</span>
<span class="hljs-keyword">echo</span> <span class="hljs-string">"&lt;h1&gt;認証されています！&lt;/h1&gt;"</span>;

<span class="hljs-comment">// ユーザー情報をまとめてくれる getUserProfile() メソッド</span>
var_dump(
    $twitter-&gt;getUserProfile()
);

<span class="hljs-comment">// APIにアクセスしてみる</span>
var_dump(
    $twitter-&gt;api()-&gt;get(<span class="hljs-string">"account/verify_credentials.json"</span>)
);
</span></code></span></pre>


<p>コメントの通りです。authenticateメソッドだけでほとんど余計な処理は省かれて、スッキリしていますね。</p>



<p>実際の動作としては、こんな感じみたいです。</p>



<ol class="wp-block-list">
<li>ユーザーがlogin.phpにアクセス</li>



<li>hybridauth/index.php に移動、そこからサービスの認証画面へリダイレクト</li>



<li>認証が済んだらトークンをセッションに保存して、再びユーザーが元いたlogin.phpに移動</li>
</ol>



<h2 class="wp-block-heading">base_url について</h2>



<p>config.php で出て来た <em>base_url</em> ですが、少し補足しておきます。</p>



<p>要するにこの項目は、全ての認証処理を代理で行なってくれるイケてるしヤバい <em>hybridauth/index.php</em> にアクセスさせる為の物です。 もっと言えば、そこにアクセスしたユーザーに対して <em>hybridauth/index.php</em> に記述されている処理が走りさえすれば良いです。</p>



<p>ですので、上の例示では hybridauth/ ディレクトリが公開ディレクトリにある前提になっていますが、 そうでない場合（非公開ディレクトリになっていたり、フレームワークの都合上アクセス出来なくなっていたりする場合）、 アクセスさせるファイル内で hybridauth/index.php をインクルードしさえすれば動くはずです。</p>



<p>例えば、&#8221;base_url&#8221; を /auth.php 等として、該当ファイルを設置し、</p>


<pre class="wp-block-code"><span><code class="hljs language-php"><span class="hljs-keyword">require_once</span>(<span class="hljs-string">"/the/path/to/hybridauth/index.php"</span>);
</code></span></pre>


<p>等としておけば良いですね。</p>



<h2 class="wp-block-heading">気になった事柄</h2>



<p>公式の例示では、APIアクセスも、認証済みである事を前提としていました。</p>



<p>認証を使わず、アプリに割り振られたのアクセストークンを使ったAPIアクセスは可能なのか、が気になりました。<br />
それをするならそういうライブラリを使えば良いのですが、一つで済むならそれが一番ですよね。<br />
気が向いたら調べてみます。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>すぐに使える簡易サーバーでHTMLをチェックする3つの方法</title>
		<link>https://blog.mach3.jp/2012/09/21/check-html-with-simple-server.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 21 Sep 2012 00:55:13 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Sublime Text]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2668</guid>

					<description><![CDATA[Webページが「file://～」だとうまく動かない…でも一々サーバーにアップしたり環境整備するのが面倒…。 そんな時に使える簡易サーバーのご紹介です。 HTTPでアクセスしてチェックしたいケースとは Webページを制作 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Webページが「file://～」だとうまく動かない…でも一々サーバーにアップしたり環境整備するのが面倒…。 そんな時に使える簡易サーバーのご紹介です。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-sY0U3GH3EUQ/UFsE9BnCBHI/AAAAAAAABmg/oB_Tmh8nkP0/s400/20120920-00.png" alt="すぐに使える簡易サーバーでHTMLをチェックする3つの方法"/></figure>



<p></p>



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



<h2 class="wp-block-heading">HTTPでアクセスしてチェックしたいケースとは</h2>



<p>Webページを制作している時、多くの場合はそのままブラウザで開けば動作チェックが出来ますが、 サーバーを通してHTTPでアクセスしないと正常に動作しないケースもあります。</p>



<p>つまり、「file:～」ではなく、「http:～」でアクセスしたい。例えば、</p>



<ul class="wp-block-list">
<li>ChromeからAjaxのテストをしたい</li>



<li>各種ウィジェットのスクリプトの表示をチェックしたい</li>
</ul>



<p>Chromeのケースは起動オプション（&#8221;&#8211;allow-file-access-from-files&#8221;）で解決できますし、 ウィジェットもスクリプトの中身を少しいじれば動くことが多いですが、 いずれもWebサーバーを通せば難なく動作するわけで、それがすぐに出来るのならばその方がシンプルではないかな、と思うわけです。</p>



<h2 class="wp-block-heading">ではどうしようか</h2>



<p>既にXAMPP/MAMPPや仮想マシン等でサーバ環境がある場合は良いのですが、 バーチャルホスト等の諸設定をこなすのが面倒くさかったり、とにかくささっと確認したいような場合は、 簡易的なサーバを利用してのチェックがお勧めです。</p>



<p>サッと起動して、サッ確認し、終わったらサッと終了する。</p>



<p>ここでは、3つの方法を提案してみます。</p>



<ol class="wp-block-list">
<li>SublimeServerでチェックする</li>



<li>PHP5.4+のビルトインサーバーでチェックする</li>



<li>ローカルプロキシでチェックする</li>
</ol>



<h2 class="wp-block-heading">SublimeServer でチェックする</h2>



<p>もし貴方が<a href="http://www.sublimetext.com/2">Sublime Text 2</a>を使って制作をしているのならば、これを使わない手はないでしょう。 <a href="https://github.com/learning/SublimeServer">Sublime Server</a>は、Sublime Text 2で動作する簡易Webサーバープラグインです。</p>



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



<p><a href="https://github.com/learning/SublimeServer">learning/SublimeServer</a></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Allow you run a HTTP Server in SublimeText 2, and serves all the open project folders</p>
</blockquote>



<p>メリットは、作業環境からすぐに実行できる点ですね。</p>



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



<ol class="wp-block-list">
<li>「<a href="http://wbond.net/sublime_packages/package_control">Sublime Package Control</a>」をインストール</li>



<li>コマンドパレットから <em>「Install Package」>「SublimeServer」</em> と打ち込む</li>
</ol>



<p>※プラグインの導入法については<a href="/2012/01/sublime-text-and-nettuts-fetch.html">以前書いた記事</a>などをご参考に</p>



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



<ol class="wp-block-list">
<li><em>「Tools」>「SublimeServer」>「Start SublimeServer」</em>で起動</li>



<li>確認したいHTMLファイルを開いて、右クリックし、<em>「View This File in Browser」</em></li>
</ol>



<figure class="wp-block-image"><img decoding="async" src="https://lh4.googleusercontent.com/--Wz2xFc_cYY/UFsAj8pt3aI/AAAAAAAABmA/c1KECRnWQJE/s500/20120920-01.png" alt="SublimeServer"/></figure>



<p></p>



<p>これで、デフォルトのブラウザで目的のファイルが開かれます。 URLは以下のようになります。プロジェクトがルートディレクトリのような扱いになっていますね。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>http://localhost:8080/[folder name]/index.html</p>
</blockquote>



<p>ポート番号の<em>「8080」</em>は、<em>「Tools」&gt;「SublimeServer」&gt;「Settings」</em> で変更できます。</p>



<h2 class="wp-block-heading">PHP5.4+のビルトインサーバーでチェックする</h2>



<p>マシンにPHP5.4以降がインストールされているのあらば、 PHPにビルトインされている簡易Webサーバーが利用できます。</p>



<p><a href="http://www.php.net/manual/ja/features.commandline.webserver.php">PHP: ビルトインウェブサーバー &#8211; Manual</a></p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-mAMfF2zpPVw/UFsAjxoDqVI/AAAAAAAABmA/6-bx2aM43BM/s500/20120920-02.png" alt="PHP5.4+のビルトインサーバー"/></figure>



<p></p>



<p>メリットはPHPの動作チェックが出来る点ですが、 簡易的な物なのでrewrite等は動かず、そこらへんに依存するFW等の動作は難しいでしょう。 そういう大掛かりな物は、きちんと仮想環境を構築してテストしましょう。</p>



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



<p>※PHP5.4以降が導入済みで、パスが通っている前提で話を進めます。</p>



<ol class="wp-block-list">
<li>ターミナル（あるいはコマンドプロンプト）を開く</li>



<li><br /><p>目的のファイルがあるディレクトリまで移動して、以下のコマンドを実行する</p><br /><blockquote><p>php -S localhost:8080</p></blockquote><br /></li>



<li><br /><p>ブラウザを開いてアドレスバーにURLを入力する</p><br /><blockquote><p>http://localhost:8080/index.html</p></blockquote><br /></li>
</ol>



<p>実行したディレクトリがルートディレクトリの扱いになります。</p>



<h2 class="wp-block-heading">ローカルプロキシでマッピングする</h2>



<p>これは前述した2つの方法と違い、ローカルでWebサーバーを起動するのではなく、 ローカルプロキシを利用して、或るドメインへのアクセスをローカルのファイルにマッピングする方法です。</p>



<p>…と言ってもピンと来ないですね。</p>



<p>例えば、<em>「http://example.com/index.html」</em>というファイルへブラウザでアクセスするとして、 その<em>「index.html」</em>の内容を、ローカルにあるファイルに差し替える事が出来ます。 そうすることで、あたかも<em>インターネット上にそのファイルがあるかのように</em>振る舞ってくれるわけですね。</p>



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



<p>ここでは、ローカルプロキシツールのCharlesを使ってみます。 有料ではありますがクロスプラットフォームで開発されていて、Windows/Mac/Linux版が用意されています。</p>



<p><a href="http://www.charlesproxy.com/">Charles Web Debugging Proxy • HTTP Monitor / HTTP Proxy / HTTPS &amp; SSL Proxy / Reverse Proxy</a></p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-9IYim2_Ei-M/UFsAkn-AIWI/AAAAAAAABmA/u9RlpKyMMpY/s500/20120920-03.png" alt="Charles Web Debugging Proxy"/></figure>



<p></p>



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



<ol class="wp-block-list">
<li><em>「Tools」>「Map To Local」</em>で設定ダイアログを開きます</li>



<li><em>「Add」</em>で新しくマッピングを作成します</li>



<li><br /><p>下記のような要領で入力して<em>「OK」</em></p><br /><figure><img decoding="async" src="https://lh5.googleusercontent.com/-HPnv5-g9DVE/UFsE9DN1OxI/AAAAAAAABmg/CbYSrAd8NmA/s500/20120920-04.png" alt="Edit Mapping - Charles"></figure><br /></li>



<li><br /><p>設定したURLにアクセスします</p><br /><blockquote><p>http://local.test/index.html</p></blockquote><br /></li>
</ol>



<p>ドメインは、名前解決が出来る必要があります。 プロジェクトに使用する予定のドメインを使うか、適当な「local.test」などの名前をあてがってhostsファイルに127.0.0.1などで書き込んでおくか、 あるいはexample.comやlocalhostを利用するなどしましょう。</p>



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



<p>これらの方法は、DirectoryIndexが指定できなかったりパフォーマンスが悪かったりする為、あくまでも簡易的なチェック向けです。 が、それで十分な場合は多いに制作の手助けになってくれる事でしょう。</p>



<p>特にローカルプロキシは、こういったケースに因らず、様々なシーンで開発効率をあげてくれるので、 （むしろそちらの方がメインですね） ぜひとも導入しておくべきだと思います。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>OpauthとtmhOAuthで極めてお手軽にTwitterと連携してみる</title>
		<link>https://blog.mach3.jp/2012/08/24/opauth-and-tmhoauth-for-twitter.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 24 Aug 2012 01:00:50 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Twitter]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2630</guid>

					<description><![CDATA[PHPでTwitterのAPIを利用する方法は何度かPEARのServices_Twitterと絡めて記事にした事がありましたが、 今回はもっと手軽に導入できるOpauthとtmhOAuthを紹介してみます。 認証はOp [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHPでTwitterのAPIを利用する方法は何度かPEARのServices_Twitterと絡めて記事にした事がありましたが、 今回はもっと手軽に導入できる<em>Opauth</em>と<em>tmhOAuth</em>を紹介してみます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-fxH1YjDGGCc/UDaJLTvOyOI/AAAAAAAABkY/TJ0YFczT3JE/s400/20120824-00.png" alt="OpauthとtmhOAuthで極めてお手軽にTwitterと連携してみる"/></figure>



<p></p>



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



<h2 class="wp-block-heading">認証はOpauthで</h2>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-wQYHOHBi93w/UDaJLT0qhxI/AAAAAAAABkY/ll1D5qbd53o/s500/20120824-01.png" alt="Opauth – Multi-provider authentication framework for PHP"/></figure>



<p></p>



<ul class="wp-block-list">
<li><a href="http://opauth.org/">Opauth – Multi-provider authentication framework for PHP</a></li>
</ul>



<p>Opauthは、様々なOAuth認証を一手に引き受けてくれる認証フレームワークです。</p>



<p>執筆時に公式に紹介されていた利用可能なサービスは、Twitter・Facebookなどを含め11件。 これらのサービスへの認証機能は<em>「ストラテジー」</em>という形で外部モジュールとして提供されます。 所謂ストラテジーパターンと呼ばれる物ですね。</p>



<p>その使い方は、認証のみにフォーカスしているライブラリなだけあって恐ろしくシンプルで簡単。 早速試してみます。</p>



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



<p>公式のダウンロードページからダウンロードするか、 Githubにリポジトリが公開されているのでそこからcloneします。</p>



<ul class="wp-block-list">
<li><a href="https://github.com/uzyn/opauth">ダウンロードページ</a></li>



<li><a href="https://github.com/uzyn/opauth">GitHubリポジトリ</a></li>
</ul>



<p>公式の<em>「Opauth bundled with examples」</em>からなら、Twitter、Google、Facebookのストラテジーも同梱されているので 最初に試す際にはこれがおすすめです。 （それ以外ではストラテジーが空っぽの状態なので、別途ダウンロードしてくる必要があります）</p>



<h3 class="wp-block-heading">設定</h3>



<p>ダウンロードして解凍・設置したら、設定ファイルを用意します。 <em>opauth.config.php</em> などとしておきましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$opauth_config = <span class="hljs-keyword">array</span>(
    <span class="hljs-comment">/**
     * アプリケーションへのパス
     */</span>
    <span class="hljs-string">"path"</span> =&gt; <span class="hljs-string">"/the/path/to/"</span>,

    <span class="hljs-comment">/**
     * Twitterで認証した後に戻るコールバックURL。
     * {path} は前述のpathを展開してくれる。
     */</span>
    <span class="hljs-string">"callback_url"</span> =&gt; <span class="hljs-string">"{path}callback.php"</span>,

    <span class="hljs-comment">/**
     * ハッシュの生成に使われる文字列。任意の文字列を入れておく。
     */</span>
    <span class="hljs-string">"security_salt"</span> =&gt; md5(<span class="hljs-string">"foobar"</span>),

    <span class="hljs-comment">/**
     * ここからがストラテジーの設定
     */</span>
    <span class="hljs-string">"Strategy"</span> =&gt; <span class="hljs-keyword">array</span>(
        <span class="hljs-comment">/**
          * Twitterストラテジーの設定
          * key, secret はTwitterの公式から取得。
          */</span>
        <span class="hljs-string">"Twitter"</span> =&gt; <span class="hljs-keyword">array</span>(
            <span class="hljs-string">"key"</span> =&gt; <span class="hljs-string">"&#91;consumer_key]"</span>,
            <span class="hljs-string">"secret"</span> =&gt; <span class="hljs-string">"&#91;consumer_secret]"</span>
        )
    )
);
</code></span></pre>


<p><em>consumer_key</em> と <em>consumer_secret</em> は、 事前にTwitterでアプリケーションを登録して、自前の物を取得しておきましょう。</p>



<ul class="wp-block-list">
<li><a href="https://dev.twitter.com/apps/new">Create an application | Twitter Developers</a></li>
</ul>



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



<h4 class="wp-block-heading">Twitterの認証画面へリダイレクト</h4>



<p>まず、Twitterの認証画面へリダイレクトするスクリプトを書きます。 ユーザはログイン時はこのページにアクセスする事になります。</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-keyword">require</span> <span class="hljs-string">"/the/path/to/Opauth.php"</span>;
<span class="hljs-keyword">require</span> <span class="hljs-string">"/the/path/to/opauth.config.php"</span>;

<span class="hljs-keyword">new</span> Opauth($opauth_config);
</span></code></span></pre>


<p>ライブラリと設定を読み込んでインスタンスを初期化するだけです。<br />
認証画面のURLの取得やらリクエストトークンの取得やらリダイレクト処理やら、<br />
面倒な部分は全て代行してくれます。素晴らしい。</p>



<h4 class="wp-block-heading">アクセストークンを取得</h4>



<p>今度は、Twitterの認証画面から返ってきたユーザの<em>アクセストークン</em>を取得します。</p>



<p>デフォルトの設定では、認証情報は全て$_SESSIONに入るので<br />
事前に*session_start()* しておきましょう。</p>


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

session_start();

<span class="hljs-keyword">require</span> <span class="hljs-string">"/the/path/to/Opauth.php"</span>;
<span class="hljs-keyword">require</span> <span class="hljs-string">"/the/path/to/opauth.config.php"</span>;


<span class="hljs-comment">/**
 * コールバック時には第二引数にfalseを入れて初期化する。
 */</span>
$opauth = <span class="hljs-keyword">new</span> Opauth($opauth_config, <span class="hljs-keyword">false</span>);

<span class="hljs-comment">/**
 * 認証情報を取得します。
 */</span>
<span class="hljs-keyword">if</span>(<span class="hljs-keyword">isset</span>($_SESSION&#91;<span class="hljs-string">"opauth"</span>]) &amp;&amp; <span class="hljs-keyword">isset</span>($_SESSION&#91;<span class="hljs-string">"credentials"</span>])){

    $uid = $_SESSION&#91;<span class="hljs-string">"opauth"</span>]&#91;<span class="hljs-string">"auth"</span>]&#91;<span class="hljs-string">"id_str"</span>]; <span class="hljs-comment">// Twitterの数字のID</span>
    $access_token = $_SESSION&#91;<span class="hljs-string">"credentials"</span>]&#91;<span class="hljs-string">"token"</span>]; <span class="hljs-comment">// アクセストークン</span>
    $access_token_secret = $_SESSION&#91;<span class="hljs-string">"credentials"</span>]&#91;<span class="hljs-string">"secret"</span>]; <span class="hljs-comment">// 秘密のアクセストークン</span>

}
</span></code></span></pre>


<p>コールバック時も、インスタンスを初期化してセッションから情報を取得するだけです。</p>



<p>ここで取得したアクセストークンを使ってTwitterAPIにアクセスするわけですが、<br />
Opauthは認証を代行するライブラリなので、その為の機能は備えていません。<br />
ここから先は、他のライブラリに代行してもらうことにします。</p>



<h2 class="wp-block-heading">APIの利用はtmhOAuthで</h2>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-9PACCvvHn44/UDaJLflWeKI/AAAAAAAABkY/h47QCYyBv3w/s500/20120824-02.png" alt="themattharris/tmhOAuth"/></figure>



<p></p>



<ul class="wp-block-list">
<li><br />    <a href="https://github.com/themattharris/tmhOAuth">themattharris/tmhOAuth</a><br />  </li>
</ul>



<p>
  <em>tmhOAuth</em>は、PEARのServices_TwitterのようにTwitterAPIへのアクセスを代行してくれるライブラリです。<br />
  勿論認証機能も備えていますが、あまりにもOpauthが楽すぎたので作業分担をしてもらいます。
</p>



<p>
  その特徴としては、（ほぼ）単ファイルで構成されていること。<br />
  <em>tmhOAuth.php</em>をとってきて読み込むだけでその機能を利用する事ができるので、導入が容易いですね。<br />
  （正確には、tmhUtilities.php というユーティリティ用のファイルが同梱されていますが、<br />
  依存しているわけではありません）
</p>



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



<p>
  基本的には、前項で取得した4つのトークンを引数にして初期化して、<br />
  あとはTwitterAPIへのリクエストを行うだけです。
</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-keyword">require</span> <span class="hljs-string">"/the/path/to/tmhOAuth.php"</span>;

<span class="hljs-comment">/**
 * tmhOAuthを初期化。
 * コンストラクタの引数はトークンをまとめた連想配列。
 */</span>
$twitter = <span class="hljs-keyword">new</span> tmhOAuth(
    <span class="hljs-keyword">array</span>(
        <span class="hljs-string">"consumer_key"</span> =&gt; <span class="hljs-string">"&#91;consumer_key_for_your_application]"</span>,
        <span class="hljs-string">"consumer_secret"</span> =&gt; <span class="hljs-string">"&#91;consumer_secret_for_your_application]"</span>,
        <span class="hljs-string">"user_token"</span> =&gt; <span class="hljs-string">"&#91;access_token_of_the_user]"</span>,
        <span class="hljs-string">"user_secret"</span> =&gt; <span class="hljs-string">"&#91;access_token_secret_of_the_user]"</span>
    )
);

<span class="hljs-comment">/**
 * requestメソッドでTwitterAPIにリクエストを送る。
 * ここではユーザーのホームタイムラインを取得してみる。
 */</span>
$status = $twitter-&gt;request(
    <span class="hljs-string">"GET"</span>, <span class="hljs-comment">// リクエストメソッド</span>
    $twitter-&gt;url(<span class="hljs-string">"1/statuses/home_timeline"</span>), <span class="hljs-comment">// エンドポイントを指定</span>
    <span class="hljs-keyword">array</span>( <span class="hljs-string">"count"</span> =&gt; <span class="hljs-number">8</span> ) <span class="hljs-comment">// パラメータ</span>
);

<span class="hljs-comment">/**
 * requestの返り値はHTTPのステータスコード
 */</span>
<span class="hljs-keyword">if</span>($status == <span class="hljs-number">200</span>){
    <span class="hljs-comment">/**
     * データはメンバのresponseの中に、
     * さらに生のデータはその中の"response"の中にJSONで格納されている。
     */</span>
    $response = $twitter-&gt;response;
    $data = json_decode($response&#91;<span class="hljs-string">"response"</span>]);
    var_dump($data); <span class="hljs-comment">// あとは煮たり焼いたりする</span>
}
</span></code></span></pre>


<p>
  無事タイムラインを取得出来ましたでしょうか。<br />
  requestの返り値に注意しましょう。
</p>



<p>
  こちらのライブラリもまた、かなりシンプルな使い勝手になっていますね。
</p>



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



<p>
  PEARのServices_Twitterには、個人的にいくつかの不安がありました。
</p>



<ul class="wp-block-list">
<li><br />    ながらくβ版のままで、あまりメンテナンスされていない<br />  </li>



<li><br />    ローカルコピーでプロジェクトに同梱しづらい<br />  </li>
</ul>



<p>
  そこで他の選択肢を探していましたところ、<br />
  これらの2つのライブラリが候補として挙がって来ました。
</p>



<p>
  お手軽さも上々なので、今後是非試していきたいリソースです。
</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>はじめてのKohana : インデックス</title>
		<link>https://blog.mach3.jp/2012/05/28/get-started-with-kohana-index.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 28 May 2012 10:32:25 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[PHP]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2502</guid>

					<description><![CDATA[PHPのWebアプリケーションフレームワークである「Kohana」の導入の記録をまとめました。 はじめてのKohana 本連載は、私がKohanaに興味をもって導入し、色々試してみた記録をまとめたものなので、 あまり体系 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>PHPのWebアプリケーションフレームワークである「Kohana」の導入の記録をまとめました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-NwJo8J6DtR4/T7PQXXXKF-I/AAAAAAAABgs/G7mylmhDbxI/s400/20120517.png" alt="はじめてのKohana"/></figure>



<p></p>



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



<h2 class="wp-block-heading">はじめてのKohana</h2>



<p>本連載は、私がKohanaに興味をもって導入し、色々試してみた記録をまとめたものなので、 あまり体系的に紹介できていない部分があるかもしれませんが、ご了承ください。 また、導入時に書いた物なので、そこまで突っ込んだ内容はありません。</p>



<p><a href="/2012/05/get-started-with-kohana-01.html">続きを読む</a></p>



<h2 class="wp-block-heading">インデックス</h2>



<h3 class="wp-block-heading">1. <a href="/2012/05/get-started-with-kohana-01.html">Hello World !</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>はじめに</li>



<li>Kohanaについて</li>



<li>インストール</li>



<li>初期設定</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">2. <a href="/2012/05/get-started-with-kohana-02.html">コントローラとビューの基本</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>ルーティングとコントローラ</li>



<li>ビューを使って出力する</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">3. <a href="/2012/05/get-started-with-kohana-03.html">コントローラ</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>コントローラファイル</li>



<li>パラメータを受け取る</li>



<li>before / after</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">4. <a href="/2012/05/get-started-with-kohana-04.html">ルーティング</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>ルーティングを設定してURLをデザインする</li>



<li>パラメータを増やす</li>



<li>パラメータを省略する</li>



<li>様々な形式のフィードを出力する</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">5. <a href="/2012/05/get-started-with-kohana-05.html">ビュー</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>ビューファイル</li>



<li>ビューに値を渡す（set）</li>



<li>値を参照渡しする（bind）</li>



<li>共用の値を設定する</li>



<li>ビューの中のビュー</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">6. <a href="/2012/05/get-started-with-kohana-06.html">モデルとデータベース</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>モデルファイル</li>



<li>データベースの初期設定</li>



<li>データベースインスタンスとクエリの実行</li>



<li>結果を受け取る</li>



<li>クエリビルダー</li>



<li>プリペアドステートメント</li>



<li>DBクラスでのデータベース指定</li>
</ol>
</blockquote>



<h3 class="wp-block-heading">7. <a href="/2012/05/get-started-with-kohana-07.html">バリデーション</a></h3>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<ol class="wp-block-list">
<li>値のチェックができるValidクラス</li>



<li>Validationクラス</li>



<li>エラーメッセージのカスタマイズ</li>



<li>独自のルールでチェックする</li>
</ol>
</blockquote>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
