タグ

ブックマーク / hnw.hatenablog.com (6)

  • PHPのジェネレータの実装を調べてみた - hnwの日記

    PHP 5.5で実装されたジェネレータについて、PHPのソースコードを追いかけてみました。ボチボチ追いかけたつもりですが、間違いや説明不足に気づいた方はツッコミをお願いします。 該当箇所のgithub.comへのリンクも作ってみました。カギ括弧で囲った場所がソースコード断片へのリンクになっていますので、PHPソースコードリーディングに興味がある方はリンク先も参照してください。なぜか5.5.5のタグが切られていなかったので5.5.4が対象です。 ジェネレータ関数の返す値 yield文を含む関数をジェネレータ関数と呼びます。PHPのparse時にyield文が見つかると、「その関数がジェネレータ関数であるというフラグが立てられます」。 ジェネレータ関数は普通の関数と異なり、呼ばれたタイミングでは関数の実行を行いません。代わりに、「ジェネレータ関数に紐付いたGeneratorクラスのインスタンス

    PHPのジェネレータの実装を調べてみた - hnwの日記
  • 第70回PHP勉強会で浮動小数点数の話をしました - hnwの日記

    7月22日に開催された第70回PHP勉強会で発表してきました。以下が発表資料です。 浮動小数点数周りのトピックを3点紹介する内容でしたが、思ったより反応が良かったように思います。 ただ、面白おかしく話そうとして、聞いている方々に無駄に恐怖を与えてしまったかもしれません。冷静に読み返していただければ、怖いように見える内容もレアケースの話題が多いことがわかるかと思います。 また、PDOの挙動については誤解を与えてしまったかと思いますので、プレゼン資料の25ページ目を大幅に差し替えてアップロードしました。 この点についてもう少し説明します。PDOでプリペアードクエリを利用する際、プレースホルダに値を埋め込むのにPDOStatement::bindValueメソッドを利用することができます。この際、bindValueメソッドの第3引数で利用でPDO::PARAM_INT定数を指定しても、第2引数の

    第70回PHP勉強会で浮動小数点数の話をしました - hnwの日記
  • GitHubへpull requestする際のベストプラクティス - hnwの日記

    みなさん、Git使ってますか?僕はまだメインのVCSがSubversionなのもあって、なかなか慣れません。せっかくGitを使っているのに、ちょっと不便なSubversionくらいの位置づけです。でも、同じような理解度の人って多いんじゃないでしょうか。 一方で、最近はGitHub管理のオープンソースプロジェクトが増えてきました。バグレポートを送るにしてもpull request*1が前提のような空気があり、Git初心者には少し敷居が高い印象があります。 そんな僕も先日初pull requestをしてみたんですが、色々な失敗の積み重ねで残念なpull requestになってしまいました。その反省を元に、稿ではpull requestする際のベストプラクティスを紹介します。これは「Git Workflow」をベースにコマンド例などを加筆したものです。 概要 pull requestする際は、

    GitHubへpull requestする際のベストプラクティス - hnwの日記
  • PHPのcopy関数がファイルサイズ分のメモリを消費する件の対策 - hnwの日記

    補足(2010/08/24 15:00):rename関数について言えば、同一ファイルシステム上であればrenameシステムコールを利用するのでこの問題は起こりません。さらに蛇足ですが、ファイルシステムをまたがってrename関数を利用するとコピーしてから削除することになり、アトミック性を保証できないため、障害の原因にならないかどうかの検討が必要だと思います。 「AKIBA de: PHPのrename()関数はファイルシステム間で使うとメモリをバカいする」で指摘されている通り、PHPのcopy関数やファイルシステムをまたがってrename関数を使う場合に、PHPがファイルサイズと同じ大きさのメモリを消費してしまいます。環境によっては再現しないかもしれませんが、僕の手元のMacOSX 10.5+PHP5.3.3環境では再現しました。 <?php // 「dd if=/dev/urando

    PHPのcopy関数がファイルサイズ分のメモリを消費する件の対策 - hnwの日記
  • mb_check_encodingは何をチェックするのか(その1 SJIS編) - hnwの日記

    (2009/02/15 17:20)「個人的な感想」を追記しました。また、下記はPHP5.2.1以降の挙動です。PHP5.2.0以前のmb_check_encodingは更にカオスなので、あまり使い物にならないと思います。 (2009/02/16 12:30)追記2:バグっぽいと思った件は当にバグで、修正がhttp://news.php.net/php.cvs/56276の通り取り込まれました。PHP5.2.9から修正される予定です。 (2009/02/22 16:20)追記3:他のエンコーディングについても調査しました。「(その2 EUC-JP編)」と「(その3 UTF-8編)」も合わせてご覧下さい。 PHPのmb_check_encoding関数が一体何のチェックをしているのか、エンコーディングごとに一通り調べてみます。 まずはSJISとSJIS-win(CP932)について調べてみ

    mb_check_encodingは何をチェックするのか(その1 SJIS編) - hnwの日記
  • PHP5.3.0alpha3のround関数の実装がPHP5.2.6と変わった - hnwの日記

    (2016/07/02 20:00追記)稿をさらに掘り下げた記事「PHPのround関数を読み解く (1)丸め桁数が大きすぎ・小さすぎる場合」「PHPの新しいround関数を読み解く (2)pre-roundingの意味」を書きました。合わせてご確認ください。 12月4日付でPHP5.2.7とPHP5.3.0alpha3が同時リリースされましたが、これに関連して毎度おなじみPHPのround関数の話題です。相変わらず記事は長いので簡単なまとめから。 PHP5.3.0alpha3ではこれまでのPHPのいずれとも違うround関数が実装されました。少々疑問は残るものの、比較的マシな実装だと僕は考えています。今回は0.50000000001のような不思議な数は含まれていませんし、問題が起こる例が以前より減ったように思います。 第3引数で丸め方式を選択できるようになりました。四捨五入(デフォルト

    PHP5.3.0alpha3のround関数の実装がPHP5.2.6と変わった - hnwの日記
  • 1