WordPress へようこそ。これは最初の投稿です。編集もしくは削除してブログを始めてくだださい !
投稿者: muneando
CakePHP:paginateのsortに複数のソート項目を追加した話し
CakePHPで用意されているpaginateのsortのメモです。paginateのsortは便利ですが、最初はテーブルの1項目しかソートの対象になりません。お客さんから、「価格」と並び替えるときに、もう一つ「価格条件」でも合わせてソートしてくれという入り用とのこと。しかし、CakePHPのレファレンスによると、ソートするには一つの項目だけしかソート項目を指定できません。・・・/cake/libs/controller/controller.phpのpaginate()のソースを追っても、複数のソート項目を設定できるようにはなっていません。
そこで、再度調べてみると、検索する前にモデルでbeforeFind()を呼んくれるとのこと。そこでモデルでbeforeFind()を定義して、ここでソート項目を追加してしまうことにしました。例えばこんな感じ(だいぶコードを省略しています)。
function beforeFind($queryData) { array_unshift($queryData['order'], array('XXX.item' => ‘desc’)); return($queryData); }
ORDER BY句の最初に
XXX.item desc
が追加されます。$queryData[‘order’]は配列で、配列の順番でORDER BY句に追加していきますので、
$queryData['order'][] = array('XXX.item' => ‘desc’);
とすると、ORDER BY句の最後に、
, XXX.item desc
が追加されます。これで、複数の項目でSORTできます。
ここからついでの話しです。ORDER BY句に、ちょっとしたSQL関数を追加したい場合、例えば、
XXX.item is NULL desc
を追加した場合(あまりありませんが・・・)、
array('XXX.item is NULL' => ‘desc’)
と指定してしまうと、
“XXX”.”item” is NULL” dess
と解析されてSQLエラーになってしまいます。これは、
array('(XXX.item) is NULL' => ‘desc’)
として括弧で括ってあげれば、ORDER BY句には、期待通り、
(XXX.item) is NULL desc
にしてくれます。
Windows7とXPの切り替えの話し
ほとんどWindows7で作業をしています。といっても、仕事ではデスクトップ経由で青山オフィスのXPにアクセスしていますが。
簡単にセットアップできたWindows7ですが、インストールできていなかったのは周辺機器でした。DVDを見ようとしたら音が鳴らない。スピーカーが付いていないのでした。
PCにはマザーボードにサウンドカードの機能が付いています。すでにドライバが自動的にインストールされています。スピーカーを付ければいいのですが、7とXPを2つスピーカーを付けるのもイヤですね。
そこで、今はWindows7とXPを2台のPCにインストールして、ELECOMのKVM-DVU2という切換機で切り替えています。KVM-DVU2にはUSBを切り替えるという機能が備わっています。しかし、いままで使っていませんでした。
今回、そのUSBにエプソンのEP-301というプリンタと、CREATICEのSound Blaster Digital Music SXという外付けのサウンドボードを付けてみました。これで、Windows7でも音が鳴ります。しかも、スピーカーもXPと共有できます。Sound Blaster Digital Music SXは、まだWindows7の64ビットのドライバはベータ版でしたが、正常に動いているようです。
KVM-DVU2にUSBの切り替え機能があるのは知っていましたが、ようやく役に立つことになりました。
ただし、KVM-DVU2という切換機は、たまに勝手にキーが連続して入力してしまうとか、例えばaを一文字入力しても、aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaとが連打される、グラフィックボードによってはPCを切り替えると解像度が変わるとか、問題が無い訳ではありません。KVM-DVU2を経由しても画面が汚くなるということもありませんので、まあ今のところ満足です。モニタがDVIでキーボードとマウスがUSBというのは、まだ選択肢が少ないし、値段も高いですし、本当は4ポートが欲しかったのですが・・・・。
自作PC用に一番左のWindows11のパッケージを実際に購入しましたが、問題なくインストールできました。Windowsは使うPCの分だけ正しくライセンスを購入しましょう。
Googleリーダーで異常に写真が大きくなるサイト
Googleリーダーである有名写真家(クラシックカメラとか、高級デジカメの批評で有名な人)を見ると、掲載している写真が大きくて、Googleリーダーからはみ出すのです。
オリジナルのサイトでは、正しくレイアウトされているので、原因はアップしている写真の大きさ。無駄にサイズが大きいのです。これは意図的にやっているのか、わかりませんが・・・。
Googleリーダーでは写真が拡大されて表示してしまうので、ピントが甘いのがわかってしまうのが残念です。
CakePHPのpaginateの最適化の話し
ページングが簡単にできてしまうCakePHPのpaginateはとても便利です。パラメーターをちょっと設定してあげるだけなので、誰でも使いたくなるはず。
しかし、このpaginateには、大きな落とし穴があります。いくつものアソシエーションを設定されているモデルに対してpaginateを使うと、とても遅いのです。
これはpaginateだけではなくfindAllでも言えること。何も考えずに使うと、結果が返ってこないのです。
デバッグレベルを3にするとわかるのですが、大量にSQLが生成されます。この辺りをきちんとチューニングしてあげないといけません。
paginateの最適化を調べましたが、なかなか検索にひっかかりません。仕方ないので、試行錯誤。結局は以下の通り。
必要のないアソシエーションは実行する前に削除しておく。モデルクラスで最初に$hasManyを定義しますが、このままですと勝手にそのモデルへの抽出のためのSQLを発行してくれます。paginateのfieldsオプションに、抽出したい項目を並べておけば、それだけをSQL一つで抽出してくれるかと思っていましたが、これは大間違え。$hasManyに定義されているモデルに対して1レコードづつ改めてSQLを生成します。
あと、アソシエーションが3つになると、例えばA->B->Cと各モデルがhasMany,belongsToのアソシエーションを定義されているとすると、Aに対してpaginateをすると、A->Bで参照されたSQLを発行して、その後各レコードでCを参照するSQLが発行されてしまいます。したがって、Cがあまり大きなテーブルではなくて、ほとんど更新がないようなテーブルだと、データを配列に格納して参照させたほうがいいかもしれません。
とにかく、CakePHPのpaginateやfindAllは、余計なSQLを発行してくれます。いかに無駄なSQLを削除するかがパフォーマンスの分かれ目です。
今回、以上の方法でCakePHPから発行しているSQLの数を一桁以上減らすことで、paginateのパフォーマンスをあげました。一番のCakePHPのチューニング方法は、core.phpでデバッグレベルを3にして表示されるデバッグ情報のSQLダンプを見ながら調整していくことをお勧めします。
Windows7でのトラブル
Windows7 64bitを使ってのトラブルは、あまりないようですが、自分でわかっているのは次の2件。
- リモートデスクトップ接続でWindowsVistaから切断したときに、WindowsVista側で画面の解像度が変わってしまう。
- Windows Live WriterのAmazonアフリエイトリンクを作成してくれるプラグイン「Amazon Associate JP plugin」で商品を探しに行くとエラーになる。
- キヤノンの古いPIXUS MP730というプリンタをプリンタサーバー経由だと双方向通信できない。ただし、PIXUS MP730がプリンタサーバー経由で印刷できるだけましか。
あまり、大きな影響はないですが、ただ面倒なだけです。
USBメモリにUbuntuをインストールした話し
Windows7を買うついでに、USBメモリを買ってしまった。買ったのは、なるべく小さいUSBメモリ。つけっぱなしにしてもいいように、出っぱりが少ないもの。
買ったのは、プリンストンのUSBメモリ。このUSBメモリにUbuntuをインストールします。
最初は、usb-creator.exeを使えばUSBメモリにUbuntuをインストールできると書いてあったが、UbuntuのISOイメージには見あたらない。
そこで、UNetbootinというソフトを使って、ISOイメージファイルからUSBメモリに転送。とても簡単。ブートCDを作る必要もない。
しかし、Ubuntuの設定の保存はどうやるの? ブートするたびに毎回設定を忘れてしまうのですが・・・。基本を理解していないのでした。
そういえばプリンストンのUSBメモリですが、USBメモリといってもただのUSBメモリではありません。メモリ自体がmicroSDなのです。つまり、microSD付きのUSBメモリアダプタなのです。したがって、もっとmicroSDが安くなったら差し替えることができるのです。まあ、microSD自体は小さいので、そんなに差し替えすることはないかもしれませんが・・・。
Windows7 をインストールした話し
今日は、渋谷のビックカメラによって、Windows7 Professionalを買って帰りました。
早速、インストールです。もちろん64ビットです。せっかくメモリが4GBありますので。
Windows7のRCが入っている領域にインストールします。今回は新規インストールです。
XPのことは何も聞かれません。問題なくあっさりインストール完了です。何もトラブルがないのは逆に怖いです。
アプリケーションは、
をインストールしました。アンチウイルスソフトは、今回初めて
を入れました。データはすべて共有あるいは分散していますので、データの移行はしなくていいから、とても簡単です。以上、2時間くらいの作業です。
自作PC用に一番左のWindows11のパッケージを実際に購入しましたが、問題なくインストールできました。Windowsは使うPCの分だけ正しくライセンスを購入しましょう。
QSLカード到着
JARLビューロからQSLカードが来ました。今回は多いです。
オール神奈川コンテストとか6m AND DOWNコンテストなどコンテストがあったことと、5月6月のコンディションが良かった時期の交信のおかげかもしれません。
ハムログで受領の処理をしました。こちらから先月分までのカードを送らなければいけませんね。
Eclipse-PDTを上書きインストールしたらプラグインが無効になる話し
先ほどの記事のように、Eclipse-PDTを上書きインストールしたらプラグインが無効になってしまった。
とりあえずの必須のプラグインは、
の2つ。再インストールしようにも、うまくいかない。
Clay Database Modelingは2.0になっていて、旧バージョンのアップデートサイトがクローズされている。旧バージョンのライセンスは購入しているが、開発元のアズーリによると、旧バージョンは新しいバージョンにアップデートしろとのこと。しかし、旧バージョンからのバージョンアップはなし。しかもライセンス料は80,000円也。機能とコストが全く見合わないのでアップデートはやめておく。別のデータベースモデリングのプラグインを探さなければいけない。
プラグインを有効にどうしてもできないので、しかたないので再インストールをしなければいけない。なにげにアップデートしたら、こんな羽目になった。残念。