SHOYAN BLOG

I am a pragmatic programmer.

Php-idnkitをインストールする

php-idnkitをインストールしたのでメモ。
OSはubuntu、PHPのバージョンは5.6.24で行った。

php-idnkitはidnkitをPHPから使えるようにするPHPの拡張モジュール。
拡張モジュールなのでPHPをコンパイルし直す必要はない。モジュールをコンパイルして、php.iniのextensionに指定すれば使えるようになる。

idnkitのインストール

php-idnkitはあくまでidnkitをPHPから使えるようにする拡張モジュールなのでidnkitがないと動作しない。
まずはidnkitをインストールする。

idnkitはJPNICが提供しており、以下からソースコードをダウンロードすることができる。

1
2
3
4
5
6
$ wget https://www.nic.ad.jp/ja/idn/idnkit/download/sources/idnkit-1.0-src.tar.gz
$ tar -zxf idnkit-1.0-src.tar.gz
$ cd idnkit-1.0-src && \
    ./configure && \
    make && \
    make install

php-idnkitをインストール

続いてphp-idnkitをインストールする。
そのままではエラーとなったので以下のパッチをあてた。

php-idnkit.patch

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
--- xxx/idnkit.c
+++ yyy/idnkit.c
@@ -36,7 +36,11 @@ static int le_idnkit;
  *
  * Every user visible function must have an entry in idnkit_functions[].
  */
+#if ZEND_MODULE_API_NO >= 20100525
+zend_function_entry idnkit_functions[] = {
+#else
 function_entry idnkit_functions[] = {
+#endif
    PHP_FE(idnkit_decodename,   NULL)
    PHP_FE(idnkit_encodename,   NULL)
    PHP_FE(idnkit_errno,        NULL)
@@ -104,7 +108,7 @@ PHP_MINIT_FUNCTION(idnkit)
    idn_nameinit(1);

    /* get idnkit version */
-   REGISTER_STRING_CONSTANT("IDNKIT_VERSION", (char*)idn_version_getstring(), CONST_CS | CONST_PERSISTENT);
+   REGISTER_STRING_CONSTANT("IDNKIT_VERSION", "1.0", CONST_CS | CONST_PERSISTENT);

    /* idnkit actions */
    REGISTER_LONG_CONSTANT("IDNKIT_DELIMMAP",       IDN_DELIMMAP,       CONST_CS | CONST_PERSISTENT);
1
2
3
4
5
6
7
8
$ wget http://www.sera.desuyo.net/idnkit/php-idnkit-20031204.tar.gz
$ tar -zxf php-idnkit-20031204.tar.gz
$ cd idnkit && \
    patch -lsp1 < /tmp/php-idnkit.patch && \
    phpize && \
    ./configure && \
    make && \
    make install

php.iniにextensionを指定

最後にphp.iniにextensionを指定を指定する。
以下は、/usr/local/lib/php.ini にphp.iniがある場合の設定例。

1
$ echo "extension=idnkit.so" >> /usr/local/lib/php.ini

以下のコマンドが動作すればOK。

1
2
$ php -a
> echo idnkit_encodename(mb_convert_encoding("日本語JPドメイン名.jp", "UTF-8", "auto"));

高任和夫の「起業前夜」を読了した

私は本が好きで常に何かしらの本を読んでいる。

最近、高任和夫の「起業前夜」を読了した。
商社のサラリーマンが会社の闇に気づいて、それをなんとかしようとする話しだ。
その過程で様々な人と出会い、主人公は自分の人生や幸福について考えることになる。

社会人になってから小説は読むのに時間がかかるのでそれとなく敬遠していたのだが、小説を読む必要性があるのではないかと考えを改めた。
最近、視野が狭くなっていると感じている。
同じオフィスで働く毎日を繰り返すと、どうしてもその日常での視点で物事を見てしまう。
その組織の常識が自分の常識となり、それはどうもおもしろくない。
そんなことを考えず、ただ目の前の仕事をこなしそれでうまくいけばいいのだが私はそうではないので、視野を広げてみようと思ったのが小説を読むきっかけである。

そういう理由なので、サラリーマンが題材の小説を中心に読むつもりだ。
職種は違えど、会社に勤めるサラリーマンであれば皆似たような悩みや問題を持っていると思う。
それをどのように解決し成長していくのかを学び、あわよくば取り込んでしまおうと思っている。

「起業前夜」の次は何を読むのかというと、楡周平の「プラチナタウン」だ。
寂れた地方を元気にしていく内容の小説。
色々と学べることがありそうで楽しみだ。

mysql_real_escape_string()のみで防げないSQLインジェクション

PHPアプリのSQLインジェクション対策として、mysql_real_escape_string() 等があるがこれだけでは万全ではないことがあるのでメモ。

例えば以下のSQLではmysql_real_escape_string()を使っているが、脆弱性が存在する。

1
2
$id = mysql_real_escape_string("1 OR 1=1");
$sql = "SELECT * FROM table_name WHERE id = $id";

mysql_real_escape_string() では上記を防ぐことができない。
クエリ内の変数をシングルクォート(')で囲むことで上記を防ぐことができる。

1
2
$id = mysql_real_escape_string("1 OR 1=1");
$sql = "SELECT * FROM table_name WHERE id = '$id'";

社内ISUCONに参加して優勝した

社内ISUCONが開催されたので参加してみた。
参加チームは全10チーム。
ISUCONは今回初めての参加だったが、思っていた以上に楽しかった。
参加するまではそんなに楽しいものなのかと懐疑的だったのだが、ほかのチームとスコアを競い一喜一憂するのは楽しいものだった。

社内のプライベートクラウド上で行い、PHPとRubyのアプリケーションを選択することができた。
最初はRubyでやったが、スコアがあがらなかったのでPHPのアプリケーションに変更した。

効果があったのが、クエリのチューニング。
select句でアプリケーションに使うカラムに絞ることでIOを減らしたり、結果をセッションにキャッシュすることでクエリの実行回数を減らした。
また、テーブルのカラムにインデックスを作成してチューニングした。
そのほか、php-fpmの子プロセスの数を増やしたり、mysqlのパラメーターをチューニングするのも効果があった(具体的にはinnodb_buffer_pool_size,read_rnd_buffer_size,sort_buffer_size,query_cache_sizeあたり)。

サーバ側はほかのメンバーに任せきりといった感じだったので、どこがボトルネックになっているかを素早く探すスキルやミドルウェアをパパッと導入できるスキルを身につけたいと思った。
優勝できたのは他のメンバーが頑張ってくれたのと運がよかったのだと思う。
個人的には反省の多いISUCONだった。
課題が見つかったのとISUCONを楽しめたのが収穫だ。

ポケモンGOが自分を変えたこと

ポケモンGOが日本で遊べるようになったのが2016/6/21。
およそ2ヶ月が経ちスタート当時のブームは落ち着いてきた。

自分はコツコツと続けていて、最近ようやくレベル20になった。
レベル20になるとポケストップでハイパーボールが出てくるようになる。

今更だが、ポケモンGOの開発者のメッセージをみた。
目指しているのはみんなが外に出てもっと歩き、新しい場所へ行き、友達と楽しむゲームという言葉が印象的だった。
そんなゲームで遊ぶことで、人生が豊かになると信じていると話していた。

自分はポケモンGOをやりだしてから、ほんの少しだが人生が豊かになったと思う。

家の近くのポケモンを息子と一緒に探しにいったことがある。
カビゴンを見つけたときは2人で歓声をあげたものだ。

ポケモンGOにはポケストップがいたるところにある。
今まで気づかず、素通りしていたものに気付かされた。
身近なところにこんなものがあったのかと。

最近は道を歩くときに、なにか面白いものはないかと気にするようになった。
少しだけ自分も変わっているのだと思う。