It's raining cats and dogs.

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

anyenvのphpenvでphp5.5を入れた時にapcの設定でハマった件

anyenvでphpenvを入れて、php5.5を入れて適当なphp書いて、ビルトインサーバで実行してみたら以下の様なnoticeが出た。

Notice: Unknown: 1. h->opened_path=[null] h->filename=[/private/var/apps/sample/index.php] in Unknown on line 0
Notice: Unknown: apc_cache_find [220575364] in Unknown on line 0
Notice: Unknown: 2. h->opened_path=[/private/var/apps/sample/index.php] h->filename=[/private/var/apps/sample/index.php] in Unknown on line 0
Notice: Unknown: apc_cache_make_file_entry: entry->data.file.filename is [/private/var/apps/sample/index.php] in Unknown on line 0
Notice: Unknown: Inserting [/private/var/apps/sample/index.php] in Unknown on line 0

php5.5からデフォルトOpecacheになったのになんでapcとか使われてるんだろうとおもって、php -iしてみたら

$ php -i | grep apc
Configure Command =>  './configure'  '--with-apxs2=/usr/sbin/apxs' '--enable-option-checking' '--enable-phar' '--disable-intl' '--with-libxml-dir=/usr/local/opt/libxml2' '--with-openssl=/usr/local/opt/openssl' '--with-openssl-dir=/usr/local/opt/openssl' '--with-kerberos=/usr' '--with-zlib' '--with-zlib-dir=/usr/local/opt/zlib' '--enable-bcmath' '--with-bz2=/usr' '--enable-calendar' '--enable-exif' '--with-png-dir=/usr/local/opt/libpng' '--with-jpeg-dir=/usr/local/opt/jpeg' '--with-freetype-dir=/usr/local/opt/freetype' '--with-xpm-dir=/usr/X11' '--with-gd=/usr/local' '--enable-gd-native-ttf' '--with-pear' '--enable-mbstring' '--enable-mbregex' '--enable-shmop' '--enable-soap' '--enable-sockets' '--enable-sysvmsg' '--enable-sysvsem' '--enable-sysvshm' '--enable-wddx' '--with-xmlrpc' '--with-xsl=/usr/local/opt/libxslt' '--enable-zip' '--with-pcre-regex=/usr/local/opt/pcre' '--with-vpx-dir=/usr/local/opt/libvpx' '--with-pcre-dir=/usr/local/opt/pcre' '--with-curl=/usr/local/opt/curl' '--with-iconv-dir=/usr/local/opt/libiconv' '--with-mcrypt=/usr/local/opt/mcrypt' '--with-libexpat-dir=/usr/local/opt/expat' '--with-gettext=/usr/local/opt/gettext' '--enable-pcntl' '--with-mysql=mysqlnd' '--with-mysqli=mysqlnd' '--with-pdo-mysql=mysqlnd' '--with-mysql-sock=/tmp/mysql.sock' '--with-readline=/usr/local/opt/readline' '--enable-apc' '--enable-apc-debug' '--enable-apc-filehits' '--enable-igbinary' '--enable-memcached' '--with-libmemcached-dir=/usr/local/opt/libmemcached' '--enable-memcached-igbinary' '--with-http-curl-requests=/usr/local/opt/curl' '--with-http-curl-libevent=/usr/local/opt/libevent' '--with-http-zlib-compression=/usr/local/opt/zlib' '--with-http-magic-mime=/usr/local/opt/libmagic' '--with-config-file-path=/Users/t-yamaguchi/.anyenv/envs/phpenv/versions/5.5.9/etc' '--with-config-file-scan-dir=/Users/t-yamaguchi/.anyenv/envs/phpenv/versions/5.5.9/etc/conf.d' '--prefix=/Users/t-yamaguchi/.anyenv/envs/phpenv/versions/5.5.9'
apc
apc.cache_by_default => On => On
apc.canonicalize => On => On
apc.coredump_unmap => Off => Off
apc.enable_cli => Off => Off
apc.enabled => On => On
apc.file_md5 => Off => Off
apc.file_update_protection => 2 => 2
apc.filters => no value => no value
apc.gc_ttl => 3600 => 3600
apc.include_once_override => Off => Off
apc.lazy_classes => Off => Off
apc.lazy_functions => Off => Off
apc.max_file_size => 1M => 1M
apc.mmap_file_mask => no value => no value
apc.num_files_hint => 1000 => 1000
apc.preload_path => no value => no value
apc.report_autofilter => Off => Off
apc.rfc1867 => On => On
apc.rfc1867_freq => 0 => 0
apc.rfc1867_name => APC_UPLOAD_PROGRESS => APC_UPLOAD_PROGRESS
apc.rfc1867_prefix => upload_ => upload_
apc.rfc1867_ttl => 3600 => 3600
apc.serializer => igbinary => igbinary
apc.shm_segments => 1 => 1
apc.shm_size => 32M => 32M
apc.shm_strings_buffer => 4M => 4M
apc.slam_defense => On => On
apc.stat => On => On
apc.stat_ctime => Off => Off
apc.ttl => 0 => 0
apc.use_request_time => On => On
apc.user_entries_hint => 4096 => 4096
apc.user_ttl => 0 => 0
apc.write_lock => On => On

なぜかapcが有効になっているし、コンパイルオプションでも--enable-apcとか付いてる。ひとまずphp.ini

-apc.enabled=1
+apc.enabled=0

な感じでapcを無効にしたらnoticeはでなくなりました。

ところで、anyenvで入れたphpenvはよくあるCHH/phpenvではなくて、phpenv/phpenvが使われる。CHH/phpenvでphp5.5を使っていた時はこんなことはなかったので、phpenv/phpenv側の設定だろうとおもってgithubリポジトリを眺めていたら、↓あたりでそれっぽい感じのことをしていた。

https://github.com/phpenv/phpenv/blob/dev/etc/php-5.5.Darwin.source https://github.com/phpenv/phpenv/blob/dev/etc/ext/apc.ini

そもそもphp5.5でapcって動かせたっけ?APCuじゃなくて。

android studioで2段階認証設定済みのgithubからcloneする

android studioを使ってgithubからコードをcheckoutするときに、github側で2段階認証(two factor authentication)を設定しているときはpersonal access tokenを使うそうです。

http://michaelcarrano.com/blog/using-github-with-android-studio

githubの画面からtokenを発行しても良いけど、android studioからtokenを取得することもできるようだ。

  1. android studio起動
  2. 起動後のメニューから「configure」→「preferences」を選択
  3. 左メニューから「Version Control」「GitHub」を選択
  4. Auth TypeのプルダウンをTokenにすると「Create API Token」ボタンが出てくるので押す
  5. ログインダイアログがでてgithubのID/PWを入れると認証コードを入力するウィンドウがでるので、2段階認証の認証コードを入力する
  6. Token欄にtokenらしき●印がでるので、「Test」ボタンを押すと接続確認が取れる
  7. 右下の「OK」ボタンを押して完了

あとは起動後のメニューから「Check out from Version Control」からgithubを選んでプロジェクトをcheckoutしたらおk

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だと改行コードありだった。