hnwの日記

PHP

PHPの新しいround関数にバグをみつけた

PHP 5.3.0以降、PHPのround関数の挙動はChristian Seilerさんが提案したRFCに従って一新されています。この新しいround関数の仕様上の問題もしくはバグを見つけました。 以前の記事「PHP5.3.0alpha3のround関数の実装がPHP5.2.6と変わった」でこの新しい実装…

PHPの日付文字列の解釈ルールがドキュメント化されました

PHP

PHPのstrtotime関数やDateTimeクラスは、様々なフォーマットの日付文字列を解釈し、時刻として取り扱うことができます。たとえば次のような文字列を解釈することができます。 "Wednesday July 23rd, 2008"(=2008年7月23日) "first Wednesday July 23rd, 2…

PHPの独特な正規表現関数:mb_ereg_search

PHP

直前の記事「mb_ereg_replace関数でe修飾子を使う際の注意点」で利用しているmb_ereg_search_ナントカという関数群は特徴的な関数ですが、あまり使用例を見ない関数です。今回はこの関数群の概要を紹介します。 この関数群は正規表現マッチを行うmb_ereg系関…

mb_ereg_replace関数でe修飾子を使う際の注意点

PHP

mb_ereg_replace関数でe修飾子を使ってevalする場合の注意点をまとめてみました。 概要 マニュアルの下記引用部にもあるとおり、mb_ereg_replace関数はe修飾子の指定があっても特にエスケープなどを行いません。 信頼できない入力に対しては、絶対に e 修正…

日付と時刻の豆知識 (4)tz databaseと日本のサマータイム

tz database(zoneinfo database、Olson Databaseとも)とは、世界のタイムゾーン名と、時差およびサマータイムの運用情報をまとめたファイル、もしくはそれをまとめるプロジェクト名のことです。プログラミング言語およびOSでの利用を想定して作られたもの…

日付と時刻の豆知識 (2)うるう秒とコンピュータ

うるう秒とは、地球の自転と時刻とのずれを補正するために、特定の日を1秒だけ長くしたり短くしたりして調整するものです。私たちが日常的に利用している時刻は原子時計を基準にしていますが、地球の自転する速度は僅かながら変化し続けているので、観測に基…

細かすぎてChangeLogにも載らないバグフィックス選手権

PHP

本日付でPHP 5.3.4がリリースされました。ChangLogを眺めたところではそれほど大きなツッコミどころは無さそうです。 ところで、このPHP 5.3.4からChangeLogにも載っていないバグ #52826 が修正されています。これは僕が報告したバグで、php -iすると嘘のス…

PSR-0 を和訳してみた

PHP

先週の土日にPHPMatsuriに行ってきました。ナイスなイベントでしたね。その感想はまた改めて書きますが、Nate Abeleによるセッション「Practical PHP 5.3」で触れられていたPSR-0を適当に訳してみました。これはPHP5.3の名前空間とクラス名に関する標準化の…

PHPカンファレンス2010で発表&パネル発表してきました

PHP

9月24日、25日の両日、PHPカンファレンス2010が開催されました。僕は25日のテックデイで、PHPのストリームについて発表してきました。また、最初のPHPを作った開発者であり今もPHPのコアデベロッパーであるRasmusとHipHop for PHPの開発者Scottを招いての発…

PHPのcopy関数がファイルサイズ分のメモリを消費する件の対策

PHP

補足(2010/08/24 15:00):rename関数について言えば、同一ファイルシステム上であればrenameシステムコールを利用するのでこの問題は起こりません。さらに蛇足ですが、ファイルシステムをまたがってrename関数を利用するとコピーしてから削除することになり…

例えばPHPのpreg_replace関数でe修飾子を避ける

PHP

(2015/04/19追記)e修飾子はPHP 5.5からdeprecatedになっています。また、PHP7からは廃止されます。PHPのpreg_replace関数では、e修飾子が利用できます。これはPerlから輸入された機能で、置換後パターンの文字列をPHP文法に従って評価する(evalする)とい…

PHPのPCRE関数での\Q,\EはPerlと同一ではない

PHP

Perl正規表現で利用できる便利なエスケープシーケンスとして、\Qと\Eがあります。これはメタ文字の解釈を止めたり、その解釈を再開したりするものです。「man perlre」には次のような例が出てきます。 /$unquoted\Q$quoted\E$unquoted/ この正規表現は変数$u…

PHPの文字列型は2GB以上の文字列を処理できない

PHP

(2015/6/12追記)PHP7から、64bit環境であれば2GB以上の長さの文字列が扱えるようになります。やったね! PHPの文字列型は、一般には文字列長の制限が無いとされています。PHPマニュアルにも次のように書いてあります。 注意: 文字列が非常に大きくなっても…

Snow Leopardで少し古いPHPをビルドする方法

PHP

PHP bugs #49332で指摘されているのですが、PHP5.2.10以前およびPHP5.3.0をSnow Leopard(MacOSX 10.6)でビルドしようとすると、リンク時に下記のようなエラーが出てビルドに失敗します。 Undefined symbols: "_res_9_search", referenced from: _zif_dns_get…

WEB+DB PressでPHPの連載をはじめました

PHP

非常に今更ですが、「WEB+DB Press」でPHPの連載記事を書きはじめました。連載タイトルは「PHP転ばぬ先の杖」ということで、PHP初心者から中級者をターゲットに、PHPではまりやすい落とし穴や便利なtipsなどを紹介していきたいと思っています。 Vol.56掲載の…

PHPで1599年以前の曜日計算がおかしい

PHP

(2010-04-24 17:40)内容を補足する意味で「グレゴリオ暦が採用された時期とプログラミング言語の対応」「ユリウス暦を扱いたい場合」を追記しました。 PHPの日付まわりの処理にバグを見つけました。1599年以前の日付の75%程度の曜日を誤判定するバグがPHP …

PHPで整数の範囲を超えたときの挙動について

PHP

(4/17追記)twitter経由でタレコミがありまして、恥ずかしいミスをコッソリ直しました(32bit整数の範囲について)。どなたかわかりませんが、ありがとうございます! PHPの整数(integer型)はCのlong型をそのまま利用しています。つまり、32bit環境であれ…

64bit環境とPHP

PHP

先週のPHP勉強会の僕のプレゼン「64bit PHPの罠」に間違いがありました(参照:「第51回PHP勉強会@関東に参加してきました」)。全体の主張はそれほど変わりませんが、下記の通り訂正いたします。 誤:「PHPのinteger型はCのint型」「64bit環境ではPHPのinte…

Unknown曜日

PHP

(2016/04/01追記) 本バグはPHP 5.5.20以降、およびPHP 5.6.4以降で修正されています。 64bit環境のPHPで過去の曜日を調べてみたら「知らんよ」って言われました。

第51回PHP勉強会@関東に参加してきました

PHP

追記(2010-04-04):ごめんなさい、プレゼン内容に一部嘘が混ざってました。「64bit環境とPHP」も併せてご覧下さい。 第51回PHP勉強会@関東に参加して、15分ほどのプレゼンをしました。勉強会の会場は、毎度おなじみトライコーン株式会社さんでした。suzukiさ…

ctype_digit関数の罠

PHP

PHPにはctype_digitやctype_lowerなど、ctype_XXXXという関数が多数あります。本記事の話題はこれらctype関数の挙動と注意点についてです。ctype関数のマニュアルには下記のような記述があります。 これは、256 より小さな整数が指定された場合、指定した範…

PHPのY10K問題

PHP

PHPは他の言語と同様に、時刻を扱う際にunix epochからの経過秒数(いわゆるunix time)を利用しています。PHP5.2.6以降では、64bit環境であればunix timeも64bitに拡張されています。これで2038年問題も過去のものになるというわけです。 一方、unix timeが…

sort関数と全順序集合

PHP

大仰なタイトルですが、約1年前の記事「PHPのsort関数は相当おかしい」の補足記事です。僕が何を根拠にPHPのsort関数(の第二引数のデフォルト値)がおかしいと思ったかを説明します。一言でいうと、PHPの全ての値とSORT_REGULAR(言い換えるとPHPの)の組み…

SplFixedArrayはPHP標準の配列よりメモリを消費しない

PHP

PHP5.3.0から実装されたSplFixedArrayというSPLクラスがあります。これはマニュアルによれば下記のようなクラスです。 SplFixedArray クラスは配列の主要な機能を提供します。 SplFixedArray と通常の PHPの配列との主な違いは、 SplFixedArray は固定長であ…

unixtimeを求めるワンライナー

PHP

特定の日時のunixtimeが知りたくなった時って皆さんどうしてますか?例えば2009/09/26 23:00:00 JSTであれば次のワンライナーで求められます。 $ php -r 'echo mktime(23,0,0,9,26,2009);' 1253973600 いやいや、ワンライナーって言ったらPerlだろうとも思っ…

PHPカンファレンス2009でLTしてきました

PHP

9月5日に、PHPカンファレンス2009のライトニングトーク枠でphpallについて喋ってきました。資料は下記です。 発表資料:「phpall:PHPの全バージョンの挙動を試す」(PDF) Ustream録画:http://www.ustream.tv/recorded/2107844 (他の方のLTも含んでいる動画…

第45回PHP勉強会@関東に参加してきました

PHP

第45回PHP勉強会@関東に参加して、5分ほどLTをしました。勉強会の会場は、はてな@六本木さんでした。店名がイカス。そして幹事のgusagiさん毎度ありがとうございます。 発表資料 : 「バグレポしようぜ!」(PDF) 以前の記事「PHPへのバグ報告の手順」の焼き…

PHP 5.3の無名関数を試してみた

PHP

何番煎じかわからないですが、PHP 5.3からは無名関数が実装されたということで、試しに使ってみました。 見なくても何となく使えるようなものだと思いますが、ドキュメントが「PHP: 無名関数 - Manual」にありますので、ざっと目を通した方がいいと思います…

Symfony Event Dispatcherで遊んでみた

PHP

Symfony Event Dispatcher とは Symfony Event DispatcherというのはPHPフレームワークであるsymfonyに含まれるライブラリで、GoF*1のObserverパターンの変種です。 このクラスは現在Symfony Event Dispatcherという名前で単体公開されていますので、symfony…

PCREはUnicode文字プロパティをサポートするとは限らない

PHP

(2011/05/19追記)CentOS5のpcreパッケージについて言えば、2010年7月以降Unicode文字プロパティが有効になっているそうです。安心ですね!(via「 CentOS5.5でCakePHP1.3系のInflector::slugを正常動作させる方法 - Lism.in * blog - nekoya (id:studio-m)…