<?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>case K:</title>
	<atom:link href="http://case-k.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://case-k.com</link>
	<description>My backpack is always FULL.</description>
	<lastBuildDate>Fri, 21 Aug 2015 04:28:58 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.8.1</generator>
	<item>
		<title>AngularJSを使ってみた</title>
		<link>http://case-k.com/blog/2015/08/21/angularjs%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/</link>
		<comments>http://case-k.com/blog/2015/08/21/angularjs%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/#respond</comments>
		<pubDate>Fri, 21 Aug 2015 04:28:58 +0000</pubDate>
		<dc:creator><![CDATA[keisuke]]></dc:creator>
				<category><![CDATA[IT系個人事業「オフィスORA」]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[フレームワーク]]></category>

		<guid isPermaLink="false">http://case-k.com/?p=77</guid>
		<description><![CDATA[クライアントサイドのJavaScriptフレームワークとしては、個人的にExtJS4を採用してた。 ... <a href="http://case-k.com/blog/2015/08/21/angularjs%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/">Read more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>クライアントサイドのJavaScriptフレームワークとしては、個人的に<a href="https://www.sencha.com/products/extjs/#overview" target="_blank">ExtJS4</a>を採用してた。<br />
大げさ過ぎる感はあるのだけど、その設計のストイックな感じや、複雑さに触れることに「快感」をおぼえたりなんかしてた。</p>
<p>しかし、ちょっと前にsencha社のオープンソース（GPLv3）としての扱いがイマイチになったりしたもんで、「もうそろそろExtJSから離れるか」となってた。</p>
<p>その後、クライアントサイドで大掛かりなアプリ設計をする機会がなく、<a href="https://jquery.com/" target="_blank">jQuery</a>でお茶を濁してたりしてたのだけど、そろそろExtJS4の「自分なりの後釜」を決めて使えるようにしとかなきゃってことで、<a href="https://angularjs.org/" target="_blank">AngularJS</a>に手を出してみたので、使った感じをまとめておく。</p>
<h2>MVW（Model-View-Whatever）パターン</h2>
<p>Model-View-*なパターンはいろいろあって、ご多分にもれず「どれがいい？どれが悪い？」みたいな不毛で無駄な話をよく聞くけど、AngularJSは「MV*？、*はなんでもいいじゃん」パターンで、そういう無駄な論議をしないところが、なかなかイカしてる（ExtJSはMVCだし、MVVMだ）。</p>
<p>とはいえ、基本的に「Whatever＝Controller」だ。</p>
<p>ViewはもちろんHTMLで記述されるDOMのセットだし、そこにはAngularJS独自にPresentation LogicとしてFilterやDirectiveがある。</p>
<p>Modelは、$scopeで参照されるすべての「データ」だし、Business Logicを含むServiceが定義されてる。</p>
<p>で、もちろんControllerはViewとModelを繋ぐもの。</p>
<h2>$watch()、、、強力だ</h2>
<p>「データバインディング」や「DI（依存性注入）」がAngularJSを語る上で重要ポイントだけど、それを差し置いて$watch()が気に入った。</p>
<p>$watch()はデータバインディングを支える仕組みで、オブジェクトやプロパティの変化を文字通りwatchできる。</p>
<p>「要素Aにバインドされている値が変化したので、要素Bを非表示から表示状態にするぜ」</p>
<p>なんてことが簡単にできる、イベントリスナーってわけだ。</p>
<h2>Serviceでビジネスロジック</h2>
<p>どんなフレームワークでもModelの概念の中にビジネスロジックを含めたい。</p>
<p>AngularJSでは、それはService定義という形で実装できる。</p>
<p>これをちゃんと使わないと、アホほどControllerが太っていくし、Unitテストもできないし、AngularJSを使う意味がなくなる。</p>
<h2>i18n/l10nの仕組みはナカッタ</h2>
<p>どうも理解困難だったのはこのポイント。</p>
<p>「<a href="https://docs.angularjs.org/guide/i18n" target="_blank">Developer Guide &#8211; i18n and l10n</a>」を読んでみると、わりと手数を要求してくる。</p>
<p>つまりは、そういう仕組みは「自分でやる」のが前提みたい（？いや、多分、AngularJSプロジェクトがまだこの部分が洗練されるような状況になっていないような気がする）。</p>
<p>というわけで、将来どうなるかが分からないし、変なpluginを使ってそのルールにしばられたくないので、自分で実装した。l10n部分だけだけど。。。w</p>
<ul>
<li>どうせサーバーサイドでもl10nするので、そこでクライアントサイド用のリソースデータを作る</li>
<li>作ったリソースデータは、ページロード時にng-appなモジュールに「value」として渡す（もちJSON形式）</li>
<li>以下の様なServiceを作る</li>
<li>各ControllerでこのServiceの依存性注入して、_()メソッドでリソースをロードさせViewに渡すなどする</li>
</ul>
<p>[js]<br />
webapp.factory(&quot;translate&quot;, function(l10n) {<br />
    return {<br />
        _: function(key) {<br />
            return eval(&quot;l10n[&#8216;&quot;+key+&quot;&#8217;]&quot;);<br />
        }<br />
    };<br />
});<br />
[/js]</p>
<p>&#8220;l10n&#8221;は、サーバーサイドで作られたリソースデータでvalueとしてng-appに渡されたもの。<br />
Controllerでは、</p>
<p>[js]<br />
webapp.controller(&#8216;SomethingCtrl&#8217;, [&#8216;$scope&#8217;,&#8217;translate&#8217;, function($scope,Upload,appconfig,$timeout,translate) {<br />
    $scope.hoge = translate._(&#8216;gegege&#8217;);<br />
}]);<br />
[/js]</p>
<p>ってな具合に使う。<br />
i18nでlocaleについてもインプリメントしようと思ってるが、現時点では未着手。</p>
<h2>ファイルアップロード</h2>
<p>どうもAngularJSのダメなところがこういうところに現れている気がする。<br />
まだ進化中なんだな。。と思うことで許せる範疇ではあるけどw</p>
<p>フォームを作って、その入力データをサーバーにPOST送信する時に、$httpという標準に用意されているAjax非同期通信するためのServiceを使ってもtype=&#8221;file&#8221;なinputで指定されたファイルが送信されない。。。</p>
<p>なんだか酷いな～。。。と思いつつ、$httpがデフォルトでつけるContent-Typeヘッダが問題だとわかった。</p>
<p>いろいろ見てたら「<a href="https://github.com/danialfarid/ng-file-upload" target="_blank">ng-file-upload</a>ってpluginがいいぞ」ってことなんで、これを使ってファイルアップロードを実装した。</p>
<h2>というわけで。。。</h2>
<p>一通りAngularJSを使ってみたわけだが、ExtJSなんかに比べてシンプルでなかなかよかった。<br />
「なんだよー」ってなる部分もあるわけだけど、まあ、そのうちなんとかなるんじゃないかと思う（<a href="https://angular.io/" target="_blank">AngularJS2</a>も進んでるみたいだし！）</p>
<p>今後は、AngularJSとjQueryの両刀使いでやっていこうと思う。<br />
それぞれの特徴を活かせるように、適材適所で。</p>
<p>あと、調査してて感じたこと。<br />
AngularJSについてだけじゃないけど、、、ネット上で情報を探すときはクソな「ノウハウのみ（しかもバッドノウハウだったりするし！）」な記事に惑わされないようにすることをオススメしとく。<br />
AngularJSみたいに過渡期なソフトウェアについては特にいえることかと。<br />
基本的にはオフィシャルサイトや、信頼できる書籍なんかで「考え方」を掴むのが最初でノウハウはその後でっていうスタンスを崩しちゃいけない。。。って、再確認した。</p>
]]></content:encoded>
			<wfw:commentRss>http://case-k.com/blog/2015/08/21/angularjs%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%a6%e3%81%bf%e3%81%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>オフィスORAのオフィシャルサイトを公開</title>
		<link>http://case-k.com/blog/2015/08/11/%e3%82%aa%e3%83%95%e3%82%a3%e3%82%b9ora%e3%81%ae%e3%82%aa%e3%83%95%e3%82%a3%e3%82%b7%e3%83%a3%e3%83%ab%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92%e5%85%ac%e9%96%8b/</link>
		<comments>http://case-k.com/blog/2015/08/11/%e3%82%aa%e3%83%95%e3%82%a3%e3%82%b9ora%e3%81%ae%e3%82%aa%e3%83%95%e3%82%a3%e3%82%b7%e3%83%a3%e3%83%ab%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92%e5%85%ac%e9%96%8b/#respond</comments>
		<pubDate>Mon, 10 Aug 2015 21:48:53 +0000</pubDate>
		<dc:creator><![CDATA[keisuke]]></dc:creator>
				<category><![CDATA[IT系個人事業「オフィスORA」]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[FuelPHP]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[PR]]></category>
		<category><![CDATA[サイト構築]]></category>

		<guid isPermaLink="false">http://case-k.com/?p=73</guid>
		<description><![CDATA[東京に戻ってきて、個人事業としてやっているオフィスORAをこれまで以上にしていきたいと思っている。 ... <a href="http://case-k.com/blog/2015/08/11/%e3%82%aa%e3%83%95%e3%82%a3%e3%82%b9ora%e3%81%ae%e3%82%aa%e3%83%95%e3%82%a3%e3%82%b7%e3%83%a3%e3%83%ab%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92%e5%85%ac%e9%96%8b/">Read more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>東京に戻ってきて、個人事業としてやっているオフィスORAをこれまで以上にしていきたいと思っている。</p>
<p>いろんな人に会ったり、いろんな場所にオフィスORAとして行くことを想定して、できるだけ「なにをやっているか」を明確に提示できるようにしたいと思っているので、PRにも力を入れていこうってことでオフィシャルサイトを作ってみた。</p>
<p><a href="http://www.office-ora.com"><img class=" size-medium wp-image-74 alignnone" src="http://case-k.com/wp-content/uploads/2015/08/Screenshot-from-2015-08-11-064149-300x225.png" alt="Screenshot from 2015-08-11 06:41:49" width="300" height="225" srcset="http://case-k.com/wp-content/uploads/2015/08/Screenshot-from-2015-08-11-064149-300x225.png 300w, http://case-k.com/wp-content/uploads/2015/08/Screenshot-from-2015-08-11-064149.png 600w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>
<p><a href="http://www.office-ora.com" target="_blank">オフィスORA</a></p>
<p>サイトとしては、わかりやすく1ページサイトにしたくて、<a href="https://wrapbootstrap.com/" target="_blank">wrapbootstrap.com</a>からお気に入りの1ページサイトのテンプレートを1000円くらいで購入して摘要（jQuery+Twitter Bootstrapペースの様々なデザインテンプレートがあるので、使うWebアプリフレームワークに合わせてこれに手をいれて使うといい感じになる）。</p>
<p>拡張性・メンテナンス性を考慮して、フレームワークはFuelPHPで。</p>
<p>プロフィールのページには、自分の顔写真も使ってみた。。。w<br />
まあ、顔が見えるというのは重要だと思うので。</p>
<p>個人事業で、プロジェクト構築とかPMOとかっていうのがどこまでニーズがあるかわからないのだけど、開発やプロマネやコンサルに加えて、中小企業のIT活用においても、大企業とわたりあえるだけのITチームやスキームをもつことの重要性をどんどんアピールして、わかっていただける顧客には誠心誠意お手伝いしたいと考えている。</p>
]]></content:encoded>
			<wfw:commentRss>http://case-k.com/blog/2015/08/11/%e3%82%aa%e3%83%95%e3%82%a3%e3%82%b9ora%e3%81%ae%e3%82%aa%e3%83%95%e3%82%a3%e3%82%b7%e3%83%a3%e3%83%ab%e3%82%b5%e3%82%a4%e3%83%88%e3%82%92%e5%85%ac%e9%96%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazon EC2 Container Service（ECS）を管理コンソールからつついてみる</title>
		<link>http://case-k.com/blog/2015/08/05/amazon-ec2-container-service%ef%bc%88ecs%ef%bc%89%e3%82%92%e7%ae%a1%e7%90%86%e3%82%b3%e3%83%b3%e3%82%bd%e3%83%bc%e3%83%ab%e3%81%8b%e3%82%89%e3%81%a4%e3%81%a4%e3%81%84%e3%81%a6%e3%81%bf%e3%82%8b/</link>
		<comments>http://case-k.com/blog/2015/08/05/amazon-ec2-container-service%ef%bc%88ecs%ef%bc%89%e3%82%92%e7%ae%a1%e7%90%86%e3%82%b3%e3%83%b3%e3%82%bd%e3%83%bc%e3%83%ab%e3%81%8b%e3%82%89%e3%81%a4%e3%81%a4%e3%81%84%e3%81%a6%e3%81%bf%e3%82%8b/#respond</comments>
		<pubDate>Wed, 05 Aug 2015 06:05:07 +0000</pubDate>
		<dc:creator><![CDATA[keisuke]]></dc:creator>
				<category><![CDATA[IT系個人事業「オフィスORA」]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[ECS]]></category>
		<category><![CDATA[コンテナ]]></category>

		<guid isPermaLink="false">http://case-k.com/?p=60</guid>
		<description><![CDATA[2015年4月にAmazon EC2 Container Service（ECS）が東京リージョンで... <a href="http://case-k.com/blog/2015/08/05/amazon-ec2-container-service%ef%bc%88ecs%ef%bc%89%e3%82%92%e7%ae%a1%e7%90%86%e3%82%b3%e3%83%b3%e3%82%bd%e3%83%bc%e3%83%ab%e3%81%8b%e3%82%89%e3%81%a4%e3%81%a4%e3%81%84%e3%81%a6%e3%81%bf%e3%82%8b/">Read more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>2015年4月にAmazon EC2 Container Service（ECS）が東京リージョンでも使えるようになったと聞いていた。</p>
<p>「そのうちAWSでDockerをうまく使えるようになっとかなくちゃ」</p>
<p>とずっと思ってたが（Beanstalkがdockerをサポートする前からw）、ずっと頭の中でペンディングしてる。。。というのが現状。<br />
いわゆる、こっち方面では「初心者レベル」。<br />
Dockerは使ってて、オフィスORA用redmineやgitlabなんかをEC2インスタンス上で稼働してたりするし、Dockerfileも自分のアプリ用にわりと書いてはいるけど。。。</p>
<p>そんな中、「オフィスORAのDevOpsな取り組み」が少しずつ進んでついに「IaaSやPaaSの現状チェックしなきゃ。。。あ、、、ってかまずDocker周辺を。。。あ、、、ってかAWSでのDockerの件&#8230;」となってて「ECSが東京リージョンでも。。。」の件を思い出して、いきなりつついてみたというわけだ。。</p>
<p>「よくわからず、いきなり触る」というアンチパターンを実践。<br />
（「遠回りしてこそわかることもある」と、悔し涙をながしつつわざとこういうアプローチを取る傾向は個人的な趣向デス）</p>
<p>案の定、動かすところまでいったものの、「ただ動いただけ」でよく把握できなかった。。。</p>
<p>問題の1つは「言葉の定義」が曖昧でなにしてるのかよくわからないこと。<br />
そこで、動いたECSを放置して、まずは「言葉の定義」をチェック。。。</p>
<p>「<a href="http://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html" target="_blank">What is Amazon EC2 Container Service?</a>」</p>
<p>AWSのECSドキュメントを開いた途端、いくつかの「言葉の定義」が記述されてた（やっぱり先にこれに目を通すべきだった）。</p>
<p style="padding-left: 30px;">【<strong>クラスタ</strong>】<br />
タスクを追加できるコンテナインスタンスの論理的グループ<br />
【<strong>コンテナインスタンス</strong>】<br />
クラスタの中に登録され、Amazon ECS Agentが走るEC2インスタンス<br />
【<strong>タスク定義</strong>】<br />
1つ以上のコンテナを含むアプリケーションの定義<br />
【<strong>スケジューラー</strong>】<br />
コンテナインスタンスにタスクを配置する為の手段（Serviceとして常にタスクが走るように監視するタイプと、ただTaskとして1度走らせるだけのタイプがあるっぽい）<br />
【<strong>タスク</strong>】<br />
コンテナインスタンス上で走るタスク定義のインスタンス<br />
【<strong>コンテナ</strong>】<br />
タスクの一部として作られるLinuxコンテナ</p>
<p>というわけで、なるほど納得。<br />
Dockerだしコンテナはわかるよ。。って思ってたが、ECSが扱うのはあくまでLinuxコンテナ（Dockerのベース）だし、複数コンテナを含む枠としてタスクがあり、それをタスク定義で記述できて、コンテナインスタンスと呼ばれるEC2インスタンス内でECS Agentがタスク群をスケジューラーに沿って走らせるぞ。。。と、そういうわけですな。</p>
<p>管理コンソールで、なにもわからずゴソゴソした時点では、タスクとコンテナの違いがイマイチわからなかったし（なんでコンテナをタスクと呼ぶの？って感じでマチガッテタ）、スケジューラーがなんなんだか分からなかった。。けど、これで納得。</p>
<p>というわけで、AWSのECSドキュメントに目を通してから、クラスメソッドさんの</p>
<ul>
<li><a href="http://dev.classmethod.jp/cloud/ecs-ga-ataglance/" target="_blank">GA&amp;東京に来たAmazon EC2 Container Service(ECS)を触ってみた #AWSSummit</a></li>
<li><a href="http://dev.classmethod.jp/cloud/aws/switch-docker-container-using-ecs/" target="_blank">Amazon EC2 Container Serviceで構築されたシステムでDockerコンテナを入れ替える</a></li>
</ul>
<p>この辺を読みながら触ってみると、私みたいに「迷える駄馬」にならないで済むとおもわれる。</p>
<p>ちなみに「AWSでDocker」という意味で整理すると。。。。</p>
<ul>
<li>ECSで</li>
<li>Elastic Beanstalkで</li>
<li>EC2インスタンスで独自に</li>
</ul>
<p>の3パターンがあるわけで、Beanstalkも含めてこれで全部触ってみたわけだけど、まだ「CoreOSなEC2インスタンスを作って独自にやる」のがピンとくる感じ。</p>
<p>もう少し、いろいろ情報を整理しつつ、いじったりもしながら考察していこうと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://case-k.com/blog/2015/08/05/amazon-ec2-container-service%ef%bc%88ecs%ef%bc%89%e3%82%92%e7%ae%a1%e7%90%86%e3%82%b3%e3%83%b3%e3%82%bd%e3%83%bc%e3%83%ab%e3%81%8b%e3%82%89%e3%81%a4%e3%81%a4%e3%81%84%e3%81%a6%e3%81%bf%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FuelPHPでFacebook SDK for PHP v5を使う</title>
		<link>http://case-k.com/blog/2015/08/04/fuelphp%e3%81%a7facebook-sdk-for-php-v5%e3%82%92%e4%bd%bf%e3%81%86/</link>
		<comments>http://case-k.com/blog/2015/08/04/fuelphp%e3%81%a7facebook-sdk-for-php-v5%e3%82%92%e4%bd%bf%e3%81%86/#respond</comments>
		<pubDate>Tue, 04 Aug 2015 07:35:30 +0000</pubDate>
		<dc:creator><![CDATA[keisuke]]></dc:creator>
				<category><![CDATA[IT系個人事業「オフィスORA」]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[FuelPHP]]></category>
		<category><![CDATA[OAuth]]></category>
		<category><![CDATA[SDK]]></category>

		<guid isPermaLink="false">http://case-k.com/?p=50</guid>
		<description><![CDATA[FuelPHP（ver.1.7）を使ってちょっとしたモノを作っている。 ログインの仕組みにTwitt... <a href="http://case-k.com/blog/2015/08/04/fuelphp%e3%81%a7facebook-sdk-for-php-v5%e3%82%92%e4%bd%bf%e3%81%86/">Read more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>FuelPHP（ver.1.7）を使ってちょっとしたモノを作っている。<br />
ログインの仕組みにTwitterとFacebookのOAuthを使いたくて、インプリメント。</p>
<p>Twitterでは<a href="https://github.com/abraham/twitteroauth" target="_blank">abraham/twitteroauth</a>を使ってて、安定の「楽で確実なインプリメント」を実施。</p>
<p>FBでは、公式の<a href="https://developers.facebook.com/docs/reference/php/5.0.0" target="_blank">SDK for PHPを使うわけだけど、いつの間にかv5.0.0</a>になっていた。<br />
v3からv4の時も、かなり仕様が変わっててリファクタリングを余儀なくされたので、v5でも。。。と思っていたら案の定であった。<br />
まあ、それでも「使わせてもらう側」としては文句をいわずに対応。</p>
<p>まずはcomposer.jsonに以下を追加して、composer.phar update。</p>
<p>[code]<br />
&quot;facebook/php-sdk-v4&quot; : &quot;~5.0&quot;<br />
[/code]</p>
<p>こんなコントローラを作成</p>
<p>[php]<br />
use Facebook\Facebook;<br />
class Controller_Auth_Fb extends Controller<br />
{<br />
    public function action_request()<br />
    {<br />
        $fb = new Facebook([<br />
            &#8216;app_id&#8217; =&gt; Config::get(&#8216;app.sns.facebook.app_id&#8217;),<br />
            &#8216;app_secret&#8217; =&gt; Config::get(&#8216;app.sns.facebook.app_secret&#8217;),<br />
            &#8216;default_graph_version&#8217; =&gt; &#8216;v2.4&#8217;,<br />
            &#8216;persistent_data_handler&#8217; =&gt; new MyFbPersistentDataHandler(),<br />
        ]);<br />
        $helper = $fb-&gt;getRedirectLoginHelper();<br />
        $url = $helper-&gt;getLoginUrl(Config::get(&#8216;base_url&#8217;).&#8217;auth/fb/&#8217;);<br />
        Response::redirect($url);<br />
    }</p>
<p>    public function action_index()<br />
    {<br />
        $fb = new Facebook([<br />
            &#8216;app_id&#8217; =&gt; Config::get(&#8216;app.sns.facebook.app_id&#8217;),<br />
            &#8216;app_secret&#8217; =&gt; Config::get(&#8216;app.sns.facebook.app_secret&#8217;),<br />
            &#8216;default_graph_version&#8217; =&gt; &#8216;v2.4&#8217;,<br />
            &#8216;persistent_data_handler&#8217; =&gt; new MyFbPersistentDataHandler(),<br />
        ]);<br />
        $helper = $fb-&gt;getRedirectLoginHelper();<br />
        try {<br />
            $accessToken = $helper-&gt;getAccessToken();<br />
            if(!isset($accessToken)) {<br />
                throw new Exception();<br />
            }<br />
            Log::debug(print_r($accessToken,true));</p>
<p>            $client = $fb-&gt;getOAuth2Client();<br />
            if(!$accessToken-&gt;isLongLived()) {<br />
                $accessToken = $client-&gt;getLongLivedAccessToken($accessToken);<br />
            }<br />
            Log::error(print_r($accessToken,true));</p>
<p>            $response = $fb-&gt;get(&#8216;/me&#8217;,$accessToken);<br />
            $data = $response-&gt;getGraphObject()-&gt;asArray();<br />
            $data[&#8216;token&#8217;] = (string)$accessToken;<br />
            Log::error(print_r($data,true));</p>
<p>        } catch(Exception $e) {<br />
            Log::error($e-&gt;getMessage());<br />
            Session::set_flash(&#8216;msg&#8217;, &quot;danger:Faild to login with facebook&#8230;&quot;);<br />
        }</p>
<p>        Response::redirect(Uri::base(false));<br />
    }<br />
}<br />
[/php]</p>
<p>action_request()でログイン用URLを生成し、そこにredirect（ページ上のログインリンクはauth/fb/request/を張っとく。事前にログインURL取得してページにそれを晒してもいいのだけどこちらを選択）。</p>
<p>action_index()は、FBからのコールバック受け取り用メソッド。<br />
action_request()でのgetLoginUrl()呼び出し時に指定してる。</p>
<p>問題は、action_request()/action_index()どちらでも生成しているFacebookオブジェクト。<br />
ここでconfigデータで&#8217;persistent_data_handler&#8217;としてMyFbPersistentDataHandlerオブジェクトを渡している。</p>
<p>これ、デフォルト（configで指定しなければ）ではPHPのsessionが使われる（session_start()とかのアレね）。<br />
でも、<a href="http://fuelphp.jp/docs/1.7/classes/session/usage.html" target="_blank">FuelPHPのセッションクラス</a>では、PHPのsessionを偽装してインプリメントされている。<br />
よって、Facebookオブジェクトをデフォルトで生成し使おうとすると、「Sessions are not active. Please make sure session_start() is at the top of your script.」なんて例外が投げられる。<br />
v3とかv4では、session_startしてるかどうかはチェックされてなかったので、FuelPHPの偽装でも動いてた。<br />
v5では、チェックするようになったみたい。</p>
<p>こんな例外が投げられたからといって、session_start()してもダメ。<br />
FuelPHPのセッションクラスと整合性が保てない。</p>
<p>そこで、自身でPersistentDataHandlerを用意してあげなくてはいけない。</p>
<p>[php]<br />
use Facebook\PersistentData\PersistentDataInterface;</p>
<p>class MyFbPersistentDataHandler implements PersistentDataInterface<br />
{<br />
    public function __construct() {<br />
        Session::instance();<br />
    }</p>
<p>    public function get($key) {<br />
        return Session::get($key);<br />
    }</p>
<p>    public function set($key, $value) {<br />
        Session::set($key,$value);<br />
    }<br />
}<br />
[/php]</p>
<p>こんな具合にPersistentDataInterfaceをインプリメントしてあげる。<br />
これをPersistent Data Handlerとして使うことで、FuelPHPでもSDK for PHP v5を使えるようになる。<br />
ちゃんと、Long Lived Tokenもゲットできる。</p>
]]></content:encoded>
			<wfw:commentRss>http://case-k.com/blog/2015/08/04/fuelphp%e3%81%a7facebook-sdk-for-php-v5%e3%82%92%e4%bd%bf%e3%81%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>composer利用時にGitHub APIでアクセス制限にひっかかる</title>
		<link>http://case-k.com/blog/2015/07/15/composer%e5%88%a9%e7%94%a8%e6%99%82%e3%81%abgithub-api%e3%81%a7%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e5%88%b6%e9%99%90%e3%81%ab%e3%81%b2%e3%81%a3%e3%81%8b%e3%81%8b%e3%82%8b/</link>
		<comments>http://case-k.com/blog/2015/07/15/composer%e5%88%a9%e7%94%a8%e6%99%82%e3%81%abgithub-api%e3%81%a7%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e5%88%b6%e9%99%90%e3%81%ab%e3%81%b2%e3%81%a3%e3%81%8b%e3%81%8b%e3%82%8b/#respond</comments>
		<pubDate>Wed, 15 Jul 2015 06:39:57 +0000</pubDate>
		<dc:creator><![CDATA[keisuke]]></dc:creator>
				<category><![CDATA[IT系個人事業「オフィスORA」]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[composer]]></category>
		<category><![CDATA[FuelPHP]]></category>
		<category><![CDATA[github]]></category>

		<guid isPermaLink="false">http://case-k.com/?p=37</guid>
		<description><![CDATA[とあるツールを作ろうと思って、FuelPHPをインストール。。。と思ったら、 Could not f... <a href="http://case-k.com/blog/2015/07/15/composer%e5%88%a9%e7%94%a8%e6%99%82%e3%81%abgithub-api%e3%81%a7%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e5%88%b6%e9%99%90%e3%81%ab%e3%81%b2%e3%81%a3%e3%81%8b%e3%81%8b%e3%82%8b/">Read more &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>とあるツールを作ろうと思って、FuelPHPをインストール。。。と思ったら、</p>
<blockquote><p>Could not fetch https://api.github.com/repos/fuel/docs, please create a GitHub OAuth token to go over the API rate limit<br />
Head to https://github.com/settings/tokens/new?scopes=repo&amp;description=Composer+on+gege+2015-07-15+1342<br />
to retrieve a token. It will be stored in &#8220;/home/vagrant/.composer/auth.json&#8221; for future use by Composer.<br />
Token (hidden):</p></blockquote>
<p>なーんて言われた。<br />
これまで見たことなかったけど、「GitHub OAuthトークンのアクセス制限ひっかかったぜ」と。。。</p>
<p>1日に60回のアクセスが制限らしいんだけど、そんなにアクセスしてないんだけどなぁ。。。まあ、composerが中でどうやってるのか知らないので、なんともいえないけど。</p>
<p>とはいえ、ここは場当たり的対応じゃくて、CIやCDする時のことも考えて、プロビジョニング時に./composer/auth.jsonつくれるようにしておかなくてはいけないなと。。。</p>
<ul>
<li>まずは、GitHubでtokenゲット</li>
<li>auth.jsonの元ファイルになるファイルを作成し、tokenを書いとく</li>
</ul>
<p>ってした。</p>
<p>ただ、いちいちauth.jsonを用意するのなんとなくキモチワルイので。。。しらべていると</p>
<p>「composerに事前に教える」というアプローチもあるなっ！となりまして、、</p>
<p>[text]<br />
$ php composer.phar config -g github-oauth.github.com [your token]<br />
[/text]</p>
<p>ってするのもアリとわかった。</p>
<p>CIやCDでプロビジョニングする際に、なにをどうするかは自由なんだけど、tokenが記述されている元ファイルだけは用意して置かないとダメ。<br />
でも、このファイルをリポジトリで管理するわけにもいかない（みんなに見えちゃう！）ので、このファイルの扱いはもう少し工夫しないといけない感じ。</p>
]]></content:encoded>
			<wfw:commentRss>http://case-k.com/blog/2015/07/15/composer%e5%88%a9%e7%94%a8%e6%99%82%e3%81%abgithub-api%e3%81%a7%e3%82%a2%e3%82%af%e3%82%bb%e3%82%b9%e5%88%b6%e9%99%90%e3%81%ab%e3%81%b2%e3%81%a3%e3%81%8b%e3%81%8b%e3%82%8b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
