2010年12月11日土曜日

Web製作でよく使うPHP変数の値有無判定関数





/**
*
* @param mixed $v
* @return boolean
*
**/
function v($v){
if(is_bool($v)){
return $v;
}elseif(is_numeric($v)){ // all numeric (0 and '0') are true.
return true;
}elseif(is_string($v)){
return !empty($v);
}elseif(is_array($v)){
$v = array_filter($v,"v");
return !empty($v);
}elseif(is_object($v)){
return v(get_object_vars($v));
}else{
return !empty($v);
}
}

実際にHTMLに出力するときは 0を値とみなすことのほうが多いと思いますので


0もTRUE扱いにしています。





PHPのStringのゼロに注意






$a = 0;
if(empty($a)){
echo 'TRUE';
}else{
echo 'FALSE';
}


これが、TRUEになることは容易にわかるのですが



$a='0';
if(empty($a)){
echo 'TRUE';
}else{
echo 'FALSE';
}



これも、TRUEになるとは盲点でした。恐るべしPHP





2010年12月1日水曜日

|| をつかって変数を初期化



値の不明な変数を初期化する場合



if($a){
$a = 'hogehoge';
}


もしくは



$a = $a ? $a : 'hogehoge';


これを以下のように書きます。



$a || $a = 'hogehoge';


|| は、if文の条件式にしか普段は使わないのだけれども


編集の初期化処理などに使うと1行で簡潔にかけて意外ときれい。


あまりこういう記述を増やすとPerlみたいに暗号のようなコードになりそうなので


ほどほどにしながら、ワンポイントで使うといいかも。





2010年11月30日火曜日

月、日の桁数をそろえたい時にsubstrの便利な使い方



月とかカレンダーの日をfor文でまとめて出力するときに


以下のように書くことがあるかと思います。




for($i=1;$i<=12;$i++){
echo $i.'月<br>';
}

=================

1月
2月
3月
4月
5月
6月
7月
8月
9月
10月
11月
12月



ただ、これだとレイアウト的に1桁の月と2桁の月でサイズがずれたりすることがあります。


そこで、1桁の月に頭に0をつけて 01月 02月 ... という風に表示したいとします。


IF文で書くと以下のような感じ。ちょっとIF文が仰々しくてあまりうれしくありません。



for($i=1;$i<=12;$i++){
if($i < 10){
echo '0'.$i.'月<br>';
}else{
echo $i.'月<br>';
}
}


これを、substrで書くとこんな感じ



for($i=1;$i<=12;$i++){
echo substr('0'.$i, -2) . '月<br>';
}

=================

01月
02月
03月
04月
05月
06月
07月
08月
09月
10月
11月
12月



全部の月の頭に0をつけて文字列として右から2文字を出力する形です。


別にそれほどエレガントでないかもしれませんが


同じ文字数にそろえたいレイアウトの整形という意味では


非常に的を得た方法ではないかなと思います。





suPHP の Premature end of script headers: の苦悩



suPHP をApacheにインストールして、PHPをCGI実行させてやろうとしたときに出たエラーメッセージ



Premature end of script headers:


とにかく、何が問題なのかは教えてくれず、どこか悪いといっているようです。


ブラウザをたたいても恐怖のInternetServerErrorだし。


いろいろ原因はあるみたいですが、はじめから設定内容を確認するしかなさそうです。


今回は、php-cgi バイナリーの設定ができていないという致命的なミスがあり


PHPをコンパイルしなおすところからやり直しました。(かなり嵌った)


結論:もう少しやさしめのエラーメッセージを希望!





2010年11月12日金曜日

SugarSyncの無料ストレージ容量が5GBにアップ!



いやはや、この無料のストレージ容量が増えたのはすごくうれしい。


SugarSync





個人的に、DropBoxやらSugarSyncなんかのファイル同期ストレージは


ヘビーに利用しているのでどんどんデータがたまって容量不足にいつも困ってました。


ちょこっと書いたソースやドキュメントをとりあえず同期して


気が向いたら続きを書くといった場所を選ばない開発ができます。


5GBも使えるとほぼ開発環境を丸ごとほりこんでも大丈夫じゃないでしょうか。


どこでも同じ設定で使えるのは開発を始めるときの障壁が少なくなりますしね。


これでもっと開発が楽しくなる予感!





※有料のLiveDrive使って容量無制限のストレージも使ってるけど


ソフトが重たいのが難点。あとLinuxと同期できるとなおうれしい。





2010年10月20日水曜日

もっと気楽に書こう



ブログを書くのがどうも進まないので、


もう少し、気楽にどうでもいいことも書くようにしようかと思います。


はじめは、技術系の備忘録的な意味で書いてましたが


備忘録といっても、仕事関係はオープンにできないことが多いので


必然的に、汎用的な内容を選ぶことになります。


ただ、それだとネタをそれほど持ち合わせていない私はすぐに窮してしまい


どんどん書かなくなってしまったので書くモチベーションを維持できるよう


適当なことも、もう少し入れていこうかと思います。


「そんなにまでしてなぜブログを書くんだ?」と言われますと


単純に、文章を書くのが苦手なのでそのトレーニングの意味が大きいです。


その中で、ただ書くだけじゃなく技術系のことなら多少知識や経験もあるので


残すと役に立つかなとなんとなく思ったからです。


ただ、実際にはぜんぜん書けてないのでこの有様です。


とにかくエントリーが続けれるようにがんばります。





2010年8月27日金曜日

さくらインターネットで、MySQLを使うときに気をつけたいこと



スタンダードプランだとInnoDBストレージがが使えない。


これにはちょっと驚いたけど、FAQに書いてありました。


http://faq.sakura.ad.jp/faq/1032/app/servlet/qadoc?000526


MyISAMだとテーブルロックなので、更新と参照のバランスよっては


問題になる可能性がありますね。


あらかじめ設計時に気をつけたいポイントです。





2010年6月23日水曜日

PECLでSQLiteをインストールできないとき



こちらで紹介されているように、途中エラーで止まってしまう場合の対処


http://blog.plastik.jp/archives/44


上記内容の中で、「ソースを直接編集」の部分がどのファイルを編集するべきか


すぐにがわからなかったのでメモ


-> sqlite.c を直接編集



vi sqlite.c

## Line: 56 行目をコメントアウト /* ~ */ で囲う
/* static unsigned char arg3_force_ref[] = {3, BYREF_NONE, BYREF_NONE, BYREF_FORCE }; */

## Line: 125, 126 の arg3_force_ref を third_arg_force_ref に変更
PHP_FE(sqlite_open, arg3_force_ref) → PHP_FE(sqlite_open, third_arg_force_ref)
PHP_FE(sqlite_popen, arg3_force_ref) → PHP_FE(sqlite_popen, third_arg_force_ref)



このあと、make && make install でいけました。





2010年6月17日木曜日

fgetcsv で文字化けする場合



fgetcsv の仕様が、PHP4 -> PHP5 で変わったらしくLocale に依存するらしい。


日本語が文字化けする場合は、以下のように明示的にLocaleを変更する



setlocale(LC_ALL,'ja_JP');


fgetcsv 実行前に上記を書けばOK。





2010年4月12日月曜日

PostgreSQL / MySQL 文字列置換



文字列の置換方法(replace)


replace( 文字列 , '検索置換文字列', '置換後の文字列')




select replace('aabbcc', 'bb', 'BBBBB')

------- result -------

aaBBBBBcc






Updateでも使える




update
tableXXXX
set
col = replace( col , 'bb', 'BBBBB')
where
col = 'aabbcc'






2010年2月17日水曜日

National Geographic の120年間の記録



ナショナルジオグラフィックの120年間分を160GBのHDDに収めた商品


http://shop.nationalgeographic.com/ngs/browse/productDetail.jsp?productId=1076014


うっふょー、これ200ドル弱なの?


すげぇすげぇと思いサイトをチェックして買おうとしたら


どうも日本への発送はしてくれないらしい。。。


かなり落ち込んでいましたら、ちょうどワシントンの友人から連絡があって


話をしたら向こうで購入して日本に送ってくれることに!!!!ラッキー!!!


持つべきものは友達です。


届くのが楽しみだなぁ。ただ全部見る時間が取れるかどうかが問題だけど。