脳みそスワップアウト

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

php

UPLOAD_ERR_PARTIALのシミュレーション

php

UPLOAD_ERR_PARTIAL を発生させる手順のメモ。 ファイルアップロードの途中でTCPセッションが切れた場合などにこれになる。 モバイル端末など、細い回線で発生しやすい。 このエラーを再現させるには、Content-Length に満たない multipart なリクエストを送…

Windows版php-7.1 で UTF8 の CSV をパースする

Windows版PHP(xampp) の fgetcsv() が、php-5.6 と php-7.1 で挙動が変わったことがわかった。 たぶん php-7.0 から。

composerでローカルディスクのgitリポジトリを使う

repositories でディレクトリを指定すればよい。 Bareリポジトリじゃなくて大丈夫。 バージョンは、ブランチ名-dev を指定する。 指定したディレクトリ直下の composer.json の name が、require した名前と合致していればいい。 composer.json { "repositor…

DmImage の 回転/反転 フィルタ

画像処理の DmImage というライブラリがある。 gd のラッパで、なかなか使いやすいので現在のプロジェクトに導入している。 携帯からの画像アップロードの要件が加わり、Exif の Orientation に基づく 回転/反転 処理が必要になった。 この機能は DmImage に…

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

php

浮動小数点数は誤差が出て安全じゃないから、重要な計算の時は使っちゃいけないよという話。 PHP に限った話ではなく、コンピュータ全般。 若手エンジニアからこんな質問がきた。 「5761800 を 小数切り捨てしたら 5761799 になっちゃった!」

illuminate/database

私の携わったプロジェクトではORMが採用されないケースが多い。 メリットデメリットともにあるし、向き不向きもあるし、アレルギーを持ってる人がいたりするし、論争に興味もないのでそれ自体はいいのだけど、 たとえORMを使わない場合でも、クエリビルダだ…

リモートデバッグ開始のブックマークレット

xdebug + phpstorm で、リモートデバッグを開始するためのブックマークレット。 開始 javascript:(/**%20@version%200.5.2%20*/function()%20{document.cookie='XDEBUG_SESSION='+'PHPSTORM'+';path=/;';})() 終了(XDEBUG_SESSIONというクッキーを消してもい…

behatでラジオボタン選択

Minkにはどういうわけかラジオボタンのタスク(?)がない。 (behat-3.0.15, mink-1.7.0) 自分で作る必要がある。 作ってみた。英語は怪しい。

PhpStormランチャ

PhpStormから実行するスクリプトが環境変数を期待している場合、 PhpStormを起動するシェルで環境変数を設定する必要がある。 そして大抵それはプロジェクトごとに固有のものだったりする。 PHPバイナリだったり、BEHAT_PARAMS だったり。 環境変数を設定し…

PhpStormから日本語behat

Windows7 + PhpStorm-8.0.3 + behat-3.0.15 Behatを使い始めた。 多言語に対応していない PhpStorm(8, 9, 10) は、Behatの多言語に対応していない。 英語以外のステップは補完できないし、IDEからテストの実行すらできない。 2014-05-15 に issue が上がって…

PDO::MYSQL_ATTR_READ_DEFAULT_FILE

pdo_mysql を libmysqlclient を使うようビルドした場合に使えるようになるPDOのクラス定数。 mysqlnd を使うようビルドした場合は存在しない。 なのでこれを使うようなコードは、定数が存在するかどうかを確認してからにしないと環境によってFatalが起きる…

DateTimeでマイクロ秒

php

DateTimeはマイクロ秒を扱うことができるが、 コンストラクタ経由だと秒精度までとなってしまう。 だからこう作る。 $timeZone = new \DateTimeZone(date_default_timezone_get()); $dt = \DateTime::createFromFormat('U.u', microtime(true)); $dt->setTim…

VirtualBoxのディレクトリ共有機能の代わりにSambaを使う

VirtualBoxのディレクトリ共有機能はとても遅い。 代わりにSambaを使うメモ。 メリット ゲスト側からのアクセスが早くなる ゲスト側でパーミッション設定ができるようになる ゲスト側でのUT、カバレッジ出力が劇的に早くなる デメリット ホスト側からのアク…

SimpleXMLのバグ #66084 の影響

とあるAPIから返されたXMLをparseしたところ、環境により結果が違っていた。 どうも、Bug #66084 の修正が影響しているらしい。 この修正は php-5.6.11, php-5.5.27, php-5.4.28 で取り込まれている。

composerで、ライブラリを新しく追加する

Symfony の http-foundation の 2.7.x を追加する例。 composer.phar require "symfony/http-foundation:~2.7" -vvv ライブラリがダウンロードされ、 composer.json, composer.lock が更新される。

Smarty3.1はまだ名前空間に対応してない

久しぶりにSmartyを使うプロジェクト。 初めて3系(3.1) を使ったのだけど、テンプレートで名前空間を use で省略することができない。 フルでクラス名を書くか、別名で対象オブジェクトをassignするという、 ちょっと残念なコードにならざるを得ない状態。 …

phpunitが遅い

PHPUnitが遅い カバレッジを出力しているわけでもないのに、phpunitの動作が遅い。 調べたのでメモ。 phpunit 4.7.5 phpunit/php-code-coverage 2.0 CentOS 6.5 ディスクが遅い環境

CakePHP3のDBマイグレーション

Phinx を使っている。 これは既存DBから差分を抽出する機能を持っていない。 つまり、マイグレーションの内容は手で書く必要がある。 この点はCake2時代の CakeDC Migration プラグインや、Symfony2に劣っている。 Phinx の記述方法自体はシンプルでわかりや…

PHP で GNU gettext

php

GNU gettext は、ソフトウェアの国際化のためのライブラリ・コマンド群。 大まかな流れとしては以下のようになる ソース中から多言語対応すべき文字列を抽出 (POT作成) gettext コマンド。 それをもとに各言語用に対訳ファイルを作成 (PO作成) msginit コマ…

php-gdが入らない

php

「php-gdが上手に入らない、なんとかして」の対応メモ。 CentOS-6.5 php-5.6(remi) 入れたいのは remi-php56 の方のphp-gd。そしてGD本体。 $ sudo yum --enablerepo=remi-php56 list | grep php-gd php-gd.x86_64 5.3.3-40.el6_6 updates $ sudo yum --disa…

リストを受け取る仮引数はType Hintingしない

php

リストはシンプルに配列な場合もあるけど、Traversable なオブジェクトかもしれない。 リストを受け取る関数/メソッドの仮引数が、Type Hinting されていると

cakephp2でテスト用DBにインデクスが作成されない

CakeTestFixture にこう書いておけば、 本番用DBからテスト用DBにスキーマを取り込んでくれる。 要はテーブルをコピーしてくれる。 public $import = ['model' => 'ModelName']; でも、なぜかpkey以外のindexは無視されてしまう。 コピーしてくれたテーブル…

php-gdが動作していない

php

概要 「php-gdが動作していないのでなんとかして」の対応メモ。 CentOS-6.4 x86-64 php-5.5.4 5.5.4-1.el6.remi gd-last 2.1.0-0.10.725ba9d.el6.remi

composer dumpautoload

autoload関連の定義ファイルを最新にする。 composer.jsonでautoload定義を更新した場合などに実行する必要がある。 名前から想像しづらくてすぐ忘れる。 composerのバージョンにもよるが、以下のようなautoload関連のファイルが対象。 vendor/autoload.php …

PHPでSoap Client

PHPで久しぶりにSOAP接続することになった。 たまにしか使わなくて忘れていたのでメモ。

DateTimeImmutableにハマる

PHP-5.5から使えるようになった DateTimeImmutable クラス。 DateTimeとの違いは値が不変であること。 DateTimeInterface というinterfaceも追加されていて、 これを使えば従来のDateTimeとも透過的に扱える。 とても素敵なクラスだと思う。 コード内の日付…

その場限りのインスタンス

PHP-5.4から、こんな書き方ができるようになった。 インスタンスを変数に格納せずにメソッドを呼べる。 (new ClassName)->someMethod(); PHP-5.3以前はこのように一旦変数に格納する必要があり、面倒だった。 $obj = new ClassName(); $obj->someMethod(); …

PDTでよく使うショートカット

実行系 Alt+Shift+X H php実行 Alt+Shift+D H phpデバッグ Alt+Shift+X Q Ant実行 検索系 Ctrl+Shift+R クラス検索 Ctrl+J インクリメンタルサーチ Makegood Alt+M C コンテキストをテスト Alt+M F ファイルをテスト Alt+M R 直前のテストを再実行 エディタ …

ExcelフレンドリなCSVをphpunit/dbunitで使う

phpunit/dbunitで、DBのテストデータをCSVで用意するのはよくやること。いまどきのアプリなら当然 UTF-8。 でも Excel は UTF-8 をまともに読み書きできない。Excel よりも UTF-8 に強いツールはある事はあるのだけども、 やっぱり操作感は Excel には敵わな…