MAMP の MYSQL のログを保存する
と。デフォルトでは設定されていなかったのでメモ。
/Applications/MAMP/bin/startMysql.sh
に以下を追加すればログが保存される様になる。
--log=/Applications/MAMP/logs/mysql_log
MAMP の MYSQL と FileMaker の連携
作業メモ。取り敢えずこの手順で出来ました。環境は Mac OSX 10.5.5。FileMaker Pro 9 Advanced。MAMP 1.7.1。現在のバージョンでは以下の通り。
まずはここから MYSQL Connector/ODBC 5.1 をダウンロード(x86)。
MySQL :: Download Connector/ODBC
Connector/ODBC をインストールしたら以下の手順で ODBC アドミニストレータ.app を設定。「Connect Options」のポートとソケットの設定も忘れずに。ソケットのパスは MAMP のスタートページに書いてあります。
http://dev.mysql.com/doc/refman/5.1/ja/myodbc-configuration-dsn-macosx.html
ただ。この環境だと ODBC アドミニストレータ.app が頻繁に落ちる。落ちる。まぁ。気にしなくても設定は出来ているので良いのだけれど。どうにかならんものなのか。
さて。いよいよ FileMaker Pro 9 を起動。ファイル > 管理 > 外部データソース から先程作った ODBC を追加する。後はデータベース管理からリレーションシップでテーブルを選択して取り込めば MAMP のデータベースと連携できます。
PHP で日付を扱うカスタム関数
そんな訳でいくつか流用。手なりで作ってしまっているのでご指摘大歓迎です。
date 型の変数を日本の日付表示に変換(曜日付)
function japaneseDate($date) { if (preg_match('/^([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})([0-9: ]*)$/', $date, $val) && $date != '1000-01-01' && $date != '9999-12-31') { $youbi = array('日', '月', '火', '水', '木', '金', '土'); $days_show = date('Y年m月d日', strtotime($date)); $days_youbi = "(".$youbi[date('w', strtotime($date))].")"; $days = $days_show.$days_youbi.$val[4]; } else if (preg_match('/^([0-9]{4})-([0-9]{1,2})$/', $date, $val)) { $days = $val[1]."年".$val[2]."月"; } else { $days = ""; } return $days; }
開始日と終了日から期間に変換
function periodDate($date_start = '0000-00-00', $date_end = '0000-00-00') { if ($date_start == '0000-00-00' && $date_end == '0000-00-00') { return; } else { if ($date_start == $date_end) { $date = japaneseDate($date_start); } else if ($date_end == '9999-12-31') { $date = japaneseDate($date_start) . '〜'; } else if ($date_start == '0000-00-00') { $date = '〜' . japaneseDate($date_end); } else { $date = japaneseDate($date_start) . '〜' . japaneseDate($date_end); } return $date; } }
開始時間と終了時間から期間に変換
function periodTime($time_start = '00:00:00', $time_end = '00:00:00') { if ($time_start = '00:00:00' && $time_end = '00:00:00') { return; } else { if ($time_start == $time_end) { $time = date('H:i', strtotime($time_start)); } else if ($time_end == '00:00:00') { $time = date('H:i', strtotime($time_start)) . '〜'; } else if ($time_end == '00:00:00') { $time = '〜' . date('H:i', strtotime($time_end)); } else { $time = date('H:i', strtotime($time_start)) . '〜' . date('H:i', strtotime($time_end)); } return $time; } }
MAMP に Xdebug を入れて Webgrind で確認してみる
Xdebug のログをフロントエンドで確認できる「Webgrind」の紹介記事を読んで実際にやってみる。
Xdebugのフロントエンド·Webgrind MOONGIFT
取り敢えず MAMP に Xdebug を入れる事から。ここにある「PHP Remote Debugging」の「Mac OS X / x86」をダウンロード(Intel Mac)。
Komodo Remote Debugging Package Downloads « ActiveState Code
PHP のバージョンごとにパッケージが違うので MAMP の PHP のバージョン(現時点で 5.2)と同じフォルダにある xdebug.so を以下に入れる。
/Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so
php.ini に以下を追記。
/Applications/MAMP/conf/php5/php.ini
[xdebug] zend_extension = /Applications/MAMP/bin/php5/lib/php/extensions/no-debug-non-zts-20050922/xdebug.so xdebug.remote_enable = On xdebug.remote_handler = dbgp xdebug.remote_mode = req xdebug.remote_host = 127.0.0.1 xdebug.remote_port = 9000 xdebug.idekey = xdebug.profiler_enable = On xdebug.profiler_output_dir = "/Applications/MAMP/tmp/xdebug/"
Xdebug を有効にするには Zend Optimizer を無効にしなくてはいけないので php.ini の以下の部分をコメントアウトする(MAMP のコンパネでも on/off の設定があるけど何故か反映されない…)。
[Zend] ; zend_optimizer.optimization_level=15 ; zend_extension_manager.optimizer=/Applications/MAMP/bin/php5/zend/lib/Optimizer-3.2.2 ; zend_optimizer.version=3.2.2
いよいよ Webgrind を入れる。と云っても落としてログファイルのパスを設定するだけ。ここで公開されているものをダウンロード。
webgrind - Xdebug Profiling Web Frontend in PHP - Google Project Hosting
落としたファイルを MAMP の htdocs に入れて config.php を以下の様に変更しました。
static $xdebugOutputDir = '/Applications/MAMP/tmp/xdebug/'; static $storageDir = '/Applications/MAMP/tmp/webgrind/';
後は MAMP を起動して webgrind にアクセスするだけ。簡単ですね。ただファイルサイズが大きいプロファイルを読み込むと流石に動作が重いかな。
Smarty のプラグイン小ネタ集
Smarty のプラグインの追加はちょっとした関数を書いて Smarty の plugins フォルダに入れるだけ。あると便利なちょっとしたプラグイン。私の場合。Smarty のデリミタを {{ と }} に変更しているので「使い方」の部分のソースは適切に変更して下さい。
modifier.mbtruncate.php
truncate をマルチバイト文字列に対応。
使い方
{{$string|mbtruncate:80}}
ソース
<?php function smarty_modifier_mbtruncate($string, $length = 80, $etc = '...') { if ($length == 0) { return '';} if (strlen($string) > $length) { $length -= strlen($etc); return mb_strcut($string, 0, $length).$etc; } else { return $string; } } ?>
modifier.mbconvert.php
マルチバイト文字コード変換。
使い方
{{$string|mbconvert:'urf-8':'euc-jp'}}
ソース
<?php function smarty_modifier_mbconvert($string, $charset, $source_charset = 'auto') { return mb_convert_encoding($string, $charset, $source_charset); } ?>
modifier.mbkana.php
全角半角変換。
使い方
{{$string|mbkana}}
ソース
<?php function smarty_modifier_mbkana($string, $option = 'KV') { return mb_convert_kana($string, $option); } ?>
compiler.append.php
変数を配列に追加。assign では配列を扱えないので。
使い方
{{* prepare the array *}} {{append var='arr' value=$var1}} {{append var='arr' value=$var2}} {{append var='arr' value=$var3}}
html_table と一緒にこんな感じでも使える。
{{foreach from=$list key='key' item='val' name='listLoop'}} {{capture name='row'}} <h4><a href="{{$val.URL}}">{{$val.name}}</a></h4> <p>{{$val.text}}</p> {{/capture}} {{append var='colAry' value=$smarty.capture.row}} {{/foreach}} {{html_table loop=$colAry cols=2 table_attr='class="table"'}}
同一テンプレート内で何回か使用する際は変数の初期化を忘れずに。
{{php}}$this->clear_assign('calAry');{{/php}}
ソース
<?php function smarty_compiler_append($tag_attrs, &$compiler) { $_params = $compiler->_parse_attrs($tag_attrs); if (!isset($_params['var'])) { $compiler->_syntax_error("assign: missing 'var' parameter", E_USER_WARNING); return; } if (!isset($_params['value'])) { $compiler->_syntax_error("assign: missing 'value' parameter", E_USER_WARNING); return; } return "\$this->append({$_params['var']}, {$_params['value']});"; } ?>
modifier.urllink.php
テキスト内に URL が含まれている場合に aタグで囲む。
使い方
{{$text|escape|urllink}} {{$text|escape|urllink:"_blank"}}
ソース
<?php function smarty_modifier_urllink($value, $target = null) { $options = ''; if (!empty($target)) { $options = sprintf(" target=\"%s\"", $target); } $value = ereg_replace("[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "<a href=\"\\0\"" . $options . ">\\0</a>", $value); return $value; }