It's raining cats and dogs.

無駄なことなんてないはず

slim 2.4からroutingでクラス形式のコントローラーを呼び出せるようになっていたらしい

slim 2.4からroutingでクラス形式のコントローラーを呼び出せるようになっていたらしい。

http://uzulla.hateblo.jp/entry/2014/01/11/040335

なるほどと思って、早速試したらできたので、おおーとなっていたのだけど、

上の例は特にパラメータを渡さない呼び出しだったので、パラメータを渡すときはどうするのかというと

  • routing
<?php
$app->get('/:greeting/:name', '\App\Controller\HelloController:index');
  • controller
<?php
namespace App\Controller;

class HelloController
{
    public function index($param1, $param2)
    {
        var_dump($param1, $param2);
    }
}

みたいな感じで取れるらしい。

ところで、これくらいシンプルなコントローラーだったら別に構わないのだけど、コンテナとして使っている$appはどうしてもコントローラで参照したいところなので、なんとか上手い渡し方ができないか調べた。結論としては良いやり方がないっぽい。

例えばこんな感じにできたらいいなーとなんとなく思った。

<?php

namespace App\Controller;

class HelloController
{
    private $app;
    public function __construct($app)
    {
        $this->app = $app;
    }
    public function index($param1, $param2)
    {
        var_dump($param1, $param2);
    }
}

調べていたら、おんなじようなことを考える人はいるもので、既にPR送っている人がいた。

https://github.com/codeguy/Slim/pull/755

このPRの結論としてはslim3に持ち越しとのことで、切ない感じになりました。slim3いつ出るの...

MySQL WorkBenchで日本語を使う

だいぶ今更感あるけど、メモ。

とりあえずざっくりER図を書きたいときにMySQL WordBenchを使うのだけど、テーブル名に日本語が表示できないのでざっくりかけない。悲しい。

調べたら設定を変えるだけで使えるらしい。

http://qiita.com/snaka/items/dc1d104ccda608156a71

便利。

そういえばMySQL WorkBench 6.0が出ていた。起動時の画面がナウでヤングな感じになっていて、おーってなったけど、あとはそんなに変わっていなかった。まぁこの手のやつはそんなに凝っていても使いにくいだけなので別にいいか。

phpenvで作ったphp環境にpeclのライブラリをインストールする

phpenvでつくったphpの環境にpeclのライブラリをインストールした時のメモ。

pearのライブラリなんかはcomposerでプロジェクトローカルにインストールしてしまうんだけど、peclってsystem php?な環境にpeclコマンドでpecl install hogehogeみたいにインストールしたことしかないし、peclコマンド自体みつからなかったので、そういえばphpenvで作った環境毎にインストールする時ってどうやるんだろうかと思ってしらべた。

結論phpizeでビルドする。らしい。

Memcachedでもいれてみる

僕の中ではメジャーなMemcachedモジュールを入れてみる。

http://pecl.php.net/package/memcached

※わけあってbeta版を入れる。

$ cd /tmp
# 適当なディレクトリにダウンロード
$ wget http://pecl.php.net/get/memcached-2.2.0b1.tgz
# 解凍
$ tar zxvf memcached-2.2.0b1.tgz
$ cd memcached-2.2.0b1
# phpizeを使う
$ phpize
# ビルドする
$ ./configure
$ make
$ make install
Installing shared extensions:     $HOME/.phpenv/versions/5.5.8/lib/php/extensions/no-debug-non-zts-20121212/

これでホームディレクトリ以下のphpenvの環境にmemcached.soというファイルを作ってくれる。

$ ls $HOME/.phpenv/versions/5.5.8/lib/php/extensions/no-debug-non-zts-20121212/
... memcached.so ...

ただ、これだけだと使えないので、php.iniで読み込んであげる必要があるけど、php.iniに書くものアレなので$HOME/.phpenv/versions/5.5.8/etc/conf.d/memcached.iniというファイルを作って読み込ませるようにする。

ファイルの内容は

$ cat $HOME/.phpenv/versions/5.5.8/etc/conf.d/memcached.ini
extension=memcached.so

これだけ。

あとはphp -iで確認

$ php -i | grep memcached
Additional .ini files parsed => $HOME/.phpenv/versions/5.5.8/etc/conf.d/memcached.ini,
memcached
memcached support => enabled
libmemcached version => 1.0.17
memcached.compression_factor => 1.3 => 1.3
memcached.compression_threshold => 2000 => 2000
memcached.compression_type => fastlz => fastlz
memcached.serializer => php => php
memcached.sess_binary => 0 => 0
memcached.sess_connect_timeout => 1000 => 1000
memcached.sess_consistent_hash => 0 => 0
memcached.sess_lock_expire => 0 => 0
memcached.sess_lock_max_wait => 0 => 0
memcached.sess_lock_wait => 150000 => 150000
memcached.sess_locking => 1 => 1
memcached.sess_number_of_replicas => 0 => 0
memcached.sess_prefix => memc.sess.key. => memc.sess.key.
memcached.sess_randomize_replica_read => 0 => 0
memcached.sess_remove_failed => 0 => 0
memcached.sess_sasl_password => no value => no value
memcached.sess_sasl_username => no value => no value
memcached.store_retry_count => 2 => 2
memcached.use_sasl => 0 => 0
Registered save handlers => files user memcached

なんかいろいろ設定されたみたい。

php5.4からデフォルトのtimezoneの扱いが変わっている件

結構今更感あるんだけど、php5.4からデフォルトのtimezoneの扱いが変わっている。

php5.4以上をインストールしてデフォルトのphp.iniのままphpを実行したりすると以下のようなメッセージが出る。

PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in Unknown on line 0

なんとなく読んでみると、とりあえずUTCタイムゾーンを設定しているけど、date.timezoneでうまいこと設定してねって話。

で、その辺りの話がdate_default_timezone_get()関数のマニュアルに書いてあった。

http://www.php.net/manual/ja/function.date-default-timezone-get.php

要は

  • 5.4以前はTZ環境変数とかみてくれたり、ホストOSに問い合わせてタイムゾーンを設定してくれていたりしていた。
  • 5.5からは明示的にdate_default_timezone_set()関数で設定するか、php.iniのdate.timezone に設定してくれ。

とのことらしい。

php.iniを見てみるとdate.timezoneはコメントアウトされているので

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = Asia/Tokyo

とか設定したらおk

nkfでファイルの文字コードを確認する

nkfはファイルの文字コードを変換したりするもんだと思っていたけど、文字コードを確認するのにも使えるらしい(そりゃそうか)

nkf--guess or -gというオプションを使う。

そういえば僕のmacにはnkfが入っていなかった。
$ brew install nkf
まずはutf8のファイルを作って文字コードを見てみる
$ cat utf8.txt
ほげほげ
ふがふが
$ nkf --guess utf8.txt
UTF-8 (LF)

おお

いろんな文字コードのファイルを作って文字コードを見てみる
$ nkf -s utf8.txt > shiftjis.txt  # shift_jis
$ nkf -j utf8.txt > jis.txt          # jis
$ nkf -e utf8.txt > eucjp.txt     # euc-jp
$ ls * | xargs nkf --guess
eucjp.txt: EUC-JP (LF)
jis.txt: ISO-2022-JP (LF)
shiftjis.txt: Shift_JIS (LF)
utf8.txt: UTF-8 (LF)

便利。

findとかで下の階層も再帰的にチェックしたら便利そう。

そういえば

僕のmacに入れたnkfだと-gだと改行コードなし。--guessだと改行コードありだった。

grep結果に色を付けるとなんだか捗る

grepで検索した時にヒットした文字列の色を替えるやり方をmonmonさんに教わったのでメモ。

--color=autoというオプションをつけると良いらしい

$ grep --color=auto 'hogehoge' access.log

のようにするとgrepの検索結果画面のhogehogeという文字に色がついて見やすい。

  • 使用前

f:id:tadasy:20140106234710p:plain

  • 使用後

f:id:tadasy:20140106234703p:plain

ちなみに

GREP_OPTIONSという環境変数を設定しておくと、常に設定したいgrepのオプションを設定しておけるので、

export GREP_OPTIONS='--color=auto'

みたいなやつを.zshrcとか.bashrcに書いておけば、もろもろ捗る。

ホームディレクトリ($HOME)以外の場所にplenvの環境を作ってperlをインストールする

plenvはデフォルトではホームディレクトリ($HOME)にインストールする前提になっているようだ。

で、今回はわけあってホームディレクトリ以外にplenv(perl)の環境を作りたかったので、その時のメモ。

基本的な流れはREADMEの通り。

/path/toディレクトリにインストールすることにする

まずはplenvのclone

$ git clone git://github.com/tokuhirom/plenv.git /path/to/.plenv

pathを設定する。readmeでは~/.bash_profileに書き込んでいるけど一旦設定だけする。特に理由はない。

$ export PATH="/path/to/.plenv/bin:$PATH"

plenvを初期化するが、ここでもひとまず~/.bash_profileには書かない。

$ eval "$(plenv init -)"

perl-buildを入れる

$ git clone git://github.com/tokuhirom/Perl-Build.git /path/to/.plenv/plugins/perl-build/

ここで試しにインストールできるperlのバージョンを確認してみる

$ plenv install -l

すると

plenv: Please install perl-build. See https://github.com/tokuhirom/plenv/blob/master/README.md#installation

perl-buildが入ってないから入れてねと怒られる。

なのでPLENV_ROOTという環境変数を使って、明示的にplenvの場所を設定してあげる

$ export PLENV_ROOT=/path/to/.plenv

もう一度plenv install -lをしてみる

$ plenv install -l
Available versions:
 5.6.0
 5.6.1-TRIAL1
 5.6.1-TRIAL2
 5.6.1-TRIAL3
...

うまくいった。

僕がうまくググれなかっただけかもしれないけど、plenvのコードを読んでみたらそれっぽいことが書いてあったので、試してみたら出来たという話。 https://github.com/tokuhirom/plenv/blob/master/libexec/plenv#L39