LinuxやMacでファイル名の一括変換

renameコマンドを使うのですがいまいち使い方が分からなかったので自分用備忘録です。
renameコマンドは引数が3つあることに注意ですね。

$ ls
piyo1.txt	piyo2.txt	piyo3.txt	piyo4.txt	piyo5.txt	piyo6.txt

# rename 置き換え前文字列 置き換え後文字列 対象のファイル群
$ rename 'piyo' 'fuga' *.txt

$ ls
fuga1.txt	fuga2.txt	fuga3.txt	fuga4.txt	fuga5.txt	fuga6.txt

Play! Framework をProduction Modeで動かす

いまいち公式ドキュメントが分かりにくいので。。。

conf/application.conf に、↓を追加。%が必要です。

# 中略
%production.application.mode=prod
%production.jpa.ddl=create

↓こんなふうにして実行。下から二行目、ProdとなっていればProduction Modeです。
# pwd
/var/www/html/myFirstApp

# play -Dconf=conf/application.conf start
[info] Loading project definition from /var/www/html/myFirstApp/project
[info] Set current project to myFirstApp (in build file:/var/www/html/myFirstApp/)

(Starting server. Type Ctrl+D to exit logs, the server will remain in background)

Play server process ID is 10007
[info] play - Application started (Prod)
[info] play - Listening for HTTP on port 9000...

止めるときは、Ctrl + Dしてからplay stopです。

PHPでのランダム日本語文字列の生成

英数字のランダム文字列のexampleはそこらへんに転がっていますが、日本語だと無かったので作ってみました。ただし、大文字ひらがなかつ小学1年生範囲の漢字のみ、ですが。
結構苦労しました、ナイーブにやると文字化けします。mb_substrとmb_strlenをutf-8と指定して使うのが肝です。

意外と採用のときのプログラミングの試験にいいかもです。制限時間30分みたいに。

class Util {

    static private $hiragana = 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわおん';
    static private $kanji = '右雨王音火貝九玉金月犬見口左山子糸耳車手十女人水夕石川早足大竹虫天田土日年白文木目立力六一ニ三四五下七小上生中入八本円休出森正赤千男町名林花学気空校字青先草村百'; // 小学1年生で習う漢字

    static function get_random_japanese_string($length = 8) {

	$jp_literals = self::$hiragana . self::$kanji;

	mt_srand();
	$random_string = "";

	for ($i = 0; $i < $length; $i++) {
	    $random_string .= mb_substr($jp_literals, mt_rand(0, mb_strlen($jp_literals, "UTF-8") - 1), 1, "utf-8");
	}
	return $random_string;
    }

}

echo Util::get_random_japanese_string(12);

出力:
$ php sandbox.php 
水校た山ニ六車らやこ円お

php54の組み込みウェブサーバーにてphpredisのpconnectでのちょっとしたトラブル

Redisを使うAPIを書いていたのですが、phpredisのpconnectを使っていたら変なことが起こりました。エラーが出るのです。

環境は、

$ uname -a
Darwin kawabook.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

$ php -v
PHP 5.4.10 (cli) (built: Dec 20 2012 19:20:33) 
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans

$ php -r "echo 'Current PHP version: ' . phpversion('redis');"
Current PHP version: 2.2.2
で、curlでアクセスするときはPHP5.4の組み込みウェブサーバーを使っていました。

こんなエラーが出て困っていました↓
/create_new_account.php - Call to a member function setex() on a non-object in /Users/mk/my_repos/Buzz/Element/ActivationCode.php on line 47

該当のクエリは、
$redis->multi()
		->setex(parent::REDIS_UNACTIVATED_W_ACTIVATION_CODE . $this->activation_code, parent::TTL_ACTIVATION_CODE, $userid)
		->zadd(parent::REDIS_UNACTIVATED_USERID_ZSET, time(), $userid)
		->exec();
↑このようにmultiを使ったものでした。

不思議なのは、スクリプトとして実行したときは問題なし、curlで実行すると↑のようなエラーが出るのです。multiを解除してあげると、スクリプトでもcurlでも動きました。

何時間も悩んでいたのですが、ちょっと前にphpredisのドキュメントを読んでpconnectという、接続をpersistentにしてくれるものをコードに採用したのを思い出しました。こんな感じです↓
$redis = new Redis();
$redis->pconnect(Constant::REDIS_CONNECT_IPADDR, Constant::REDIS_CONNECT_PORT);

connectとpconnect、比較してみたところ5%ほどpconnectの方が早かったので、後者を使い始めたのでした。

どうやらこれが原因だったようです。おそらくRedisへの接続が解放されない故に何らかの不具合があったのではと。p付きではない方、単純なconnectにしたら、curlを通してでも正常に動くようになりました。まあ、PHP54の組み込みウェブサーバーを使って開発している私が悪いのですが。ApacheやNginxだと問題ないかもしれません。

手間がかかるので具体的な再現コードは載せませんが、こういうことがありましたということで。。。