page_adsence

2011年10月27日木曜日

jquery.tmpl.jsがかなり便利

Javascriptでテンプレートエンジンって、今まで使っていなかったんですが、
jquery.tmpl.jsが結構便利な感じ。

配列の中に、連想配列をいれた状態で$.tmplに渡すと、配列の数分のHTMLが生成されて返ってくる。
今までeachでまわしたり、文字列を置換したりしてたのが一気にできる。
これ、結構やばいかも。

2011年10月25日火曜日

MacBook Proが発送されるまで

今回初めてappleのサイトから商品を購入してみたのですが、
ちょっと不安になった場所があったのでメモ。
あと、発送されるまでにかかった時間をメモ。

今回は銀行振り込みを選んで購入したのですが、
ここでちょっと不安になった。
どうやらappleは決済システムを決済ASP業者に任せてるみたいで、
振込先情報を得ようとするとappleのサイトからSMBCファイナンスサービス決済ステーションのサイトに飛ばされるようです。
いきなり外部サイトに飛ばされるので、「えっ!!」って感じになりました。
サイトのデザインもいきなりダサい感じになるので、ものすごく不安な気持ちになりましたが、
三井住友銀行グループが運営している決済サービスみたいなので、
まぁ大丈夫だろうといった感じでした。

で、その日のうちに振込み手続きをして、翌日の昼前には取引成立のメールが来ました。
取引成立メールが届いてから8時間後位に商品発送のメールが届きました。

注文してから振込み、発送までにかかった日数はわずか1日。
サイトに表示されていた到着予定日が11月3日とかになっていたので、
思った以上に早かったです。
まぁ発送されただけなので、ここから到着までどのくらいかかるかはわかりませんが、
発送された場所が「ADSC支店」となっていて、そこはどうやら品川にあるらしいので、
明日の夜までには届くんじゃないかなーと勝手な希望を持っています。

楽しみ!

10/27追記
と思ったら、届いたのは一緒に買ったアクセサリーだけ…。
よく見たらアクセサリーと別々の発送だった。
別にmac持ってないのにこんなの来ても意味ないし!!
しかも10/28の17時から10/30までは出荷も停止になるって。
カスタマイズしている時は3営業日だったのに、一番最初にもらったお届け予定日が11/3とかって
おかしいと思ったら、その辺考慮されてるのかな…。
いずれにせよがっかりの一日でした。

2011年10月24日月曜日

MacBook Proを買っちゃった。

ついにポチってしまいましたよ。。。
本日19時半頃に一度appleのストアにアクセスできなくなるって状況になったんですが、
その10分後位にアクセスしてみたら、アップデートされていました。

キタ!

ついにアップデートされました。
まぁマイナーアップデートなんで、見た目とかは全然変わってないんですけど、
ちょっとだけスペックアップされてました。

Intelが次に出すIvy BridgeのCPUは今のSunday Bridgeとそんなに変わらないみたいなんで、
とりあえずこの辺で買いかなと。

今週末ぐらいには届くはず。
あー、チョー楽しみ!!

2011年10月23日日曜日

藤本輝海ことTERUがヤバイ!!

今までぜんぜん知らなかったんですが、今年買ったDVDにいた藤本輝海ことTERUがマジでハンパない!
今年から011 Artisticのライダーになったらしいのですが、グラトリがヤバイです。

今年も何本かDVDを買ったんですが、TERUのグラトリを見た後だと他のプロのグラトリが霞んで見えます。
新原雄蔵を初めて見たとき以来の衝撃でした。

具体的に何がヤバイかって説明が文章では難しいのですが、
とにかく一度見てほしいですね!

2011年10月7日金曜日

PEAR mailのsendに関して

CcやBccに送る場合にheaderにCcやBccのアドレスを含めるだけでは送れない。
なので全てsendの第一引数に配列か宛先をカンマ区切りで結合した形で入れないといけないのですが、
カンマ区切りで文字列結合した際に、Ccは問題なく送信できてるんですが、Bccがうまくいかないという現象があった。
カンマ区切りの文字列ではなく、配列で渡した場合は特に問題なく送れたので
とりあえずそっちで対応することにした。

送れないバージョン

$to      = 'hogeTo@mail.com, fugaTo@mail.com';
$cc      = 'hogeCc@mail.com, fugaCc@mail.com';
$bcc     = 'hogeBcc@mail.com, fugaBcc@mail.com';
$from    = 'from@mail.com';
$subject = 'test mail subject';
$body    = 'test mail body';

$mime    = new Mail_Mime("\r\n");
$body    = mb_convert_encoding($body, 'ISO-2022-JP');
$subject = mb_encode_mimeheader($subject, 'ISO-2022-JP', 'B', "\r\n");

$headers = array(
  'To'      => $to,
  'Cc'      => $cc,
  'Bcc'     => $bcc,
  'From'    => $from,
  'Subject' => $subject,
);

$to = implode(',', array($to, $cc, $bcc));

$mail = Mail::factory($mailSystem, $params);
$mail->send($to, $headers, $body);

送れるバージョン

$to  = array('hogeTo@mail.com', 'fugaTo@mail.com');
$cc  = array('hogeCc@mail.com', 'fugaCc@mail.com');
$bcc = array('hogeBcc@mail.com', 'fugaBcc@mail.com');

$from    = 'from@mail.com';
$subject = 'test mail subject';
$body    = 'test mail body';

$mime    = new Mail_Mime("\r\n");
$body    = mb_convert_encoding($body, 'ISO-2022-JP');
$subject = mb_encode_mimeheader($subject, 'ISO-2022-JP', 'B', "\r\n");

$headers = array(
  'To'      => implode(",", $to),
  'Cc'      => implode(",", $cc),
  'Bcc'     => implode(",", $bcc),
  'From'    => $from,
  'Subject' => $subject,
);

$to = array_merge($to, $cc, $bcc);

$mail = Mail::factory($mailSystem, $params);
$mail->send($to, $headers, $body);

2011年9月28日水曜日

MySQLって正規表現使えたんだ・・・。

今日初めて知った。
MySQLって正規表現使えるんだ…。
でもマルチバイトはうまくいかない場合があるみたい。
mregexpっていうユーザー定義関数があるらしく、それをインストールするとどの文字コードでもうまくいくって話。

でも、この記事とかこの記事とか見るとバイナリで比較するような感じで検索すればいけんじゃねって感じです。

まぁ時間がある時に試してみようと思います。

DoctrineのSELECT文に関して

DoctrineでSELECT文を上書きする際にハマったのでメモ。

対象テーブルは2テーブル
・account(アカウント一覧)
・friends(友達一覧)
・check(チェックしたユーザー一覧)

以下のようなSQL文をDoctrineから生成しようとしたがうまくいかなかった。
SELECT *, account_id IN (1,2,3,4) AS is_friend FROM friends ORDER BY is_friend DESC;

やりたいことは以下の通り。
checkテーブルのデータを各種条件を指定して取得し、
そのデータを友達かどうかをキーにしてソートする。

最初に書いていたのはこんな感じ。

$query = Doctrine_Core::getTable('Check')
           ->select('*, account_id IN (1,2,3,4) as is_friend')
           ->where('delete_flg = ?', 0)
           ->limit(10)
           ->offset(0)
           ->orderBy('is_friend DESC');

SELECT内に書かれている「account_id IN (1,2,3,4)」の部分がうまく解釈されずに、
本来であればいる「1」かいないか「0」の2種類の結果がis_friendに格納されて返ってくるはずなのだが、
is_friendにはcheckテーブルに含まれるaccount_idが入って返ってきてしまっていた。

原因はどうやらparseSelectの中でやっている処理っぽい。
さすがにこの部分を書き換えるわけにはいかないので、
どうにかできないかと色々と試してはみたのだが、結局わからず終い。

どうしたものかと思っていたのだが、
だったら別のSQLの書き方で同じ結果を取得できるようにすればいいんじゃないかと思った。

JOINとかしてやる方法はパフォーマンス的に悪すぎるので却下。
なんとかSQL一発で取れる方法を探していたらありましたよ。

「CASE」

これ使えばいけるかもと思って、早速MySQLでコマンド叩いてみた。
SELECT *, CASE WHEN account_id IN (1,2,3,4) THEN 1 END AS is_friend FROM friends ORDER BY is_friend DESC;

いけた!
全く同じ結果ではないですが、is_friendに1かNULLが入る感じの結果が返ってきました。
CASEもう一個書けばNULLのとこを0返すようにできますが、必要ないと思ったのでやっていません。

で、今度はこれをちゃんとDoctrineが作ってくれるのかってとこです。

$query = Doctrine_Core::getTable('Check')
           ->select('*, CASE WHEN account_id IN (1,2,3,4) THEN 1 END AS is_friend')
           ->where('delete_flg = ?', 0)
           ->limit(10)
           ->offset(0)
           ->orderBy('is_friend DESC');

これを実行してみると、SQLのSyntaxエラーに…。
ググってみたら、意外とさっくり出てきた。
どうやらCASE~ENDの前後に括弧をつけるといけるらしい。
早速試してみた。

$query = Doctrine_Core::getTable('Check')
           ->select('*, (CASE WHEN account_id IN (1,2,3,4) THEN 1 END) AS is_friend')
           ->where('delete_flg = ?', 0)
           ->limit(10)
           ->offset(0)
           ->orderBy('is_friend DESC');

出来た!!!

エラーもなく、希望通りのレスポンスが返ってきました。
やはり複雑なSQLになるとDoctrineを使うのも一苦労ですね…。
Doctrineのキャッシュを使いたいがためにDoctrineで頑張ってやってましたけど、
それに見合うかどうかも判断する必要がありますね。
毎回こんな感じでハマってると時間がいくらあっても足りない…。

フレームワークでデバッグする際に使える関数

PHPでデバッグする際によく使う関数にvar_dumpやprint_r等がありますが、
symfony等のフレームワークを使用している場合、こういったダンプ関数を使ってブラウザ上に情報を出力しようとすると、出力する情報量が多すぎてブラウザがクラッシュしてしまうことが多々あります。
こういった時に使える便利な関数がいくつかあったので、メモしておくことにします。
※但しバックトレースに関してはsymfonyで試しにやってみましたが、駄目でした・・・。


debug_backtrace
バックトレースを生成する
debug_print_backtrace
バックトレースを生成する
get_included_files
include または require で読み込まれたファイルの名前を配列として返す
get_defined_constants
すべての定数の名前とその値を連想配列として返す
get_class
オブジェクトのクラス名を返す
get_class_method
クラスメソッドの名前を取得する
get_class_vars
クラスのデフォルトプロパティを取得する
get_object_vars
指定したオブジェクトのプロパティを取得する
get_parent_class
オブジェクトの親クラスの名前を取得する

2011年9月21日水曜日

symfony2のインストール方法

今頃ですが、symfony2のインストール方法です。

今回は以下の環境にインストールをしていきます。
CentOS 5.5
Apache 2.2
PHP 5.3.6
MySQL 5.5.12

Symfonyの設置先ディレクトリは以下の通りです。
/path/to/dir/

まず設置先ディレクトリへ移動します。
$ cd /path/to/dir/

で、ここからソースをダウンロードしてきます。
「Symfony Standard」か「Symfony Standard without vendors」のいずれかを選択してダウンロードします。
通常は「Symfony Standard」をダウンロードしてくることになるかと思いますが、
gitをインストールしている環境では「Symfony Standard without vendors」を選択しても良いみたいです。
まぁ結局ダウンロードすることには変わりないので、お好きな方を選んで下さい。
「Symfony Standard without vendors」を選んだ場合には、ダウンロード後にgit経由でvendor系のファイルをインストールすることになります。

ダウンロードが完了後、落としてきたファイルを解凍します。
$ tar -xzpf Symfony_Standard_Vendors_2.0.1.tgz

解凍が完了すると、Symfonyディレクトリが作成され、その中にいくつかファイルやディレクトリがあります。

で、その解凍して出てきたSymfonyディレクトリへ移動。
$ cd Symfony

Symfonyがきちんと使用できる環境なのかチェックしてくれるファイルがありますので、
それを実行します。
$ php app/check.php
********************************
*                              *
*  Symfony requirements check  *
*                              *
********************************

php.ini used by PHP: /etc/php.ini

** WARNING **
*  The PHP CLI can use a different php.ini file
*  than the one used with your web server.
*  If this is the case, please ALSO launch this
*  utility from your web server.
** WARNING **

** Mandatory requirements **

  OK        Checking that PHP version is at least 5.3.2 (5.3.6 installed)
  OK        Checking that the "date.timezone" setting is set
  OK        Checking that app/cache/ directory is writable
  OK        Checking that the app/logs/ directory is writable
  OK        Checking that the json_encode() is available
  OK        Checking that the SQLite3 or PDO_SQLite extension is available
  OK        Checking that the session_start() is available
  OK        Checking that the ctype_alpha() is available
  OK        Checking that the APC version is at least 3.0.17

** Optional checks **

  OK        Checking that the PHP-XML module is installed
  OK        Checking that the libxml version is at least 2.6.21
  OK        Checking that the token_get_all() function is available
  OK        Checking that the mb_strlen() function is available
  OK        Checking that the iconv() function is available
  OK        Checking that the utf8_decode() is available


[[WARNING]] Checking that the posix_isatty() is available: FAILED
            *** Install and enable the php_posix extension (used to colorized the CLI output) ***


[[WARNING]] Checking that the intl extension is available: FAILED
            *** Install and enable the intl extension (used for validators) ***
  OK        Checking that a PHP accelerator is installed
  OK        Checking that php.ini has short_open_tag set to off
  OK        Checking that php.ini has magic_quotes_gpc set to off
  OK        Checking that php.ini has register_globals set to off
  OK        Checking that php.ini has session.auto_start set to off

** Optional checks (Doctrine) **

  OK        Checking that PDO is installed
  OK        Checking that PDO has some drivers installed: mysql, sqlite

今回の僕の環境では特になにもエラーが出なかったので何もしていませんが、
エラーが出た場合は不足しているものをインストールしてあげましょう。

で、この後にwithout vendorsを選んだ方はvendorライブラリをインストールします。
$ php bin/vendors install

以上で設置作業は完了です。

ここからはバーチャルホストの設定ですが割愛します。
ドキュメントルートは以下のディレクトリに設定します。
/path/to/dir/Symfony/web

webディレクトリ直下にconfig.phpというファイルがありますので、
ブラウザからここにアクセスしてみます。
但し、localhostからしかアクセスできるようになっていないので、適宜修正して下さい。
僕の場合は自分のIPを追加しておきました。

設定が成功していると「Symfony Configuration」というタイトルのページが表示されます。
以上でSymfonyの設置は完了です。

次回はSymfony2の初期設定の手順を書いていきたいと思います。

2011年9月13日火曜日

memcacheのインストール

memcacheが標準っぽくなってきたので、自分のVMWare上にも入れてみた。
まずyumからインストールする
必要であればリポジトリを指定してやる。
yum install memcached

以下のファイルを作成し、中身を書く。
# vi /etc/php.d/memcached.ini

extension=memcache.so

で、apache再起動。

きちんと読み込まれているか確認
php -i | grep memcache

/etc/php.d/memcached.ini,
memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 8192 => 8192
memcache.default_port => 11211 => 11211
memcache.default_timeout_ms => 1000 => 1000
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => standard => standard
memcache.max_failover_attempts => 20 => 20
Registered save handlers => files user memcache

で、起動させる。
memcached -d -m 128 -l 127.0.0.1 -p 11211

ちなみにオプションはこんな感じ
オプション 説明 デフォルト値
-l <ip_addr> memcachedがListenするIPアドレス。 セキュリティを考慮するときちんと指定したほうがよい。 INDRR_ANY
-d デーモンとして起動
-s <file> Unixソケットへのパス
-P <filename> PIDファイルの指定。デーモンとして動作した場合のみ有効。
-u <username> memcachedを起動するユーザーを指定。root権限で実行した場合のみ有効。
-p <num> ListenするTCPポート番号。 11211
-U <num> ListenするUDPポート番号。 0, Off
-m <num> キャッシュとして利用するメモリの最大容量。単位はMB。 64
-c <num> 最大同時接続数。 1024
-M メモリを使い果たしたとき勝手にキャッシュを削除しないでエラーを返す
-n <bytes> キャッシュ1件(key+value+flags)に割り当てる最小サイズ 単位はバイト。 48
-v errorとwarningを出力
-vv -vに加えてクライアントコマンドとレスポンスを出力
-i ライセンス表示
-h バージョンとヘルプの表示
-r コアファイルのサイズ制限を最大化する。
-k 巨大なキャッシュを扱うときにキケンなオプション。
-f <factor> チャンクサイズの増加係数 1.25
-b 管理されたインスタンスの起動

起動できているか確認してみる。
$ telnet localhost 11211
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
set foo 0 0 3     (保存コマンド)
bar               (データ)
STORED            (結果)
get foo           (取得コマンド)
VALUE foo 0 3     (データ)
bar               (データ)

とりあえずこんな感じです。