2008年5月27日火曜日

CakePHP 日付の表示

<?php echo h(date("Y年m月d日 G時i分",strtotime($event['Event']['start_datetime']))); ?>

たとえばこんな感じです。

cakePHP 指定していないのにモデルがないと怒られる

cakePHP1.1で

EntryControllerでEntryモデルを使わないとしよう。

でも、Eventモデルは使う場合・・。
class EntriesController extends AppController {

var $uses = array('Event');

となるだろう。

この場合、Entryモデルは別になくても問題ないはずなのに、

appContorollerでおんなじように


class AppController extends Controller {

var $uses = array('Event');

としていると、

このお互いの$usesが同じものだったら、なぜか、TestControllerに

Testモデルがないと怒られる。

違うモデルを入れとくと、うまくいくんだが。

なんか理由があるのかな?

2008年5月23日金曜日

【MySQL】left join, right joinを同時にしたい full joinみたいなん。

oracleやpostgreSQLでは、full outer joinというものがあるが
MySQLにはない。
そんなときは、joinとunion distinctの併せ技。

table a
id  price
-------------
1  100
2  200

tableb
id  price
-------------
1  150
3  300

の場合、id 1のprice は足し合わせて、2, 3 の値はそのまま表示したいとき


SELECT a.id as id, (a.price + ifnull(b.price,0))as price FROM a left outer join b using(id) union distinct
(SELECT b.id as id, (ifnull(a.price,0) + b.price)as price FROM a right outer join b using(id));

id  price
-------------
1  250
2  200
3  300

が取得できますよ。

でも処理が重たそうですね。

2008年5月22日木曜日

【CentOS5】locateコマンドがない

CentOS5ではデフォルトでlocateコマンドが入ってない。

なので

> yum install mlocate

>updatedb

これでOKです。

2008年5月21日水曜日

mysql 誕生日から年代

mysql 誕生日から年代を求める式。

kawama.jpさんの記事に素敵な答えがありました。


テーブル:USERTABLE
誕生日カラム:user_birthday

◆年齢を求める
select truncate(((curdate() + 0) - (user_birthday + 0)) / 10000, 0) as age from USERTABLE;

年代を求める
select truncate(((curdate() + 0) - (user_birthday + 0)) / 10000, -1) as age from USERTABLE;

年代別合計を求める
select
truncate(((curdate() + 0) - (user_birthday + 0)) / 10000, -1) as age,
count(*)
from
USERTABLE
group by truncate(((curdate() + 0) - (user_birthday + 0)) / 10000, -1);

2008年5月20日火曜日

神戸シェラトン

記念日にシェラトンホテルに行ってきました。

いつもながら楽天トラベルで予約したんだけど

着いたら普通のフロントから19階にある特別フロントに通され

「一人プラス3000円でジュニアスイートに泊まれますよ!」

ってことだったので、おもいっきって泊まっちゃいました。

部屋は広くて、無駄に書斎みたいな机もあり、

景色も綺麗で、ベットもむちゃくちゃ広かったので大満足でした。

その代わり記念日なのに、夕食はファミレスでした・・・。

グラタンとオムライスを食べてファミマでゼリーを買って

昼間に買った高級りんごジュースを飲んで寝ました。

素敵な一日でした!

MySQL 大規模系の覚書

MySQLで大規模なサイトを作ろうとしたときの注意点などをつらつら書く

  1. マスター・スレーブ構成にする。(水平分散)

  2. クラスタリング化する。(垂直分散)

  3. データの集計など構文が決まってる処理はprocedureを使う。

  4. トリガを使って、無駄な集計をしないようにする。

  5. MySQL5.1からならFEDERATEDテーブルを使うと別DBのテーブルもJOINできる。

  6. MySQL5.0以上で、パーティショニングを使って一つのテーブルも物理的に分ける。

  7. データが多い場合、同じ構造のテーブルを作ることがある。そんなときはリネームして、テーブルをコピーすればよい。


とりあえず、あとでくわしくかけるとこは書こう。

⑦テーブルのリネームとコピー。

■create table テーブル名 as select * from コピーするテーブル名

・データのコピーもOKデータも一度にコピーされていい感じ。

・構造コピーNG

■create table テーブル名 LIKE コピーするテーブル名

・データコピーNG

・構造コピーOK

だから、データも構造もコピーしたい場合は

□create table テーブル名 LIKE コピーするテーブル名

□insert into テーブル名 select * from コピー元テーブル

の併せ技。

データのコピーは50万件でも1分もかからないくらい。だったと思う・・。

普通にinsertするよりも10倍以上早かったです。

2008年5月1日木曜日

mod_proxy_balancer と CakePHP

mod_proxy_balancer(Apache2.2系)を使ってみた

httpd.confで
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so

として
<VirtualHost *:80>
ServerName proxy.test

ProxyRequests Off
ProxyPass           /  balancer://cluster/ stickysession=CAKEPHP
ProxyPassReverse   /  http://appli.test/

<Proxy balancer://cluster/>
BalancerMember http://appli.test/ route=ap1
</Proxy>
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "C:/xxx/appli"
ServerName appli.test
</VirtualHost>

これで、proxy.testにアクセスがあった場合、appli.testを見てくれて、セッションも発行できるので、ログインのあるアプリでも動作できた。
ProxyPassReverse  /  http://appli.test/

を書かないとURLが書き換わってしまう。