この記事は 17 日目の@rskyさんに続いて、PHP5.4 Advent Calendar 2011 18日目エントリです。彼の朝はいつ開けるのでしょうか。
さて、このAdvent Calenderではそーだいさんの記事に続き2回目になるhtmlspecialcharsネタ。 そもそもそんな一つの関数に 2回も同じネタやる意味あるのかと悩んだのですが、突撃してみたいとおもいます。言いたいことは大体、先の記事に書いてあるので僕からは、もう少し別の角度からいってみたいと思います。
そもそもこの記事を書こうとおもったきっかけなんですが、久しぶりに、PHPマニュアルの htmlspecialchars のページ開いたときでした。。
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $charset [, bool $double_encode = true ] )
第 3 引数を指定するか否かと議論になってますが、double_encodeという引数が、もうずいぶん前に追加されていることに気がつきました。
え、なにそれこわいと、該当ページ下部の変更履歴を見てみると PHP5.2.3 の時代の変更でした。えれぇ昔のものなので僕が気がついてなかっただけのようです。
ちなみにこのオプションの意味は、
double_encode をオフにすると、PHP は既存の html エンティティをエンコードしません。 デフォルトでは、既存のエンティティも含めてすべてを変換します。
とのことで、一度このオプションをoffにしたらhtmlspecialchars_decodeをかけてもほぼほぼ戻せないテキストデータが一丁あがりなオプションがついてました。そもそも可逆が保障されているようなものではないので、まぁそういうものかもしれません。
個人的には、「やつはまだ第2形態だ、第3,第4形態を残しているぞ」という気分になりました。
そういったことがあり、この記事を書いてみようかなと思いました。
あ、そうだ、PHP5.4でしたね。さて、このPHP5.4から$flagsに下記のオプションが追加されています。
定数 ENT_SUBSTITUTE、ENT_DISALLOWED、 ENT_HTML401、ENT_XML1、 ENT_XHTML および ENT_HTML5 が追加されました。
これ結構さくっといってますが、結構気になる箇所です。
無効な符号単位シーケンスを含む文字列を渡したときに、 空の文字列を返すのではなく Unicode の置換文字に置き換えます。 UTF-8 の場合は U+FFFD、それ以外の場合は FFFD; となります。
指定した文書型において無効な符号単位シーケンスを含む文字列を渡したときに、 Unicode の置換文字に置き換えます。 UTF-8 の場合は U+FFFD、それ以外の場合は FFFD; となります。
ちょっと悩んだのですが、t_komuraさんの記事を読んで、なんとなくわかった気になりなおかつ、コミットログとソースコードをあさったでは以下のよいうな感じではなかろうかという結論に達しました。
不正なバイト列があったときに、ENT_IGNOREというオプションは削除なのですが新しくできた二つは別の文字列に置き換えます。。
ENT_SUBSTITUTEは指定した文章型によらず不正な文字列を特定のコードに置換します、ENT_DISALLOWEDは指定した文書型(つまり、ENT_HTML401、ENT_XML1、 ENT_XHTML、ENT_HTML5)のオプションに従って処理をします。(ここがちょっとあやしい)ENT_DISALLOWEDは、double_encodeがfalseのとき参照時に推奨されていない数値参照についても同様の処理を行うようになっているようにも見えます。
とりあえずコミットログの下記あたりと参考になると思いますのでこちらを参考にしてください。(だいたい同じこといってます)
Added the flag ENT_SUBSTITUTE, which makes htmlentities()/htmlspecialchars()
replace the invalid multibyte sequences with U+FFFD (UTF-8) or FFFD;
(other encodings).
Added the flag ENT_DISALLOWED. Implements FR #52860. Characters that cannot
appear literally are replaced by U+FFFD (UTF-8) or FFFD; (otherwise).
An alternative implementation would be to encode those characters into
numerical entities, but that would only work in HTML 4.01 due to limitations
on the values of numerical entities in other document types. See also the
effects on htmlentities()/htmlspecialchars() with !double_encode above.
おそらくここらへんちょっとまだ、全体的に英語からして、(otherwise)の処理が書いてなかったりするあたりから類推するに、完全に文書化されてないところがあるようにみえるので、正式版を見てから考えたいです。*1
こう、解説なのに結論めいたことがかけないですが
という感じでが今の僕のなかの結論です。
まぁ結論からいって何も変わらないとおもっていただいて結構です。
個人的には、htmlspecialchars を書く箇所というのはフレームワーク内で数か所なので修正はそんなに大変ではないだろうし、正しい使い方さえ認識があればそんなに修正箇所が多いものだとはおもっていません。また、いままでは動作を指定していたものが、新しいオプションにより、HTML5等の仕様側を関数が面倒みてくれるところまで踏み込んできたのはいいことのように思えます。
ただ、ちょっと追加されたオプションについては、もうちょっと識者の意見がお伺いしたいところだったりします。
まぁとはいえ、PHP のマニュアルを見るだけでこれだけいろいろ思うことがでてくるといのはいいことでもあり、悪いことでもあると思うのですが、PHPマニュアルの読み方とかPHPマニュアルの面白さが少しでも伝われば幸いです。
最後にここいちは、クリスマスイブ一緒に飲んだくれてくれる女の子を募集中です!
htmlspecialcharsの件、クリスマスの件フィードバックをお待ちしております。
さて、次回はco3kさんです!!
*1:もしくはもう少し追試したいです
SymfonyLiveにきています。
http://www.slideshare.net/dustin.whittle/the-path-to-symfony-in-the-usa
氏によるSymfonyの歴史と今後の話
symfony 1.x や Symfony 2.x の歴史や機能面については、散々いわれているので省きますが体制を作るという点で、githubへ以降したことが印象負荷かかったです。
もともと、symfony1.xが言語を問わずいろいろなフレームワークから機能を持ち込んだというという敬意と反省から車輪の再発明を避けようということになったという経緯が語られていました。
http://www.slideshare.net/avalanche123/clean-code-5609451
流行りのUnitTestなどについてよいコードの指針とかの話があった。Jenkinsについても(このほかの発表でも文言でてきた)語られていた。
http://window.punkave.com/2011/02/08/liveblogging-symfony-live/
symfony1.xベースのCMS(というか、symfony plugin)Apostropheの紹介、ジェネレータでテンプレートとか作るタイプのものに見える。
Symfony2.x系だとほぼすべての部分が作り直しになるはずでそういう検討もしてはいるみたい
終わった後に今晩、Apostropheについてかたろうぜみたいな呼びかけがあって盛り上がっていた。
サンドイッチおいしいです。(一人でくってます・・・)
ちなみにサンドイッチは配られたものです。
午後の部ですが当初予定されてた発表者のビザがおりず当初の予定とは違う方が話しています。
Gitについての説明でgitはSnapshotって話だった気がする。
http://www.slideshare.net/jwage/doctrine-intherealworldsf-live2011sanfran
Doctrineの作者であるJonathan H. Wageの発表、彼は1年以上はMongoDBにがっつり始まってるような気がしますがDoctrineの発表と、Symfony2のconsole+supervisord(http://supervisord.org/
)を使ったDaemon化とMongoDBのMongoCursor::tailableを使ったキュー処理の実装についての発表でした。
http://prezi.com/gxrdwsplwplf/phpbb4-building-end-user-applications-with-symfony2/
phpBBの歴史と今後についてとSymfony2をどう使うといった話。
実践的なアプリケーションの話はこれくらいだったので感覚的に同意できるところが多かったです。
Symfonyともにメインの開発者であるところのFabian氏によるライブコーディングでのSymfony2の説明会。
「あぁこれ今うごくね」とかそいう会話してた
サンフランシスコで開かれているsymfony liveに来ています。
といっても英語できるわけじゃなくて、yandodさんに連れて行ってもらってる感じです。
ちなみに、彼はかなりsymfony liveの中の人たちと顔みしりって感じがしてすごいなぁと思った。
ゴールデンゲートブリッジと俺。
ちなみに寝ぐせじゃなくて風が強いだけですから!!!
会場は、本番会場ではなく下記のレンタルオフィス?的なところ。
かなりオシャレな場所で写真はとってないんだけど下記みたいな感じ
http://homerun.com/deal/next-space-coworking-sf-1?_a=tdm&SID=3-509679857-634121179305898750
これはなんか次世代オフィスの香りがしましたがたぶん日本じゃできないなぁとおもった。
こういう、レンタルオフィスというか、作業場所あったら通いたい。
やっていたことは下記で主な議論はTwitterではなくてIRCで進んでました。
http://trac.symfony-project.org/wiki/SfLiveSfHackday2011
「symfony 1.5までしかやってなかったが何か手伝えることはあるか」
とか、かなり、積極的に会話してて、あーアグレッシブだなぁという感じ。
会話も結構弾んでいたようで「TiwgのテンプレートをDBにいれるだって?それはかなり良くない方法だ」とか、そういう話も聞こえてきて、「あーTiwg使ってる人いるんだなぁ」とかささやかな感動がありました。
いや、作った人たちがいるからまぁ当たり前かなぁとは思います。
そういえば、サンフランシスコはとってもアグレッシブな町で、町あるいてるとかなりの頻度で話しかけられます。
「私日本語のこんにちわしってるわ」みたいなおばちゃんとか、「どっからきたの?(安藤さんと僕二人であるいてて)お前らカップルか。」「ちげーよwww」みたいな会話とかよくありました。
私は日本語しかできないのでドキュメンテーションすら手伝えないので、symfony-sandboxをずーっといじってました。
このイベントのために、sandbox自体が最新に更新されていて、いろいろ新しくなって楽だった。
実を言うとSymfony2は初めて触ったけどかなりDRYだったりDIでなおかつ実践的なFWだなぁと改めて思った。(まだ完成してないけどさ)
ハッカソンに参加してたメンバーは、アメリカ以外からきた人が多い印象で、たぶんここの発表者の大半が来てたように思えるけど誰が誰だかなんてわからないのであとで記憶と名前を一致させようと思います。
http://www.symfony-live.com/san-francisco/schedule
あとメガネっ娘もいました。
とりあえずメモがてら、後でもうちょっと詳しく書きます
komagata
2011/02/07 14:34
チャックが閉じてることを確認しました!
ウノウに入って4年がたったようだ。
今のところやめる予定は無いがTeZynga Japanにかわるかもしれないとのことで、ウノウでの4年間終わりなのかもしれない。
しかし、とても面白い4年だった。
面白かったことをぱっと思いつくだけで3つあげると
われながら、なんかどうしちゃったんだという感じで正直一生誇れるような(?)話だと思います。
最初のエイプリルフールネタ。
二時間くらいですごい勢いでつくったが考えてみるともしかすると、会社の脳裏にはこのころから、買収について考えることがあったのかもしれない。
ちなみに、btoこと尾藤さんの元ネタはこれです。
二年目には、実際にぷちぷちAPI作りました。(10分くらいで)声を一人で会議室で録音していたら、次の日女性社員が自分の声録音した音声をくれて感動した覚えがある。
これは、僕の力はほとんど反映されていないが、上の二つも僕の努力のけっか とは言いがたいのであげておく。
人生で一番多くのトラフィックと、超スピードで走った3ヶ月間だった。
そのほかにも、fixdapで遊んだとか、面白ことがたくさんあったし、取引先の人には感謝しても仕切れないほどの、力をいただいていてよい4年間だったと思う。
自分がかわったなーということは一杯あるが、
月1くらいだったのが多いときは毎日飲んでた。
それもストレスとかじゃなくて、仲間がいたから飲みにいきたいと感じたんだと思う。
ただ、ちょっと飲みすぎだなと思い直して最近減らすようにしている。
もちろん会社で飲みにケーションが強制されるようなことはあってはならないけど、良い結果だと思う
ただ、外国の人はお酒本当に強いので付き合って、つぶれないように注意したい。
会社で本名でよばれることは少ない。
ただ、最近はcocoitiだと、英語圏「ここいてぃ」なので、cocoichiや、kokoichiと表現されることが多くなった。
副作用が無いよいことについてはその場で、ぱっと手を動かすようにした。
今もそうだけど、会社ではそういうことの積み重ねが重要なんだなと思い始めた。
あとは下ネタをいうようになったくらいか。
変わらなかったのは相変わらず彼女ができないこと。なんでなんだろう。
そんなこんなで、またこんな記事を書けるようなそんな人生を歩もうと思うし彼女も作ろうと思う。
昨日ふとしたきっかけで、simplateの作者の方がお亡くなりになってたことを知った。
もともと、進行性の病で引き継ぎ先を探していたことはしっていて、僕自身はというとスキルの問題とsimplateそのもの利用してないこと、また立候補者がいたことがあってみているだけだった。
http://slashdot.jp/developers/article.pl?sid=08/10/20/0610257
ふと昨日気になって調べていると、とある方のblogですでにお亡くなりになっていることと、別の方が引き継いだ方がリリースをされていたことを知った。
http://sourceforge.jp/projects/simplate/wiki/FrontPage
オープンソースのビジネスなんたらとかリスクとかはあんまり興味がなくて、(だって会社でやってることだって主要なエンジニアが全部引き抜かれちゃうとかあるでしょ)。
いくつか思うところはあった。
全部は書ききれないが一つだけ書くとすると。
僕はソースコードを一種の人の意志がある文章だとおもっていて、そういうものが、読めて共感できたり共感できなかったりすることでいろいろなことを考えたりする。
今までは仕事で使いたいが、自分個人でも使いたいからオープンソースにするとか、いろいろなフィードバックうけて安定化させたいからとかそういう感情によらない部分のことを考えていたが
あまり自分の死を意識することはないが、たとえば、生きている間もふくめてそういう感情を揺さぶることがけきるようなコードを公開できるってのは、素敵だし。だれかが、別に永久に見ていなきゃいけないわけじゃないが、引き受けてくれるというのは素敵なことなんじゃないかなとおもった。
手を動かしてて引き継いだ方々、そして実際にリリースを行った。 FUJIOKA Satoshi さんにも敬意を。
Kazuhiro IIzukaさんには敬意とご冥福を。