10 Jul 2015

[CakePHP2]使用を避けるべきModel の名前、それは Folder

あまりにも長い間いろいろ試して判明したのがこれ。

タイトルで終了しますが、CakePHP の bake でコード生成をする際避けるべきデータベーステーブルの名前は、 folders です。

理由はUtility::Folderと名前空間がかぶるから。自動生成つかってなくても、普通にぶつかって一見原因不明のエラーが出ます。

ほかにもモジュール名でかぶりそうなものもありそうですが、ひとまず。


16 Apr 2015

[CakePHP2]モデル内で別のモデルを参照する(追記あり)

別のファイルを参照するのは3通りあるそうです。
参照元:
http://stackoverflow.com/questions/980556/can-i-use-one-model-inside-of-a-different-model-in-cakephp
から説明を抜粋。
App::import() ファイルを見つけてインポートします(それだけしかしません)。クラスを使用するにはインスタンスを作製する必要があります。 ClassRegistry::init() ファイルをロードして、インスタンスを作製します。何かをロードするにはimportよりもベターです。なぜならCakePHPが通常呼び出しの際に内部で行う手続きも実行されるからです。またクラスネームにエイリアスをつけることができます。便利です。 Controller::loadModel() 前述の ClassRegistry::init() を使用してモデルをロードします。$persistModel を使用したキャッシングにも対応します(する予定です?)。コントローラ内部でのみ動作します。
と上記では書いてありますが、Model内でも Controller::loadModelは作動する模様。

Controller::loadModel('AnotherModel');
$data = $this->AnotherModel->read(null, $id);
(追記7/7)やっぱりだめっぽい。以下のやりかたが良いようです。
$anotherModel = ClassRegistry::init('AnotherModel');
data = $anotherModel->read(null, $id);

6 Mar 2015

[Haskell] CSV Library cassava

確定申告の時期、銀行やらカードやらの明細を自分のソフトで読み込めるように変換してますが、Haskellでやるにはどうしたものかと思いいろいろ検索。

Cassavaというライブラリがあるようです。

Bitstringでなしに、各フィールドの型を決めて読みこめるみたいですが、ひとまず触ってみることにします。

14 Feb 2015

Buffalo無線ルータで 無線LANをブリッジ接続で中継する手順について

こんなことに半日費したので記録しておく。
中継機に使おうとしたのは Buffalo WHR-600Dでした
そもそもは元ルータのAterm WH862A から、DHCPの割り振りがチェックできないので、中継器にアクセスできないのがこんなに時間がかかった原因でした。マニュアルに書いてある 192.168.11.1 には、アクセスできないし…。
BUFFALOの無線LANルーター(WHR-G301N等)でブリッジ接続を設定するときの手順
http://wp2.trojanbear.net/1286.html
"今回の設定で一番厄介なのは、BUFFALOの無線LANルーターのディップスイッチをOFFにすると(筆者註:ブリッジモードにする時も)問答無用で無線LANルーターのIPアドレスが192.168.11.100 になってしまう事です。"
この記述が救いでした。 有線で中継器に192.168.11.100にアクセスして無事に設定ができました。

めでたし。

10 Feb 2015

[CakePHP2] date / datetime / year フィールドで和暦の年を併記する

CakePHPのフォーム自動生成、超便利です。
日付に和暦が表示されて欲しいとき、この自動生成の中で勝手に変換されたら、最高です。
要はこんな感じで。
相変わらずでっちあげですが、
/app/View/Helper フォルダにFormHelper.php をコピーします。
_generateOptions というのがオプションを生成してる箇所になるんで、


case 'year':
(中略)
    for ($i = $min; $i <= $max; $i++) {
        $data[$i] = $i;
    }
(中略)
    break;
の箇所を
for ($i = $min; $i <= $max; $i++) {
    $wareki = 0;
    if ($i > 1988) {
        $wareki = $i - 1988;
        $data[$i] = "${i}年(平成${wareki}年)";
    } elseif ($i > 1925) {
        $wareki = $i - 1925;
        $data[$i] = "${i}年(昭和${wareki}年)";
    } elseif ($i > 1911) {
        $wareki = $i - 1911;
        $data[$i] = "${i}年(大正${wareki}年)";
    } elseif ($i > 1867) {
        $wareki = $i - 1867;
        $data[$i] = "${i}年(明治${wareki}年)";
    } else {
        $data[$i] = "${i}年";
    }
}
に置き換えます。

表示はお好みで。

3 Jan 2015

[CakePHP2] データベースにログをとる

Logging(CakePHP official)
http://book.cakephp.org/2.0/en/core-libraries/logging.html
Database logging in CakePHP
http://blog.jandorsman.com/blog/database-logging-in-cakephp
一つ目の記事に書いてあることはCake2.*でもそのままつかえます。ファイルの場所が 'app/libs/log/database_logger.php'(for CakePHP 1.*) から 'app/Lib/Log/Engine/DatabaseLog.php' (for CakePHP 2.*)になるぐらいです。素晴しい。

たとえばログにセッション情報(ユーザIDとかね)を記録したい、みたいな事になったら、ユーザがログインしてるのか確かめないと、ログインしてない時に上手くログに入りません。例えばログイン失敗しました、みたいなログがきちんと取られないことになります。
public function write($type, $message) {
 $log['type'] = ucfirst($type);
 $log['created'] = date('Y-m-d H:i:s');
 $log['content'] = $message;
 if ($login = CakeSession::read('Auth.User')) {
  $log['user_id'] = $login['id'];
 }


 return $this->Log->save($log);
}

[CakePHP2]Database logging (with some Cakesession Object)

Logging(CakePHP official)
http://book.cakephp.org/2.0/en/core-libraries/logging.html
Database logging in CakePHP
http://blog.jandorsman.com/blog/database-logging-in-cakephp
Well, Jan's article is totally usable even in CakePHP 2.4 except one location 'app/libs/log/database_logger.php'(for CakePHP 1.*) to 'app/Lib/Log/Engine/DatabaseLog.php' (for CakePHP 2.*).

When you want log some information via Cakesession Object (i.e. user ID), you should check the object first in case the user not logging in.

public function write($type, $message) {
 $log['type'] = ucfirst($type);
 $log['created'] = date('Y-m-d H:i:s');
 $log['content'] = $message;
 if ($login = CakeSession::read('Auth.User')) {
  $log['user_id'] = $login['id'];
 }


 return $this->Log->save($log);
}