LL PlanetsのIPv6ハッカソンとfilter_var()

LL Planets

先週の土曜日 8月20日は文京シビックホールLL Planetsでした。自分も実行委員会の一人だったので、当日は朝早く起きて荷物を運んだり、会場の映像周りのセッティングをしたりしてました。


LL Planets の出し物の一つである「IPv6ハッカソン」参加者として召喚されていたので、当日のセッションはほとんど聞けなかったのですが、参加された方々のブログ等を読むに、まるまる JavaScript 一色に近い内容だったようです。聞きたかったなー。

IPv6ハッカソン

ささけん(@)から召喚されてIPv6ハッカソンの参加者となったので、ほぼ一日裏のハック部屋でこもって作業してました。久々に触って慣れてない FreeBSD や慣れない Ubuntu に苦労しながらも、午前中でなんとか環境構築を終わらせて、私がやってみたのはIPv6環境で、実際にPHPフレームワークを動かしてみる」でした。


PHPの使われ方、特に mod_phpApache HTTPD に組み込まれて使われる方法だと、ApacheIPv6 対応さえしていれば特に何もすることはありません。ただフレームワークによっては IPv4 に依存したコードが入っているかも知れないので、そこをあぶり出してみようということです。


対象となるフレームワークは、どうせだから一度使ってみたいと思っていながら時間がなくてなかなかいじれないものにしてみました。結局以下の4つになりました。

当日発表したプレゼン資料は Slideshare に上げてあります。

Lithiumとfilter_var( )

さて、その作業中に気づいたのが Lithium の IP アドレスバリデーションをするコードの短さです。

/libraries/lithium/util/Validator.php

<?php
        'ip' => function($value, $format = null, array $options = array()) {
                $options += array('flags' => array());
                return (boolean) filter_var($value, FILTER_VALIDATE_IP, $options);
        },

実質以下だけといっても良いです。

<?php
filter_var($value, FILTER_VALIDATE_IP);

これは何だろうということで、この FILTER_VALIDATE_IP で Lithium のコードを grep したのですが、ここ以外何もヒットしません。もしやと思って PHP マニュアルを見てみると、filter_var( ) は PHP 5.2.0 から入った標準関数でした。

さまざまな type と option を渡して、その名の如く値をフィルターする関数のなのですが、前述のFILTER_VALIDATE_IPを type に指定することで、IP アドレスのバリデータとして使用できます。

<?php
$addrs = array(
    '192.168.0',
    '192.168.0.0',
    '2001:2e8:408:10::49',
    '2001:2e8:408:10:0:0:49',
    '2001:2e8:408:10::0:49',
    '2001:2e8:408:10::49:',
    '2001:2e8:408::0::49',
    '::ffff:192.0.2.128', // ipv4 mapped
    '::192.0.2.128', // ipv4 compatible
    );
foreach ($addrs as $addr) {
    $result = filter_var($addr, FILTER_VALIDATE_IP);
    var_dump($result);
}

IPv4 / IPv6 両方に対応していますし、IPv4 mapped IPv6 アドレスや、 IPv4 compatible IPv6 アドレスも対応しています。

PHP: Validate filters - Manualを見ると、以下のフラグを options に指定することでそれぞれの on/off ができるようになっているようです。

  • FILTER_FLAG_IPV4
  • FILTER_FLAG_IPV6
  • FILTER_FLAG_NO_PRIV_RANGE
  • FILTER_FLAG_NO_RES_RANGE

他のフレームワークが、様々なテクニックを駆使して IP アドレスのバリデーションを複雑なコードで実現しているのに比べて、Lithium の洗練具合は半端ないなと思いましたw

Scientific Linuxのscreenで文字化けした話

会社の開発環境を移行中です。Mac miniVirtualBox 上の CentOS 5.6 が、ディスクが論理的におかしなことになっているらしく、触っていると不規則にホストOSの MacOS X ごとお亡くなりになってくれやがるので、何でもテスト用に用意してるXenServerに新しくVMを作ることにしました。


今回の OS は Scientific Linux 6.0 にしてみてます。ひと通りセットアップが終わったところで、emacs でファイルを編集するとどうも日本語が化けている。lv で見てみてもやはり化けている。screen なのが悪いのかと思い、screen を終了して lv で見ると化けてない。おお、screen お前のせいだったのか。

.screenrc と /etc/screenrc を新旧環境で比べてみても差はないし何だろう、と色々試してようやく原因を発見。


歴史的経緯により、私の .screenrc には

defkanji euc

という記述があります。つまり表示は EUC-JP にしているわけね。ファイルの文字コードは、最近はほとんど UTF-8 で、一部 EUC-JP なものが残ってる。ターミナルの入出力を EUC-JP にするために上記の設定をしていたわけです。あ、ちなみにターミナルソフトは Mac の iTerm で ssh でログインしてる。
ふと思い立って、上記の設定をコメントアウトしてみたら、ちゃんと文字化けせずに表示されるようになりました。詳しい原因は不明。