<?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>Library &#8211; Mach3.laBlog</title>
	<atom:link href="https://blog.mach3.jp/tag/library/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.mach3.jp</link>
	<description></description>
	<lastBuildDate>Fri, 26 Jul 2013 01:47:06 +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>日付を便利に操作するためのJavaScriptライブラリ色々</title>
		<link>https://blog.mach3.jp/2013/07/26/js-libraries-for-date.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Fri, 26 Jul 2013 01:47:06 +0000</pubDate>
				<category><![CDATA[WebClip]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[Plugin]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=3220</guid>

					<description><![CDATA[JavaScriptには日付を扱う為の &#8220;Date&#8221; オブジェクトがありますが、正直なところこれはあまり親切ではありません。 そこで、JavaScriptの日付周りで楽をするためのライブラリのメモ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>JavaScriptには日付を扱う為の &#8220;Date&#8221; オブジェクトがありますが、正直なところこれはあまり親切ではありません。 そこで、JavaScriptの日付周りで楽をするためのライブラリのメモをここに。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-ZfOlO8juvhA/UfF2iaSilgI/AAAAAAAACJA/15V3PFD4xMs/s400/20130726-00.png" alt="日付を便利に操作するためのJavaScriptライブラリ色々"/></figure>



<p></p>



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



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



<h3 class="wp-block-heading"><a href="http://arshaw.com/xdate/">XDate &#8211; A Modern JavaScript Date Library</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-0BY8CdPA_uM/UfFwLzMpCuI/AAAAAAAACIg/znpBKW8dvA0/s500/20130726-02.png" alt="XDate - A Modern JavaScript Date Library"/></figure>



<p></p>



<p>Dateをもっと便利にした <em>XDateオブジェクト</em> を実装するライブラリです。 使い方はDateとほとんど変わらず、XDateに引数を渡して初期化して使います。</p>



<p>XDateオブジェクトは、DateにあるsetTimeやgetFullYearなどのメソッドを継承している他、 日付の足し算を行ったり、差分を計算したり等便利なメソッドが沢山生えています。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> d = <span class="hljs-keyword">new</span> XDate(<span class="hljs-number">1977</span>, <span class="hljs-number">10</span>, <span class="hljs-number">25</span>); <span class="hljs-comment">// 1977/11/25のXDateオブジェクトを生成</span>
d.addDays(<span class="hljs-number">14</span>); <span class="hljs-comment">// 14日足してみる</span>
d.diffYears(<span class="hljs-keyword">new</span> XDate()); <span class="hljs-comment">// 今日との差分を取得する</span>
d.toString(<span class="hljs-string">"yyyy年M月d日 HH:mm"</span>); <span class="hljs-comment">// フォーマットした文字列を取得</span>
</code></span></pre>


<p>Dateにないけど欲しかった機能が一通り手に入り、 且つDateの実装からあまり離れていないので使いやすいです。 大抵の物はこれでカバーできそうですね。</p>



<p>また、あまり世話を焼かないタイプのライブラリなので、サイズも小さくまとまっています。</p>



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



<h3 class="wp-block-heading"><a href="http://momentjs.com/">Moment.js | Parse, validate, manipulate, and display dates</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-nEDN4FP78eg/UfFwLx9QkYI/AAAAAAAACIg/n8EGBVTMl_U/s500/20130726-01.png" alt="Moment.js | Parse, validate, manipulate, and display dates in javascript."/></figure>



<p></p>



<p>こちらもDateオブジェクトのラッパーのMomentオブジェクトを実装するライブラリですが、 メソッド群はXDateと違ってDateオブジェクトを模した形にはなっていません。</p>



<p>Momentオブジェクトの初期化は new を使わずに <em>moment()</em> に引数を渡しておこないます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> m = moment(); <span class="hljs-comment">// 現在の日付時刻のMomentオブジェクト</span>
</code></span></pre>


<h3 class="wp-block-heading">多彩なパーサー</h3>



<p>そして注目すべきはその多彩なパーサーです。 引数に値を渡して日付・時刻を指定したMomentオブジェクトを生成出来るのはDateと同じですが、 moment() は様々な形式に対応する事ができます。</p>



<p>これもまだ一部ですが、例を挙げます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">moment(<span class="hljs-string">"1977/11/25"</span>); <span class="hljs-comment">// 文字列</span>
moment(&#91;<span class="hljs-number">1977</span>, <span class="hljs-number">10</span>, <span class="hljs-number">25</span>]); <span class="hljs-comment">// 配列</span>
moment(<span class="hljs-string">"1977-11-25"</span>, <span class="hljs-string">"YYYY-MM-DD"</span>); <span class="hljs-comment">// フォーマットを指定した文字列</span>
moment(<span class="hljs-string">"25-11-1977"</span>, &#91;<span class="hljs-string">"YYYY-MM-DD"</span>, <span class="hljs-string">"DD-MM-YYYY"</span>]); <span class="hljs-comment">// フォーマットを複数指定した文字列</span>
</code></span></pre>


<p>フォーマットの指定はすごく便利ですね。しかも配列で渡せば複数のフォーマットでチェックを行なってくれます。</p>



<h3 class="wp-block-heading">その他機能</h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> now = moment();
now.add(<span class="hljs-string">"days"</span>, <span class="hljs-number">30</span>); <span class="hljs-comment">// 30日足す</span>
now.subtract(<span class="hljs-string">"days"</span>, <span class="hljs-number">90</span>); <span class="hljs-comment">// 90日引く</span>
now.format(<span class="hljs-string">"YYYY/MM/DD"</span>); <span class="hljs-comment">// フォーマット</span>
now.fromNow()); <span class="hljs-comment">// "2 months ago"</span>
</code></span></pre>


<p><em>fromNow()</em> はTwitter等のWebサービスでよく使われる <em>「〜時間前」</em> といった表現を簡単に実装してくれます。 デフォルトは英語ですが、同梱された言語ファイルで簡単に日本語化できます。親切。</p>



<p>その他にも、ここではとても紹介しきれない程に機能満載なライブラリです。 また、その分少しファイルサイズがかさんでしまう側面も。</p>



<h2 class="wp-block-heading">Humane-Dates</h2>



<h3 class="wp-block-heading"><a href="https://github.com/zachleat/Humane-Dates">zachleat/Humane-Dates</a></h3>



<p><em>「〜時間前」</em> のような表現を実装してくれる為だけの、非常にショートでシンプルなライブラリ。 &#8220;human&#8221; ではなく &#8220;humane&#8221; なので間違えぬよう。</p>



<p>cf) <a href="http://ejje.weblio.jp/content/humane">humaneの意味 &#8211; 英和辞典 Weblio辞書</a></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">humaneDate(<span class="hljs-string">"1977/11/25"</span>); <span class="hljs-comment">// "36 years ago" （執筆時点）</span>
humaneDate(<span class="hljs-string">"1977/11/25"</span>, <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>()); <span class="hljs-comment">// 第二引数と比較ができる</span>
</code></span></pre>


<p>jQueryを読み込んでいれば、jQueryプラグインとしても機能するようです。</p>



<p>残念なのは、Moment.jsのように多言語化していないのと、 その為のインターフェイスを持ちあわせていない事。 日本語化する為には、コード内の <em>&#8220;lang&#8221;</em> オブジェクトを直接編集する必要があります。</p>



<p>単機能なのでコンパクトさが売りです。 コレだけが欲しい、という時には選択肢に入るかもしれません。</p>



<h2 class="wp-block-heading">node-date-utils</h2>



<h3 class="wp-block-heading"><a href="https://github.com/JerrySievert/node-date-utils">JerrySievert/node-date-utils</a></h3>



<p>node-data-utilsは、Dateオブジェクトを拡張する<a href="http://www23.atwiki.jp/sevenlives/pages/2505.html">Polyfill</a>です。 下の例はほんの一部ですが、Dateに追加される機能はシンプルで基本的な物です。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// スタティックなメソッド</span>
<span class="hljs-built_in">Date</span>.yesterday(); <span class="hljs-comment">// 昨日のDateオブジェクトを返す</span>
<span class="hljs-built_in">Date</span>.tomorrow(); <span class="hljs-comment">// 明日のDateオブジェクトを返す</span>

<span class="hljs-comment">// インスタンスのメソッド</span>
<span class="hljs-keyword">var</span> format = <span class="hljs-string">"YYYY年MM月DD日"</span>;
<span class="hljs-keyword">var</span> d = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Date</span>(<span class="hljs-number">1977</span>, <span class="hljs-number">10</span>, <span class="hljs-number">25</span>);
d.toFormat(format); <span class="hljs-comment">// 1977年11月25日</span>
<span class="hljs-comment">// 1年と2ヶ月と3日を足す</span>
d.add({
    <span class="hljs-attr">years</span>: <span class="hljs-number">1</span>,
    <span class="hljs-attr">months</span>: <span class="hljs-number">2</span>,
    <span class="hljs-attr">days</span>: <span class="hljs-number">3</span>
});
d.toFormat(format); <span class="hljs-comment">// 1979年1月28日</span>
</code></span></pre>


<p>add に負の数を渡せば引き算にもなります。</p>



<p>node-date-utilsはDateのprototypeを拡張する事になるので、 あなたの環境・主義がそれを許すならば使ってみても良いのではないでしょうか。</p>



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



<p>本当は <a href="https://code.google.com/p/datejs/">datejs</a> の実装が面白かったので紹介したかったのですが、 数年アップデートされておらず、試してみたもののうまく動かない物が多かったので、残念ながら諦めました。</p>



<p>日付の出力はWebサービス等で頻繁に行うと思いますので、 開発者の皆さんに感謝しつつ、できるだけ楽をしましょう。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>パッケージマネージャー「Bower」が大変便利で捗りそうです</title>
		<link>https://blog.mach3.jp/2013/01/29/bower.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 29 Jan 2013 01:56:23 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Resources]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2982</guid>

					<description><![CDATA[外部リソースをプロジェクトにインストールするのに、今まではSublimeText2のNettuts+ Fetchを使用していましたが、 node.jsベースのパッケージマネージャーの「Bower」が大変良さそうだったので [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>外部リソースをプロジェクトにインストールするのに、今までは<a href="http://www.sublimetext.com/">SublimeText2</a>の<a href="/2012/01/sublime-text-and-nettuts-fetch.html">Nettuts+ Fetch</a>を使用していましたが、 node.jsベースのパッケージマネージャーの「Bower」が大変良さそうだったのでレポートをしたためておきます。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-bYchZSyBnIg/UQaR7UpP18I/AAAAAAAAB7U/5grWWoVm2Vg/s400/20130129-00.png" alt="パッケージマネージャー「Bower」が大変便利で捗りそうです"/></figure>



<p></p>



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



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



<h3 class="wp-block-heading"><a href="http://twitter.github.com/bower/">BOWER &#8211; THE BROWSER PACKAGE MANAGER html, css, and javascript</a></h3>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/-lxzVaMvIoiY/UQaR7b2h0QI/AAAAAAAAB7U/pJJptRHExwo/s500/20130129-01.png" alt="Bower"/></figure>



<p></p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Bower is a package manager for the web. Bower lets you easily install assets such as images, CSS and JavaScript, and manages dependencies for you.</p>



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



<p>BowerはWeb開発向けのパッケージマネージャーです。画像・CSS・JavaScriptといったリソースを簡単にインストールする事ができ、依存関係を管理してくれます。</p>
</blockquote>



<p>新しいプロジェクトをスタートする度に毎回jQuery等のリソースを複製して設置するのは面倒です。 そこでBowerを利用する事で、コマンドラインから簡単に最新のパッケージを、依存リソースと一緒にインストールする事ができます。</p>



<p>また、プロジェクトの設定ファイル（bower.json）を作成して依存リソースを記しておけば、 コマンド一発で全てダウンロード、あるいはアップデートする事ができます。 プロジェクトに必要なライブラリがチームメンバーにとって一目瞭然になるのもメリットですね。</p>



<p>見ての通り、Twitter開発陣プレゼンツのリソースです。 リリース当初小耳には挟んでいたのですが、実用するまでには至らず。実際使ってみたら大変便利でした。</p>



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



<p>まずは Bower をインストールします。必要に応じて、sudoなどしましょう。 （node.jsを先にインストールしておく必要があります）</p>


<pre class="wp-block-code"><span><code class="hljs">$ npm install -g bower
</code></span></pre>


<p>Windowsユーザーの場合は、Gitがコマンドプロンプトから呼べないと上手く動作しないそうです。 公式にあるように、msysgitインストール時に &#8220;Run Git from the Windows Command Prompt&#8221;のチェックを入れるか、 あるいは Git CUIの環境でnode.jsへのパスを通しておけば使えます。</p>



<p>cf) <a href="https://npmjs.org/package/bower">公式ドキュメント参照 (&#8220;Windows users&#8221;の項)</a></p>



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



<h3 class="wp-block-heading">パッケージをインストールする</h3>



<p>まずはコマンドラインからパッケージ単体をインストールしてみます。&#8221;install&#8221; コマンドでパッケージ名を指定します。</p>


<pre class="wp-block-code"><span><code class="hljs">$ bower install jquery
</code></span></pre>


<p>すると、カレントディレクトリに「bower_components」ディレクトリが作成され、その中にパッケージがインストールされます。 こんなかんじに。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><pre class="wp-block-code"><span><code class="hljs">ProjectRoot/
└ bower_components/
    └ jquery/
         ├ jquery.js
         ├ jquery.min.js
         ├ component.json
         └ composer.json
</code></span></pre></blockquote>



<p class="caution">
    デフォルトの名前が&#8221;components&#8221;から変更になっています &#8211; 2013/09/05
</p>



<p>パッケージ名を連記する事で複数のパッケージを一度にインストールする事もできます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ bower install jquery modernizr mustache
</code></span></pre>


<p>バージョンを決め打ちしてインストールするにはシャープ記号で区切って指定することができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-php">$ bower install jquery<span class="hljs-comment">#1.8.2</span>
$ bower install jquery<span class="hljs-comment">#1.8.x</span>
$ bower install jquery<span class="hljs-comment">#1.8</span>
...
</code></span></pre>


<h3 class="wp-block-heading">パッケージをアップデートする</h3>



<p>インストールしたパッケージは &#8220;update&#8221; コマンドでアップデートできます。</p>


<pre class="wp-block-code"><span><code class="hljs">$ bower update
</code></span></pre>


<h3 class="wp-block-heading">欲しいパッケージを探す</h3>



<p>欲しいパッケージがBowerに登録されているかどうかは &#8220;search&#8221; コマンドで探すことができます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ bower search mustache

    - mustache git:<span class="hljs-comment">//github.com/janl/mustache.js</span>
    - grunt-mustache git:<span class="hljs-comment">//github.com/jonschlinkert/grunt-mustache.git</span>
</code></span></pre>


<h3 class="wp-block-heading">欲しいパッケージが見つからないんだけど？</h3>



<p>Bowerに登録されていないパッケージをインストールするにはいくつかの方法があります。 例えば、<a href="http://headjs.com">headjs</a>をインストールしたい場合。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$ bower install https:<span class="hljs-comment">//github.com/headjs/headjs</span>
$ bower install headjs/headjs
$ bower install https:<span class="hljs-comment">//raw.github.com/headjs/headjs/master/dist/head.js</span>
$ bower install ../../the/path/to/head.js
</code></span></pre>


<p>それぞれ次の物を指定してインストールしています。2番目が楽でいいですね。</p>



<ol class="wp-block-list">
<li>GitHubのリポジトリURL</li>



<li>GitHubのショートハンド</li>



<li>リソースの直接URL</li>



<li>リソースのローカルパス</li>
</ol>



<p>&#8220;register&#8221; コマンドでパッケージを新規登録する事も出来ますが、特定の条件が必要になる為、ここでは詳しく触れないでおきます。</p>



<h2 class="wp-block-heading">プロジェクトを作成する</h2>



<p>プロジェクトの設定ファイル &#8220;bower.json&#8221; を作っておく事で、 必要なパッケージを一括してインストール・アップデートする事ができます。</p>



<p>プロジェクトのルートディレクトリに&#8221;bower.json&#8221;を作成し、次のような要領で入力します。</p>



<p class="caution">
    設定ファイル名が&#8221;component.json&#8221;から変更になっています &#8211; 2013/09/05
</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
    <span class="hljs-attr">"name"</span> : <span class="hljs-string">"My Awersome Project"</span>,
    <span class="hljs-attr">"version"</span> : <span class="hljs-string">"1.0.0"</span>,
    <span class="hljs-attr">"dependencies"</span> : {
        <span class="hljs-attr">"jquery"</span> : <span class="hljs-string">"1.8"</span>,
        <span class="hljs-attr">"modernizr"</span> : <span class="hljs-literal">null</span>,
        <span class="hljs-attr">"mustache"</span> : <span class="hljs-literal">null</span>
    }
}
</code></span></pre>


<p>基本的に &#8220;dependencies&#8221; に必要なリソースを追加していく形になります。 見ての通り、キーにパッケージ名、値にバージョンを記載するオブジェクトリテラルになっており、 バージョンが &#8220;null&#8221; になっている場合は最新版をインストールします。</p>



<p>後は、引数なしで &#8220;install&#8221; コマンドを実行するだけで、依存リソースが一括してダウンロードされます。便利。</p>


<pre class="wp-block-code"><span><code class="hljs">$ bower install
</code></span></pre>


<p>また、「見つからないパッケージ」をインストールするためには、バージョンの代わりに前述の例のようなURLあるいはパス等を入力します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-string">"dependencies"</span> : {
    ...
    <span class="hljs-string">"headjs"</span> : <span class="hljs-string">"headjs/headjs"</span>
}
</code></span></pre>


<h2 class="wp-block-heading">インストール先ディレクトリをカスタマイズする</h2>



<p>Bowerは &#8220;.bowerrc&#8221; というファイルでカスタマイズする事ができます。</p>



<p>例えば、パッケージのインストール先を &#8220;bower_components&#8221; ディレクトリから他の場所に移したい場合、 プロジェクトルートに &#8220;.bowerrc&#8221; ファイルを作成して次のように入力しておきます。</p>


<pre class="wp-block-code"><span><code class="hljs language-json">{
        <span class="hljs-attr">"directory"</span> : <span class="hljs-string">"assets/vendors"</span>
}
</code></span></pre>


<p>また、 &#8220;.bowerrc&#8221; を自分のホームディレクトリに置いておく事で、自分が作る全てのプロジェクトにカスタマイズを適用する事ができますが、 そのプロジェクトを誰かと共有する際に問題が生じそうなので、基本的にはプロジェクトに同梱しておいた方が良いと思います。</p>



<h2 class="wp-block-heading">Nettuts+ のチュートリアル動画</h2>



<h3 class="wp-block-heading"><a href="http://www.youtube.com/watch?v=USk1ie30z5k">A RequireJS, Backbone, and Bower Starter Template</a></h3>



<p><iframe width="480" height="360" src="http://www.youtube.com/embed/USk1ie30z5k?rel=0" frameborder="0" allowfullscreen=""></iframe></p>



<p>Nettuts+ によるチュートリアル動画です。 Bowerの基本的な使い方に加えて、RequireJSとBackboneによるスタートアップについて解説しています。 参考に、是非。</p>



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



<p>node.js が出てから、JSベースの便利ツールが沢山出て来ましたね。 有り難りつつも、しっかり楽をさせてもらいましょう。</p>



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



<dl>
<dt>2013/09/05</dt>
<dd>bowerバージョンアップによる設定ファイルとディレクトリ名の変更について記載</dd>
</dl>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>TumblrPosts.js が新しくなりました</title>
		<link>https://blog.mach3.jp/2012/11/26/tumblrposts-js-1-3.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 26 Nov 2012 04:35:12 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[Tumblr]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2784</guid>

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



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



<p></p>



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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


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

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

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

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

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


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



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


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


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



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



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



<p>昔書いた物の粗が見えるようになるのは、成長の証でしょうか。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>CSS3のbox-shadowでお絵かきアプリを書いてみたものの…</title>
		<link>https://blog.mach3.jp/2012/10/09/shadowcanvas.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 09 Oct 2012 02:00:00 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Application]]></category>
		<category><![CDATA[box-shadow]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[CSS3]]></category>
		<category><![CDATA[Illustration]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Library]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2731</guid>

					<description><![CDATA[先日、CSS3のbox-shadowで描画されたモナリザが話題となりましたが、 インスパイアされて同じ手法でお絵かきアプリを作ったらどうなるか試してみました。 作ってみたもの まずはデモから。当たり前ですが、box-sh [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>先日、<a href="http://codepen.io/jaysalvat/pen/HaqBf">CSS3のbox-shadowで描画されたモナリザ</a>が話題となりましたが、 インスパイアされて同じ手法でお絵かきアプリを作ったらどうなるか試してみました。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh6.googleusercontent.com/-CYh_0uVRHXE/UHOEkHMC8zI/AAAAAAAABn4/yZ5IoXHh0C8/s400/20121009-00.png" alt="CSS3のbox-shadowでお絵かきアプリを書いてみたものの…"/></figure>



<p></p>



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



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



<p>まずはデモから。当たり前ですが、box-shadowに対応していないブラウザでは動きません。</p>



<ul class="wp-block-list">
<li><a href="http://jsbin.com/osenaj/1/edit">DEMO on JS Bin</a></li>
</ul>



<p><style type="text/css">
  iframe.jsbin-embed {<br />
    height:700px !important;<br />
}<br />
</style>
</p>



<p><a class="jsbin-embed" href="http://jsbin.com/osenaj/1/embed?live">JS Bin</a><script src="http://static.jsbin.com/js/embed.js"></script></p>



<h2 class="wp-block-heading">感想</h2>



<p>作って動かしてみた率直な感想を申し上げると…そもそもこういう用途を想定していないと思うので、当然あまり捗りませんでした。 が、描かれる物の雰囲気は、これはこれで嫌いではないです。水墨画的な物が描けそう。</p>



<h3 class="wp-block-heading">重さが加速する</h3>



<p>Webkitはかなり軽快に動くのですが、Firefoxだとかなりもっさりした動きになります。IE9だとまだマシです。 そして、書けば書くほど重くなっていきます。 box-shadowを一点ずつどんどん重ねていっているわけですから、そりゃ当然重くなりますよね。</p>



<h3 class="wp-block-heading">線を引きにくい</h3>



<p>基本的にブラシで点描を繰り返している様な物なので、あまりはやく描こうとすると途切れて線になりません。 そういうブラシだと思うしかないでしょう。 間を補完するような感じに描画しようかとも思いましたが、むしろ味が損なわれる感じがしたので途中でやめました。</p>



<h2 class="wp-block-heading">ライブラリ</h2>



<p>書いてみたライブラリがこちら。別にやってる事はどうということはないです。 使い道は多分ないと思うのですが、使ってみたい方はお好きにお使いください。</p>



<h3 class="wp-block-heading"><a href="https://gist.github.com/3851837">ShadowCanvas : Drawing illustration with css box-shadow — Gist</a></h3>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">/**
 * ShadowCanvas
 *
 * Drawing illustration with css box-shadow
 *
 * <span class="hljs-doctag">@version </span>0.9
 * <span class="hljs-doctag">@author <span class="hljs-variable">mach3ss</span></span>
 * <span class="hljs-doctag">@require <span class="hljs-variable">jQuery</span></span>
 */</span>
<span class="hljs-keyword">var</span> ShadowCanvas = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">selector, option</span>)</span>{

    <span class="hljs-comment">// config</span>
    <span class="hljs-keyword">this</span>.option = $.extend({}, <span class="hljs-keyword">this</span>.option, option);
    <span class="hljs-keyword">this</span>.node = $.extend({}, <span class="hljs-keyword">this</span>.node);

    <span class="hljs-comment">// nodes</span>
    <span class="hljs-keyword">this</span>.node.container = $(selector);
    <span class="hljs-keyword">this</span>.node.canvas = $(<span class="hljs-string">"&lt;div&gt;"</span>)
    .css({<span class="hljs-attr">position</span>:<span class="hljs-string">"absolute"</span>})
    .appendTo(<span class="hljs-keyword">this</span>.node.container);

    <span class="hljs-comment">// events</span>
    <span class="hljs-keyword">this</span>.node.container
    .on(<span class="hljs-string">"mousemove"</span>, $.proxy(<span class="hljs-keyword">this</span>._onMouseMove, <span class="hljs-keyword">this</span>))
    .on(<span class="hljs-string">"mousedown"</span>, $.proxy(<span class="hljs-keyword">this</span>.start, <span class="hljs-keyword">this</span>))
    .on(<span class="hljs-string">"mouseleave mouseup"</span>, $.proxy(<span class="hljs-keyword">this</span>.stop, <span class="hljs-keyword">this</span>));
};
(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">fn</span>)</span>{

    fn.boxShadowText = <span class="hljs-string">"{x}px {y}px {blur}px {size}px {color}"</span>;
    fn.drawing = <span class="hljs-literal">false</span>;

    fn.node = {
        <span class="hljs-attr">container</span> : <span class="hljs-literal">null</span>,
        <span class="hljs-attr">canvas</span> : <span class="hljs-literal">null</span>
    };

    fn.option = {
        <span class="hljs-attr">color</span>: <span class="hljs-string">"black"</span>,
        <span class="hljs-attr">blur</span> : <span class="hljs-number">5</span>,
        <span class="hljs-attr">size</span> : <span class="hljs-number">5</span>
    };

    <span class="hljs-comment">/**
     * Configure option or get the option value
     *
     * @param String key
     * @param Mixed value (optional)
     * @return Mixed
     */</span>
    fn.config = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">key, value</span>)</span>{
        <span class="hljs-keyword">if</span>(<span class="hljs-keyword">this</span>.option.hasOwnProperty(key)){
            <span class="hljs-keyword">if</span>(<span class="hljs-keyword">typeof</span>(value) !== <span class="hljs-string">"undefined"</span>){
                <span class="hljs-keyword">this</span>.option&#91;key] = value;
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
            } <span class="hljs-keyword">else</span> {
                <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.option&#91;key];
            }
        }
    };

    <span class="hljs-comment">/**
     * Get css text for box-shadow
     *
     * @param Integer x
     * @param Integer y
     * @return String
     */</span>
    fn._getBoxShadowText = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x, y</span>)</span>{
        <span class="hljs-keyword">var</span> o, callback;
        o = <span class="hljs-keyword">this</span>.option;
        o.x = x;
        o.y = y;
        callback = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">a, b</span>)</span>{
            <span class="hljs-keyword">return</span> o&#91;b];
        };
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.boxShadowText.replace((<span class="hljs-regexp">/\{(\w+)\}/g</span>), callback);
    };

    <span class="hljs-comment">/**
     * Draw the point with box-shadow
     *
     * @param Integer x
     * @param Integer y
     * @return self
     */</span>
    fn.draw = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">x, y</span>)</span>{
        <span class="hljs-keyword">var</span> shadow = <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>);
        shadow = shadow === <span class="hljs-string">"none"</span> ? <span class="hljs-string">""</span> : <span class="hljs-string">","</span> + shadow ;
        shadow = <span class="hljs-keyword">this</span>._getBoxShadowText(x, y) + shadow;
        <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>, shadow);
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };


    <span class="hljs-comment">/**
     * Start drawing
     *
     * @return self
     */</span>
    fn.start = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.drawing = <span class="hljs-literal">true</span>;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };

    <span class="hljs-comment">/**
     * Stop drawing
     *
     * @return self
     */</span>
    fn.stop = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.drawing = <span class="hljs-literal">false</span>;
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };

    fn._onMouseMove = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        <span class="hljs-keyword">var</span> offset, x, y;

        <span class="hljs-keyword">if</span>(! <span class="hljs-keyword">this</span>.drawing){
            <span class="hljs-keyword">return</span>;
        }

        offset = <span class="hljs-keyword">this</span>.node.container.offset();
        x = e.clientX - offset.left + <span class="hljs-built_in">document</span>.body.scrollLeft;
        y = e.clientY - offset.top + <span class="hljs-built_in">document</span>.body.scrollTop;
        <span class="hljs-keyword">if</span>(x &lt; <span class="hljs-keyword">this</span>.node.container.width() &amp;&amp; y &lt; <span class="hljs-keyword">this</span>.node.container.height()){
            <span class="hljs-keyword">this</span>.draw(x, y);
        }
    };

    <span class="hljs-comment">/**
     * Clear all on canvas
     *
     * @return self
     */</span>
    fn.clear = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>, <span class="hljs-string">"none"</span>);
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>;
    };

    <span class="hljs-comment">/**
     * Get css text of the illustration on canvas now
     *
     * @return String
     */</span>
    fn.getCSS = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">this</span>.node.canvas.css(<span class="hljs-string">"boxShadow"</span>);
    };

}(ShadowCanvas.prototype));
</code></span></pre>


<p>使い方は、キャンバスにしたいボックス要素のセレクターを引数にしてnewするだけです。 各設定はconfigで。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> myCanvas = <span class="hljs-keyword">new</span> ShadowCanvas(<span class="hljs-string">"#my-canvas"</span>);
myCanvas.config(<span class="hljs-string">"color"</span>, <span class="hljs-string">"black"</span>);
myCanvas.config(<span class="hljs-string">"size"</span>, <span class="hljs-number">8</span>);
myCanvas.config(<span class="hljs-string">"blur"</span>, <span class="hljs-number">10</span>);
</code></span></pre>


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



<p>表現力は結構ありそうですが、実用的なアプリかと問われると…</p>



<p>cf) <a href="http://kachibito.net/web-design/pure-css-mona-lisa.html">CSS3のbox-shadowだけで作られたモナリザ・・・ &#8211; かちびと.net</a></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>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>シンプルなスプライトアニメーションライブラリ 「MovieCrop.js」</title>
		<link>https://blog.mach3.jp/2012/05/07/moviecrop-js.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Mon, 07 May 2012 06:50:15 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Animation]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Library]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=2406</guid>

					<description><![CDATA[CSSスプライトを使用したアニメーションライブラリは既に色々と選択肢がありそうですが、 敢えて今回これを書いてみたのは、ローテクでごくシンプルな物が欲しかったから。 さらに言ってみれば、それらの選択肢をまだ知らなかったか [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>CSSスプライトを使用したアニメーションライブラリは既に色々と選択肢がありそうですが、 敢えて今回これを書いてみたのは、ローテクでごくシンプルな物が欲しかったから。 さらに言ってみれば、それらの選択肢をまだ知らなかったから。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-QGbdmsg8mF0/T6PrWR_CuMI/AAAAAAAABgM/TcIIW8iRdr0/s400/20120504-01.png" alt="シンプルなスプライトアニメーションライブラリ 「MovieCrop.js」"/></figure>



<p></p>



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



<h2 class="wp-block-heading">MovieCrop.jsについて</h2>



<ul class="wp-block-list">
<li><a href="https://github.com/mach3/js-moviecrop">MovieCrop.js via Github</a></li>
</ul>



<p>MovieCrop.jsは、CSSのbackground-imageを利用したアニメーションを実装するjQueryプラグインです。 名前から推察されるように、ActionScriptのMovieClipを模して作った…つもりです。</p>



<p>再生/逆再生/停止/巻き戻しが出来ます。</p>



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



<p>まず使用する画像を作成し、ブロック要素の背景にします。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/-o8WNJOT1eWI/T6PrWd2WF_I/AAAAAAAABgM/xO1L7FqOlWo/s500/20120504-02.png" alt="CSSスプライト"/></figure>



<p></p>



<p>要するにブロック要素のサイズの分だけ背景をズラしていってアニメーションさせる仕組みなので、そのような画像を用意します。</p>



<p>アニメーションの再生方法は、jQueryオブジェクトのmoviePlay()メソッドをコールするだけです。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">".loading"</span>).moviePlay();
</code></span></pre>


<p>逆再生・停止・巻き戻しも同じ要領で。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">".loading"</span>).movieReverse(); <span class="hljs-comment">// 逆再生</span>
$(<span class="hljs-string">".loading"</span>).movieStop(); <span class="hljs-comment">// アニメーションをストップ</span>
$(<span class="hljs-string">".loading"</span>).movieRewind(); <span class="hljs-comment">// 最初のコマに巻き戻す</span>
</code></span></pre>


<h2 class="wp-block-heading">動きをカスタマイズする</h2>



<p>動きをカスタマイズするには、moviePlay/movieReverseメソッドにオプションを渡します。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">".loading"</span>).moviePlay({
    <span class="hljs-attr">fps</span> : <span class="hljs-number">20</span>, <span class="hljs-comment">// fps（1秒毎のフレーム数）</span>
    <span class="hljs-attr">frames</span> : <span class="hljs-number">20</span>, <span class="hljs-comment">// 合計フレーム数</span>
    <span class="hljs-attr">repeat</span> : <span class="hljs-literal">true</span>, <span class="hljs-comment">// リピート再生をするか否か</span>
    <span class="hljs-attr">direction</span> : <span class="hljs-string">"vertical"</span> <span class="hljs-comment">// アニメーションの方向</span>
});
</code></span></pre>


<h2 class="wp-block-heading">完了時のコールバックを設定する</h2>



<p>アニメーション完了時のコールバックを、moviePlay/movieReverseの第二引数で設定できます。 このコールバックは、アニメーションが「完了」しないと呼ばれません。 つまり、オプションのrepeatをfalseに設定し、最後のコマまで進んだ時初めて呼ばれます。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">".loading"</span>).moviePlay({
    <span class="hljs-attr">repeat</span> : <span class="hljs-literal">false</span>
}, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"アニメーションが完了しました"</span>);
});
</code></span></pre>


<h2 class="wp-block-heading">MovieCropクラス</h2>



<p>MovieCropクラスのインスタンスを生成して使う事もできます。 この場合は、第一引数にはjQueryオブジェクトではなく、HTMLElementを渡して下さい。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> ele, mc;
ele = $(<span class="hljs-string">".loading"</span>)&#91;<span class="hljs-number">0</span>];
mc = <span class="hljs-keyword">new</span> MovieCrop( ele, {
    <span class="hljs-attr">fps</span> : <span class="hljs-number">20</span>,
    <span class="hljs-attr">frames</span> : <span class="hljs-number">20</span>
});
mc.play();
</code></span></pre>


<p>MovieCropクラスは次のメソッドを持ちます。</p>



<ul class="wp-block-list">
<li>play(callback) : 再生する</li>



<li>reverse(callback) : 逆再生する</li>



<li>stop() : 止める</li>



<li>rewind() : 最初のコマに戻る</li>



<li>nextFrame() : 次のコマに進む</li>



<li>prevFrame() : 前のコマに戻す</li>



<li>setFrame(frame) : 指定されたコマに移動する</li>
</ul>



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



<ul class="wp-block-list">
<li><a href="http://jsfiddle.net/mach3ss/LSH79/embedded/result/">MovieCrop.js DEMO via jsfiddle</a></li>
</ul>



<p><iframe style="width: 100%; height: 300px" src="http://jsfiddle.net/mach3ss/LSH79/embedded/" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p>



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



<p>冒頭で申し上げた通り、この手のソリューションは他にも優秀な選択肢があります。 特にもうじき発表されるAdobeFlashCS6は、FlashIDEで制作したアニメーションからCSSスプライトシートを書き出す事ができ、そこからそのままアニメーションさせる事が出来るスグレモノです。 スプライトアニメーションは素材の画像を作るのが恐らく一番面倒なので、こうしたアプリケーションは大変助かりますね。</p>



<p>ならばこのライブラリをいつ使うのかと言うと…。シンプルさ故にライブラリ間の競合の不安が少し減る程度の存在意義は…あるかな。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>条件分岐に特化したリソースローダー「yepnope.js」を試してみる</title>
		<link>https://blog.mach3.jp/2011/04/21/yepnope-js.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Thu, 21 Apr 2011 01:10:35 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[head.js]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[Loader]]></category>
		<category><![CDATA[yepnope.js]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1773</guid>

					<description><![CDATA[最近ブログ記事のソースコードで見かけるようになった「yepnope.js」を試してみました。 条件分岐によって読むリソースを切り分ける事に特化したライブラリです。 yepnope.jsとは yepnope.js &#124; A  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>最近ブログ記事のソースコードで見かけるようになった「yepnope.js」を試してみました。<br />
条件分岐によって読むリソースを切り分ける事に特化したライブラリです。</p>



<figure class="wp-block-image"><img decoding="async" src="https://lh5.googleusercontent.com/_JJkNs5Ixl70/Ta8a3xZKMfI/AAAAAAAABRc/0wOEy_xcmO0/201104210240.png" alt="条件分岐に特化したリソースローダー「yepnope.js」を試してみる"/></figure>



<p></p>



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



<h2 class="wp-block-heading">yepnope.jsとは</h2>



<p><a href="http://yepnopejs.com/">yepnope.js | A Conditional Loader For Your Polyfills!</a></p>



<figure class="wp-block-image"><img decoding="async" src="https://lh3.googleusercontent.com/_JJkNs5Ixl70/Ta8a8Txez6I/AAAAAAAABRg/KgUOlep2XoQ/201104210238.png" alt="yapnope.js"/></figure>



<p></p>



<p>手書き風のロゴがかわいい。</p>



<p><em>yep</em>はyes、<em>nope</em>はnoの口語体で、固く言えば「yesno.js」。<br />
与えた条件がtrueの場合とfalseの場合で読むJS/CSSを切り替えるのが得意な<br />
リソースローダーです。</p>



<h2 class="wp-block-heading">最も簡単なサンプル</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript">yepnope(<span class="hljs-string">"hoge.js"</span>);
yepnope(<span class="hljs-string">"style.css"</span>);
</code></span></pre>


<p>単一ファイルをロードするだけの簡単なサンプルです。<br />
内部的には、ドキュメント内で一番最初のScript要素を探して、<br />
その前にinsertBeforeしているみたい。</p>



<p>ちなみに、スクリプトローダーではなく<em>「リソースローダー」</em>なので<br />
JavaScriptだけではなくCSSもロード出来ます。</p>



<h2 class="wp-block-heading">複数ファイルを読んでみる</h2>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">yepnope</span>({
    <span class="hljs-attribute">load </span>: &#91; <span class="hljs-string">"hoge.js"</span>, <span class="hljs-string">"fuga.js"</span> ]
});
</code></span></pre>


<dl>
<dt>load</dt>
<dd>後述するtestの結果に関わらず、とにかく読み込む。</dd>
</dl>



<h2 class="wp-block-heading">条件分岐で読むJSを分ける</h2>


<pre class="wp-block-code"><span><code class="hljs language-css"><span class="hljs-selector-tag">yepnope</span>({
    <span class="hljs-attribute">test </span>: (<span class="hljs-string">'localStorage'</span> in window) &amp;&amp; window&#91;<span class="hljs-string">'localStorage'</span>] !== null,
    yep : &#91; <span class="hljs-string">"hoge.js"</span>, <span class="hljs-string">"fuga.js"</span> ], <span class="hljs-comment">/* testの結果がtrueの場合こっちを読む */</span>
    nope : &#91; <span class="hljs-string">"foo.js"</span>, <span class="hljs-string">"bar.js"</span> ] <span class="hljs-comment">/* testの結果がfalseの場合こっちを読む */</span>
});
</code></span></pre>


<dl>
<dt>test</dt>
<dd>基準となる条件文等</dd>
<dt>yep</dt>
<dd>testがtrueの時に読み込むファイル。単一ファイルの場合は文字列でも可。</dd>
<dt>nope</dt>
<dd>testがfalseの時に読み込むファイル。単一ファイルの場合は文字列でも可。</dd>
</dl>



<p>上の例は、localStorageが使用可能である場合は<em>yep</em>に設定したhoge.js,fuga.jsがロードされ、<br />
そうでない場合は<em>nope</em>に設定したfoo.js,bar.jsがロードされます。</p>



<h2 class="wp-block-heading">コールバックを設定する</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript">yepnope({
    <span class="hljs-attr">test</span> : (<span class="hljs-string">'localStorage'</span> <span class="hljs-keyword">in</span> <span class="hljs-built_in">window</span>) &amp;&amp; <span class="hljs-built_in">window</span>&#91;<span class="hljs-string">'localStorage'</span>] !== <span class="hljs-literal">null</span>,
    <span class="hljs-attr">yep</span> : &#91; <span class="hljs-string">"hoge.js"</span>, <span class="hljs-string">"fuga.js"</span> ],
    <span class="hljs-attr">nope</span> : &#91; <span class="hljs-string">"foo.js"</span>, <span class="hljs-string">"bar.js"</span> ]
    <span class="hljs-attr">callback</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"> url, result, key </span>)</span>{
        <span class="hljs-built_in">console</span>.log( url ); <span class="hljs-comment">/* ロードされたリソースのURL */</span>
        <span class="hljs-built_in">console</span>.log( result ); <span class="hljs-comment">/* testの結果（true|false） */</span>
        <span class="hljs-built_in">console</span>.log( key ); <span class="hljs-comment">/* yep|nope におけるインデックス（またはキー） */</span>
    },
    <span class="hljs-attr">complete</span> : <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        <span class="hljs-built_in">console</span>.log( <span class="hljs-string">"全部読み込み終わりました！"</span> );
    }
});
</code></span></pre>


<p>ロード完了時の処理を<em>callback/complete</em>で設定出来ます。<br />
ファイルのロードは非同期に行われる為、<br />
読むリソースを元に何かを処理したい場合はこれらのコールバックを使用します。</p>



<dl>
<dt>callback</dt>
<dd>リソースが読み込まれる度に呼ばれる。</dd>
<dt>complete</dt>
<dd>全リソースがロードし終えた時に一度だけ呼ばれる。</dd>
</dl>



<h2 class="wp-block-heading">「無ければ読めばいいじゃない」を実装する</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> Init = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-keyword">if</span>( !<span class="hljs-built_in">window</span>.MyClass ){ <span class="hljs-keyword">return</span>; }
    <span class="hljs-keyword">new</span> MyClass();
};

yepnope({
    <span class="hljs-attr">test</span> : <span class="hljs-built_in">window</span>.MyClass,
    <span class="hljs-attr">nope</span> : <span class="hljs-string">"myclass.js"</span>,
    <span class="hljs-attr">complete</span> : Init
});
</code></span></pre>


<p><strong>myclass.js</strong></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">var</span> MyClass = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
    <span class="hljs-built_in">console</span>.log( <span class="hljs-string">"Hello, MyClass"</span> );
};
</code></span></pre>


<p>MyClassが無い場合はjsファイルをロードしてから、<br />
既にある場合はスルーして<em>complete</em>が呼ばれるのでそのまま初期化。</p>



<p>コールバックで再度条件分岐をしているのは、myclass.jsが読み込めたかどうかの保証が無い為。<br />
myclass.jsが404でも、タイムアウト後に<em>complete</em>は呼ばれてしまいます。</p>



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



<p>以前、<a href="/2011/03/headjs.html">ローダーもくっついている器用な「head.js」</a>を記事にしましたが、<br />
やはり特化したローダーともなると、さすがに色々と気が効いています。<br />
基本的にJavaScriptファイルはパックしてしまう事が多いのですが、<br />
新要素のフォールバック等にはかなり活用出来るかもしれませんね！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>2010年に出会った愛すべきリソース達*11</title>
		<link>https://blog.mach3.jp/2010/12/29/lovely-resources-2010.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Wed, 29 Dec 2010 08:46:00 +0000</pubDate>
				<category><![CDATA[WebClip]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Resources]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Yahoo]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=1284</guid>

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



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



<p></p>



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



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



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



<p></p>



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



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



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



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



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



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



<p></p>



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



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



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



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



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



<p></p>



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



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



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



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



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



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



<p></p>



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



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



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



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



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



<p></p>



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



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



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



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



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



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



<p></p>



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



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



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



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



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



<p></p>



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



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



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



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



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



<p></p>



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



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



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



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



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



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



<p></p>



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



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



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



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



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



<p></p>



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



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



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



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



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



<p></p>



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



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



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



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



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



<p>皆様よいお年を！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>@anywhereで認証してみる備忘録</title>
		<link>https://blog.mach3.jp/2010/09/14/auth-anywhere.html</link>
		
		<dc:creator><![CDATA[mach3]]></dc:creator>
		<pubDate>Tue, 14 Sep 2010 14:35:46 +0000</pubDate>
				<category><![CDATA[Laboratory]]></category>
		<category><![CDATA[Anywhere]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Library]]></category>
		<category><![CDATA[Service]]></category>
		<category><![CDATA[Twitter]]></category>
		<guid isPermaLink="false">http://blog.mach3.jp/?p=682</guid>

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



<p>@anywhereはTwitter公式から提供されている、<br />
どのサイトでもTwitterの機能が使えるようになる便利なライブラリです。<br />
cf) <a href="/2010/04/twitter-anywhere.html">ブログで@anywhereを試してみた！ ～ どこでもTwitter</a></p>



<p>今回はこの@anywhereでユーザー認証をしてみましょう。<br />
※アプリケーションの登録等は割愛致します。<br />
※jQueryを使用しています。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh3.ggpht.com/_JJkNs5Ixl70/TI-FvKGTMFI/AAAAAAAABB4/DWq3p5mDXQM/201009142322.png" alt="@anywhereで認証してみる備忘録"/></figure>



<p></p>



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



<ul class="wp-block-list">
<li><a href="#auth-basic">@anywhereの基本</a></li>



<li><a href="#auth-func">認証に必要な機能</a></li>



<li><a href="#auth-demo">デモ</a></li>



<li><a href="#auth-source">コード抜粋</a></li>



<li><a href="#auth-mendokusee">めんどくせーな、と思ったら</a></li>



<li><a href="#auth-fin">まとめ</a></li>
</ul>



<h2 class="wp-block-heading" id="auth-basic">@anywhereの基本</h2>



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



<p>公式で登録したアプリケーションのAPIkeyを付加したURLで、ライブラリをロードします。</p>


<pre class="wp-block-code"><span><code class="hljs language-xml"><span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"text/javascript"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"http://platform.twitter.com/anywhere.js?id=&lt;ここにAPIkeyを記述&gt;&amp;v=1"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
</code></span></pre>


<h3 class="wp-block-heading">twttr.anywhere</h3>



<p>@anywhereはtwttr.anywhereというメソッドが全ての基本です。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">twttr.anywhere(<span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">tw</span>)</span>{
    <span class="hljs-comment">// ここでtwを使ってなんやかんやする</span>
});
</code></span></pre>


<p>twttr.anywhereに渡したfunctionは、<br />
anywhereを使用する準備が整った時にコールされます。<br />
ここでfunctionに渡されているtwに様々な便利な機能が備えられているので、<br />
それらを使ってなんやかんやするわけですね。</p>



<h2 class="wp-block-heading" id="auth-func">認証に必要な機能</h2>



<p>cf) <a href="http://dev.twitter.com/anywhere/begin">@anywhere公式ドキュメント（英語）</a></p>



<h3 class="wp-block-heading">tw.isConnected()</h3>



<p>ユーザー認証が済んでいるかどうかをbool値で返すメソッド。<br />
認証済みかそうでないかで処理を切り分けたい時に使います。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-keyword">if</span>( tw.isConnected() ){
    <span class="hljs-comment">// 認証済みの場合の処理</span>
} <span class="hljs-keyword">else</span> {
    <span class="hljs-comment">// 未認証の場合の処理</span>
}
</code></span></pre>


<h3 class="wp-block-heading">tw.signIn()</h3>



<p>Twitterにサインインする為のメソッドです。<br />
これをコールすると、別ウィンドウでTwitterに接続するページが開き、<br />
そのページでログインして戻ってくると認証が完了する仕組みです。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">"#Signin"</span>).live(<span class="hljs-string">"click"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    tw.signin();
});
</code></span></pre>


<h3 class="wp-block-heading">twttr.anywhere.signOut()</h3>



<p>Twitterからサインアウトする為のメソッドです。<br />
※signIn()とは親が異なる点に注意。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">$(<span class="hljs-string">"#Signout"</span>).live(<span class="hljs-string">"click"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    twttr.anywhere.signOut();
});
</code></span></pre>


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



<p>認証が完了すると、twの&#8221;authComplete&#8221;イベントがトリガーされます。<br />
認証完了時に処理を行いたい時にbindして使います。<br />
「おや？bindってjQueryじゃねーの？」とか思われるかもしれませんが、<br />
実際anywhere自体がjQueryを使用して書かれているみたいです。</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">tw.bind(<span class="hljs-string">"authComplete"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
    alert(<span class="hljs-string">"認証完了！"</span>);
});
</code></span></pre>


<h3 class="wp-block-heading">tw.currentUser.data()</h3>



<p>tw.currentUserには現在接続中のユーザーの情報が格納されています。<br />
ユーザーの情報を引き出すには、data()メソッドを用います。<br />
console.log()してみると分かりますが、プロパティアクセスでも取得出来ます。<br />
※公式ドキュメントでは言及されていないので、念のためdata()を経由した方がよいかもしれません</p>


<pre class="wp-block-code"><span><code class="hljs language-javascript"><span class="hljs-comment">// data()で取得</span>
alert( tw.currentUser.data(<span class="hljs-string">"screen_name"</span>) + <span class="hljs-string">"でログイン中です"</span> );
<span class="hljs-comment">// プロパティアクセスで取得</span>
alert( tw.currentUser.screenName + <span class="hljs-string">"でログイン中です"</span> );
</code></span></pre>


<p>取得できるユーザー情報のリストは、APIドキュメントを参照<br />
…するよりもconsole.log()してプロパティ見たほうが多分はやい。</p>



<h2 class="wp-block-heading" id="auth-demo">デモ</h2>



<p class="caution">
    デモページは閉鎖致しました。
</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh6.ggpht.com/_JJkNs5Ixl70/TI-FvAiWf1I/AAAAAAAABB8/sLQRotrSt6Y/201009142300.png" alt="Demo"/></figure>



<p></p>



<ul class="wp-block-list">
<li>「Signin」ボタンをクリックすると認証用のページが開きます</li>



<li>認証が完了すると表示が切り替わってユーザー情報が表示されます</li>



<li>テンプレートに<a href="http://github.com/mach3/js-jquery-render">jquery.render.js</a>を使ってみました<br /><br />cf) <a href="/2010/09/jquery-render-js.html">シンプルなjQueryテンプレートプラグインを書いてみる</a></li>
</ul>



<h2 class="wp-block-heading" id="auth-source">コード抜粋</h2>


<pre class="wp-block-code"><span><code class="hljs language-javascript">twttr.anywhere( <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">tw</span>)</span>{
    <span class="hljs-keyword">var</span> refresh = <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params"></span>)</span>{
        $(<span class="hljs-string">"#LoginStatus"</span>).html(<span class="hljs-string">""</span>);
        <span class="hljs-keyword">if</span>( !tw.isConnected() ){
            $(<span class="hljs-string">"#template-loginstatus-normal"</span>)
            .render()
            .appendTo(<span class="hljs-string">"#LoginStatus"</span>);
        }<span class="hljs-keyword">else</span>{
            <span class="hljs-keyword">var</span> cu = tw.currentUser;
            $(<span class="hljs-string">"#template-loginstatus-connected"</span>)
            .render({
                <span class="hljs-string">"screen_name"</span>: cu.data(<span class="hljs-string">"screen_name"</span>),
                <span class="hljs-string">"profile_image_url"</span>: cu.data(<span class="hljs-string">"profile_image_url"</span>),
                <span class="hljs-string">"name"</span>: cu.data(<span class="hljs-string">"name"</span>),
                <span class="hljs-string">"description"</span> : cu.data(<span class="hljs-string">"description"</span>),
                <span class="hljs-string">"location"</span>: cu.data(<span class="hljs-string">"location"</span>),
                <span class="hljs-string">"followers_count"</span> : cu.data(<span class="hljs-string">"followers_count"</span>),
                <span class="hljs-string">"friends_count"</span> : cu.data(<span class="hljs-string">"friends_count"</span>),
                <span class="hljs-string">"listed_count"</span> : cu.data(<span class="hljs-string">"listed_count"</span>)
            })
            .appendTo(<span class="hljs-string">"#LoginStatus"</span>);
        }
    };
    $(<span class="hljs-string">"#LoginStatus .signin"</span>).live( <span class="hljs-string">"click"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        tw.signIn();
        <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
    });
    $(<span class="hljs-string">"#LoginStatus .signout"</span>).live( <span class="hljs-string">"click"</span>, <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">e</span>)</span>{
        twttr.anywhere.signOut();
        refresh();
        <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>;
    });
    tw.bind(<span class="hljs-string">"authComplete"</span>, refresh);
    refresh();
});
</code></span></pre>


<h2 class="wp-block-heading" id="auth-mendokusee">めんどくせーな、と思ったら</h2>



<p>簡単に認証ボタンが実装できる、connectButton()というメソッドが提供されています。<br />
特にカスタマイズする必要がなかったり、面倒な時はこれを使っちゃえばいいですね。</p>



<figure class="wp-block-image"><img decoding="async" src="http://lh3.ggpht.com/_JJkNs5Ixl70/TI-Fvaa6q-I/AAAAAAAABCA/RUpaFNyoEXs/201009142305.png" alt="connectButton()"/></figure>



<p></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">twttr.anywhere( <span class="hljs-function"><span class="hljs-keyword">function</span>(<span class="hljs-params">tw</span>)</span>{
    tw(<span class="hljs-string">"#MyConnectButton"</span>).connectButton();
});
</code></span></pre>


<p>サインアウトボタンにトグルしてくれたりはしないので、<br />
欲しい場合は自分で実装する必要があります。</p>



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



<p>フロントエンドだけで済んでしまうようなWebアプリケーションならば、<br />
お手軽に使えて良いですね。<br />
Webベースのクライアントなんかを作りたい時にも良いかもしれません。<br />
さ、次はPHPのOAuthだ。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
