2008年3月11日火曜日

DBD::mysqlがMacPortsでビルドされたMySQLを使う為のオプション

MySQL5はMacPortsでインストール。
Perl5.10.0は/usr/local/perl5.10.0 に野良ビルド。
な環境における、DBD::mysqlのインストール。

普通に
$ cpan -i DBD::mysql

とかやっても、

Can't exec "mysql_config": No such file or directory at Makefile.PL line 76.

Cannot find the file 'mysql_config'! Your execution PATH doesn't seem
not contain the path to mysql_config. Resorting to guessed values!
Can't exec "mysql_config": No such file or directory at Makefile.PL line 466.
Can't exec "mysql_config": No such file or directory at Makefile.PL line 466.
Can't exec "mysql_config": No such file or directory at Makefile.PL line 466.
Can't exec "mysql_config": No such file or directory at Makefile.PL line 466.
Can't exec "mysql_config": No such file or directory at Makefile.PL line 466.
Can't exec "mysql_config": No such file or directory at Makefile.PL line 466.
Failed to determine directory of mysql.h. Use

perl Makefile.PL --cflags=-I<dir>

to set this directory. For details see the INSTALL.html file,
section "C Compiler flags" or type

perl Makefile.PL --help
Warning: No success on command[/usr/local/perl5.10.0/bin/perl Makefile.PL]
CAPTTOFU/DBD-mysql-4.006.tar.gz
/usr/local/perl5.10.0/bin/perl Makefile.PL -- NOT OK
Running make test
Make had some problems, won't test
Running make install
Make had some problems, won't install
Failed during this command:
CAPTTOFU/DBD-mysql-4.006.tar.gz : writemakefile NO '/usr/local/perl5.10.0/bin/perl Makefile.PL' returned status 512


とかむっちゃ怒られます。
シンボリックリンクをはってダマしてもいいんですが、perl Makefile.PL するときに--mysql_config=/path/to/mysql_config というオプションが書ける事に今更気づいたのでメモしておきます。

$ perl Makefile.PL --mysql_config=/opt/local/bin/mysql_config5
$ make && make test && make install

2008年3月5日水曜日

円高なのでついカッとなってVMware Fusionを購入した

昨日VMware Fusionの体験版をインストールして、いろいろ入れまくった結果、「結構使える!しかも円高!」というわけで My SmithMicro Software というサイトから購入。
なんと$35.99!(円で決済したので3,897円でした)

買ったサイトからの自動返信メールに、全商品20%オフ!みたいなことが書かれています。
キャンペーン用のURLが用意されていてそれを経由すると安くなる、ということっぽい。
Just click on the URL below and get our best products at our best prices. You can even send this offer to a friend! It's our way of saying thanks.

とかあったけど、ブログに載せるのはいいのかどうかわからんので、
購入を考えている方は僕にメールしてもらうといいかも。
キャンペーン用のURLをお送りします。
Hurry! This offer expires 15 days from the date of purchase.

らしいっす。

とはいっても、僕は
MacBookに4GBメモリとVMware Fusionをプレゼント
この方法で20%オフだったので、結局同じっぽいす。

MacのgvimではCTRL+[が効かない!?

ふとしたことから、

macのgvimでCTRL+[がつかえないなあ
Mac の gVim でつまずいたこと

え!?そうだっけ?と思って自分のgvimでも試したところ本当に使えなかった。

そこで、.vimrcに
imap <C-[> <ESC>
imap <C-]> <ESC>


を追加したところ、vimでもgvimでもCTRL+[でESC状態が可能になりました。
CTRL+]でもESCになるけど、まぁよし。

2008年3月3日月曜日

VimでHTMLやCSSの保存と同時に各ブラウザのリロードを実現する

最近はHTMLやCSSも書いてます。
ずっとVimを使って書いているのですが、いちいちブラウザチェックの為にリロードするのがめんどくさくてかないません。
皆さんそう思っているようで、

CSSを保存したときにブラウザを更新 mac+applescript+emacs+safari
というエントリを見つけました。
Emacsウラヤマシイ!Vimでもやりたい!

ということでvimrcとAppleScriptを連携させてやってみました。
しかも、
Mac+AppleScript+Vim+Safari+Firefox+Opera
という感じで、Safari & Firefox & Operaも同時更新させるようにしました。

まずはAppleScript。
/Applications/AppleScript/スクリプトエディタを起動し、reload_browser.scptという名前で下記のコードを保存します。

reload_browser.scpt
tell application "Safari"
do JavaScript "location.reload()" in document 1
end tell

tell application "Firefox" to activate
tell application "System Events" to keystroke "r" using {command down}

tell application "Opera" to activate
tell application "System Events" to keystroke "r" using {command down}

tell application "Vim" to activate


コードは$HOME/bin/に保存してます。
FIrefoxやOperaで直接Javascriptを実行する方法がよくわからなかったので、System Eventでキー押させてます。
リロードが終わったらVim(僕はGVim使ってるので)にactivateしてフォーカスを戻す。
後はこれをvimから叩くだけ。

:!osascript /Users/cohtan/bin/reload_browser.scpt


ぶっちゃけ、これでは使い勝手が悪いので、CTRL+Gにマッピングすることに。
Vimのどちらのモードからも使えるよう下記の設定を.vimrcに追加。

imap <C-G> <ESC>:w<CR>:!osascript /Users/cohtan/bin/reload_browser.scpt<CR><CR>a
nmap <C-G> :w<CR>:!osascript /Users/cohtan/bin/reload_browser.scpt<CR><CR>


これだけで、いつどんな時でもCTRL+Gで保存&各ブラウザリロードが実現!
快適っすよー!

2008年3月2日日曜日

Cakephp1.2 特定のモデルのPaginate SQLをカスタマイズする

CakePHP1.2になって超絶便利になったController::paginate。
$this->paginate = array('limit' => 10, 'page' => 1);
$this->paginate(MODEL_NAME, Mixed);


こんな一行で勝手に10データ分ずつページネーションやってくれる優れもの。
大変便利な機能なんですけど、一つ欠点があります。

例えば、

IDuser_idlogin_date
112008-02-29
212008-03-01
322008-02-29
432008-02-29


こんな「logs」なんつーテーブルがあったとします。
ここで、user_idごとにlogin回数を集計したいとなった場合、GROUP BY 句を使う必要があります。
そのときにController::paginateメソッドではうまくページネーションすることができなくなってしまうというわけです。
うーむ、ここばっかりは自前でページネーション作るしかないかぁ。がっくし、と少し肩を落としながら該当部分のソースをごろごろ眺めていると、

cake/libs/controller/controller.php : LINE 957
if (method_exists($object, 'paginateCount')) {
$count = $object->paginateCount($conditions, $recursive);
} else {
$count = $object->findCount($conditions, $recursive);
}
$pageCount = intval(ceil($count / $limit));

となってました。
どうやらモデル内にpaginateCountというメソッドを用意してあげて、そいつが適切なカウント数を返してあげればGROUP BY句が入っていようが、きちんとページネーションしてくれるというわけでした!

モデル名はLogということにして試しに書いてみるとこんな感じ。
app/model/log.php
class LogModel extends AppModel {
var $name = "Log";
function paginateCount($conditions, $recursive) {
$result = $this->query('SELECT Log.user_id FROM logs as Log WHERE ' . $conditions[1]);
return count($result);
}
}

今回の検証ではconditionsは配列になっていて、[1]にController::paginateに渡したWHERE句が入っていました。
この辺はもうちょっと調べなきゃです。

と、このメソッドをモデルに突っ込んでおくだけで集計後の値でカウントしたいようなテーブルにおいてもpaginateが使用できます。なかなか素敵ですね。

ただ、
return count($result);

がなんかかっこわるいですw

SELECT COUNT ( SELECT Log.user_id FROM logs as Log WHERE HOGE GROUP BY Log.user_id );

とかいけそうな気がしたけど駄目でしたorz
あれー、こういう書き方ってダメなんだっけ。。

久しぶりにブログを書く

最初ログインできなくて焦った。 いや、ログインはできたのだが、ログイン後に自分のブログの管理画面に遷移できず、新しいブログを作成する画面になってしまったからビビッてしまった。 どうやら、Google+(現在はサービス終了)に紐づいたプロフィールを設定しているとこのような状況に陥る...