<?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>CMS &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/cms/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Tue, 04 Jun 2013 01:32:29 +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スプレッドシートを簡易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>Tumblrでタグリスト/新規投稿リストを出力してみる</title>
		<link>https://blog.mach3.jp/2010/10/15/js-tumblrposts.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 15 Oct 2010 05:02:28 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tags]]></category>
		<category><![CDATA[Tumblr]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=882</guid>

					<description><![CDATA[この記事の情報は古い為、次の記事をあわせて御覧ください。 » TumblrPosts.jsが新しくなりました Tumblrを弄る案件に初めて参加させて頂きましたが、 このサービスは他のブログサービスと異なり、 「最新の投 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p class="caution">
  この記事の情報は古い為、次の記事をあわせて御覧ください。<br /> » <a href="/2012/11/tumblrposts-js-1-3.html">TumblrPosts.jsが新しくなりました</a>
</p>



<p>Tumblrを弄る案件に初めて参加させて頂きましたが、<br />
このサービスは他のブログサービスと異なり、<br />
「最新の投稿」「タグ一覧」の出力機能を備えていない様子。<br />
同機能を実現する為にはAPIへのアクセスを（複数回）行わなければならないのですが、<br />
大変不便なので、それを代行するライブラリを書いてみました。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh5.ggpht.com/_JJkNs5Ixl70/TLff5hpTJ3I/AAAAAAAABDs/okRSs8lEXPM/201010151358.png" alt="Tumblrでタグリスト/新規投稿リストを出力してみる"/></figure>



<p></p>



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



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



<p><a href="http://github.com/mach3/js-tumblrposts.js">mach3&#8217;s js-tumblrposts.js at master &#8211; GitHub</a></p>



<p>Tumblrの記事を、API(/api/read/json/）を通して取得するクラスです。</p>



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



<h3 class="wp-block-heading">ライブラリのロード</h3>


<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">"jquery.min.js"</span>&gt;</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">"jquery.class.min.js"</span>&gt;</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">"tumblrposts.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<p>先ず、必要なライブラリをロードします。<br />
jQueryと、jquery.class.jsが必要です。<br />
cf) <a href="/2010/09/jquery-class-js.html">jQueryでPrototype.js風のクラス定義をしてみる</a></p>



<h3 class="wp-block-heading">初期化</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> posts = <span class="hljs-keyword">new</span> TumblrPost({
    <span class="hljs-attr">domain</span>:<span class="hljs-string">"example.tumblr.com"</span>,
    <span class="hljs-attr">maxNum</span>:<span class="hljs-number">300</span>
});
</code></span></pre>


<p>初期化します。<br />
引数のオブジェクトリテラルには、domain（対象となるTumblrのドメイン）と<br />
maxNum（取得する最大記事数）を渡す事が出来ます。<br />
両方共省略しても大抵問題は生じません。詳しくは後述。</p>



<h3 class="wp-block-heading">イベント</h3>



<p>次にイベントハンドラを設定します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">posts.bind( posts.EVENT_COMPLETE, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    <span class="hljs-keyword">var</span> s = <span class="hljs-keyword">this</span>;
    <span class="hljs-comment">// getPosts() で投稿リストを取得</span>
    <span class="hljs-comment">// getTitleByPost() で投稿タイトルを取得</span>
    $.each( <span class="hljs-keyword">this</span>.getPosts(), <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> i, post </span>)</span>{
        <span class="hljs-keyword">var</span> title = s.getTitleByPost(post, <span class="hljs-number">100</span>),
            html = <span class="hljs-string">'&lt;li&gt;&lt;a href="{{url}}"&gt;{{title}}&lt;/a&gt;&lt;/li&gt;'</span>
            .replace( <span class="hljs-regexp">/{{url}}/</span>, post.url )
            .replace( <span class="hljs-regexp">/{{title}}/</span>, title );
        $(html).appendTo( $(<span class="hljs-string">"ul#updated"</span>) );
    });
    <span class="hljs-comment">// getTags() でタグリストを取得</span>
    $.each( <span class="hljs-keyword">this</span>.getTags(), <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> i, tag </span>)</span>{
        <span class="hljs-keyword">var</span> html = <span class="hljs-string">'&lt;li&gt;&lt;a href="/tagged/{{url}}"&gt;{{tagname}} ({{count}})&lt;/a&gt;&lt;/li&gt;'</span>
            .replace( <span class="hljs-regexp">/{{tagname}}/</span>, tag.name )
            .replace( <span class="hljs-regexp">/{{count}}/</span>, tag.count );
        $(html).appendTo( $(<span class="hljs-string">"ul#tags"</span>) );
    });
});
</code></span></pre>


<p>記事のロードが完了すると<em>&#8220;complete&#8221;</em>（EVENT_COMPLETE）イベントが着火されます。<br />
イベントハンドラ内で<em>getPosts()</em>や<em>getTags()</em>を呼ぶと、投稿/タグのリストを取得する事が出来ます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">posts.bind( posts.EVENT_PROGRESS, <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-keyword">this</span>.getLoadedRate() + <span class="hljs-string">"% Loaded"</span> );
});
</code></span></pre>


<p>こちらは使う事は少ないかもしれませんが、<br />
記事のロードが進むごとに<em>&#8220;progress&#8221;</em>(EVENT_PROGRESS)イベントが着火されます。<br />
getLoadedRate()で進捗をパーセントで取得する事が出来ます。</p>



<h3 class="wp-block-heading">ロードスタート</h3>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">posts</span><span class="hljs-selector-class">.run</span>();
</code></span></pre>


<p><em>run()</em>メソッドをコールすると、APIへのアクセスが開始されます。</p>



<h2 class="wp-block-heading">APIとか</h2>



<dl>
<dt>TumblrPost( config )</dt>
<dd>コンストラクタ。引数に設定用のオブジェクトを渡せます。<br />
<em>config</em><br />
&#8211; <em>domain</em> (String) : Tumblrのドメイン。外部Tumblrにアクセスする時に指定。<br />
&#8211; <em>maxNum</em> (Number) : 読み込む最大記事数。投稿数が多い場合はこれを指定する事で負荷を軽減出来ます。<br />
（maxNumを指定した場合、タグの取得はあまり正確でなくなります）</dd>
<dt>run() : void</dt>
<dd>APIへのアクセスを開始します。<br />
全ての投稿をロードするか、config.maxNumに達するまでアクセスを繰り返し行ないます。</dd>
<dt>getTags() : Array</dt>
<dd>タグリストを取得します。返されるArrayの子要素はシンプルなオブジェクトです。<br />
<em>Array</em><br />
&#8211; <em>name</em> (String) : タグの名前<br />
&#8211; <em>count</em> (Number) : ポスト数</dd>
<dt>getPosts( offset, count ) : Array</dt>
<dd>記事リストを取得します。<br />
&#8211; offset (Number) : 開始位置<br />
&#8211; count (Number) : 取得する記事数 返されるArrayの子要素はTumblrAPIのpostオブジェクトです<br />
c) <a href="http://www.tumblr.com/docs/en/api#api_read">API | Tumblr</a></dd>
<dt>getTitleByPost( post ) : String</dt>
<dd>postオブジェクトから記事タイトルを抽出します。（試験的に実装）</dd>
<dt>getLoadedRate() : Number</dt>
<dd>ロードの進捗をパーセントで返します。</dd>
</dl>



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



<p>仕方がないとは言え、<br />
この手法は場合によっては複数回JSONPのアクセスを繰り返すことになり、<br />
パフォーマンスが正直あまりよろしくない為、必要がなければ避けるべきでしょう。<br />
（一度に取得できるポストの最大数が50なので…）</p>



<p>最新の投稿の取得は、はっきり言ってオマケでつけています。<br />
タグ抽出時にどうせ投稿情報取得するので、ついでに格納しとけ～的な。<br />
新規投稿だけならJSONPのコールバックで直接処理したほうが明らかに効率がいいので、<br />
タグリストに用がないならそうすべきですね。</p>



<p>そんなわけで、<br />
TumblrのAPIがタグの抽出に対応してくれれば不要なライブラリです。<br />
まとめ書きながらなんかへこんできました…</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>MT備忘録: blog_idに関わるスニペットメモ</title>
		<link>https://blog.mach3.jp/2010/06/13/mt-blogid.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Sun, 13 Jun 2010 22:00:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[MovableType]]></category>
		<guid isPermaLink="false">http://lab.mach3.jp/2010/06/13/mt%e5%82%99%e5%bf%98%e9%8c%b2-blog_id%e3%81%ab%e9%96%a2%e3%82%8f%e3%82%8b%e3%82%b9%e3%83%8b%e3%83%9a%e3%83%83%e3%83%88%e3%83%a1%e3%83%a2.html</guid>

					<description><![CDATA[ここ最近MovableType構築のお仕事が進行中なのですが、 あまりにもMTを弄るのが久しぶり過ぎてかなり泡を食っています。 （なんせ以前使ったバージョンは3.xだった気が…） そんな中で生まれた苦し紛れなスニペットを [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>ここ最近MovableType構築のお仕事が進行中なのですが、<br />
あまりにもMTを弄るのが久しぶり過ぎてかなり泡を食っています。<br />
（なんせ以前使ったバージョンは3.xだった気が…）<br />
そんな中で生まれた苦し紛れなスニペットをメモっておきます。</p>



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



<p>はじめにお断りしておくと、今回のお仕事は<br />
「本番環境を直接触れず、ローカルで構築したMTのバックアップデータを納品する。<br />
尚、本番環境でPHPは動作しない。」<br />
というちょっと限定的な状況です。</p>



<h2 class="wp-block-heading">名前からblog_idを引く</h2>



<p>例えば、親サイトから、ある子ブログの投稿一覧を出力したい。<br />
本番環境で作業できるのならばblog_id決め打ちで良いと思うのですが、<br />
バックアップ＋復元を繰り返していくとblog_idが安定せず、<br />
連番で増えて行ってしまう場合があります。</p>



<p>そこで、ブログのタイトルからblog_idを引いてみます。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">mt:Blogs</span> <span class="hljs-attr">include_blogs</span>=<span class="hljs-string">"site"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">mt:SetVarBlock</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"blog_name"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">mt:BlogName</span> /&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mt:SetVarBlock</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">mt:If</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"blog_name"</span> <span class="hljs-attr">eq</span>=<span class="hljs-string">"最新情報"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">mt:SetVarBlock</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"news_id"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">mt:BlogID</span> /&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mt:SetVarBlock</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">mt:ElseIf</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"blog_name"</span> <span class="hljs-attr">eq</span>=<span class="hljs-string">"導入事例"</span>&gt;</span>
        <span class="hljs-tag">&lt;<span class="hljs-name">mt:SetVarBlock</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"case_id"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">mt:BlogID</span> /&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mt:SetVarBlock</span>&gt;</span>
    <span class="hljs-tag">&lt;/<span class="hljs-name">mt:If</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">mt:Blogs</span>&gt;</span>
</code></span></pre>


<p>サイトに所属する全てのブログの中で、タイトルが一致する物を拾ってIDをSetVarしています。<br />
上の例では「最新情報」というブログのIDを「news_id」に、<br />
「導入事例」というブログのIDを「case_id」に格納しています。<br />
あとは格納されたIDを使ってなんやかんやしましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">mt:Entries</span> <span class="hljs-attr">blog_id</span>=<span class="hljs-string">"$news_id"</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">mt:Ignore</span>&gt;</span><span class="hljs-comment">&lt;!--なんやかんや--&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mt:Ignore</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">mt:Entries</span>&gt;</span>
</code></span></pre>


<p>もうちょっとスマートな書き方がありそうな気もせんではないですが…<br />
もしご存知の方いたら是非ご教示下さい。</p>



<h2 class="wp-block-heading">親サイトのモジュールを子ブログで使う</h2>



<p>これはMT使いの中ではごく当たり前かもしれませんね。<br />
子ブログでMTIncludeしても、子ブログのモジュールの中から探してしまうので、<br />
blog_idモディファイアで、どのブログのモジュールから探すか指定してやりましょう。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">mt:Ignore</span>&gt;</span><span class="hljs-comment">&lt;!-- 親サイトのIDを取得してwebsite_idに格納 --&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mt:Ignore</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">mt:BlogParentWebsite</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">mt:SetVarBlock</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"website_id"</span>&gt;</span><span class="hljs-tag">&lt;<span class="hljs-name">mt:WebsiteID</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mt:SetVarBlock</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">mt:BlogParentWebsite</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">mt:Ignore</span>&gt;</span><span class="hljs-comment">&lt;!-- blog_idで指定してモジュールをインクルード --&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">mt:Ignore</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">mt:Include</span> <span class="hljs-attr">module</span>=<span class="hljs-string">"module_name"</span> <span class="hljs-attr">blog_id</span>=<span class="hljs-string">"$website_id"</span> /&gt;</span>
</code></span></pre>


<p>純粋にMTの機能だけでアレコレしようとすると、 なんだかモッサリなコードになってしまいますね…。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
