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を取得することもできるようだ。
- android studio起動
- 起動後のメニューから「configure」→「preferences」を選択
- 左メニューから「Version Control」「GitHub」を選択
- Auth TypeのプルダウンをTokenにすると「Create API Token」ボタンが出てくるので押す
- ログインダイアログがでてgithubのID/PWを入れると認証コードを入力するウィンドウがでるので、2段階認証の認証コードを入力する
- Token欄にtokenらしき●印がでるので、「Test」ボタンを押すと接続確認が取れる
- 右下の「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送っている人がいた。
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とかで下の階層も再帰的にチェックしたら便利そう。