hnwの日記

2009-01-01から1年間の記事一覧

2009年をふりかえる

年末の恒例行事ということで、2009年のまとめ記事です。 書いた 2009年は本記事を含め43本の記事を書きました。人気があったのは下記の記事です。また、今年は12ヶ月記事が揃いました。毎月1本以上記事が書けたのは初めてです。 PHPのsort関数は相当おかしい…

ファイル末尾の連続する改行を取り除く

テキストファイルの末尾に改行がたくさんついてたり、逆に1個もついていなかったりすることってありますよね。たくさんあるファイルについて、末尾改行1個だけの形に統一したいなー、と思ったら意外と苦労したので紹介します。 本当はもっとシンプルに書けそ…

モダンにGmailからメール送信

補足:Email::MIMEについては「モダンPerlの世界へようこそ:第20回 Email::Sender:メールを送信する|gihyo.jp … 技術評論社」の内容とかぶってました…。この記事によればEmail::Senderも既に安定してるみたいなので、Email::Sendを使っている本記事の内容…

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も含んでいる動画…

第18回オープンソーステクノロジー勉強会に参加してきました

追記:「1行の大きさの制約の65535バイトを4バイトまで拡張する」が意味不明だったのを修正しました。1行のサイズを2バイトで管理している関係で、通常のMySQLではBLOB型などを除外した1行のデータサイズが256^2-1=65535バイトまでに制限されているのですが…

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

PHP

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

MacPortsでPHP5.2.10をインストールする方法

先ほど気づいたのですが、MacPortsのphp5パッケージの中身がPHP 5.3.0になっていました。「port upgrade php5」すると名前空間とか無名関数とかが使えちゃうと思います。でも、僕は保守的なのでPHP 5.2.10がインストールされた方が嬉しいんですよね。 そんな…

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)…

自然順ソートを行うPHPワンライナー

PHP

PHPの豊富すぎる組み込みの関数の中でも、natsort関数はかなり高機能な関数の一つだと思います。他の言語なら本体に組み込まれることは有り得ないのではないでしょうか。 natsort ― "自然順"アルゴリズムで配列をソートする 説明 bool natsort ( array &$arr…

ワンライナーのためのPHPコマンドラインオプション

PHP

ワンライナー(1行スクリプト)の代名詞と言えばPerlでしょう*1。Perlにはワンライナー向けのコマンドラインオプションが多数用意されています。中でも-neオプションや-peオプションは強力で、入力行ごとの処理をループを使わずに簡潔に記述できます。Perlの…

Emacsの自動セーブに頼るくらいなら本当にセーブしよう

Dropbox管理のファイルをEmacsで編集していると、Emacsの自動セーブファイル(ファイル名が#からはじまる謎のファイル)までDropboxに保存されてしまって悲しい気分になります。この問題に対して「ubulog: Emacsでオートセーブファイルの作成場所を変える」…

pearコマンドのキャッシュと仲良くなる

PHP

openpearってプログラマ視点で非常に素晴らしいですよね。自分のライブラリをPEARパッケージにすると他のマシンにインストールするのが楽になるので、個人レベルでもコードの再利用が進むと思います。大人数で使うようなものなら尚更メリットは大きいと思い…

見直されるべきPHP5の組み込みイテレータ

PHP

PHPには5.0.0以降SPL (Standard PHP Libray)という枠組みが導入されています。これにより、Iteratorインターフェースを実装したクラスのインスタンスであれば、foreach文で配列と同じように取り扱えます。自分でクラスを作るときもIteratorを実装すれば使う…

array_unique関数がPHP5.2.10から後方互換性を取り戻します

PHP

「array_unique関数がPHP5.2.9から後方互換性を失いました」の内容について、PHPの中の人も認識を改めたようです。次のようなタレコミがありました。 【速報】「sort()関数は相当おかしい」と PHP 開発者を訴えていた問題で、原告の hnw さんが最高裁で勝訴…

関数に見えて実は言語構造であるようなPHPキーワード一覧

PHP

追記(2009/05/10 09:25):何をもって「関数に見える」かは人によると思いますが、下記のリストはリファレンスマニュアルのURLがfunction.*.phpとなっているものを引っ張ってきました。 PHPには一見関数に見えるけど関数ではないキーワードが多く存在します…

UTF-8→SJIS/EUC-JPの重複文字をまとめてみた

PHP

文字エンコーディングの変換を行うと、異なる2文字が同じ文字に変換されることがあります。このような文字を重複文字と呼ぶことにします。UTF-8→Shift_JISおよびUTF-8→EUC-JPについて、重複文字を自分用の資料としてまとめてみました。 MacOSX上のPHP5.2.9で…

Text_VariationProducerの紹介

PHP

Text_VariationProducerというPHPのクラスを作りましたので、紹介します。 Text_VariationProducerは、指定した全組み合わせの文字列を作り出すようなイテレータです。n重ループや分岐を書く代わりに、文字列の組み合わせパターンを簡単な文法で記述するだけ…

Suhosinの野良portsを作った

PHP

MacportsでSuhosinが入れられるように、githubに野良Portsを作りました。怪しい英語で説明も書いてみました:http://wiki.github.com/hnw/macports-repos-hnw Suhosinというのは「なぜSuhosinを使うのか」でも紹介しましたが、PHPのセキュリティレベル向上の…

PHPの==演算子をわかりやすくするパッチ

PHP

「PHPの==がキモい件」でも書きましたが、PHPの==は数値っぽいものに対してアバウトな比較を行う演算子です。一方で、他の言語の==演算子は正確な比較を行うものばかりだと思います。他の言語の経験者がPHPのソースコードを読み書きする場合に、PHPの==演算…

MacPortsのSubversion 1.6.0がTigerでビルドできない件

先日「MacPortsのSubversionが濁点つきのファイル名を扱えるようになってた」という記事を書いたのですが、実は僕自身がこの新Subversionをビルドできなくて困っていました。 MacOSX Leopard(10.5)のマシンでは普通に使えていたのですが、Tiger(10.4)のマシ…

MacPortsのSubversionが濁点つきのファイル名を扱えるようになってた

追記(2009-07-17):僕の環境だけかもしれませんが、upgradeするときは「sudo port upgrade subversion +unicode_path」としないと、新バージョンがvariantsの指定無しでビルドされてしまいます。どうにも面倒なのですが、何とかならないもんですかね。 以前…

巨大なSJISのCSVファイルをfgetcsv関数で処理する

PHP

さて、前回記事「PHPでメモリ上に一時ファイルを作る」では、file_get_contents関数でCSVファイル全体を取得して文字エンコーディングの変換を行い、変換結果に対してfgetcsv関数を利用しました。しかし、CSVファイルが巨大な場合にはfile_get_contentsを使…

PHPでメモリ上に一時ファイルを作る

PHP

「blog.plastik.jp » PHP5 の fgetcsv() で読み込み内容が腐る現象」という記事を読みました。fgetcsv()だとSJISのCSVファイルがうまく読めないので、UTF-8に直してテンポラリファイルに保存してfgetcsvで読み込む、という筋書きのようです。 ちゃんとtmpfil…

array_unique関数がPHP5.2.9から後方互換性を失いました

PHP

追記(2009/06/26):PHP 5.2.10以降、この問題は修正されています。「array_unique関数がPHP5.2.10から後方互換性を取り戻します」も併せてご覧ください。 2/26にPHP5.2.9がリリースされましたが、このバージョンからarray_unique関数が後方互換性を失いま…

PHPのsort関数は相当おかしい

PHP

追記(2009/02/28 15:35):ソートする配列の要素が数値または数値形式の文字列のみの場合は、が推移律を満たすので、この記事のような矛盾は起こりません。念のため。オヤジギャグがこらえられなくなったら立派なオヤジだと思います。それはさておき、今日…

mb_ereg系の関数でUTF-16を扱う方法

PHP

PHPでmb_regex_encoding("UTF-16")すると、一見mb_ereg系関数が期待通りに動きません。