脳みそスワップアウト

揮発性なもので。おもにPHPのこととか。

php5 + JSON-C では JSON_BIGINT_AS_STRING が効かない

phpには、JSONを扱うためのjson拡張が同梱されている。(ext-json(JSON_parser))

しかしこのソース中の以下の一文が問題で、各種Linuxディストリで配布できないことになっている。

ext/json/JSON_parser.c

The Software shall be used for Good, not Evil.

Bug #63520 JSON extension includes a problematic license statement

よって、パッケージでインストールする場合、json拡張はphp同梱のではなく、別のものが使われている。
たとえば Remi の場合は たぶん pecl-jsonc

PHPコードからのインタフェイスはそのままに、実装の下位ライブラリだけ別物というイメージ。
しかし実装が違うため、挙動が微妙に違う。

開発環境がソースからビルドのPHPSTG/本番環境が Remi のPHP というプロジェクトで問題が起きたのでメモ。

続きを読む

浮動小数点は安全じゃない

浮動小数点数は誤差が出て安全じゃないから、重要な計算の時は使っちゃいけないよという話。
PHP に限った話ではなく、コンピュータ全般。

若手エンジニアからこんな質問がきた。
「5761800 を 小数切り捨てしたら 5761799 になっちゃった!」

<?php
$rate = 4.850/100;
$result = 1188000 * $rate;
echo $result*100;                 // 5761800
echo floor($result*100), "\n";    // 5761799
続きを読む

BASEトランザクションとCAP定理

BASEトランザクションとCAP定理

クラウドや分散システムで使われる用語

BASEトランザクションとは

  • Basically Available
    • 可用性が高く常に利用できることを重視。
    • 楽観ロックやキュー。
  • Soft State
    • あるノードの状態はその内部に埋め込まれた情報によって決まるものではなく、 外部から送られた情報によって決まるという状態の考え方
  • Eventual Consistency(結果整合性)
    • 一時的に整合性が満たせない状態が起きるが、 ある一定の期間が経てば満たせるようになる、こと。
    • DNSやNTPなど。

CAP定理とは

以下の3つのうち、2つまでしか満たせないという定理。

  • Consistency(整合性)
  • Availability(可用性)
  • Partition(分散)

システムへの要求によって選択する必要があり、クラウドの場合はAとPは必須となる。 厳密なConsistentは満たすことができないが、少し緩めて、結果整合性なら実現できる。

  • 複数のレプリカノードにデータ送信時
    • いくつかノードで何らかの事情で書き込みに失敗した
    • すべて書き込みには成功したが、同時に終わったわけではない