<?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>Fusic Developers&#039; Weblog</title>
	<atom:link href="http://blog.fusic.co.jp/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.fusic.co.jp</link>
	<description>(株)Fusicのエンジニアが書く技術blogです。</description>
	<lastBuildDate>Tue, 01 May 2012 01:05:32 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>オレオレ framework の作り方</title>
		<link>http://blog.fusic.co.jp/archives/2317</link>
		<comments>http://blog.fusic.co.jp/archives/2317#comments</comments>
		<pubDate>Sun, 29 Apr 2012 01:31:24 +0000</pubDate>
		<dc:creator>t-kawano</dc:creator>
				<category><![CDATA[objective-c]]></category>

		<guid isPermaLink="false">http://blog.fusic.co.jp/?p=2317</guid>
		<description><![CDATA[Fusic 河野です。 GW 始まりましたね。みなさん、楽しんでますか？ 来る５月１９日（土）に Future Sync vol.2 というイベントをします。 これは、プログラマー・デザイナー・クリエイター・企画・マーケ [...]]]></description>
			<content:encoded><![CDATA[<p>Fusic 河野です。</p>
<p>GW 始まりましたね。みなさん、楽しんでますか？<br />
来る５月１９日（土）に <a href="http://futuresync.jp/" title="future sync" target="_blank">Future Sync vol.2</a> というイベントをします。<br />
これは、プログラマー・デザイナー・クリエイター・企画・マーケティング・学生など、<br />
様々な人たちが IT の未来を同期するために開催される、トークイベントです。<br />
詳細は、<a href="http://futuresync.jp/" title="future sync vol.2" target="_blank">ココ</a>とか<a href="http://sora2hs.blog70.fc2.com/blog-entry-541.html" title="Future Sync vol.2 を開催いたします！" target="_blank">ココ</a>にも書いてますので、ご興味を持たれた方が居られましたら<br />
ぜひご参加をお願い致します！<br />
（学生さんのみなさん、無料ですよ～）</p>
<p>さて、本題。<br />
今回は iphone での framework の作り方についてです。<br />
iphone アプリをいくつか作成していると色々と独自のライブラリなどが<br />
溜まってくるかと思います。<br />
それらのオレオレライブラリを framework としてまとめ、今後の開発にも<br />
直ぐに活用できるようにしておけば、きっと楽になるのではないでしょうか。<br />
それでは早速いきましょー！！<br />
（今回は実際のコードではなく、画像が多いです。ご容赦を！）</p>
<h3>準備</h3>
<p>　今回は kstenerud さんの <a href="https://github.com/kstenerud/iOS-Universal-Framework" target="_blank">iOS-Universal-Framework</a> というツールを使用します。<br />
　便利です。オススメです！<br />
　リンク先の README を見てたら大体の事は分かると思います。</p>
<p>　git clone で落としてきてインストールの作業を行います。</p>

<div class="wp_syntax"><div class="code"><pre class="objective-c" style="font-family:monospace;">$ git clone git://github.com/kstenerud/iOS-Universal-Framework.git
$ cd iOS-Universal-Framework/Real Framework
$ ./install.sh</pre></div></div>

<p>　因みにアンインストールする場合には、同ディレクトリにある uninstall.sh を叩きます。</p>
<h3>フレームワーク側の作成</h3>
<p>　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework01.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework01-300x203.png" alt="" title="framework01" width="300" height="203" class="alignnone size-medium wp-image-2318" /></a><br />
　&#8221;準備&#8221;を行った後、xcode を開くと新しく &#8220;Static iOS Framework&#8221;という<br />
　テンプレートが追加されてますので、それを選んで新規にプロジェクトを作成します。</p>
<p>　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework02.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework02-300x204.png" alt="" title="framework02" width="300" height="204" class="alignnone size-medium wp-image-2319" /></a><br />
　今回は &#8220;HelloWorldFramework&#8221; という名前で作成しました。<br />
　ARC などのオプションはお好みで設定してください。<br />
　（サンプルでは ARC をオンにしてます）</p>
<p>　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework03.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework03-300x203.png" alt="" title="framework03" width="300" height="203" class="alignnone size-medium wp-image-2320" /></a><br />
　プロジェクト内に &#8220;HelloWorld&#8221; というクラスを作成します。</p>
<p>　それぞれのファイルには以下のコードを書いておきます。<br />
　UIAlertView で &#8220;hello, world!&#8221; と表示する簡単なものです。</p>
<p>HelloWorld.h</p>

<div class="wp_syntax"><div class="code"><pre class="objective-c" style="font-family:monospace;">#import &lt;Foundation/Foundation.h&gt;
&nbsp;
@interface HelloWorld : NSObject
&nbsp;
- (void)sayHelloWorld;
&nbsp;
@end</pre></div></div>

<p>HelloWorld.m</p>

<div class="wp_syntax"><div class="code"><pre class="objective-c" style="font-family:monospace;">#import &quot;HelloWorld.h&quot;
&nbsp;
#import &lt;UIKit/UIKit.h&gt;
&nbsp;
@implementation HelloWorld
&nbsp;
- (void)sayHelloWorld
{
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@&quot;alert!&quot;
                                                        message:@&quot;hello, world!&quot; 
                                                       delegate:nil 
                                              cancelButtonTitle:@&quot;OK&quot; 
                                              otherButtonTitles:nil];
    [alertView show];    
}
&nbsp;
@end</pre></div></div>

<p>　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework04.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework04-300x203.png" alt="" title="framework04" width="300" height="203" class="alignnone size-medium wp-image-2321" /></a><br />
　ビルドが成功すると &#8220;Product&#8221; のところに &#8220;HelloWorldFramework.framework&#8221; が<br />
　作成されてます。<br />
　そして、その &#8220;HelloWorldFramework.framework&#8221; を選択し、右クリックして、<br />
　Finder で表示します。</p>
<p>　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework05.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework05-300x168.png" alt="" title="framework05" width="300" height="168" class="alignnone size-medium wp-image-2322" /></a><br />
　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework06.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/framework06-300x277.png" alt="" title="framework06" width="300" height="277" class="alignnone size-medium wp-image-2323" /></a><br />
　Finder で表示したところです。<br />
　ここにある &#8220;HelloWorldFramework.framework&#8221; というディレクトリが<br />
　今回使うフレームワークです。<br />
　これをどこかわかりディレクトリにコピーしておきます。</p>
<p>　お疲れ様でした！<br />
　これで、一旦はオレオレフレームワークの作成が終わりました。<br />
　ツールのおかげでほんとに楽ですよね！！</p>
<h3>アプリケーション側での利用</h3>
<p>　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application01.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application01-300x187.png" alt="" title="application01" width="300" height="187" class="alignnone size-medium wp-image-2324" /></a><br />
　アプリにて、先程の &#8220;HelloWorldFramework.framework&#8221; を<br />
　組み込んでいきます。<br />
　適当に新規プロジェクトでアプリを作成します。<br />
　&#8221;UseFramework&#8221; としています。</p>
<p>　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application02.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application02-300x175.png" alt="" title="application02" width="300" height="175" class="alignnone size-medium wp-image-2325" /></a><br />
　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application03.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application03-300x175.png" alt="" title="application03" width="300" height="175" class="alignnone size-medium wp-image-2326" /></a><br />
　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application04.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application04-300x175.png" alt="" title="application04" width="300" height="175" class="alignnone size-medium wp-image-2327" /></a><br />
　新規作成したアプリに作成したフレームワークを追加します。<br />
　解りやすいところにコピーした &#8220;HelloWorldFramework.framework&#8221; を<br />
　選択して追加します。</p>
<p>　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application05.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application05-300x175.png" alt="" title="application05" width="300" height="175" class="alignnone size-medium wp-image-2328" /></a><br />
　アプリにボタンを追加して、関数を追加してボタンが押下されると<br />
　関数が呼ばれるようにします。<br />
　今回、say というメソッドを作成し呼び出すようにしました。</p>

<div class="wp_syntax"><div class="code"><pre class="objective-c" style="font-family:monospace;">#import &quot;HelloWorldFramework/HelloWorld.h&quot;
&nbsp;
...(中略）
&nbsp;
- (IBAction)say:(id)sender
{
    HelloWorld *hello = [[HelloWorld alloc] init];
    [hello sayHelloWorld];
}</pre></div></div>

<p>　注意点として、フレームワーク内のヘッダを呼び出す場合は、<br />
　#import &#8220;HelloWorldFramework/HelloWorld.h&#8221;　のように<br />
　&#8221;フレームワーク名／呼び出したいヘッダ&#8221;<br />
　のように記載します。</p>
<p>　<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application06.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/application06-149x300.png" alt="" title="application06" width="149" height="300" class="alignnone size-medium wp-image-2329" /></a><br />
　プロジェクトを実行し、ボタンを押下すると無事に<br />
　&#8221;hello, world!&#8221; が表示されました！！</p>
<h3>おわりに</h3>
<p>　ツールのおかげでほんとに楽だったと思います。<br />
　実際に自分で１から作ろうとするとユニバーサル化含め<br />
　メンドクサイ事がいっぱいなのですが、ほんとに楽です。<br />
　これで気軽にフレームワークが作成できますね！</p>
<p>　ぜひ、みなさんの開発ライフにご活用ください！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusic.co.jp/archives/2317/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>インフラ勉強会＠福岡でWakameについて話してきました</title>
		<link>http://blog.fusic.co.jp/archives/2308</link>
		<comments>http://blog.fusic.co.jp/archives/2308#comments</comments>
		<pubDate>Sat, 28 Apr 2012 06:33:01 +0000</pubDate>
		<dc:creator>puddings</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[FukInfra]]></category>
		<category><![CDATA[Wakame]]></category>

		<guid isPermaLink="false">http://blog.fusic.co.jp/?p=2308</guid>
		<description><![CDATA[Fusic 平田です。 インフラ勉強会＠福岡に参加してきました。 で、行くなら喋ろうってことでWakameのお話。 ※ Ustの録画をしそこねておりました。大変申し訳ありません。。。 補足情報は、以下のような感じです。  [...]]]></description>
			<content:encoded><![CDATA[<p>Fusic 平田です。<br />
インフラ勉強会＠福岡に参加してきました。<br />
で、行くなら喋ろうってことでWakameのお話。</p>
<div id=zpd_Aez3L style='width:425px'><object id='zpo_Aez3L' width='425' height='360'><param name='movie' value='http://zenpre.net/swf/ja/zenpreEmbed.swf' /><param name='flashvars' value='pid=Aez3L&#038;socketServer=182.48.35.212&#038;presentId=1312&#038;nowSlideIndex=59&#038;channelId=225526' /><param name='bgcolor' value='#FFFFFF' /><param name='quality' value='high' /><param name='allowFullScreen' value='true'/><param name='allowScriptAccess' value='always' /><embed name='zpe_Aez3L' src='http://zenpre.net/swf/ja/zenpreEmbed.swf' type='application/x-shockwave-flash' quality='high' allowScriptAccess='always' allowfullscreen='true' pluginspage='http://www.adobe.com/go/getflashplayer' bgcolor='#FFFFFF' width='425' height='360' flashvars='pid=Aez3L&#038;socketServer=182.48.35.212&#038;presentId=1312&#038;nowSlideIndex=59&#038;channelId=225526'></embed></object></div>
<p>※ Ustの録画をしそこねておりました。大変申し訳ありません。。。<br />
補足情報は、以下のような感じです。<br />
・OpenFlow対応が追加されている<br />
# 参考: <a href="http://www.slideshare.net/yasuhiro_yamazaki/openflow-in-iaas-wakame">www.slideshare.net/yasuhiro_yamazaki/openflow-in-iaas-wakame</a><br />
・対応ハイパーバイザにESXiとOpenVZが追加された<br />
・Gentooへのインストールスクリプトが追加された</p>
<p>Wakameいいよーいいよーってのをもっとわかりやすく説明するために、いろいろ実験中です。<br />
これについてはまた別途エントリ書くようにします。</p>
<p>他の方の発表は以下の通り。</p>
<p>Spring_MTさん: MySQL Casual Talks Vol.3の話、など<br />
# 参考: <a href="http://spring-mt.tumblr.com/post/21638089137/mysql-casual-talks-vol-3-lt" class="autohyperlink" title="http://spring-mt.tumblr.com/post/21638089137/mysql-casual-talks-vol-3-lt" target="_blank">spring-mt.tumblr.com/post/21638089137/mysql-casual-talks-vol-3-lt</a><br />
参加しましたって話と、それに絡んでMySQLやRailsの話。<br />
いろいろ勉強会やりたい！と画策してらっしゃるようで、楽しみにしております。</p>
<p>take_3さん: <del datetime="2012-04-28T05:54:57+00:00">東京こわい</del>いろいろ勉強会に参加した話などなど<br />
特に場が騒然としたのが、<a href="http://atnd.org/events/25823">x86/x64最適化勉強会</a>の話。<br />
最近のCPUだと、慣例どおりのコード書いてたら分岐予測でコスト浪費するんだよってなにそれ<del datetime="2012-04-28T05:54:57+00:00">こわい</del>すごいってな雰囲気でした。<br />
あとは、「などなど」とまとめましたが多方面にわたるいろいろなお話。</p>
<p>あとはバックアップの話とか冗長化の話とか、あれこれいろいろ話してそのまま懇親会に移動。<br />
技術の話やらそうでもない話やらで大いに盛り上がりました。Excelは言語だよね、とか。<br />
次回もぜひ参加させていただきたいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusic.co.jp/archives/2308/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iptablesを利用してVPN接続を共有(?)してみる話</title>
		<link>http://blog.fusic.co.jp/archives/2287</link>
		<comments>http://blog.fusic.co.jp/archives/2287#comments</comments>
		<pubDate>Sat, 14 Apr 2012 07:33:10 +0000</pubDate>
		<dc:creator>puddings</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[iptables]]></category>

		<guid isPermaLink="false">http://blog.fusic.co.jp/?p=2287</guid>
		<description><![CDATA[Fusic 平田です。 前提 VPN越しでサーバに接続することがままあるのですが。 接続先VPNルータの設定の問題で、Windows7での接続がどうにも失敗するという事態に。 VPNルータの設定を変えたいものの、設置先が [...]]]></description>
			<content:encoded><![CDATA[<p>Fusic 平田です。</p>
<h3>前提</h3>
<p>VPN越しでサーバに接続することがままあるのですが。<br />
接続先VPNルータの設定の問題で、Windows7での接続がどうにも失敗するという事態に。<br />
VPNルータの設定を変えたいものの、設置先が遠方なのですぐには対応できず。</p>
<p>で、Linux(確認したのはUbuntu)だったら接続できるようなので、このLinuxのVPN接続を<del datetime="2012-04-14T06:38:50+00:00">間借り</del>共有すればいいんじゃないかなという話に。<br />
図で書くと↓のような想定ビフォーアフター。<br />
<a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/before.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/before-300x191.png" alt="" title="before" width="300" height="191" class="alignleft size-medium wp-image-2291" /></a><a href="http://blog.fusic.co.jp/wp-content/uploads/2012/04/after.png"><img src="http://blog.fusic.co.jp/wp-content/uploads/2012/04/after-300x190.png" alt="" title="after" width="300" height="190" class="alignright size-medium wp-image-2292" /></a><br />
<br clear="all"><br />
というわけで、iptablesを使ってさくっとやってみます。</p>
<h3>ネットワーク情報</h3>
<p>Linux(VPN接続済)<br />
eth0: 192.168.11.100<br />
ppp0: 192.168.100.200<br />
※LinuxでのVPN接続方法については、今回は割愛。<br />
サーバ<br />
eth0: 192.168.100.100<br />
クライアント(Windows7)<br />
eth0: 192.168.11.101</p>
<h3>いろいろ設定</h3>
<p>まずはLinuxの設定をいくつか。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">$ cat /etc/sysctl.conf | grep net\.ipv4\.ip_forward
net.ipv4.ip_forward=1</pre></div></div>

<p>net.ipv4.ip_forward=1にすることで、IPv4転送が有効になります。<br />
書き換えた後は</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">$ sudo sysctl -p
net.ipv4.ip_forward = 1</pre></div></div>

<p>として設定を反映。</p>
<p>あとはiptablesでIPマスカレードを設定。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">$ sudo iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -j MASQUERADE</pre></div></div>

<p>これでLinux側は準備完了。</p>
<p>Windows7側にはルーティングを追加。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">C:\Windows\System32&gt;route add 192.168.100.0 mask 255.255.255.0 192.168.11.100
OK!</pre></div></div>

<p>※ルーティングを永続的にしたい場合は、-pを加えると再起動後も有効になります。</p>
<p>で、Windows7側からpingで確認してみると</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">C:\Windows\System32&gt;ping 192.168.100.100
&nbsp;
192.168.100.100 に ping を送信しています 32 バイトのデータ:
192.168.100.100 からの応答: バイト数 =32 時間 =34ms TTL=62
192.168.100.100 からの応答: バイト数 =32 時間 =34ms TTL=62
192.168.100.100 からの応答: バイト数 =32 時間 =36ms TTL=62
192.168.100.100 からの応答: バイト数 =32 時間 =38ms TTL=62
&nbsp;
192.168.100.100 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 34ms、最大 = 38ms、平均 = 35ms</pre></div></div>

<p>無事見えるようになりました。:-)</p>
<p>内容としては単なるIPマスカレードの話なのですが、こんな使い方もあるよってことで。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusic.co.jp/archives/2287/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rails3.2でdeviseのインストール手順を間違えたら面倒だった話</title>
		<link>http://blog.fusic.co.jp/archives/2269</link>
		<comments>http://blog.fusic.co.jp/archives/2269#comments</comments>
		<pubDate>Wed, 22 Feb 2012 10:33:37 +0000</pubDate>
		<dc:creator>yamamoto</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://blog.fusic.co.jp/?p=2269</guid>
		<description><![CDATA[この前Rails3.1がリリースされたと思ったら、もうRails3.2です。 バージョンが上がると、重宝して使っていたgemやプラグインが対応に追いつくのかが不安なんですが、その内のひとつ「devise」に関してのちょっ [...]]]></description>
			<content:encoded><![CDATA[<p>この前Rails3.1がリリースされたと思ったら、もうRails3.2です。<br />
バージョンが上がると、重宝して使っていたgemやプラグインが対応に追いつくのかが不安なんですが、その内のひとつ「devise」に関してのちょっとしたエントリーです。</p>
<p>deviseとは</p>
<p><a href="https://github.com/plataformatec/devise" class="autohyperlink" title="https://github.com/plataformatec/devise" target="_blank">github.com/plataformatec/devise</a></p>
<p>deviseはシステムのログイン管理を担ってくれるRubyのパッケージです。<br />
ログイン認証が必要なシステムに対して、ユーザー登録・パスワードの暗号化・パスワードリセットなどの処理を担ってくれるので便利です。</p>
<p>そのdeviseを使用したプロジェクトを作ります。<br />
Railsは3.2です。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">rails new sample</pre></div></div>

<p>で、プロジェクト作成。データベースも作成しておきます。</p>
<p>Gemfileに、deviseに関する行を追加。</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">gem <span style="color:#996600;">'devise'</span></pre></div></div>

<p>その後、本来は</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">rails generate devise:install</pre></div></div>

<p>とすべきところを、</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">rails generate devise user</pre></div></div>

<p>と、いきなりモデルの作成をしました。<br />
すると、</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">/home/user/.rvm/gems/ruby-1.9.2-p180@rails32/gems/execjs-1.3.0/lib/execjs/runtimes.rb:50:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)</pre></div></div>

<p>本編とは関係ないエラーが出てしまいました。<br />
JavaScriptのランタイムが無いと。<br />
Gemfileから</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># gem 'therubyracer'</span></pre></div></div>

<p>のコメントアウトを外します。</p>
<p>で、再度</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">rails generate devise user</pre></div></div>

<p>を実行。<br />
すると、必要なファイルが作成されます。<br />
そして、アプリを起動すると。。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">/home/user/.rvm/gems/ruby-1.9.2-p180@rails32/gems/devise-2.0.1/lib/devise/rails/routes.rb:406:in `raise_no_devise_method_error!':User does not respond to 'devise' method. This usually means you haven't loaded your ORM file or it's being loaded too late. To fix it, be sure to require 'devise/orm/YOUR_ORM' inside 'config/initializers/devise.rb' or before your application definition in 'config/application.rb' (RuntimeError)</pre></div></div>

<p>何か怒られました。<br />
ここで、「ああ、『rails generate devise:install』をしてなかった。。」と、インストールコマンドを実行。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">rails generate devise:install</pre></div></div>

<p>すると、</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">/home/yama/.rvm/gems/ruby-1.9.2-p180@rails32/gems/devise-2.0.1/lib/devise/rails/routes.rb:406:in `raise_no_devise_method_error!': User does not respond to 'devise' method. This usually means you haven't loaded your ORM file or it's being loaded too late. To fix it, be sure to require 'devise/orm/YOUR_ORM' inside 'config/initializers/devise.rb' or before your application definition in 'config/application.rb' (RuntimeError)</pre></div></div>

<p>同じエラーです。どつぼにはまりかけです。</p>
<p>エラーをよく読むと、<br />
config/initializers/devise.rb　か、<br />
config/application.rb　に、<br />
require &#8216;devise/orm/YOUR_ORM&#8217;　を書いてね、と言われているようです。<br />
どのO/Rマッパーを使うのかがわからないと起動できないみたいですね。<br />
なので、<br />
config/application.rb　に</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">require 'devise/orm/active_record'</pre></div></div>

<p>を記述後、インストールコマンドを実行。<br />
無事、必要なファイルが生成され、deviseを使えるようになりました。</p>
<p>何事も順序どおりに、端折っちゃだめよというお話でした。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusic.co.jp/archives/2269/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RAID5がiowait出まくりで遅いので、stripe_cache_sizeを増やした話</title>
		<link>http://blog.fusic.co.jp/archives/2258</link>
		<comments>http://blog.fusic.co.jp/archives/2258#comments</comments>
		<pubDate>Thu, 12 Jan 2012 09:18:00 +0000</pubDate>
		<dc:creator>puddings</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[raid]]></category>

		<guid isPermaLink="false">http://blog.fusic.co.jp/?p=2258</guid>
		<description><![CDATA[あけましておめでとうございます。 Fusic 平田です。 新年気分とは何の関係もない、RAIDのお話です。 年末にXenサーバのディスクがお亡くなりになったので、ディスク換装してCentOS6.2でKVMサーバを再構築。 [...]]]></description>
			<content:encoded><![CDATA[<p>あけましておめでとうございます。<br />
Fusic 平田です。<br />
新年気分とは何の関係もない、RAIDのお話です。</p>
<p>年末にXenサーバのディスクがお亡くなりになったので、ディスク換装してCentOS6.2でKVMサーバを再構築。<br />
で、ディスク4本なのでどうしようかなーと思いつつRAID5を組んではみたのですが、iowaitが収まらない。<br />
特に書き込みのほうが苦戦しているようで、仮想サーバがちょっと頑張るたびにロードアベレージが10越えたり。<br />
これじゃ使い物にならんなあ最悪RAID10で組み直したほうがいいかなあ。。。とか悩んでいる時に以下の記事を発見。<br />
<a href="https://peterkieser.com/2009/11/29/raid-mdraid-stripe_cache_size-vs-write-transfer/">peterkieser.com/2009/11/29/raid-mdraid-stripe_cache_size-vs-write-transfer/</a><br />
※ 記事中のスクリプトまでは試していません。<br />
書き込みで苦しんでいるならstripe_cache_size増やすと捗るよ！ってことでやってみました。</p>
<p>サーバスペック：<br />
Xeon X3230 (4コア) メモリ8GB HDD1TB*4(RAID5, software raid)</p>
<p>対象のRAIDアレイ（今回はmd3）に対して</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;"># echo 8192 &gt; /sys/block/md3/md/stripe_cache_size</pre></div></div>

<p>と実行して値を書き換えます。<br />
resyncがかかってしばらくしたら完了したので、あとはtopでだらだら流して様子見。<br />
仮想サーバ側で何度か負荷の高い処理をしてみてもロードアベレージがさほど上がらなくなったので、とりあえずはよし。</p>
<p>あとはOS再起動しても動くように、ruleを追加。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;"># cat &lt;&lt;EOS &gt; /etc/udev/rules.d/80-md-stripe-cache.rules
SUBSYSTEM==&quot;block&quot;, KERNEL==&quot;md*&quot;, ACTION==&quot;change&quot;, TEST==&quot;md/stripe_cache_size&quot;, ATTR{md/stripe_cache_size}=&quot;8192&quot;
EOS</pre></div></div>

<p>今のところ、これで快適に動作しています。<br />
問題が起きないか、最大限の関心を持って注視を続けることが当面の隠れ業務です。</p>
<p>・・・ていうか、そもそもRAID5使わないとかsoftware raid使わないとか別の方策あった気もします。</p>
<p>追記：<br />
8192でも微妙につっかえる場面が見受けられたので、結局32768（最大）まで増やしています。<br />
ページサイズ(=4KB)×stripe_cache_size×ディスク数分のメモリ使うので、あんまし増やしすぎるのも嫌だなーと思ったんですが。<br />
メモリで困る前にCPU数で困りそうな気がしたのと、メモリは最悪増設できるしなーってことで、とりあえずはこのままで。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusic.co.jp/archives/2258/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ディレクトリ内のファイル容量を調べる方法(CUI)</title>
		<link>http://blog.fusic.co.jp/archives/2245</link>
		<comments>http://blog.fusic.co.jp/archives/2245#comments</comments>
		<pubDate>Mon, 26 Dec 2011 13:37:06 +0000</pubDate>
		<dc:creator>kitagishi</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.fusic.co.jp/?p=2245</guid>
		<description><![CDATA[Fusic 北岸です。 もう今年も終わりますね。 休みの日に近所でバドミントンをしているのですが、 昨日で今年最後の分が終わってしまいました。 打ち損じでカツーンなんて音をさせてばかりではありますが、来年も楽しく頑張りま [...]]]></description>
			<content:encoded><![CDATA[<p>Fusic 北岸です。</p>
<p>もう今年も終わりますね。<br />
休みの日に近所でバドミントンをしているのですが、<br />
昨日で今年最後の分が終わってしまいました。<br />
打ち損じでカツーンなんて音をさせてばかりではありますが、来年も楽しく頑張ります！</p>
<p>さてさて、今回のテーマは<strong> 「CUIでファイルサイズの合計を調べる」 </strong>です。<br />
すごく基本的な内容ではありますが、以前ちょっと気になって調べたのでまとめておきます。</p>
<h2> ファイルサイズを調べるコマンド </h2>
<p>皆さんは、ファイルサイズを調べる時に、どのようなコマンドを使用されていますか？<br />
私がすぐに思いつくのは、次のコマンドです。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;"> $ ls -l</pre></div></div>

<p>そして、ディレクトリの容量を調べるなら、このコマンドですね。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;"> $ du</pre></div></div>

<p>しかし、この du というコマンド、きちんとファイルサイズを測れません。</p>
<p>この du は、ブロックサイズを単位としてサイズを計測しています。</p>
<p>今回用意したシステムは<strong> ブロックサイズが4096バイト(=4.0KB) </strong> なので、<br />
例えば次のような結果が得られます。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">sky@ub1110x64:~/contrail$ ls -l ./substance/
合計 12
-rw-rw-r-- 1 sky sky 4097 2011-12-26 07:22 ice_grain
-rw-rw-r-- 1 sky sky 4096 2011-12-26 07:22 moisture</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">sky@ub1110x64:~/contrail$ du -ah ./substance/
4.0K	./substance/moisture
8.0K	./substance/ice_grain
16K	./substance/</pre></div></div>

<p>たった１バイトしか違わないのに、du コマンドだと 4.0KB も違う事になっていますね。</p>
<h2> どうやってファイルサイズを測るか </h2>
<p>では、どうすればブロックサイズに左右されずに、<br />
フォルダ内の容量を測れるのでしょうか。</p>
<p>調べて分かったのは、<strong> find </strong> コマンドです。<br />
一例を示します。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;"> $ find ./ -printf &quot;%s\n&quot;</pre></div></div>

<p>階層的にディレクトリ内ファイルを検索してくれるコマンド find には、<br />
そのファイルに関する情報を出力してくれるアクションがあります。</p>
<p>それが <strong> 「-printf」 </strong> です。</p>
<p>「 find ./ 」のみだと、カレントディレクトリ配下のディレクトリの内容を出力するだけですが、<br />
「-printf」を利用する事により、出力内容を変える事が出来ます。</p>
<p>ここで使用しているフォーマットは次の通りです。<br />
%s : ファイルサイズのバイト表示<br />
\n : 改行</p>
<p>実行結果の一例を示します。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">sky@ub1110x64:~/contrail$ ls -l *
sky:
合計 24
-rw-rw-r-- 1 sky sky 6789 2011-12-26 07:22 high
-rw-rw-r-- 1 sky sky 1234 2011-12-26 07:22 light
-rw-rw-r-- 1 sky sky 9999 2011-12-26 07:22 scraper
&nbsp;
substance:
合計 12
-rw-rw-r-- 1 sky sky 4097 2011-12-26 07:22 ice_grain
-rw-rw-r-- 1 sky sky 4096 2011-12-26 07:22 moisture</pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">sky@ub1110x64:~/contrail$ find ./ -printf &quot;%s : %f\n&quot;
4096 : ./
4096 : sky
1234 : light
6789 : high
9999 : scraper
4096 : substance
4096 : moisture
4097 : ice_grain</pre></div></div>

<p>※見やすいようにファイル名(%f)も表示しています。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">sky@ub1110x64:~/contrail$ du -ah
4.0K	./sky/light
8.0K	./sky/high
12K	./sky/scraper
28K	./sky
4.0K	./substance/moisture
8.0K	./substance/ice_grain
16K	./substance
48K	.</pre></div></div>

<p>ちなみに、次のようにディレクトリ指定を省略すれば、<br />
カレントディレクトリ配下を検索するため、同じ出力が得られます。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;"> $ find -printf &quot;%s : %f\n&quot;</pre></div></div>

<p>現状のままでは、各ファイルやディレクトリのサイズが列挙されただけで、合計の値が得られていません。<br />
もう一手間加えます。</p>
<p>というわけで、<strong> awk </strong> コマンドを組み合わせたものがこちらです。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">sky@ub1110x64:~/contrail$ find ./ -printf &quot;%s\n&quot; | awk '{ sum += $1; }; END { print sum }'
38503</pre></div></div>

<p>各ファイルサイズについて、{ sum += $1; }; の部分で次々と足し合わされ、<br />
END { print sum } の部分によって、最後に１回だけ、変数 sum が出力されます。</p>
<p>いかがでしょうか。<br />
私にとって、awk コマンドはまだまだ慣れないものではありますが、<br />
とても応用が効きそうなコマンドだなと思いました。</p>
<h2> 物理をやってたあの頃 </h2>
<p>研究室を思い出すと、、、やっぱりまだありました、変なもの、不思議なもの。<br />
前回は片栗粉でしたが、今回は <strong> ペットボトル </strong> です。</p>
<p>それは <strong> エッキー </strong> って呼ばれてました。<br />
中身は、500ml いっぱいの水と、砂が４分の１程度、ピンが３、４個ほどだったと思います。</p>
<p>では、何のためのものなのかと言うと <strong> 「液状化現象」 </strong> を見るためです。<br />
液状化っていうと、地震の時に水がしみ出してくるアノ現象ですね。</p>
<p>使い方としては、<br />
このエッキーをよく振って、静かに置きます。<br />
この時、ピンは砂に埋もれて見えない状態になっているはずです。</p>
<p>この状態で、デコピンなどしてエッキーに刺激を与えると、ピンが飛び出してきます。<br />
これが、地震後の液状化に対応しています。</p>
<p>ちなみに最近知ったのですが、<br />
エッキーって、商品名でした。<br />
どうも、キットとして売られているようです。</p>
<p>おしまいです。<br />
ではでは。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusic.co.jp/archives/2245/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP2.0で現状の問題点などまとめました。</title>
		<link>http://blog.fusic.co.jp/archives/2207</link>
		<comments>http://blog.fusic.co.jp/archives/2207#comments</comments>
		<pubDate>Wed, 14 Dec 2011 10:12:50 +0000</pubDate>
		<dc:creator>hagiwara</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://blog.fusic.co.jp/?p=2207</guid>
		<description><![CDATA[そろそろ誕生日の萩原です。誕生日プレゼントください。去年も似たようなことを言ったような気がするのは気のせいです。 最近、CakePHP2を色々触ってまして、色々困ったことがあったので、まとめておこうかなと思います。(Ca [...]]]></description>
			<content:encoded><![CDATA[<p>そろそろ誕生日の萩原です。誕生日プレゼントください。<s>去年も似たようなことを言ったような気がするのは気のせいです。</s></p>
<p>最近、CakePHP2を色々触ってまして、色々困ったことがあったので、まとめておこうかなと思います。(CakePHP2.0.4現在)<br />
(下でCakePHP2.xなんか知りませんと言われてますが・・・)</p>
<h3>AppControllerをapp/Controller以外に置く場合の注意</h3>
<p>CakePHP2からは皆さんご存知の通り、AppController及び、AppModelが、app直下に設置が出来なくなりました。</p>
<p>CakePHP2ではAppControllerはapp/Controller以下に設置をすること、と言うことになっています。</p>
<p>しかし、個人的には出来れば、直接アクセスするコントローラとはAppControllerは分けたいところです。</p>
<p>そこで、AppControllerをapp/Libに設置をしようと考えまして設置を行っていました。</p>
<p>app/Lib以下にAppControllerを設置後は、AppControllerを継承するコントローラにはApp::usesの記述が必要になります。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
App<span style="color: #339933;">::</span><span style="color: #004000;">uses</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'AppController'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Lib'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> PostsController <span style="color: #000000; font-weight: bold;">extends</span> AppController <span style="color: #009900;">&#123;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>しかし、作業をしていく内に、たまに<strong>AppController内のアクションが読めない</strong>というエラーが出ることがありました。(debug2でも)</p>
<p>元凶は<strong>app/tmp/cache/persistent/cake_core_file_map</strong>のキャッシュ(こいつがなかなかの曲者です・・・)だと言うことはすぐにわかったのですが、どうにも再現性も取れず、対策がなかなかつかめない状態でした。(1ヶ月くらい悩んでいました・・・)</p>
<p>結局のところ現象としては</p>
<p>(1)404ページ(missing controllerなど)にアクセス<br />
(2)CakeErrorControllerを見に行く<br />
(3)CakeErrorControllerがapp/Controller以下にセットしていない場合は、CakeコアのCakeErrorControllerを見に行く<br />
(4)当然、コアのコントローラにApp::usesの記述があるはずもなく、継承するAppControllerの場所として<strong>App/Controller</strong>以下を見に行く<br />
(5)ないので、<strong>CakeコアのAppController</strong>にアクセスしに行く<br />
(6)さらに、<strong>キャッシュにAppControllerの位置はCakeコアにある</strong>、と記述<br />
(7)その後、通常のシステムのページにアクセスしても、AppControllerとして、<strong>CakeコアのAppController</strong>を見に行く<br />
(8)App/Lib以下に設置したAppConttroller内のアクションが呼ばれない</p>
<p>ということが起こっていました。</p>
<p>解決策としては</p>
<p>①AppControllerを素直にApp/Controller内に設置する<br />
②CakeErrorControllerをApp/Controller内にコピーしてApp::usesをセットする</p>
<p>①はまずまず問題ないく動作をするはずです。</p>
<p>②についてはCakeコアでAppControllerを継承しているものが、他には通常あまり使わないであろう、PagesControllerくらいだったので、こちらでもおそらく問題なく動作すると思います。</p>
<h3>(2011/12/15追記)</h3>
<p>LibにAppControllerを置くと言う件について、Libの中にControllerのディレクトリを作ってその中に置けばいいという指摘を頂きました。<br />
試してみると、app/Lib/Controller/AppController.phpという形で設置をしたら、確かに問題なくusesなしでもapp/Lib/Controller/AppController.phpを見に行ってくれました。<br />
これならCakeErrorを書き換える必要もなくなるので、これが一番良い解決法かもしれません。</p>
<h3>app以下のクラス名とPlugin以下のクラス名が同名だと誤動作する</h3>
<p>これは具体例を挙げた方が早いと思います。</p>
<p>app/Controller/<strong>PostsController.php</strong>(①)と、app/Plugin/Post/Controller/<strong>PostsController.php</strong>(②)の二つの同名のコントローラがあるとします。</p>
<p>初めに①にアクセスした後、②にアクセスをしようとすると、①にアクセスをしてしまうというものです。(逆もしかり)</p>
<p>これが起きてしまう原因はapp/tmp/cache/persistent/cake_core_file_mapのキャッシュがプラグインを考慮していないためです。<strong>（またお前か・・・）</strong></p>
<p>実のところ、AdminPluginを作成してそこに管理画面を実装しようとしていたところでしたので、これはかなり致命的でした。</p>
<p>解消方法自体はコアを触れば出来なくもないのですが、コアのアップデートなど一切できなくなるのでお勧めはしません。</p>
<p>どうしても動作させたいのであれば、lib/Cake/Core/App.phpをプラグインを考慮するように直接編集すると、動作はします。</p>
<p>まぁ、ただ当分はapp以下とPlugin以下で同名のクラスが入るような実装は避けた方が良いでしょう。</p>
<h3>(2011/12/16追記)</h3>
<p>CakePHPチームにチケットを投げてみましたが、同名のクラスは現在使えない、Cake3で計画中と言われました。</p>
<h3>PaginatorのorderにSQLが記述できない</h3>
<p>CakePHP2からPaginatorがコンポーネントに分離されたことは皆さんご存知かとは思いますが、CakePHP2では現在のところPaginatorで<strong>orderにSQLがそのまま記述が出来ません。</strong></p>
<p>例えば</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Paginator</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">settings</span> <span style="color: #339933;">=</span> 
    <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'order'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'`hoge` is null ASC'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span></pre></div></div>

<p>のようなソートを行いたい時に上記のorderが無視されます。(実際に必要な場面がありました・・・)</p>
<p>これは、コアのPaginatorComponentを見ればわかるのですが、352行目～の記述で</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasField</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$order</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$alias</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'.'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasField</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$order</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$field</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">elseif</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #000088;">$alias</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$object</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#123;</span><span style="color: #000088;">$alias</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasField</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$field</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$order</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$alias</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'.'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$field</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$value</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>とありまして、例外が全く、無視される形になっています。</p>
<p>この記述自体は1.3にもあるのですが、1.3では最後にarray_mergeをしているので、SQLも取り込んでくれていたのですが、2.0では無視された状態です。</p>
<p>どうしても特殊なorderをかけたい場合は現状では素書きのSQLやDBのviewなどで対応しておいた方が良いかもしれません。</p>
<p>(今回私の場合は、元々orderをかけたかったテーブルがviewだったのでviewにソート用のカラムを泣く泣く追加しました・・・)</p>
<h3>(2011/12/16追記)</h3>
<p>CakePHPチームにチケットを投げてみたところ、orderを文字列で指定したら動くじゃん！って言われたので現在配列で指定したんだけど・・・と返しているところです。</p>
<h3>SSLページでのCookieのセキュア属性を外す方法</h3>
<p>SSLページがあるページとないページが混同する場合、Cookieのセキュア属性が付いていると、セッションを共有できないため、セキュア属性を外してあげる必要があります。</p>
<p>1.3の場合は以下の対応が必要になります。</p>
<p>app/config/core.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">//	Configure::write('Session.save', 'php');</span>
	Configure<span style="color: #339933;">::</span><span style="color: #004000;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Session.save'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'session_custom'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>app/config/session_custom.php</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SESSION</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'session.use_trans_sid'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'session.name'</span><span style="color: #339933;">,</span> Configure<span style="color: #339933;">::</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Session.cookie'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'session.cookie_lifetime'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">cookieLifeTime</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'session.cookie_path'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #990000;">ini_set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'session.cookie_secure'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>これは、コアのcake_session.phpの設定を強引に上書きをしています。</p>
<p>CakePHP2ではcore.phpに以下の記述をすれば、対応できます。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Configure<span style="color: #339933;">::</span><span style="color: #004000;">write</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Session'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'defaults'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'php'</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">'ini'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'session.cookie_secure'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span>
    <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>特に新しいファイルを作成する必要はなく、手軽です。</p>
<h3>CakePHP2.0ではセッションを共有するしないにかかわらず、SSLがあるページとないページが混同するサイトでは、セキュア属性は外した方が良い。</h3>
<p>これは、まずSSLのあるページ(①)でログインをした後、SSLのないページ(②)にアクセスし、その後、①のページにアクセスをすると<strong>、ログアウトしてしまう</strong>と言う現象のためです。(これは1.3では発生しません)</p>
<p>詳しい原因についてはまだ追い切れていないのですが、①にアクセスした後、②にアクセスすると①と異なるセッションキーが振られます。(これは当然の話)</p>
<p>その後①のページにアクセスすると、<strong>②で発行されたセッションキーに上書き</strong>されてしまうため、ログアウトをしてしまいます。</p>
<p>以上の理由から、今のところ、SSLがあるページとないページが混同するサイトでは、セキュア属性は外して置いた方が良いと思います。</p>
<h3>(2011/12/16追記)</h3>
<p>CakePHPチームにチケットを投げてみたところ、上記の書き方でセキュア外せばいいじゃん！って言われました。</p>
<h3>最後に</h3>
<p>まだCakePHP2は駆け出しで、問題が色々と出てますが、触っている感じとしては1.3とそう大差なく使えています。そして早いです。</p>
<p>きっとこれからどんどん良くなっていくと思うので皆さんどんどんさわりましょう！</p>
<p>後、本当にfile_mapのキャッシュには要注意です！<br />
<small><s>ああ・・・app.phpの750行目を消してfile_mapのキャッシュをなかったことにしたい・・・ｗ</s></small></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusic.co.jp/archives/2207/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CakePHPでのSQLのログ</title>
		<link>http://blog.fusic.co.jp/archives/2196</link>
		<comments>http://blog.fusic.co.jp/archives/2196#comments</comments>
		<pubDate>Thu, 08 Dec 2011 04:53:09 +0000</pubDate>
		<dc:creator>nakano</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.fusic.co.jp/?p=2196</guid>
		<description><![CDATA[Fusicの中野です。 表題のとおり、CakePHPのログに関する小ネタを紹介します。 ちなみに、使っているCakePHPのバージョンは1.3です。（CakePHP2.xなんて知りません） CakePHPでConfigu [...]]]></description>
			<content:encoded><![CDATA[<p>Fusicの中野です。</p>
<p>表題のとおり、CakePHPのログに関する小ネタを紹介します。<br />
ちなみに、使っているCakePHPのバージョンは1.3です。（CakePHP2.xなんて知りません）</p>
<p>CakePHPでConfigure::read(&#8220;debug&#8221;) > 1の場合は画面にSQLのログが表示されます。<br />
ですが、運用中ではPHPのエラー表示などがされないように、Configure::read(&#8220;debug&#8221;) == 0の状態ではないかと思います。<br />
そうなると、すこしだけSQLの確認をしたいときなどちょっと面倒ですよね。</p>
<p>CakePHPはConfigure::read(&#8220;debug&#8221;) > 1の場合、SQLのログはDboSourceの_queriesLogというメンバの配列に格納されていて、どうやらその配列の中身を画面に出力しているようです。</p>
<p>そこで、こいつの中身が取れれば解決できるので・・・</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$db</span> <span style="color: #339933;">=&amp;</span> ConnectionManager<span style="color: #339933;">::</span><span style="color: #004000;">getDataSource</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$Model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">useDbConfig</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullDebug</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// ここがfalseだとログを保存しない。$db-&gt;fullDebug = Configure::read() &gt; 1みたいになってます。</span>
<span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span>_queriesLogMax <span style="color: #339933;">=</span> <span style="color: #cc66cc;">200</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// SQLがこの件数こえると配列に保存しないよ的なもの。</span></pre></div></div>

<p>みたいなことをfindを実行する前に書いてあげれば、_queriesLogに登録されるようです。</p>
<p>だけど、これだと少々めんどいのでBehaviorにまとめてみましょう。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> QueryLogBehavior <span style="color: #000000; font-weight: bold;">extends</span> ModelBehavior <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$__settings</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">var</span> <span style="color: #000088;">$_queriesLogMax</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">999</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">function</span> setup<span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$Model</span><span style="color: #339933;">,</span> <span style="color: #000088;">$settings</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
　　　<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__settings<span style="color: #009900;">&#91;</span> <span style="color: #000088;">$Model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">alias</span> <span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
　<span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">function</span> make_query_key<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$Model</span><span style="color: #339933;">,</span> <span style="color: #000088;">$query</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span> <span style="color: #b1b100;">return</span> <span style="color: #990000;">get_class</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$Model</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;__&quot;</span> <span style="color: #339933;">.</span>  <span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">serialize</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$query</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
  <span style="color: #000000; font-weight: bold;">function</span> add_query<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">&quot;'&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;' = '&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$key</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;'&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">function</span> beforeFind<span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$Model</span><span style="color: #339933;">,</span> <span style="color: #000088;">$query</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;log&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$query</span> <span style="color: #009900;">&#41;</span> and <span style="color: #000088;">$query</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;log&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$db</span> <span style="color: #339933;">=&amp;</span> ConnectionManager<span style="color: #339933;">::</span><span style="color: #004000;">getDataSource</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$Model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">useDbConfig</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullDebug</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
      <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span>_queriesLogMax <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_queriesLogMax<span style="color: #339933;">;</span>
      <span style="color: #000088;">$key</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">make_query_key</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$Model</span><span style="color: #339933;">,</span> <span style="color: #000088;">$query</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// いらないかも。</span>
      <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;conditions&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$query</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$query</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;conditions&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_query</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
      <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$query</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;conditions&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_query</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> 
      <span style="color: #009900;">&#125;</span>
      <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__settings<span style="color: #009900;">&#91;</span><span style="color: #000088;">$Model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">alias</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$query</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;log&quot;</span><span style="color: #009900;">&#93;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$query</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">function</span> afterFind<span style="color: #009900;">&#40;</span> <span style="color: #339933;">&amp;</span><span style="color: #000088;">$Model</span><span style="color: #339933;">,</span> <span style="color: #000088;">$results</span><span style="color: #339933;">,</span> <span style="color: #000088;">$primary</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$db</span> <span style="color: #339933;">=&amp;</span> ConnectionManager<span style="color: #339933;">::</span><span style="color: #004000;">getDataSource</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$Model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">useDbConfig</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fullDebug</span> <span style="color: #339933;">=</span> Configure<span style="color: #339933;">::</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span>_queriesLogMax <span style="color: #339933;">=</span> <span style="color: #cc66cc;">200</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$hit_sql</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">;</span> <span style="color: #000088;">$level</span> <span style="color: #339933;">=</span> LOG_DEBUG<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__settings<span style="color: #009900;">&#91;</span><span style="color: #000088;">$Model</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">alias</span><span style="color: #009900;">&#93;</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$keypair</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      <span style="color: #990000;">list</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$level</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$keypair</span><span style="color: #339933;">;</span>
      <span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span>_queriesLog <span style="color: #b1b100;">as</span> <span style="color: #000088;">$index</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$query_log</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;/^(.*)&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add_query</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$key</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;(.*)$/&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$query_log</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">&quot;query&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$regexp</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #000088;">$hit_sql</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$regexp</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$regexp</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
          <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">is_null</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$hit_sql</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">log</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$hit_sql</span><span style="color: #339933;">,</span> <span style="color: #000088;">$level</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>なんかこんな風に適当にBehaviorを追加して</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">Hoge</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;all&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;contain&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;conditions&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #339933;">&lt;</span>なんかの条件<span style="color: #339933;">&gt;,</span> <span style="color: #0000ff;">&quot;log&quot;</span> <span style="color: #339933;">=&gt;</span> LOG_INFO <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>みたいにしてあげたら、app/tmp/log/debug.logにSQLが記述されます。これで任意のfindの処理のSQLをログにだしたりできます。<br />
データベースの設定でSQLのログだしとけよとかいうツッコミはなしで。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusic.co.jp/archives/2196/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>autofs + sshfs の設定</title>
		<link>http://blog.fusic.co.jp/archives/2086</link>
		<comments>http://blog.fusic.co.jp/archives/2086#comments</comments>
		<pubDate>Tue, 22 Nov 2011 03:57:13 +0000</pubDate>
		<dc:creator>kitagishi</dc:creator>
				<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://blog.fusic.co.jp/?p=2086</guid>
		<description><![CDATA[初めまして。 物理系出身で、新人の北岸です。 ブログ初投稿ですが、よろしくお願いします。 今回のテーマは 「autofs を使って、sshfs を利用する」 です。 単純にsshfsを使うより、 autofsと組み合わせ [...]]]></description>
			<content:encoded><![CDATA[<p>初めまして。<br />
物理系出身で、新人の北岸です。</p>
<p>ブログ初投稿ですが、よろしくお願いします。</p>
<p>今回のテーマは <strong>「autofs を使って、sshfs を利用する」</strong> です。</p>
<p>単純に<strong>sshfs</strong>を使うより、<br />
<strong>autofs</strong>と組み合わせた方が何かと便利かなーって思ったので、<br />
このテーマで進めたいと思います。</p>
<p>というのも、毎回 sshfs コマンドを叩くのも煩わしいですし、<br />
起動時にマウントさせる設定などしてると、<br />
ネットに繋がっていない環境ではそこでエラーになってしまいます。</p>
<p>でも、autofs なら大丈夫！<br />
そんな感じです。</p>
<h3>用意した環境</h3>
<p>Virtualbox 上にLinux を２台<br />
1. <strong>Ubuntu</strong> 11.10 64bit Desktop<br />
2. CentOS 5.7 64bit</p>
<h3>概要</h3>
<p><strong>Ubuntu</strong> にて、<br />
・公開鍵認証の設定<br />
・autofs の設定<br />
・sshfs でマウント<br />
という流れで進めます。</p>
<h2>公開鍵認証の設定</h2>
<p>root ユーザになり、<br />
秘密鍵と公開鍵のセットを作成するために次のコマンドを実行します。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">root@ub1110x64:~# ssh-keygen</pre></div></div>

<p>この時、秘密鍵の場所は、「/root/.ssh/id_rsa.bright」を指定し、パスフレーズは空で設定しました。</p>
<p>SSH接続の際に、この秘密鍵を読み込むための設定をします。<br />
ファイル ~/.ssh/config に、次の設定を記述します。</p>
<p><code>Host bright<br />
    User root<br />
    HostName 192.168.55.101<br />
    IdentityFile ~/.ssh/id_rsa.bright</code></p>
<p>後は、この公開鍵を CentOS に設置するだけです。<br />
次の手順で設置しました。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">root@ub1110x64:~# scp .ssh/id_rsa.bright.pub root@192.168.55.101:/root/
root@ub1110x64:~# ssh root@192.168.55.101
[root@localhost ~]# mkdir .ssh
[root@localhost ~]# touch ~/.ssh/authorized_keys
[root@localhost ~]# cat id_rsa.bright.pub &gt;&gt; .ssh/authorized_keys</pre></div></div>

<p>これで無事、次のコマンドなどを実行して、<br />
<strong>Ubuntu</strong> からパスワード無しでSSH接続が出来るようになりました。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">root@ub1110x64:~# ssh bright</pre></div></div>

<h2>autofs の設定</h2>
<p>まず次のコマンドで、sshfs と autofs をインストールします。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">root@ub1110x64:~# apt-get install sshfs autofs</pre></div></div>

<p>次に、autofs の設定をしていきます。<br />
これは２つのファイルに、１行ずつ書くだけです。</p>
<p>まず、ファイル /etc/auto.master の最終行に、次の一行を追加します。<br />
<code>/home/sky/bright /etc/auto.sshfs --timeout 0 --ghost</code></p>
<p>この設定の意味は、<br />
ディレクトリ /home/sky/bright に、<br />
ファイル /etc/auto.sshfs の内容に従ってマウントするというものです。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">--timeout 0</pre></div></div>

<p>これは、自動切断をする時間のための設定で、<br />
ゼロを指定しているため、自動でアンマウントしない設定です。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">--ghost</pre></div></div>

<p>これは、実際にアクセスするまでマウントしないという設定です。</p>
<p>最後に、ファイル /etc/auto.sshfs というファイルを作成して、<br />
<code>blue -fstype=fuse,allow_other :sshfs\#bright\:/</code><br />
だけ記述します。</p>
<p>この設定の意味は、<br />
ファイル /etc/auto.master に記述されたディレクトリ上の、<br />
ディレクトリ blue に sshfs でマウントするというものです。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">-fstype=fuse,allow_other</pre></div></div>

<p>これは、sshfs の FUSE options で allow_other を指定するという設定です。<br />
これを加える事で、例えば一般ユーザ sky でも<br />
マウントしたディレクトリにアクセス出来るようになります。</p>
<p>autofs の設定はここまでです。</p>
<p>最後に、次のコマンドで、autofs を再起動するだけです。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">root@ub1110x64:~# service autofs restart</pre></div></div>

<h3>autofs の設定に関する余談</h3>
<p>1. もし、/root/.ssh/config ファイルの設定をしていなかったら<br />
設定ファイル /etc/auto.sshfs に関しては、次のように書かないとマウント出来ません。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">blue -fstype=fuse,allow_other,IdentityFile=/root/.ssh/id_rsa.bright :sshfs\#root@192.168.55.101\:/</pre></div></div>

<p>2. 1 の条件で、sshfs コマンドでマウントするとしたら<br />
次の２つのコマンドを実行する必要があります</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">root@ub1110x64:~# mkdir -p /home/sky/bright/blue/
root@ub1110x64:~# sshfs -o allow_other,IdentityFile=~/.ssh/id_rsa.bright /home/sky/bright/blue/ root@192.168.55.101:/</pre></div></div>

<h2>マウントの確認</h2>
<p>マウントしたポイントは、/home/sky/bright/blue/ です。</p>
<p>次のコマンドを実行してみると、<br />
無事にマウントが出来ている事が確認出来ました。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">root@ub1110x64:~# ll /home/sky/bright/blue/
合計 112
drwxr-xr-x 1 root root  4096 2011-11-13 03:58 ./
drwxr-xr-x 3 root root     0 2011-11-13 13:20 ../
-rw-r--r-- 1 root root     0 2011-11-13 03:57 .autofsck
-rw-r--r-- 1 root root     0 2011-10-05 14:17 .autorelabel
drwxr-xr-x 1 root root  4096 2011-10-28 01:00 bin/
&nbsp;
*** (略) ***</pre></div></div>

<p>試しに、適当なファイルを作成してみたいと思います。<br />
今回は <strong>Ubuntu</strong> の一般ユーザ(sky)でやってみます。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">sky@ub1110x64:~$ cat /etc/issue &gt;&gt; ~/bright/blue/sky.txt
sky@ub1110x64:~$ ll ~/bright/blue/sky.txt
-rw-r--r-- 1 root root 20 2011-11-13 04:21 /home/sky/bright/blue/sky.txt</pre></div></div>

<p>無事に作成できました。</p>
<p>CentOS にログインしてみても、確かにファイルは存在してました。</p>

<div class="wp_syntax"><div class="code"><pre class="sh" style="font-family:monospace;">[root@localhost ~]# ll /sky.txt
-rw-r--r-- 1 root root 20 11月 13 04:21 /sky.txt
[root@localhost ~]# cat /sky.txt
Ubuntu 11.10 \n \l</pre></div></div>

<h2>おわり</h2>
<p>初投稿で、文章を書くのも苦手で、なかなか苦戦しました。<br />
準備でもケアレスミスの連続で大変でした。。。<br />
まだまだ未熟ですが、めげずに頑張っていきます！</p>
<p>ちなみに、自分の開発環境を Windows から <strong>Ubuntu</strong> に変更したので、<br />
積極的にこの設定を使っていこうと思います。</p>
<h2>物理をやってたあの頃</h2>
<p>豆知識ってわけではありませんが、<br />
物理をやってたあの頃の割とどうでもいい事をつらつらと。。。</p>
<p>研究室に、<strong>片栗粉</strong>がありました。<br />
しかも、料理のためではありません。<br />
<strong>水と混ぜる</strong>、それだけのためです。<br />
それ以外の使い方を見た事がありません！</p>
<p>なぜ混ぜるのか、<br />
それは、<strong>ダイラタント流体</strong>を作るためです。</p>
<p>もしかすると、テレビなどで、<br />
白い液体の上を走る人を見たことがあるかと思います。<br />
アレです。</p>
<p>このダイラタント流体は、<br />
圧力を加えると固体のように振る舞い、<br />
そうでないと液体のような振る舞いをするというものです。</p>
<p>実際に、水と片栗粉をスプーンでかき混ぜて、<br />
そのスプーンでその白い液体を叩くと、<br />
固体のような手応えを受けます。<br />
一方で、ゆっくりスプーンをあてると、<br />
液体のように飲み込まれていきます。</p>
<p>何とも不思議なやつなんです～</p>
<p>今度こそお終いです。<br />
ではでは。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusic.co.jp/archives/2086/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPMatsuriはFusicのプラスになったのか？(4/4)</title>
		<link>http://blog.fusic.co.jp/archives/2034</link>
		<comments>http://blog.fusic.co.jp/archives/2034#comments</comments>
		<pubDate>Thu, 20 Oct 2011 03:33:28 +0000</pubDate>
		<dc:creator>oyama</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.fusic.co.jp/?p=2034</guid>
		<description><![CDATA[どうやら最終区担当の小山です。 FusicのPHPMatsuri2011 レポートも最後です。何やらハードルが上がっているように見えますが、そこはスルー力を発揮します。 PHPMatsuriリレーブログで「FusicがP [...]]]></description>
			<content:encoded><![CDATA[<p>どうやら最終区担当の小山です。</p>
<p>FusicのPHPMatsuri2011 レポートも最後です。何やらハードルが上がっているように見えますが、そこはスルー力を発揮します。</p>
<p>PHPMatsuriリレーブログで「<a href="http://blog.fusic.co.jp/archives/1869">FusicがPHPMatsuriに参加すべき意義</a>」というエントリーを書きましたが、「実際はどうだったのか？」について考えてみたいと思います。</p>
<h2>PHPMatsuri前</h2>
<p><a href="http://blog.fusic.co.jp/archives/1869">前のエントリー</a>はどちらかというと自分個人の考えが強かったのですが、あるとき弊社社長からこんなメールが社内に送信されました。</p>
<p>&#8220;今、気付いたけど、小山君がいいこと書いてました。</p>
<p><a href="http://blog.fusic.co.jp/archives/1869" class="autohyperlink" title="http://blog.fusic.co.jp/archives/1869" target="_blank">blog.fusic.co.jp/archives/1869</a></p>
<p>PHP Matsuri に参加する方々、ぜひ何かを感じて<br />
帰って来て下さい。&#8221;</p>
<p>会社としても4人を送り込むわけですから、期待しないわけにはいかないです。<br />
ただ、この時点では4人ともそこまで意気込んではいなかったのではないでしょうか。</p>
<h2>はたしてPHPMatsuriで何を感じたのか</h2>
<p>「PHPMatsuriで何かを感じることができたのか」</p>
<p>それは今までの3回のエントリーを見ていただければ一目瞭然でしょう。</p>
<p>傍から見ていても違いが分かるほどです。</p>
<p>例えば、先日CakePHP2.0のリリースがありましたが(おめでたい！)、<br />
今まで以上に社内で話題になっているように感じました。<br />
CakePHP界隈の人の話題もでるようになりました。</p>
<p>では、「<strong>具体的に何が変わったのか</strong>」、自分なりに分析してみたいと思います。</p>
<h3>会社の外をより意識するようになった</h3>
<p>PHPMatsuriをはじめとして勉強会やカンファレンスで、最も良い効果のひとつがこれだと思います。<br />
さらにPHPMatsuriはハカソンイベントです。</p>
<p>「<strong>会社の外の人と同じ環境で開発できる</strong>」</p>
<p>これができるイベントはなかなかありません。<br />
ネットを通じて一つのプログラムを開発するのもかなりエキサイティングな体験ですが、<br />
実際に同じ場所で、いつもと違った人と一緒に開発するのはさらに刺激的です。</p>
<p>ちなみにこの体験はかなり中毒性があるらしく、PHPMatsuriにリピータが多いことからもそれが証明されているのではないでしょうか。</p>
<h3>ライブラリを「使う」意識から「作る」意識により傾いた</h3>
<p>何かのシステムを作るとき、目指す目標は「システムを完成させること」です。<br />
ただ、その目の前の目標だけを追っていたら毎回同じように苦労するでしょう。</p>
<p>「システムを完成させること」と同時に<br />
<strong>「次のシステムでも使えるような機能に」</strong><strong>「いつか別のシステムでも使えるような機能に」</strong><br />
<strong>「どこかの誰かが使えるような機能に」</strong><br />
という意識を持つことで、次のシステムを作るとき楽になるかもしれませんし、<br />
そういう意識を持つことが結果的にソースコードが綺麗になることにつながります。</p>
<p>なかなか日々の業務に追われていたら変えたい意識もなかなか変わることはできませんが、<br />
PHPMatsuriではフレームワークの開発者やライブラリの開発者が一堂に会しています。<br />
その人たちの考えに少しでも触れることができます。<br />
むしろ触れずにはいられない環境です。</p>
<p>さらに「次の日のLT大会」のための、業務でない「何かを」作ります。<br />
多分PHPMatsuriに行く前の、開発ネタを考えるときから何かを得られたのではないでしょうか。</p>
<h3>プログラムの世界を楽しめた</h3>
<p>何で括ればいいか良い言葉を思いつきませんでしたが、<br />
PHPMatsuriはPHPやJavaScriptをはじめとした<strong>「プログラムを通じて楽しむ環境」</strong>だったように思います。<br />
プログラムの世界を楽しむことができれば、<br />
35年定年説なんて関係ないでしょうし、日々の仕事も楽しくなることうけあいです。</p>
<p>PHPMatsuriに行くことを決めた時点でいつも楽しめているんでしょうが、<br />
PHPMatsuriに参加したことで、いろんな人と交流ができて、さらに楽しむ術を覚えたように思います。<br />
この楽しみがもっと増えればいいなと思っています。</p>
<h2>結論</h2>
<p><strong>当初のもくろみ以上にPHPMatsuriはFusicのプラスになった</strong></p>
<p>4人がそれぞれ精一杯過ごせたと思います。<br />
フレームワークのコアデベロッパに相談したり(貴重！)、<br />
ハッカー精神よろしくアグレッシブすぎるものを開発したり、<br />
会社の外の人とはじめて一緒に開発する環境を体験したり、<br />
さらには全員が最後に成果を発表できて、<br />
確実にプラスになっています。</p>
<p>PHPMatsuri青年団の皆様、この場を借りて御礼をいいたいと思います。</p>
<p>本当にありがとうございました！</p>
<h2>来年</h2>
<p>来年のことを言うと鬼が笑うので、あまり考えないようにしていますが、<br />
来年もPHPMatsuriが開催されて欲しいと思っています。<br />
ただ、PHPMatsuriを開催するのに多大な労力がかかっていることも知っています。</p>
<p>もし来年PHPMatsuriが開催されるなら、<br />
そのための協力はできる限りしていきたいなと思っています。</p>
<h2>ちなみに</h2>
<p>自分は今年はこんなものを作成していました。<br />
ハッカー賞次点をいただきました！ありがとうございます！</p>
<div id=zpd_C4ecx style='width:425px'><object id='zpo_C4ecx' width='425' height='360'><param name='movie' value='http://zenpre.net/swf/ja/zenpreEmbed.swf' /><param name='flashvars' value='pid=C4ecx&#038;socketServer=182.48.35.212&#038;presentId=1067&#038;nowSlideIndex=0&#038;channelId=' /><param name='bgcolor' value='#FFFFFF' /><param name='quality' value='high' /><param name='allowFullScreen' value='true'/><param name='allowScriptAccess' value='always' /><embed name='zpe_C4ecx' src='http://zenpre.net/swf/ja/zenpreEmbed.swf' type='application/x-shockwave-flash' quality='high' allowScriptAccess='always' allowfullscreen='true' pluginspage='http://www.adobe.com/go/getflashplayer' bgcolor='#FFFFFF' width='425' height='360' flashvars='pid=C4ecx&#038;socketServer=182.48.35.212&#038;presentId=1067&#038;nowSlideIndex=0&#038;channelId='></embed></object></div>
<p>何が一番面倒かって仕様が複雑すぎで実装に先が見えないことです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fusic.co.jp/archives/2034/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

