Apelog

昔から言われている事ながらDoCoMo向けサイトでリダイレクトする場合、リダイレクト先のURLがディレクトリで終わる場合にURLの最後を「/」で終わらないと警告が出るというもの。

× http://blog.apecell.com
↓
○ http://blog.apecell.com/

警告は出るものの遷移はおこなわれるので見られなくなるわけではないものの、特に理由が無ければ付けるようにした方がいいでしょう。

久しぶりに聞かれたのでメモ。

DoCoMo
http://imutl.ezweb.ne.jp/cgi2001/utl_menu.cgi
AU
http://docomo.ne.jp/cp/mailsetst.cgi
SoftBank
http://elinks.softbank.ne.jp/selfcare

__autoload()が早いというよりも、class_exists()に比べてrequre_once()、include_once()が遅いからというもの(クラスの読み込み判定の場合)。

通常__autoload()内でクラスの有無を調べて無ければ読み込みを行う。一度しか呼ばれないものならその場で読み込んだほうが早いが、複数回読み込み判定がおこなわれるものがある場合(Superクラスなど)一度autoload経由でclass_exists()の篩いにかけた方が良い。

PHP5のフレームワークではほとんどautoload系の読み込み実装がなされている事からも、その差は結構大きいので不特定回数読み込まれるファイルが多数ある場合は注意。

以下の動作環境で最も単純なクラス( class Sample{} )を1000回読み込んでインスタンス生成した場合、class_exists()で見つからなければrequire()と、常にrequire_once()だと100倍以上差があった。

  • PHP 5.2.3
  • WindowsXP SP2
  • AMD Athlon™ 64 Processor 3500+ 1.79GHz
  • 2.00GB RAM

1000回require_once() – 0.450819秒

<?php
for ($i=0;$i<1000;$i++) {
    require_once('Sample.php');
    $sample = new Sample();
}
----------------------------------------------------
marker  time index            ex time         perct
----------------------------------------------------
Start   1193042528.49833500   -                0.00%
----------------------------------------------------
Stop    1193042528.94915400   0.450819       100.00%
----------------------------------------------------

999回class_exists(), 1回require() – 0.003704秒

<?php
for ($i=0;$i<1000;$i++) {
    if (!class_exists('Sample', false)) {
        require('Sample.php');
    }
    $sample = new Sample();
}
----------------------------------------------------
marker  time index            ex time         perct
----------------------------------------------------
Start   1193042740.50069500   -                0.00%
----------------------------------------------------
Stop    1193042740.50439900   0.003704       100.00%
----------------------------------------------------

require()よりinclude()の方が早いのでinclude()にすればもう少し差は縮まるものの、なぜPHPのautoload()が早いかというとautoloadをclass_existsな実装で書く事が多いからであり、autoloadの中で全てrequire_once()していたら別に早くないという事。

クラス名の_をディレクトリとするPEAR風構成のオートローダーならZend FrameworkのZend_Loderがすぐ導入できます(Zend_LoaderとZend_Exceptionの2つで)。

環境違うと全然違うよ、な状態なら教えてください。

JavaScriptでonkey~系のイベントハンドラを使いその操作をマウスを使っても行える場合、忘れずその処理も加えるという事。

onClickでの処理にショートカットとしてonKey系の処理を付け加えた場合などはそんなに忘れる事も無いが、最近では良くあるフォームの入力中に送信可否を出したり文字数計算やらをする場合に忘れがち。onKeyupでフォームにキーボードからの入力は拾えても、マウスのみの操作で右クリックから貼り付けを拾えないのはよろしくない。

例えば、名前とコメントが空でなければSubmitボタンを有効にするような場合にonKeyupの処理しかないと、どちらかがマウスで貼り付けのみであった場合Submitボタンが無効化されたままになってしまう。

そういう時には忘れずonBlurやonMouseupで拾ってやって同じ処理を加えてやる事。

貼り付けは常にCtrl+Vを使っていたりするとついつい忘れてしまうので注意。

かなり昔から言われてる事で、頻繁にJavaScriptを書く人には至極当然なんだろうけども・・・。

ほぼ年齢の計算式

年齢の計算式は良く使う。

MySQLはマニュアルにも書いてあるけど。

SELECT (YEAR(CURDATE())-YEAR(`birth`)) - (RIGHT(CURDATE(), 5) > RIGHT(`birth`, 5)) AS `age`

プログラムで書く場合

((現在日時-生年月日)/10000)切り上げ
$birth = 19830221;
echo (int) ((date('Ymd') - $birth) /10000);

となる。が「ほぼ」年齢の計算式と書いたのは正確には「誕生日の前日が終了する瞬間」に年齢が加算されるので前日には年齢が上がっている。

利用する業務によってはその1日で大きな違いにもなる。以下のリンクに具体的な問題点などの指摘があるので留意。

ある地方公務員電算担当のナヤミ
「生年月日から年齢を計算する簡単な計算式」は使えるとは限らない