<?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>SNS開発者の本気帳</title>
	<atom:link href="http://www.synapz.jp/ogsy/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.synapz.jp/ogsy</link>
	<description></description>
	<lastBuildDate>Thu, 04 Mar 2010 14:59:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[Rails 2.3.2] acts_as_state_machine から AASMへ変更</title>
		<link>http://www.synapz.jp/ogsy/2009/10/rails-aasm-state-machine/</link>
		<comments>http://www.synapz.jp/ogsy/2009/10/rails-aasm-state-machine/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 07:30:32 +0000</pubDate>
		<dc:creator>ogsy</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Plugin]]></category>
		<category><![CDATA[StateMachine]]></category>

		<guid isPermaLink="false">http://192.168.1.2/wpmu/ogsy/2009/10/16/rails-2-3-2-acts_as_state_machine-%e3%81%8b%e3%82%89-aasm%e3%81%b8%e5%a4%89%e6%9b%b4/</guid>
		<description><![CDATA[
こんちには、おがしょーです。
今回は自分の備忘録のためのエントリです。


ユーザー認証などでRestfulAuthenticationを使う場合、ステートマシンとして2種類のモジュールが使える。
1. acts_as_state_machine
2. AASM （rubyist-aasm）


※今回の流れ。
ググって出てくる参考サイトではほとんどacts_as_state_machineを使用していたので、迷い無くこれをチョイス。
↓
プラグインはGitHubからのインストールでまとめたいので探してみる、が見つからない。
↓
実は長い間アップデートされてない。
↓
後継でAASMなるものを発見。
↓
rubyist-aasmをインストールした後、RestfulAuthenticationをAASMに切り替える。
↓
find_in_stateがエラーになる。
↓
そういえばacts_as_state_machineに複数状態を指定できるパッチ当ててたっけ。。


引用元： kaeruspoon様
module ScottBarron
module Acts
module StateMachine
module ClassMethods
protected
def with_state_scope(target_states)
target_states = [target_states] unless target_states.is_a?(Array)
raise InvalidState unless target_states.all? {&#124;s&#124; states.include?(s)}
cond = []
cond_param = []
target_states.each do &#124;st&#124;
cond &#60;&#60; &#34;#{table_name}.#{state_column} = ?&#34;
cond_param &#60; {:conditions =&#62; [cond.join(" OR "), cond_param].flatten} do
yield if block_given?
end
end
end
end
end
end

↓
AASM用に変更してみる・・・が、動かない。AASMがgemだからか？？
↓
メソッド名を変えてリトライ。
[ RAILS/config/initializers/patch_aasm.rb ]
module AASM
module Persistence
module ActiveRecordPersistence
module ClassMethods
def find_in_states(number, state, *args)
with_states_scope state do
find(number, *args)
end
end
def count_in_states(state, *args)
with_states_scope state do
count(*args)
end
end
def [...]]]></description>
			<content:encoded><![CDATA[<p>
こんちには、おがしょーです。<br />
今回は自分の備忘録のためのエントリです。<br />
<br />
<br />
ユーザー認証などで<a href="http://github.com/technoweenie/restful-authentication" target="_BLANK">RestfulAuthentication</a>を使う場合、ステートマシンとして2種類のモジュールが使える。<br />
1. <a href="http://www.google.co.jp/search?q=acts_as_state_machine" target="_BLANK">acts_as_state_machine</a><br />
2. <a href="http://github.com/rubyist/aasm" target="_BLANK">AASM （rubyist-aasm）</a><br />
<br />
<br />
<b>※今回の流れ。</b><br />
ググって出てくる参考サイトではほとんどacts_as_state_machineを使用していたので、迷い無くこれをチョイス。<br />
↓<br />
プラグインはGitHubからのインストールでまとめたいので探してみる、が見つからない。<br />
↓<br />
実は長い間アップデートされてない。<br />
↓<br />
後継でAASMなるものを発見。<br />
↓<br />
rubyist-aasmをインストールした後、RestfulAuthenticationをAASMに切り替える。<br />
↓<br />
find_in_stateがエラーになる。<br />
↓<br />
そういえばacts_as_state_machineに複数状態を指定できるパッチ当ててたっけ。。<br />
<br />
<br />
引用元： <a href="http://www.kaeruspoon.net/articles/507" target="_BLANK">kaeruspoon</a>様<br />
<pre><code>module ScottBarron
module Acts
module StateMachine
module ClassMethods
protected
def with_state_scope(target_states)
target_states = [target_states] unless target_states.is_a?(Array)
raise InvalidState unless target_states.all? {|s| states.include?(s)}
cond = []
cond_param = []
target_states.each do |st|
cond &lt;&lt; &quot;#{table_name}.#{state_column} = ?&quot;
cond_param &lt; {:conditions =&gt; [cond.join(" OR "), cond_param].flatten} do
yield if block_given?
end
end
end
end
end
end</code>
</pre>
↓<br />
AASM用に変更してみる・・・が、動かない。AASMがgemだからか？？<br />
↓<br />
メソッド名を変えてリトライ。<br />
[ RAILS/config/initializers/patch_aasm.rb ]<br />
<pre><code>module AASM
module Persistence
module ActiveRecordPersistence
module ClassMethods
def find_in_states(number, state, *args)
with_states_scope state do
find(number, *args)
end
end
def count_in_states(state, *args)
with_states_scope state do
count(*args)
end
end
def calculate_in_states(state, *args)
with_states_scope state do
calculate(*args)
end
end
protected
def with_states_scope(target_states)
target_states = [target_states] unless target_states.is_a?(Array)
raise InvalidState unless target_states.all? {|s| aasm_states.include?(s)}
cond = []
cond_param = []
target_states.each do |st|
cond &lt;&lt; &quot;?&quot;
cond_param &lt; {:conditions =&gt; ["#{table_name}.#{aasm_column} IN (#{cond.join(', ')})", cond_param].flatten} do
yield if block_given?
end
end
end
end
end
end</code></pre>
↓<br />
できた (n&#8217;∀&#8217;)η<br />
<br />
<br />
まだgemとかよくわかってないのGitHubでForkして修正して・・・とかやりたかったけど無理でした。<br />
先は長いなぁ〜。<br />
<br />
<br />
おまけ。<br />
ステートマシンについてはこちらのページが詳しいです。<br />
<a href="http://www.ibm.com/developerworks/jp/java/library/j-cb03137/index.html" target="_BLANK">境界を越える: Rails での拡張</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.synapz.jp/ogsy/2009/10/rails-aasm-state-machine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amazon EC2？ それとも・・・</title>
		<link>http://www.synapz.jp/ogsy/2009/10/amazon-ec2-or-others/</link>
		<comments>http://www.synapz.jp/ogsy/2009/10/amazon-ec2-or-others/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 03:07:55 +0000</pubDate>
		<dc:creator>ogsy</dc:creator>
				<category><![CDATA[テクノロジー]]></category>
		<category><![CDATA[仮想化]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[EC2]]></category>
		<category><![CDATA[VirtualMachine]]></category>

		<guid isPermaLink="false">http://192.168.1.2/wpmu/ogsy/2009/10/06/amazon-ec2%ef%bc%9f-%e3%81%9d%e3%82%8c%e3%81%a8%e3%82%82%e3%83%bb%e3%83%bb%e3%83%bb/</guid>
		<description><![CDATA[
こんにちは、おがしょーです。

今回は開発したアプリを実行させる環境についてですが、レンタルサーバーのホスティング、ハウジング、クラウドの利用などいろいろな選択肢があります。
弊社は現在、コストパフォーマンスと調達期間の関係でAmazon EC2をメインで使ってます。


EC2、安いんです。初期費用とか無いですし。
月の転送料とか、従量制課金の部分をいれても仮想マシン1台あたり月1万もいかないんじゃないでしょうか。
普通のホスティング（専用サーバー）でやろうとすると、スタート月は初期費用込みで10万近くなりますよね、たぶん。


しかしEC2って、CPUの処理速度はまぁまぁなんですが転送速度がとにかく遅い。。
SSH中の文字とか、ヌルヌルです（´Д｀）
通説で日本ー米国間の物理的なネットワーク遅延が原因だと言われています。
といっても200〜300msくらいの遅延で、そこそこレベルのウェブサービス運用ではそんなに影響することはないと考えてますが。


で、やっぱり国内にサーバーがあればなぁ、ってなります。
10/1付けだけど今日見つけたニュース（Impress EnterpriseWatchより）↓


ITコア、「Amazon EC2より安い」仮想化ホスティングサービス「GS10」 




きましたね！国産EC2の対抗が！
GrowServer2010の略称でGS10っていうみたいです。


仮想マシンのラインナップは以下のとおり。（モデル価格表をコピペ）


モデル  	メモリ  	CPU  	ディスク（実効）※1  	月額費用S1 	1GB 	1コア 	30GB 	￥10,000S2 	2GB 	2コア 	30GB 	￥20,000S4 	4GB 	2コア 	30GB 	￥30,000S8 	8GB 	4コア 	30GB 	￥50,000

初期費は無料です。
契約単位は1ヶ月です。
お支払は前払いとなります。
※1　3重化DISK


うーん、できればメモリ2GBのCPU1コアで￥15,000のS1.5（仮）モデルも作ってほしかった。。

仮想化にはVMware vSphereを使ってる模様。
VMの設定はvCenterのUIを直接使えたりするのかな？んなわけないか。
OSのインストールまではどうやってやるのか、とかよくわかってません。


このGS10、転送料無料な上24時間監視やロードバランサーが無料で月1万円は安いと思いますが、どうでしょうか？
さらにダメ押しでSLAは驚異の99.99%（！！）だそうです。


サービスインは11月1日からみたいですが、期待してます。
またEC2との比較テストでもできればまたレポートしてみたいと思います。
]]></description>
			<content:encoded><![CDATA[<p>
こんにちは、おがしょーです。<br />
<br />
今回は開発したアプリを実行させる環境についてですが、レンタルサーバーのホスティング、ハウジング、クラウドの利用などいろいろな選択肢があります。<br />
弊社は現在、コストパフォーマンスと調達期間の関係で<a href="http://aws.amazon.com/ec2/">Amazon EC2</a>をメインで使ってます。<br />
<br />
<br />
EC2、安いんです。初期費用とか無いですし。<br />
月の転送料とか、従量制課金の部分をいれても仮想マシン1台あたり月1万もいかないんじゃないでしょうか。<br />
普通のホスティング（専用サーバー）でやろうとすると、スタート月は初期費用込みで10万近くなりますよね、たぶん。<br />
<br />
<br />
しかしEC2って、CPUの処理速度はまぁまぁなんですが転送速度がとにかく遅い。。<br />
SSH中の文字とか、ヌルヌルです（´Д｀）<br />
通説で日本ー米国間の物理的なネットワーク遅延が原因だと言われています。<br />
といっても200〜300msくらいの遅延で、そこそこレベルのウェブサービス運用ではそんなに影響することはないと考えてますが。<br />
<br />
<br />
で、やっぱり国内にサーバーがあればなぁ、ってなります。<br />
10/1付けだけど今日見つけたニュース（<a href="http://enterprise.watch.impress.co.jp/">Impress EnterpriseWatch</a>より）↓<br />
</p>
<blockquote><p>
<a href="http://enterprise.watch.impress.co.jp/docs/news/20091001_318715.html">ITコア、「Amazon EC2より安い」仮想化ホスティングサービス「GS10」 </a><br />
</p></blockquote>
<p>
<br />
<br />
きましたね！国産EC2の対抗が！<br />
<a href="http://www.itcore.jp/growserver/index.html">GrowServer2010</a>の略称でGS10っていうみたいです。<br />
<br />
<br />
仮想マシンのラインナップは以下のとおり。（<a href="http://www.itcore.jp/growserver/index.html#tokucho3">モデル価格表</a>をコピペ）<br />
</p>
<blockquote><p>
モデル  	メモリ  	CPU  	ディスク（実効）※1  	月額費用S1 	1GB 	1コア 	30GB 	￥10,000S2 	2GB 	2コア 	30GB 	￥20,000S4 	4GB 	2コア 	30GB 	￥30,000S8 	8GB 	4コア 	30GB 	￥50,000<br />
<ul class="list_normal">
<li>初期費は無料です。</li>
<li>契約単位は1ヶ月です。</li>
<li>お支払は前払いとなります。</li></ul>
※1　3重化DISK<br />
</p></blockquote>
<p>
うーん、できればメモリ2GBのCPU1コアで￥15,000のS1.5（仮）モデルも作ってほしかった。。<br />
<br />
仮想化には<a href="http://www.vmware.com/jp/products/vsphere/">VMware vSphere</a>を使ってる模様。<br />
VMの設定は<a href="http://www.vmware.com/jp/products/vi/vc/">vCenter</a>のUIを直接使えたりするのかな？んなわけないか。<br />
OSのインストールまではどうやってやるのか、とかよくわかってません。<br />
<br />
<br />
このGS10、転送料無料な上24時間監視やロードバランサーが無料で月1万円は安いと思いますが、どうでしょうか？<br />
さらにダメ押しでSLAは<font>驚異の99.99%（！！）</font>だそうです。<br />
<br />
<br />
サービスインは11月1日からみたいですが、期待してます。<br />
またEC2との比較テストでもできればまたレポートしてみたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.synapz.jp/ogsy/2009/10/amazon-ec2-or-others/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Rails 2.3.2] モデルのカラムにサブクエリの値が使いたいのですよ</title>
		<link>http://www.synapz.jp/ogsy/2009/10/rails-2009100201/</link>
		<comments>http://www.synapz.jp/ogsy/2009/10/rails-2009100201/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 07:08:11 +0000</pubDate>
		<dc:creator>ogsy</dc:creator>
				<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SubQuery]]></category>

		<guid isPermaLink="false">http://192.168.1.2/wpmu/ogsy/2009/10/02/rails-2-3-2-%e3%83%a2%e3%83%87%e3%83%ab%e3%81%ae%e3%82%ab%e3%83%a9%e3%83%a0%e3%81%ab%e3%82%b5%e3%83%96%e3%82%af%e3%82%a8%e3%83%aa%e3%81%ae%e5%80%a4%e3%81%8c%e4%bd%bf%e3%81%84%e3%81%9f%e3%81%84/</guid>
		<description><![CDATA[
こんにちは、最近めっきり（なにが？）なおがしょ〜です。
ここ数ヶ月はずっとRubyOnRailsを勉強してますが、ようやく数％くらいわかってきた気がします。


さて、本題。ウェブアプリケーションで親子関係のあるデータを一覧表示しようとする場合で、子供側のデータを COUNT(*) してみたりしたくなる時があると思います（あるよね？ね？？）。深く考えず、はじめにRailsでやってみたのはこんな感じでした↓


# モデル：item.rb
class Item &#60; ActiveRecord::Base
&#160; # col: id
&#160; # col: name
&#160; has_many :sub_item
end
# モデル：sub_item.rb
class SubItem &#60; ActiveRecord::Base
&#160; # col: id
&#160; # col: item_id
&#160; # col: name
&#160; belongs_to :item
end
# アクション：items_controller.rb
def index
&#160;&#160; @items = Item.find :all
end
# ビュー：items/index.html.erb
&#60;% @items.each do &#124;item&#124; %&#62;
&#60;%=h item.sub_items.count %&#62;&#60;!—&#160; 小モデルの合計を表示する —&#62;
&#60;% end %&#62;



上記コードで問題なく実行できましたが、発行されるSQL文は
&#160; 親モデルのSELECT文＋（小モデルのSELECT文×行数）
となり、非常に無駄な気がします。
サブクエリを使えばSQL文は1つで済みますよね。


プラグインとか他のやり方とか探したんですが、findbysql()をする以外の方法が見つからなかったので、簡単にサブクエリを使ったカラムがモデルに追加できるプラグインを作ってみました。http://github.com/ogasyo/subquerycolumn


以下のコマンドでさくっとインストールして、&#160; $ script/plungin install git://github.com/ogasyo/subquerycolumn.git親モデルとコントローラーのfind()部分を以下の用に修正するだけ。


# モデル：item.rb
class Item &#60; [...]]]></description>
			<content:encoded><![CDATA[<p>
こんにちは、最近めっきり（なにが？）なおがしょ〜です。<br />
ここ数ヶ月はずっとRubyOnRailsを勉強してますが、ようやく数％くらいわかってきた気がします。<br />
<br />
<br />
さて、本題。ウェブアプリケーションで親子関係のあるデータを一覧表示しようとする場合で、子供側のデータを COUNT(*) してみたりしたくなる時があると思います（あるよね？ね？？）。深く考えず、はじめにRailsでやってみたのはこんな感じでした↓<br />
<br />
<br />
<pre><code># モデル：item.rb
class Item &lt; ActiveRecord::Base
&nbsp; # col: id
&nbsp; # col: name
&nbsp; has_many :sub_item
end
# モデル：sub_item.rb
class SubItem &lt; ActiveRecord::Base
&nbsp; # col: id
&nbsp; # col: item_id
&nbsp; # col: name
&nbsp; belongs_to :item
end
# アクション：items_controller.rb
def index
&nbsp;&nbsp; @items = Item.find :all
end
# ビュー：items/index.html.erb
&lt;% @items.each do |item| %&gt;
&lt;%=h item.sub_items.count %&gt;&lt;!—&nbsp; 小モデルの合計を表示する —&gt;
&lt;% end %&gt;
</code></pre>
<br />
<br />
上記コードで問題なく実行できましたが、発行されるSQL文は<br />
&nbsp; 親モデルのSELECT文＋（小モデルのSELECT文×行数）<br />
となり、非常に無駄な気がします。<br />
サブクエリを使えばSQL文は1つで済みますよね。<br />
<br />
<br />
プラグインとか他のやり方とか探したんですが、find<em>by</em>sql()をする以外の方法が見つからなかったので、簡単にサブクエリを使ったカラムがモデルに追加できるプラグインを作ってみました。<a href="http://github.com/ogasyo/sub_query_column">http://github.com/ogasyo/sub<em>query</em>column</a><br />
<br />
<br />
以下のコマンドでさくっとインストールして、&nbsp; $ script/plungin install git://github.com/ogasyo/sub<em>query</em>column.git親モデルとコントローラーのfind()部分を以下の用に修正するだけ。<br />
<br />
<br />
<pre><code># モデル：item.rb
class Item &lt; ActiveRecord::Base
&nbsp; # col: id
&nbsp; # col: name
&nbsp; hasmany :sub_item
&nbsp; sub_query_column :count_sub_items, :type =&gt; :integer, :query =&gt; “SELECT COUNT(id) FROM sub_items where sub_items.item_id = items.id”
end
# アクション：items_controller.rb
def index
&nbsp;&nbsp; @items = Item.with_sub_query.find :all
end
</code></pre>
<br />
<br />
ビュー側での値の取得はこんな感じです↓<br />
&lt;%=h item.count_sub_items %&gt;&lt;!—&nbsp; NEW! 小モデルの合計を表示する —&gt;<br />
<br />
以上で超簡単にできます。<br />
<br />
<br />
サクッと簡単に作ったプラグインなのでテストはありませんし、バグもあると思います。<br />
利用する場合はきっちりデバッグを行うようにオヌヌメします。<br />
できればGitHubでForkして改良してくれれば最高です（他力本願<br />
＃あと、他の方法でこんなのあるよ、とかもうすでに同じのあるだろ、とかはこっそり教えてくれるとありがたいです。。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.synapz.jp/ogsy/2009/10/rails-2009100201/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VMware ESXi を DELL Dimension8300 に入れてみた</title>
		<link>http://www.synapz.jp/ogsy/2009/06/vmware-esxi-dell-dimension8300/</link>
		<comments>http://www.synapz.jp/ogsy/2009/06/vmware-esxi-dell-dimension8300/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 07:51:08 +0000</pubDate>
		<dc:creator>ogsy</dc:creator>
				<category><![CDATA[仮想化]]></category>
		<category><![CDATA[ESXi]]></category>
		<category><![CDATA[VirtualBox]]></category>
		<category><![CDATA[VM]]></category>

		<guid isPermaLink="false">http://192.168.1.2/wpmu/ogsy/2009/06/22/vmware-esxi-%e3%82%92-dell-dimension8300-%e3%81%ab%e5%85%a5%e3%82%8c%e3%81%a6%e3%81%bf%e3%81%9f/</guid>
		<description><![CDATA[
こんにちは、おがしょ〜です。
タイトルどおりですが、今回は「やってみた」系です。

内容は「ESXiをUSBメモリブート &#62; ESXi 3.5 のインストール &#62; Sun xVM VirtualBox で使用していたVMをインポート &#62; 実行」って感じです。バージョンは v4 と v3.5 の2種類あるようですが、なんとなく x64=v4、x86=v3.5 みたいな感じがしたので今回は v3.5update4 をチョイスしました。まったく使用されないまま足下に転がってるDELLが不憫でESXiを入れてみました。
　（ほんとは XEN にしようとしてましたが、、面倒くさいので、、、、
興味の無い人にはまったく興味ない分野ですね、すいません(・∀・)


以下さくっとVMware ESXiの説明。


仮想OSを実行するための仮想機械（バーチャルマシン）。
いわゆるType1ハイパーバイザと呼ばれる（VirtualBox とか VMware Server とかはType2）。
実行するマシンを選ぶが、その分ホストOSが必要ない。→余計なボトルネックが少ない基本Intelのチップセットを所望される模様→特に NIC と StorageAdapter
無償である。（※商用利用の場合とかは調べてません）





一番はじめ、ESXiがよくわからなかった時、知見のある方から「まずUSBメモリからブートしてみればいいよ」との助言を頂いたのでさっそくググってみる。（T様ありがとうございます！！）するとだいたい・・・


インストールCDイメージをダウンロードする。ちなみに、結構面倒な登録フォームでユーザー登録（無料）をする必要があります。ダウンロードしたイメージをマウントして中身の「install.tgz」を適当な場所に解凍する。
さらにその中の「usr/lib/vmware/installer/VMware-VMvisor-big-3.5.0_Update_4-153875.i386.dd.bz2」を解凍する。&#160;&#160;&#160; $ bzip2 -d usr/lib/vmware/installer/VMware-VMvisor-big-3.5.0_Update_4-153875.i386.dd.bz2
出てきた「VMware-VMvisor-big-3.5.0_Update_4-153875.i386.dd」を dd でUSBメモリにコピー。※WIN!!な人はWinDDとか使うがいいです。&#160;&#160;&#160; $ dd if=VMware-VMvisor-big-3.5.0_Update_2-153875.i386.dd of=/dev/sdb bs=1024&#160;&#160;&#160; ※dd の引数of=は必ず実行中の環境に合わせてください！！




こんな感じの手順で起動用のUSBメモリが作れました。実際にUSBメモリを挿してブートする前に、BIOSの起動順序のところでUSBメモリを上位に設定しておきます。


HDDのインターフェースがIDEなウチのDimension君なんですが、USBブートしてみるとちゃんと認識されてました！！もちろんNICも問題なし！！SATAのみのサポートっぽいことが随所に書いてある ESXi だったのでかなりビクビクしてましたが、要らぬ心配だったみたいです。起動後にモニタに表示されるURLを叩いて、表示されたページから VMware Infrastructure Client をダウンロードします。「〜.exe」ってなってるのでWindows用ですか。ですよね。MacOSXなのに・・・。


で、VMware Infrastructure Client で一通り画面をみつつ、やっぱりHDDにインストールすることにしました。（USBメモリ他にも使うし。。）
手順は↑で使ったインストールCDイメージをCDに焼いて、CDブートして、普通にインストールするだけ。・・・かと思ったら途中で


Installation operation Failed!The installation [...]]]></description>
			<content:encoded><![CDATA[<p>
こんにちは、おがしょ〜です。<br />
タイトルどおりですが、今回は「やってみた」系です。<br />
<br />
内容は「ESXiをUSBメモリブート &gt; ESXi 3.5 のインストール &gt;<a href="http://jp.sun.com/products/software/virtualbox/"> Sun xVM VirtualBox</a> で使用していたVMをインポート &gt; 実行」って感じです。バージョンは v4 と v3.5 の2種類あるようですが、なんとなく x64=v4、x86=v3.5 みたいな感じがしたので今回は <b><font>v3.5update4</font></b> をチョイスしました。まったく使用されないまま足下に転がってるDELLが不憫でESXiを入れてみました。<br />
　（ほんとは <a href="http://http//ja.wikipedia.org/wiki/Xen_%28%E4%BB%AE%E6%83%B3%E5%8C%96%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%29">XEN</a> にしようとしてましたが、、面倒くさいので、、、、<br />
興味の無い人にはまったく興味ない分野ですね、すいません(・∀・)<br />
<br />
<br />
以下さくっと<a href="http://www.vmware.com/jp/products/esxi/">VMware ESXi</a>の説明。<br />
</p>
<blockquote><p>
<ol><li>仮想OSを実行するための仮想機械（バーチャルマシン）。</li>
<li>いわゆるType1<a href="http://ja.wikipedia.org/wiki/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%BC%E3%83%90%E3%82%A4%E3%82%B6">ハイパーバイザ</a>と呼ばれる（VirtualBox とか VMware Server とかはType2）。</li>
<li>実行するマシンを選ぶが、その分ホストOSが必要ない。→余計なボトルネックが少ない</li><li>基本Intelのチップセットを所望される模様→特に NIC と StorageAdapter</li>
<li>無償である。（※商用利用の場合とかは調べてません）</li>
</ol>
</p></blockquote>
<p>
<br />
<br />
一番はじめ、ESXiがよくわからなかった時、知見のある方から「まずUSBメモリからブートしてみればいいよ」との助言を頂いたのでさっそく<a href="http://www.google.co.jp/search?hl=ja&amp;safe=off&amp;q=ESXi+USB%E3%83%A1%E3%83%A2%E3%83%AA&amp;btnG=%E6%A4%9C%E7%B4%A2&amp;lr=">ググって</a>みる。（T様ありがとうございます！！）するとだいたい・・・<br />
</p>
<blockquote><p>
<ol><li>インストールCDイメージを<a href="https://www.vmware.com/jp/tryvmware/?p=esxi">ダウンロード</a>する。ちなみに、結構面倒な登録フォームでユーザー登録（無料）をする必要があります。</li><li>ダウンロードしたイメージをマウントして中身の「install.tgz」を適当な場所に解凍する。</li>
<li>さらにその中の「usr/lib/vmware/installer/VMware-VMvisor-big-3.5.0_Update_4-153875.i386.dd.bz2」を解凍する。&nbsp;&nbsp;&nbsp; $ bzip2 -d usr/lib/vmware/installer/VMware-VMvisor-big-3.5.0_Update_4-153875.i386.dd.bz2</li>
<li>出てきた「VMware-VMvisor-big-3.5.0_Update_4-153875.i386.dd」を dd でUSBメモリにコピー。※WIN!!な人は<a href="http://sourceforge.net/projects/windd">WinDD</a>とか使うがいいです。&nbsp;&nbsp;&nbsp; $ dd if=VMware-VMvisor-big-3.5.0_Update_2-153875.i386.dd <b>of=/dev/sdb</b> bs=1024&nbsp;&nbsp;&nbsp; ※dd の引数of=は必ず実行中の環境に合わせてください！！</li>
</ol>
</p></blockquote>
<p>
<br />
こんな感じの手順で起動用のUSBメモリが作れました。実際にUSBメモリを挿してブートする前に、BIOSの起動順序のところでUSBメモリを上位に設定しておきます。<br />
<br />
<br />
HDDのインターフェースがIDEなウチのDimension君なんですが、USBブートしてみるとちゃんと認識されてました！！もちろんNICも問題なし！！SATAのみのサポートっぽいことが随所に書いてある ESXi だったのでかなりビクビクしてましたが、要らぬ心配だったみたいです。起動後にモニタに表示されるURLを叩いて、表示されたページから VMware Infrastructure Client をダウンロードします。「〜.exe」ってなってるのでWindows用ですか。ですよね。MacOSXなのに・・・。<br />
<br />
<br />
で、VMware Infrastructure Client で一通り画面をみつつ、やっぱりHDDにインストールすることにしました。（USBメモリ他にも使うし。。）<br />
手順は↑で使ったインストールCDイメージをCDに焼いて、CDブートして、普通にインストールするだけ。・・・かと思ったら途中で<br />
<br />
</p>
<blockquote><p><i>Installation operation Failed!The installation operation has encountered a fatal error:Unable to find a supported device to write the VMware ESX Server 3i 3.5.0 image to.</i><br />
</p></blockquote>
<p>
<br />
みたいなエラーでインストール出来ない！！<a href="http://www.google.co.jp/search?q=ESXi+%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB+IDE&amp;lr=lang_ja&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:ja-JP-mac:official&amp;client=firefox-a">ググって</a>みました。まさにドンぴしゃな素敵ページ発見！！<br />
<a href="http://techno-st.net/2009/01/23/vmware-esxi-ide-hdd.html">trial and error</a>様 &lt;<i>http://techno-st.net/2009/01/23/vmware-esxi-ide-hdd.html</i>&gt;<br />
<br />
<br />
なるほど、インストール時の判定でIDEコントローラだと弾かれるのね。。<br />
Dimension8300はまったく同じ手順でIDE HDDを無事認識できました！！インストールも特に問題なく終了し、後はUSBメモリブートの時と同じでした。<br />
<br />
<br />
＝＝＝ タバコ休憩 ( ´ー｀)y-~~ ＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝<br />
<br />
<br />
そして、最後に既存の VirtualBox2.2 のVMをインポートします。<br />
手順は<br />
</p>
<blockquote><p>
<ol><li>VirtualBoxで仮想アプライアンスのエクスポート。「Write legacy OVF 0.9」にチェックを付けること。</li>
<li>VMware Infrastructure Clientで出力したOVFファイルをインポート。</li>
</ol>
</p></blockquote>
<p>
<br />
<br />
以上でOKなハズなんですが、インポート時にいくつかエラーが出たので、手でOVFファイルを修正する必要があります。エラーメッセージをメモってなかったので適当な表現で( TДT)ｺﾞﾒﾝﾖｰ<br />
</p>
<blockquote><p>
<ul><li>「Envelope」エレメントがなんとかかんとか、エラー<br />
<ul><li>VirtualBoxの出力では&lt;Envelope&gt;・・・&lt;/Envelope&gt;となってますが、ESXi的には&lt;ovf:Envelope&gt;・・・&lt;/ovf:Envelope&gt;にして欲しいようです。</li></ul></li><li>「ovf:version」属性がほげほげ、エラー<ul><li>&lt;ovf:Envelope ovf:version=&#8221;0.9&#8243; &#8230;&gt; と先頭にこの属性があるのが気に入らないようです。&lt;ovf:Envelope&nbsp;&nbsp; &#8230;.&nbsp; ovf:version=&#8221;0.9&#8243;&gt; のように最後にしてあげるとエラーが取れました。</li></ul></li><li>「vssd:VirtualSystemType」がエラー</li><ul><li>VirtualBoxでは「vmx-6」になってますが、ESXi3.5では「vmx-04」にするといいみたいです。ちなみにESXi4.0では「vmx-06」とかで、「xen3」とかもあるみたい？</li></ul><li>「disk1」のデバイスがおかしいっぽい？エラー<ul><li>VirtualBoxでIDEコントローラを使っていた場合に出るみたいで、ESXiではSCSIコントローラに置き換えてあげる必要があります。Itemエレメント「IDE Controller」を次の様に変更します。</li><ol><li>rasd:Description =&gt; &#8220;SCSI Controller&#8221;</li><li>rasd:ResourceType =&gt; &#8220;6&#8243;</li><li>rasd:ResourceSubType =&gt; &#8220;lsilogic&#8221;</li></ol></ul></li></ul>
</p></blockquote>
<p>
<br />
今回インポート時に出たエラーは以上です。<br />
<br />
ここまでの修正を施したOVFファイルを再度インポートします。エラーが出なければHDイメージファイル（vmdk）のアップロードが始まります。これがまた遅い・・・。2ファイル合計1.5GBほどで1時間くらいかかったと思います。<br />
<br />
<br />
ようやくインポートが終わったのでVMware Infrastructure ClientからVMを実行。VirtualMachinesタブを開いて、対象のVMを右クリックし、「Open Console」を選択するとコンソール画面が開きます。まだVMを起動してなければコンソール画面の右三角ボタンをクリックでインスタンスの起動が行えます。あと今更レビューなんですが、このクライアントソフト、UI言語は英語なんですが直感的で非常に使いやすいです。<br />
<br />
<br />
はじめてESXiで動かした感想、これは素晴らしい！！<br />
なんか、きっちりマシンリソースを使えてる感が気持ちいいです。<br />
Dimension8300 の CPU は Pentium4 の2.8GHzなんですが、はっきりいってう●■みたいな性能だと思ってました。ごめんなさいごめんなさい。。<br />
これからも色々実験台として活躍していただきます(´∀｀)<br />
<br />
<br />
なんだか無駄に長い割に役に立ちそうにないエントリですが、とりあえず今日はここまで。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.synapz.jp/ogsy/2009/06/vmware-esxi-dell-dimension8300/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP パフォーマンスチューニング Pt.2</title>
		<link>http://www.synapz.jp/ogsy/2009/04/cakephp-pt2/</link>
		<comments>http://www.synapz.jp/ogsy/2009/04/cakephp-pt2/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 10:14:07 +0000</pubDate>
		<dc:creator>ogsy</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[チューニング]]></category>
		<category><![CDATA[パフォーマンス]]></category>

		<guid isPermaLink="false">http://192.168.1.2/wpmu/ogsy/2009/04/20/cakephp-%e3%83%91%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%b3%e3%82%b9%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0-pt-2/</guid>
		<description><![CDATA[
こんにちは、おがしょ〜です。
前回の更新から1ヶ月以上が経過してしまいました。。

さて前回、


もっと細かく調べてみたところ、CakePHPのコア部分でいくつか微妙な箇所がありました。

モデルをたくさん使っているコントローラが遅い
セッションのストア先にmemcachedを指定すると遅い
ImageMagick（convert）の変換処理が遅い



と、3つの問題点を挙げていましたので、今回はそれについて適当なことを書いてみます。


まず1.の「モデルをたくさん使っているコントローラが遅い」について。
CakePHP1.2の便利な点として、割と使いやすいO/Rマッパーの存在があります。ざっくり言えばRDBをテーブル単位で構造化されたオブジェクト（モデルクラスとか）として扱える、ってそんな感じの機能です。さらにCakePHPでは、モデルとモデルの関連性を定義しておくことにより、O/Rマッパーが勝手に関連するものも取ってきてくれます。SQL的に言えばJOINするような感じで、これが超便利。


しかし、あまりに深い関連性を持たせるとなんでもかんでも取ってこられるので大変なことになります。
例えば、


ModelA =&#124;1:n&#124;= ModelB
ModelB =&#124;1:n&#124;= ModelC
ModelB =&#124;1:n&#124;= ModelD


と4つのモデルがこのような関係であった場合、ModelAのみ必要な場合に取得しようとすると、SQL的に &#8220;ModelA JOIN ModelB JOIN ModelC &#8230;&#8221; となってしまうとこは容易に想像つきますし、これは他の方も行っているexpectsメソッドを実装すれば割と簡単に解決できます。


でも問題はSQLクエリと結果の分量じゃなくて、CakePHPによって生成されるモデルインスタンス（と初期化時間）が問題でした。具体的には上記モデル構成の場合、リクエストのたびにModelA〜ModelDまでのインスタンスが必ず生成されます。expectsメソッドを実装したとしても、このインスタンス生成はコントローラの初期化時に行われるので全く効果がありません。


この辺りのCakePHPの動作をざっくりと･･･

コントローラの初期化
使用するモデル定義を見る
モデルインスタンスを作成
3.で作ったモデル内で、関連しているモデルインスタンスを作成
3〜4を関連するモデルすべてで行う。



という感じになっています。
4.の動作がとっても間抜けな感じで、作り手のモデル定義によってはシステム全体のモデルのインスタンスを生成することになってしまいます。


この問題の解決策としては、

コントローラにモデルを登録せずに、メソッド内で必要なモデルのみを動的にアタッチする。（できるかどうか不明）
モデルのインスタンス生成を実際に必要なときにのみ行う。




の2択で考えてましたが、
当時のプロジェクトの進行度的に、かなりの修正作業の入る選択肢1.は不可能でした。
で、２．を選びました。思いつきのキーポイントはisset()やget()など、PHPのマジックメソッド。



要は関連するモデルの関連性のみを覚えておいて、実際にアプリがそのモデルを使おうとした時に、まだ無ければ初めてインスタンスを生成しよう、ってことです。適用前はコントローラの初期化時にかなりの数のインスタンスが生成されてましたが、適用後はメソッドごと必要な分のインスタンスのみが生成されているようです。


実際のコードについては以前CakePHP.jpのフォーラムに投げておいたのでそっちを参照してください。
（まったく反応がないのでちょっと寂しかったり ｡･ﾟ･(ﾉД`)･ﾟ･｡

ちなみに上記フォーラムに上げたコードにはその後に見つかった致命的なバグが残ってますが、お暇な方は試してみてください。

・・・とここまでを読み返してみて、やっぱり自分には文才が無いことを再確認しました。
長くなったので今日はこの辺で。
]]></description>
			<content:encoded><![CDATA[<p>
こんにちは、おがしょ〜です。<br />
前回の更新から1ヶ月以上が経過してしまいました。。<br />
<br />
さて前回、<br />
</p>
<blockquote><p>
もっと細かく調べてみたところ、CakePHPのコア部分でいくつか微妙な箇所がありました。<br />
<ol>
<li>モデルをたくさん使っているコントローラが遅い</li>
<li>セッションのストア先にmemcachedを指定すると遅い</li>
<li>ImageMagick（convert）の変換処理が遅い</li>
</ol>
</p></blockquote>
<p>
と、3つの問題点を挙げていましたので、今回はそれについて適当なことを書いてみます。<br />
<br />
<br />
まず1.の「<b>モデルをたくさん使っているコントローラが遅い</b>」について。<br />
CakePHP1.2の便利な点として、割と使いやすい<a href="http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E9%96%A2%E4%BF%82%E3%83%9E%E3%83%83%E3%83%94%E3%83%B3%E3%82%B0">O/Rマッパー</a>の存在があります。ざっくり言えばRDBをテーブル単位で構造化されたオブジェクト（モデルクラスとか）として扱える、ってそんな感じの機能です。さらにCakePHPでは、モデルとモデルの関連性を定義しておくことにより、O/Rマッパーが勝手に関連するものも取ってきてくれます。SQL的に言えばJOINするような感じで、これが超便利。<br />
<br />
<br />
しかし、あまりに深い関連性を持たせるとなんでもかんでも取ってこられるので大変なことになります。<br />
例えば、<br />
</p>
<blockquote><p>
ModelA =|1:n|= ModelB<br />
ModelB =|1:n|= ModelC<br />
ModelB =|1:n|= ModelD<br />
</p></blockquote>
<p>
と4つのモデルがこのような関係であった場合、ModelAのみ必要な場合に取得しようとすると、SQL的に &#8220;ModelA JOIN ModelB JOIN ModelC &#8230;&#8221; となってしまうとこは容易に想像つきますし、これは他の方も行っている<a href="http://www.google.co.jp/search?q=cakephp+expects&amp;lr=lang_ja&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=org.mozilla:ja-JP-mac:official&amp;client=firefox-a">expectsメソッド</a>を実装すれば割と簡単に解決できます。<br />
<br />
<br />
でも問題はSQLクエリと結果の分量じゃなくて、<b>CakePHPによって生成されるモデルインスタンス</b>（と初期化時間）が問題でした。具体的には上記モデル構成の場合、リクエストのたびにModelA〜ModelDまでのインスタンスが必ず生成されます。expectsメソッドを実装したとしても、このインスタンス生成はコントローラの初期化時に行われるので全く効果がありません。<br />
<br />
<br />
この辺りのCakePHPの動作をざっくりと･･･<br />
<ol>
<li>コントローラの初期化</li>
<li>使用するモデル定義を見る</li>
<li>モデルインスタンスを作成</li>
<li>3.で作ったモデル内で、関連しているモデルインスタンスを作成</li>
<li>3〜4を関連するモデルすべてで行う。</li>
</ol>
<br />
<br />
という感じになっています。<br />
4.の動作がとっても間抜けな感じで、作り手のモデル定義によってはシステム全体のモデルのインスタンスを生成することになってしまいます。<br />
<br />
<br />
この問題の解決策としては、<br />
<ol>
<li>コントローラにモデルを登録せずに、メソッド内で必要なモデルのみを動的にアタッチする。（できるかどうか不明）</li>
<li>モデルのインスタンス生成を実際に必要なときにのみ行う。<br />
</li>
</ol>
<br />
<br />
の2択で考えてましたが、<br />
当時のプロジェクトの進行度的に、かなりの修正作業の入る選択肢1.は不可能でした。<br />
で、２．を選びました。思いつきのキーポイントは<strong>isset()や</strong>get()など、PHPの<a href="http://php.benscom.com/manual/ja/language.oop5.magic.php">マジックメソッド</a>。<br />
<br />
<br />
<br />
要は関連する<b>モデルの関連性のみ</b>を覚えておいて、実際にアプリがそのモデルを使おうとした時に、まだ無ければ初めてインスタンスを生成しよう、ってことです。適用前はコントローラの初期化時にかなりの数のインスタンスが生成されてましたが、適用後はメソッドごと必要な分のインスタンスのみが生成されているようです。<br />
<br />
<br />
実際のコードについては以前<b><a href="http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1798&amp;forum=6">CakePHP.jpのフォーラムに投げておいた</a></b>のでそっちを参照してください。<br />
（まったく反応がないのでちょっと寂しかったり ｡･ﾟ･(ﾉД`)･ﾟ･｡<br />
<br />
ちなみに上記フォーラムに上げたコードにはその後に見つかった致命的なバグが残ってますが、お暇な方は試してみてください。<br />
<br />
・・・とここまでを読み返してみて、やっぱり自分には文才が無いことを再確認しました。<br />
長くなったので今日はこの辺で。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.synapz.jp/ogsy/2009/04/cakephp-pt2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CakePHP パフォーマンスチューニング</title>
		<link>http://www.synapz.jp/ogsy/2009/03/cakephp/</link>
		<comments>http://www.synapz.jp/ogsy/2009/03/cakephp/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 09:29:50 +0000</pubDate>
		<dc:creator>ogsy</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[プログラミング]]></category>

		<guid isPermaLink="false">http://192.168.1.2/wpmu/ogsy/2009/03/05/cakephp-%e3%83%91%e3%83%95%e3%82%a9%e3%83%bc%e3%83%9e%e3%83%b3%e3%82%b9%e3%83%81%e3%83%a5%e3%83%bc%e3%83%8b%e3%83%b3%e3%82%b0/</guid>
		<description><![CDATA[
こんにちは、おがしょ〜です。

現在進行中のプロジェクトでCakePHPなるフレームワークを使っているんですが、これが機能満載で思いのほか重い。使用しているバージョンは 1.2RC3 です。「CakePHP パフォーマンス」とかでググってみると1.1に比べてだいぶ遅いというベンチマーク結果などが出てきました。やっぱり。。


とはいえ開発も終盤でフレームワークの変更はしたくないですし、メインの開発陣とは別にチューニング箇所について調査することにしました。まずシステム構成ですが、

Linux（なんだっけ？）
Apache2
mysql5
mod_php5


まんまLAMPですね。
あとはアプリ側キャッシュにmemcachedを使ってたり、画像配信にSquidを前に立てたりします。


で、PHP＆CakePHP側の主要な構成ですが、

コードキャッシュ＆ローカルキャッシュにはAPCをチョイス。CakeのCacheエンジンはAPCとMemcacheを用途に応じて切り替え。
Memcachedは複数サーバから同じデータを参照する必要のあるものにのみ使用する。それ以外のどうでもいいキャッシュはAPCに格納する。パフォーマンスはたぶんローカルmemcachedと同じようなものかと。
・・・な感じでしょうか。


まず、Apacheについてくる ab（ApacheBench） コマンドで実際のページのパフォーマンスを計測していきます。

&#62;&#160; $ ab http://example.jp/
コマンド終了時に表示された内容の「Requests per second: x.xx [#/sec]」の部分でだいたいの性能をみます。秒間n回リクエストを捌きました的な意味合いだと思います。


どんな数字が出れば速いのか？の基準については私もよくわかりません；；ただ体感的に考えて、1#/sec 程度だとブラウザの表示に最低1秒以上かかってることになるのであまりよろしくないですよね。この辺りの判断は人によります、たぶん・・・。


で、abで計測した結果をみて思ったことは、「なんか全体的に同じように遅い」でした。商品DBなんかの検索機能のあるページとかが飛び抜けて遅いだけなら複雑なSQLクエリとかが原因と考えられたりしますが、どうもそうではない様子。もっと細かく調べてみたところ、CakePHPのコア部分でいくつか微妙な箇所がありました。

モデルをたくさん使っているコントローラが遅い
セッションのストア先にmemcachedを指定すると遅い
ImageMagick（convert）の変換処理が遅い



3はCakePHP関係ないですね；結論からいうと上記3つが主なボトルネックでして、解決することでかなりのパフォーマンスアップが図れました！が、長くなりそうなので解決編は次回以降のエントリに分けます･･･。
]]></description>
			<content:encoded><![CDATA[<p>
こんにちは、おがしょ〜です。<br />
<br />
現在進行中のプロジェクトでCakePHPなるフレームワークを使っているんですが、これが機能満載で思いのほか重い。使用しているバージョンは 1.2RC3 です。「CakePHP パフォーマンス」とかでググってみると1.1に比べてだいぶ遅いというベンチマーク結果などが出てきました。やっぱり。。<br />
<br />
<br />
とはいえ開発も終盤でフレームワークの変更はしたくないですし、メインの開発陣とは別にチューニング箇所について調査することにしました。まずシステム構成ですが、<br />
<ul>
<li>Linux（なんだっけ？）</li>
<li>Apache2</li>
<li>mysql5</li>
<li>mod_php5</li>
</ul>
<br />
まんま<a href="http://ja.wikipedia.org/wiki/LAMP">LAMP</a>ですね。<br />
あとはアプリ側キャッシュに<a href="http://ja.wikipedia.org/wiki/Memcached">memcached</a>を使ってたり、画像配信に<a href="http://ja.wikipedia.org/wiki/Squid_cache">Squid</a>を前に立てたりします。<br />
<br />
<br />
で、PHP＆CakePHP側の主要な構成ですが、<br />
<ul>
<li>コードキャッシュ＆ローカルキャッシュには<a href="http://jp.php.net/manual/ja/intro.apc.php">APC</a>をチョイス。</li><li>CakeのCacheエンジンはAPCとMemcacheを用途に応じて切り替え。</li>
<li>Memcachedは複数サーバから同じデータを参照する必要のあるものにのみ使用する。それ以外のどうでもいいキャッシュはAPCに格納する。パフォーマンスはたぶんローカルmemcachedと同じようなものかと。</li>
</ul>・・・な感じでしょうか。<br />
<br />
<br />
まず、Apacheについてくる <a href="http://www.itmedia.co.jp/help/tips/linux/l0500.html">ab（ApacheBench）</a> コマンドで実際のページのパフォーマンスを計測していきます。<br />
<br />
&gt;&nbsp; $ ab http://example.jp/<br />
コマンド終了時に表示された内容の「Requests per second: x.xx [#/sec]」の部分でだいたいの性能をみます。秒間n回リクエストを捌きました的な意味合いだと思います。<br />
<br />
<br />
どんな数字が出れば速いのか？の基準については私もよくわかりません；；ただ体感的に考えて、1#/sec 程度だとブラウザの表示に最低1秒以上かかってることになるのであまりよろしくないですよね。この辺りの判断は人によります、たぶん・・・。<br />
<br />
<br />
で、abで計測した結果をみて思ったことは、「なんか全体的に同じように遅い」でした。商品DBなんかの検索機能のあるページとかが飛び抜けて遅いだけなら複雑なSQLクエリとかが原因と考えられたりしますが、どうもそうではない様子。もっと細かく調べてみたところ、CakePHPのコア部分でいくつか微妙な箇所がありました。<br />
<ol>
<li>モデルをたくさん使っているコントローラが遅い</li>
<li>セッションのストア先にmemcachedを指定すると遅い</li>
<li>ImageMagick（convert）の変換処理が遅い</li>
</ol>
<br />
<br />
3はCakePHP関係ないですね；結論からいうと上記3つが主なボトルネックでして、解決することでかなりのパフォーマンスアップが図れました！が、長くなりそうなので解決編は次回以降のエントリに分けます･･･。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.synapz.jp/ogsy/2009/03/cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>1ヶ月遅れの初心表明</title>
		<link>http://www.synapz.jp/ogsy/2009/03/post-1/</link>
		<comments>http://www.synapz.jp/ogsy/2009/03/post-1/#comments</comments>
		<pubDate>Thu, 05 Mar 2009 09:11:35 +0000</pubDate>
		<dc:creator>ogsy</dc:creator>
				<category><![CDATA[雑記]]></category>

		<guid isPermaLink="false">http://192.168.1.2/wpmu/ogsy/2009/03/05/1%e3%83%b6%e6%9c%88%e9%81%85%e3%82%8c%e3%81%ae%e5%88%9d%e5%bf%83%e8%a1%a8%e6%98%8e/</guid>
		<description><![CDATA[
こんにちは、2009年2月入社のおがしょ〜です。

シナプスでは初社員として迎えていただき、いろんな期待と不安が入り交じっております。それと、ブログスペースは入社後すぐに作っていただきましたが、時間が作れず中々カキコできませんでした。関係者のみなさま、どうもすいません＆ありがとうございますm(__)m

さて、業務の内容ですが主にLAMPやLAMRなどを用いたWebサービス開発です。といってもすぐにバリバリコーディングは無理なので、現在はサポート要員な立ち位置ですが。

今までのWebサービスの経験はASP、JSP、PHPを各1〜2年程度です。最近ようやくMVCが理解できるようになったレベルです&#8230;orz

今後はそんなヘタレ社員の視点から見たWebサービス開発のノウハウをあげていこうと思います。たまに意味不明なエントリがあるかもしれませんが、そこは生暖かく見守っていただければ幸いです。
]]></description>
			<content:encoded><![CDATA[<p>
こんにちは、2009年2月入社のおがしょ〜です。<br />
<br />
シナプスでは初社員として迎えていただき、いろんな期待と不安が入り交じっております。それと、ブログスペースは入社後すぐに作っていただきましたが、時間が作れず中々カキコできませんでした。関係者のみなさま、どうもすいません＆ありがとうございますm(__)m<br />
<br />
さて、業務の内容ですが主に<a href="http://ja.wikipedia.org/wiki/LAMP">LAMP</a>やLAMRなどを用いたWebサービス開発です。といってもすぐにバリバリコーディングは無理なので、現在はサポート要員な立ち位置ですが。<br />
<br />
今までのWebサービスの経験はASP、JSP、PHPを各1〜2年程度です。最近ようやく<a href="http://ja.wikipedia.org/wiki/Model_View_Controller">MVC</a>が理解できるようになったレベルです&#8230;orz<br />
<br />
今後はそんなヘタレ社員の視点から見たWebサービス開発のノウハウをあげていこうと思います。たまに意味不明なエントリがあるかもしれませんが、そこは生暖かく見守っていただければ幸いです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.synapz.jp/ogsy/2009/03/post-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
