脳みそスワップアウト

揮発性なもので。おもに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 の記述方法自体はシンプルでわかりや…

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 には敵わな…