でじくる。

主にプログラムの話題などを扱うブログです。

PDOのFETCH_CLASSがprivateなプロパティでも使えるのは便利なのか気持ち悪いのかよくわからない

PHPでデータベースを操作する際に、

私は基本的にPDOを使用しています。

 

PDOには、fetchしてきたデータを指定したクラスに

勝手に詰め込んだオブジェクトを返してくれる

PDO::FETCH_CLASSというオプションがあります。

 

いかにも便利そうなんですが、

何となく思い込みというか常識的に考えて、

データを詰め込むモデルのプロパティは

privateにしてあるからFETCH_CLASSとか使えないんじゃね、

と思い込んでいました。

 

しかし、今日調べ物をしていて偶然見つけたんですが、

privateなプロパティでも勝手に詰め込んでしまうんですね。

 

PDO::FETCH_CLASS and visibility private (private constructor, private property)

https://bugs.php.net/bug.php?id=44337

 

実験してみたら確かにprivateなプロパティにも勝手に詰め込まれいましたし、

またプロパティは当然privateのままでした。

 

EC2の小ネタ三つ

今日はEC2を使う上で知っておくと何かと便利なネタを三つほど紹介します。

といっても、リンクを三つ張るだけの簡単なお仕事ですが。

 

"Auto Scaling"で指定時刻にEC2インスタンスを起動

http://blog.suz-lab.com/2011/08/auto-scalingec2.html

 

EBS-backedインスタンスのrootボリュームをサイズ増量

http://dev.koba206.com/?p=117

 

EC2インスタンスにEBSボリュームでRAID0環境を作る

http://dev.koba206.com/?p=21

PHPのmktimeは引数の順番がイミフなのでDateTimeを使いたい。

PHPを使っていて結構困ることの一つに

mktimeの引数の順番があります。

どんな順番で並べたらいいかだいたい忘れていて、

いつもphp.netのお世話に。

 

ということで、PHP5.2以降だとDateTimeクラスが使用できるようになっているので

多少めんどくささが緩和されます。

といっても、まだ本格的にDateTimeを使い倒してはいないんですが。

 

参考サイトいくつか。

 

PHPの DateTimeオブジェクトの簡易リファレンス

http://fdays.blogspot.com/2008/03/strtime-phpdatetime-datetime-new.html

 

DateTimeクラスを使ったモダンな日付処理

http://blog.asial.co.jp/704

 

DateTime クラス(php.net)

http://www.php.net/manual/ja/class.datetime.php

innodbでテーブルごとにデータファイルを作成する

MySQLinnodbを使用する場合、

通常、データは単一のibdata1というファイルに保存されます。

このファイルはmy.cnfの設定によって自動拡張するようになっていて、

放置していると平然と数GBとかにふくれあがります。

 

32bitのLinuxを使用していた場合、2GB以上のファイルは扱えなかったりするので、

ibdata1が大きくなりすぎてMySQLが動かなくなったりするわけですね。

 

いまどき32bitのLinuxを使用することもあまりないと思うのですが、

EC2のsmall instanceなんかはなぜか32bitだったりするので困りものです。

それに、ひたすらibdata1のサイズが肥大していくのも気分がよくない感じです。

 

それで表題の話。innodbではテーブルごとにデータファイルを作成することができます。

MySQLの定番サイト、「漢のコンピュータ道」に参考になる記事があります。

 

InnoDBのファイルサイズ管理

http://nippondanji.blogspot.com/2009/01/innodb_16.html

 

innodb_file_per_tableの設定をすればよし。

 

大きくなってしまったibdata1を小さくする方法もあります。

 

ibdata1 のサイズを減らす手順

http://bitwalker.dtiblog.com/blog-entry-162.html

 

一回データを消した上で入れ直さないといけないので、

動いているシステムで行うのはちょっと大変です。

 

mod_rewriteのQSAフラグの存在をよく忘れる件

Apacheにはmod_rewriteというURLをリダイレクトしたりするのに

使える便利なモジュールがあります。

使いすぎるとかなりの黒魔術状態ですが、

やっぱり使ってしまう。

 

mod_rewriteの簡単な紹介記事は

 

mod_rewrite サンプル集

http://tech.bayashi.jp/archives/entry/techweb/2007/001981.html

 

など参考になります。

 

mod_rewriteは便利なんですが、一つ困ったことがあります。

たとえば、

http://foo.bar/hoge/foo?page=1

みたいなURLをmod_rewriteを使って書き換えた場合、

最初からついてたパラメータ

page=1

が消えてしまうんですね。

 

んで、元々ついてたGETのパラメータを消さないようにするための仕組みが

QSAフラグというやつで、

こんな感じに使います。

RewriteRule ^hoge/([0-9]+)$ /hoge.php?param=$1 [QSA]

 

この場合

http://foo.bar/hoge/1?page=2

にアクセスした場合

http://foo.bar/hoge.php?param=1&page=2

というURLにリダイレクトされる、と。

 

いつも忘れて検索してしまうので、メモっておきます。

PHPのautoloadは結局どう書くのが一番気分がいいのか

PHPにはクラスを自動的に探してくる

オートローディングという機能があります。

 

オートロードするための関数を登録する方法として

__autoload()とspl_autoload_register()の二つが存在し、

__autoload()は複数の関数を登録できないので非推奨、

spl_autoload_register()を使いましょう、ということになっています。

サードパーティのライブラリなんかを使用する場合、

__autoload()だと困ったことになるわけですね。

 

で、オートロードの関数を作成するわけですが、

クラスの存在するかもしれないファイルのパスを指定する方法は

だいたい三通りあります。

1.クラスをおいてあるディレクトリを逐一指定してパスを作成する

2.クラスの命名規則からパスを作成する

3.名前空間の命名規則からパスを作成する

 

1は簡単ですね、/path/to/hogeとかディレクトリを書いておいて、

そこから/path/to/hoge/AClass.phpみたいなパスを作成する。

2はPath_To_Hoge_AClassみたいなクラス名をつけるようにして

そのクラス名を分解して/path/to/hoge/AClass.phpにする。

3はPHP5.3以降の新機能名前空間を使用する方法。

オートロードの関数には補完された名前空間が渡されるので

path\to\hoge\AClass.phpみたいな名前空間からパスを作成する、と。

 

PHP5.3以前は1か2の方法が使用されていて、pearでは2の方法が推奨というか、

命名規約に書かれています。

http://pear.php.net/manual/ja/standards.naming.php

 

ただ、私は2の方式の長ったらしいクラス名が嫌いだったので、

めんどくさいと思いつつ1の方法を使用していました。

 

PHP5.3以降は名前空間が使えるので3の方法にすればいいんじゃね?

という話になるわけですが、補完なしにuse Foo\Barとか打つのはマゾいので

もろもろ検討中です。

 

iOSアプリをサブミットしようとしたらUINewsstandAppがどうこうとか言われてうざい。

そんな困ったときのためのstackoverflow

Xcode gave strange newsstand-error when trying to submit an app

http://stackoverflow.com/questions/6977357/xcode-gave-strange-newsstand-error-when-trying-to-submit-an-app?answertab=votes#tab-top

 

info.plistのNewsstand Iconの項目を削除すればOK。

 

あと、universal appをサブミットする場合、

iPad用のサムネイル画像を先に用意しておかないと文句を言われます。