今回は自分の備忘録のためのエントリです。
ユーザー認証などで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? {|s| states.include?(s)} cond = [] cond_param = [] target_states.each do |st| cond << "#{table_name}.#{state_column} = ?" cond_param << st.to_s end with_scope :find => {:conditions => [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 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 << "?"
cond_param << st.to_s
end
with_scope :find => {:conditions => ["#{table_name}.#{aasm_column} IN (#{cond.join(', ')})", cond_param].flatten} do
yield if block_given?
end
end
end
end
end
end
↓できた (n'∀')η
まだgemとかよくわかってないのGitHubでForkして修正して・・・とかやりたかったけど無理でした。
先は長いなぁ〜。
おまけ。
ステートマシンについてはこちらのページが詳しいです。
境界を越える: Rails での拡張
今回は開発したアプリを実行させる環境についてですが、レンタルサーバーのホスティング、ハウジング、クラウドの利用などいろいろな選択肢があります。
弊社は現在、コストパフォーマンスと調達期間の関係でAmazon EC2をメインで使ってます。
EC2、安いんです。初期費用とか無いですし。
月の転送料とか、従量制課金の部分をいれても仮想マシン1台あたり月1万もいかないんじゃないでしょうか。
普通のホスティング(専用サーバー)でやろうとすると、スタート月は初期費用込みで10万近くなりますよね、たぶん。
しかしEC2って、CPUの処理速度はまぁまぁなんですが転送速度がとにかく遅い。。
SSH中の文字とか、ヌルヌルです(´Д`)
通説で日本ー米国間の物理的なネットワーク遅延が原因だと言われています。
といっても200〜300msくらいの遅延で、そこそこレベルのウェブサービス運用ではそんなに影響することはないと考えてますが。
で、やっぱり国内にサーバーがあればなぁ、ってなります。
10/1付けだけど今日見つけたニュース(Impress EnterpriseWatchより)↓
ITコア、「Amazon EC2より安い」仮想化ホスティングサービス「GS10」きましたね!国産EC2の対抗が!
GrowServer2010の略称でGS10っていうみたいです。
仮想マシンのラインナップは以下のとおり。(モデル価格表をコピペ)
モデル メモリ CPU ディスク(実効)※1 月額費用うーん、できればメモリ2GBのCPU1コアで¥15,000のS1.5(仮)モデルも作ってほしかった。。
S1 1GB 1コア 30GB ¥10,000
S2 2GB 2コア 30GB ¥20,000
S4 4GB 2コア 30GB ¥30,000
S8 8GB 4コア 30GB ¥50,000
- 初期費は無料です。
- 契約単位は1ヶ月です。
- お支払は前払いとなります。
※1 3重化DISK
仮想化にはVMware vSphereを使ってる模様。
VMの設定はvCenterのUIを直接使えたりするのかな?んなわけないか。
OSのインストールまではどうやってやるのか、とかよくわかってません。
このGS10、転送料無料な上24時間監視やロードバランサーが無料で月1万円は安いと思いますが、どうでしょうか?
さらにダメ押しでSLAは驚異の99.99%(!!)だそうです。
サービスインは11月1日からみたいですが、期待してます。
またEC2との比較テストでもできればまたレポートしてみたいと思います。
こんにちは、最近めっきり(なにが?)なおがしょ〜です。
ここ数ヶ月はずっとRubyOnRailsを勉強してますが、ようやく数%くらいわかってきた気がします。
さて、本題。
ウェブアプリケーションで親子関係のあるデータを一覧表示しようとする場合で、子供側のデータを COUNT(*) してみたりしたくなる時があると思います(あるよね?ね??)。
深く考えず、はじめにRailsでやってみたのはこんな感じでした↓
# モデル:item.rb class Item < ActiveRecord::Base # col: id # col: name has_many :sub_item end # モデル:sub_item.rb class SubItem < ActiveRecord::Base # col: id # col: item_id # col: name belongs_to :item end # アクション:items_controller.rb def index @items = Item.find :all end # ビュー:items/index.html.erb <% @items.each do |item| %> <%=h item.sub_items.count %><!— 小モデルの合計を表示する —> <% end %>
上記コードで問題なく実行できましたが、発行されるSQL文は
親モデルのSELECT文+(小モデルのSELECT文×行数)
となり、非常に無駄な気がします。
サブクエリを使えばSQL文は1つで済みますよね。
プラグインとか他のやり方とか探したんですが、findbysql()をする以外の方法が見つからなかったので、簡単にサブクエリを使ったカラムがモデルに追加できるプラグインを作ってみました。
http://github.com/ogasyo/subquerycolumn
以下のコマンドでさくっとインストールして、
$ script/plungin install git://github.com/ogasyo/subquerycolumn.git
親モデルとコントローラーのfind()部分を以下の用に修正するだけ。
# モデル:item.rb class Item < ActiveRecord::Base # col: id # col: name hasmany :sub_item sub_query_column :count_sub_items, :type => :integer, :query => “SELECT COUNT(id) FROM sub_items where sub_items.item_id = items.id” end # アクション:items_controller.rb def index @items = Item.with_sub_query.find :all end
ビュー側での値の取得はこんな感じです↓
<%=h item.count_sub_items %><!— NEW! 小モデルの合計を表示する —>
以上で超簡単にできます。
サクッと簡単に作ったプラグインなのでテストはありませんし、バグもあると思います。
利用する場合はきっちりデバッグを行うようにオヌヌメします。
できればGitHubでForkして改良してくれれば最高です(他力本願
#あと、他の方法でこんなのあるよ、とかもうすでに同じのあるだろ、とかはこっそり教えてくれるとありがたいです。。
タイトルどおりですが、今回は「やってみた」系です。
内容は「ESXiをUSBメモリブート > ESXi 3.5 のインストール > Sun xVM VirtualBox で使用していたVMをインポート > 実行」って感じです。
バージョンは 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様ありがとうございます!!)
するとだいたい・・・
こんな感じの手順で起動用のUSBメモリが作れました。
- インストールCDイメージをダウンロードする。
ちなみに、結構面倒な登録フォームでユーザー登録(無料)をする必要があります。- ダウンロードしたイメージをマウントして中身の「install.tgz」を適当な場所に解凍する。
- さらにその中の「usr/lib/vmware/installer/VMware-VMvisor-big-3.5.0_Update_4-153875.i386.dd.bz2」を解凍する。
$ 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とか使うがいいです。
$ dd if=VMware-VMvisor-big-3.5.0_Update_2-153875.i386.dd of=/dev/sdb bs=1024
※dd の引数of=は必ず実行中の環境に合わせてください!!
実際に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 operation has encountered a fatal error:
Unable to find a supported device to write the VMware ESX Server 3i 3.5.0 image to.
ググってみました。
まさにドンぴしゃな素敵ページ発見!!
trial and error様 <http://techno-st.net/2009/01/23/vmware-esxi-ide-hdd.html>
なるほど、インストール時の判定でIDEコントローラだと弾かれるのね。。
Dimension8300はまったく同じ手順でIDE HDDを無事認識できました!!
インストールも特に問題なく終了し、後はUSBメモリブートの時と同じでした。
=== タバコ休憩 ( ´ー`)y-~~ ================
そして、最後に既存の VirtualBox2.2 のVMをインポートします。
手順は
以上でOKなハズなんですが、インポート時にいくつかエラーが出たので、手でOVFファイルを修正する必要があります。
- VirtualBoxで仮想アプライアンスのエクスポート。
「Write legacy OVF 0.9」にチェックを付けること。- VMware Infrastructure Clientで出力したOVFファイルをインポート。
エラーメッセージをメモってなかったので適当な表現で( TДT)ゴメンヨー
- 「Envelope」エレメントがなんとかかんとか、エラー
- VirtualBoxの出力では<Envelope>・・・</Envelope>となってますが、ESXi的には<ovf:Envelope>・・・</ovf:Envelope>にして欲しいようです。
- 「ovf:version」属性がほげほげ、エラー
- <ovf:Envelope ovf:version="0.9" ...> と先頭にこの属性があるのが気に入らないようです。
<ovf:Envelope .... ovf:version="0.9"> のように最後にしてあげるとエラーが取れました。
- <ovf:Envelope ovf:version="0.9" ...> と先頭にこの属性があるのが気に入らないようです。
- 「vssd:VirtualSystemType」がエラー
- VirtualBoxでは「vmx-6」になってますが、ESXi3.5では「vmx-04」にするといいみたいです。
ちなみにESXi4.0では「vmx-06」とかで、「xen3」とかもあるみたい? - 「disk1」のデバイスがおかしいっぽい?エラー
- VirtualBoxでIDEコントローラを使っていた場合に出るみたいで、ESXiではSCSIコントローラに置き換えてあげる必要があります。
Itemエレメント「IDE Controller」を次の様に変更します。 - rasd:Description => "SCSI Controller"
- rasd:ResourceType => "6"
- rasd:ResourceSubType => "lsilogic"
- VirtualBoxでIDEコントローラを使っていた場合に出るみたいで、ESXiではSCSIコントローラに置き換えてあげる必要があります。
ここまでの修正を施したOVFファイルを再度インポートします。
エラーが出なければHDイメージファイル(vmdk)のアップロードが始まります。
これがまた遅い・・・。2ファイル合計1.5GBほどで1時間くらいかかったと思います。
ようやくインポートが終わったのでVMware Infrastructure ClientからVMを実行。
VirtualMachinesタブを開いて、対象のVMを右クリックし、「Open Console」を選択するとコンソール画面が開きます。
まだVMを起動してなければコンソール画面の右三角ボタンをクリックでインスタンスの起動が行えます。
あと今更レビューなんですが、このクライアントソフト、UI言語は英語なんですが直感的で非常に使いやすいです。
はじめてESXiで動かした感想、これは素晴らしい!!
なんか、きっちりマシンリソースを使えてる感が気持ちいいです。
Dimension8300 の CPU は Pentium4 の2.8GHzなんですが、はっきりいってう●■みたいな性能だと思ってました。ごめんなさいごめんなさい。。
これからも色々実験台として活躍していただきます(´∀`)
なんだか無駄に長い割に役に立ちそうにないエントリですが、とりあえず今日はここまで。
今日中にシナプスマップ(仮)についてのエントリを書いてしまうと言ってしまったのでやります。やればできる子ですから。
さて今度はシナプスのラスボス的存在の遠藤さんについてです。
遠藤さんと実際に会ったのはサバゲーでだったんで、仕事のやり方とか中身についてはまったく把握してませんでした。
サバゲーでの第一印象を今ぶっちゃけて言うと クールな素敵めがね兄さん って感じです。
すごく似合っていると思うので めがね は外せません。
では例によってエピソードを紹介します。
Apple好き
たぶん病気か信者です。
もしAppleが白物家電を作っていたら間違いなく買ってるでしょう。
その影響かどうかは知りませんが、弊社では業務用のPCとして自動的(強制てk)にMacが割り当てられます。
自分も昔はMac信者でしたが今のOSXはほとんど触ったことがありませんでした。
入社後はしばらくMacOSXとの格闘をしてましたが、その時に遠藤さんに色々教えてもらい今はなんとか使えてます。
趣味 > カート | 性格 > 負けず嫌い
去年からみんなでサバゲーに加えてカートもやり出しました。
1回目の時はだいたいみんな同じようなタイムでしたが、2回目、3回目と行くうちに遠藤さんが素人グループでは一番速いところまで行ってました。
自分はそれまでずっと遠藤さんの後ろの2番手ポジションだったんですが、くやしくて単独でコソ連をしたときにようやく抜くことができました。
その報告を当時プロジェクトが佳境に入って激務だった遠藤さんに報告したところ、「俺はそんなタイム認めねー!」と言われました・・・。
こっちは行きたくても行けないのに、コソ連とかずるいのでとりあえずそのタイム却下ね、みたいな。
その後今に至るまでシナプスカート部の活動が出来てませんが、きっと次に行ったとき僕のタイムは抜かれることでしょう(笑
趣味 > サバゲー > ポリタン王子
サバイバルゲームを知らない人にはあまりわからないと思いますが印象深いので。
サバゲーで行うゲームの種類で「ポリタンク戦」という、1人がキーアイテムを奪取してその人が相手陣地に潜入成功すると勝ち、っていうがあります。
遠藤さんはそのポリタンク戦の時にポリタンクを持たせると、なんと成功率100%!! (おがしょ調べ
普段そんなに前へ前へというタイプではないと思うのですが、スポットライトが当たった瞬間にものすごい輝きを放ちます。
勝負強いってことなんしょうか。
仕事 > 生涯エンジニア
自分はエンジニアとしていつまで前線に居られるかを考えたとき、巷でよく言われる「プログラマ35歳定年説」を肯定的に考えてしまいます。
35歳から先でずっとプログラマとしてやれるのかどうか、そんな話を2人でしていたときに遠藤さんは「俺はずっとプログラムやりますよ」と迷い無く言ってました。
正直色々と限界が見えていた(自分で作った限界?)時だっただけに、非常にカッコいいなぁと思ったのを覚えています。
まだまだありますが、とりあえず今回は以上です。
ちなみに山本さん、遠藤さんのマインドマップでボケてて見えない部分は社外秘です。
どうしても気になる方はこちらへどうぞ!
こんにちは、おがしょーです。
社内組織図のかわりにマインドマップで相手を書いてみようということで、弊社ボスの山本さんについて書いてみました。
2009年5月時点でだいたいこんな感じですね。
まだまだ頭の中ではありそうなんですが、アウトプットするとなると結構難しい・・・。
このままだとただの自分だけの記憶の鍵にしかならないので、遠藤さんたちのようにいくつかエピソードを紹介します。
サバゲー > 尻もち > 腰が弱点
よく転けてます。
もちろんサバイバルゲームの最中にですが、雨が降ってるとか前日まで降ってたとかで地面がぬかるんでるような日は必ず転けてます。
しかも、だいたいいつも盛大に尻もちをついているので腰にダメージを受けます。
前は尾てい骨にヒビが入ったとか言ってたような・・・?
今回は大丈夫でしょうか(笑
仕事 > 営業 > 巧みな話術
「営業」という分類にしてますがたぶんその枠では収まりません。
とにかく口がうまいです。もちろん良い意味でですが。
手法としては、相手を納得させる、もしくは相手を安心させるところから入るってのを自然とやっているように見えます。
持ち味のフレンドリーを盾に相手も気持ちよくしつつ、自分の目的を達している様は是非見習っていきたいところだと感じています。
その中の言葉で「〜っぽい」や「〜〜とか」という言い回しをよくします。
最近自分もうつってしまっているようでちょっと困ってますw
性格 > 利益優先主義 > 嫌なことは嫌と言える人
言葉が間違っているかもしれませんが「利益優先」な感じです。
それは自分自身のいやらしい利益が云々という意味ではなく、例えば仕事なら「お客様にとっての利益」や「運営者の利益」をキチンと判断し、そのバランスをどうとるのかをちゃんと考えられているという意味です。
そしてその考えがあるから「嫌なことは嫌」と言えるのでしょうね。
今まで割とYESManで典型的なジャパニーズサラリーマン風の方との交流が多かったのですが、ここまではっきり我を持ってる人とは久しぶりに出会いました。
この点は非常にリスペクトしております。
酒好き > 酔うとたまにめんどくさい
Synapz入社前の話ですが、夜中0時過ぎにかかってくる電話はだいたい山本さんでした(笑
その時間帯の電話では100%確実に酔っぱらっているので終始変なテンションで話してきます。
話の内容は世間話から仕事の話まで色々ですが、だいたいは山本さんが言いたいことを言って最後に「あ、電車着たから切るね」で終了のパターンでしたw
たぶん一人暮らしの自分に気をかけてくれていたんでしょうね・・・。
でもE藤さんと2人で酔っぱらって今から10時に渋谷に来いって電話だけは勘弁してください><
とりあえず以上な感じです的な。
こんにちは、おがしょ〜です。
前回の更新から1ヶ月以上が経過してしまいました。。
さて前回、
もっと細かく調べてみたところ、CakePHPのコア部分でいくつか微妙な箇所がありました。と、3つの問題点を挙げていましたので、今回はそれについて適当なことを書いてみます。
- モデルをたくさん使っているコントローラが遅い
- セッションのストア先にmemcachedを指定すると遅い
- ImageMagick(convert)の変換処理が遅い
まず1.の「モデルをたくさん使っているコントローラが遅い」について。
CakePHP1.2の便利な点として、割と使いやすいO/Rマッパーの存在があります。
ざっくり言えばRDBをテーブル単位で構造化されたオブジェクト(モデルクラスとか)として扱える、ってそんな感じの機能です。
さらにCakePHPでは、モデルとモデルの関連性を定義しておくことにより、O/Rマッパーが勝手に関連するものも取ってきてくれます。
SQL的に言えばJOINするような感じで、これが超便利。
しかし、あまりに深い関連性を持たせるとなんでもかんでも取ってこられるので大変なことになります。
例えば、
ModelA =|1:n|= ModelBと4つのモデルがこのような関係であった場合、ModelAのみ必要な場合に取得しようとすると、SQL的に "ModelA JOIN ModelB JOIN ModelC ..." となってしまうとこは容易に想像つきますし、これは他の方も行っているexpectsメソッドを実装すれば割と簡単に解決できます。
ModelB =|1:n|= ModelC
ModelB =|1:n|= ModelD
でも問題はSQLクエリと結果の分量じゃなくて、CakePHPによって生成されるモデルインスタンス(と初期化時間)が問題でした。
具体的には上記モデル構成の場合、リクエストのたびにModelA〜ModelDまでのインスタンスが必ず生成されます。
expectsメソッドを実装したとしても、このインスタンス生成はコントローラの初期化時に行われるので全く効果がありません。
この辺りのCakePHPの動作をざっくりと・・・
- コントローラの初期化
- 使用するモデル定義を見る
- モデルインスタンスを作成
- 3.で作ったモデル内で、関連しているモデルインスタンスを作成
- 3〜4を関連するモデルすべてで行う。
4.の動作がとっても間抜けな感じで、作り手のモデル定義によってはシステム全体のモデルのインスタンスを生成することになってしまいます。
この問題の解決策としては、
- コントローラにモデルを登録せずに、メソッド内で必要なモデルのみを動的にアタッチする。(できるかどうか不明)
- モデルのインスタンス生成を実際に必要なときにのみ行う。
の2択で考えてましたが、当時のプロジェクトの進行度的に、かなりの修正作業の入る選択肢1.は不可能でした。
で、2.を選びました。思いつきのキーポイントはisset()やget()など、PHPのマジックメソッド。
要は関連するモデルの関連性のみを覚えておいて、実際にアプリがそのモデルを使おうとした時に、まだ無ければ初めてインスタンスを生成しよう、ってことです。
適用前はコントローラの初期化時にかなりの数のインスタンスが生成されてましたが、適用後はメソッドごと必要な分のインスタンスのみが生成されているようです。
実際のコードについては以前CakePHP.jpのフォーラムに投げておいたのでそっちを参照してください。
(まったく反応がないのでちょっと寂しかったり 。・゚・(ノД`)・゚・。
ちなみに上記フォーラムに上げたコードにはその後に見つかった致命的なバグが残ってますが、お暇な方は試してみてください。
・・・とここまでを読み返してみて、やっぱり自分には文才が無いことを再確認しました。
長くなったので今日はこの辺で。
現在進行中のプロジェクトでCakePHPなるフレームワークを使っているんですが、これが機能満載で思いのほか重い。
使用しているバージョンは 1.2RC3 です。
「CakePHP パフォーマンス」とかでググってみると1.1に比べてだいぶ遅いというベンチマーク結果などが出てきました。やっぱり。。
とはいえ開発も終盤でフレームワークの変更はしたくないですし、メインの開発陣とは別にチューニング箇所について調査することにしました。
まずシステム構成ですが、
- Linux(なんだっけ?)
- Apache2
- mysql5
- mod_php5
あとはアプリ側キャッシュにmemcachedを使ってたり、画像配信にSquidを前に立てたりします。
で、PHP&CakePHP側の主要な構成ですが、
- コードキャッシュ&ローカルキャッシュにはAPCをチョイス。
- CakeのCacheエンジンはAPCとMemcacheを用途に応じて切り替え。
- Memcachedは複数サーバから同じデータを参照する必要のあるものにのみ使用する。
それ以外のどうでもいいキャッシュはAPCに格納する。
パフォーマンスはたぶんローカルmemcachedと同じようなものかと。
まず、Apacheについてくる ab(ApacheBench) コマンドで実際のページのパフォーマンスを計測していきます。
> $ ab http://example.jp/
コマンド終了時に表示された内容の「Requests per second: x.xx [#/sec]」の部分でだいたいの性能をみます。
秒間n回リクエストを捌きました的な意味合いだと思います。
どんな数字が出れば速いのか?の基準については私もよくわかりません;;
ただ体感的に考えて、1#/sec 程度だとブラウザの表示に最低1秒以上かかってることになるのであまりよろしくないですよね。
この辺りの判断は人によります、たぶん・・・。
で、abで計測した結果をみて思ったことは、「なんか全体的に同じように遅い」でした。
商品DBなんかの検索機能のあるページとかが飛び抜けて遅いだけなら複雑なSQLクエリとかが原因と考えられたりしますが、
どうもそうではない様子。
もっと細かく調べてみたところ、CakePHPのコア部分でいくつか微妙な箇所がありました。
- モデルをたくさん使っているコントローラが遅い
- セッションのストア先にmemcachedを指定すると遅い
- ImageMagick(convert)の変換処理が遅い
3はCakePHP関係ないですね;
結論からいうと上記3つが主なボトルネックでして、解決することでかなりのパフォーマンスアップが図れました!
が、長くなりそうなので解決編は次回以降のエントリに分けます・・・。
シナプスでは初社員として迎えていただき、いろんな期待と不安が入り交じっております。
それと、ブログスペースは入社後すぐに作っていただきましたが、時間が作れず中々カキコできませんでした。
関係者のみなさま、どうもすいません&ありがとうございますm(__)m
さて、業務の内容ですが主にLAMPやLAMRなどを用いたWebサービス開発です。
といってもすぐにバリバリコーディングは無理なので、現在はサポート要員な立ち位置ですが。
今までのWebサービスの経験はASP、JSP、PHPを各1〜2年程度です。
最近ようやくMVCが理解できるようになったレベルです...orz
今後はそんなヘタレ社員の視点から見たWebサービス開発のノウハウをあげていこうと思います。
たまに意味不明なエントリがあるかもしれませんが、そこは生暖かく見守っていただければ幸いです。
![]()
![]()
![]()











