PostgreSQL リハビリ

7.3以降、久しぶりにPostgreSQL案件に携わることになったので、リハビリのメモ。 PostgreSQL本体は、Windows版のバイナリパッケージでお気軽インストール。 Windowsサービスとしてインストールされます。 インストール中にデータベース・クラスタも作成され…

Doctrine2 DBAL フェッチのサンプル

実装コード class TestDoctrineDbalFetchCommand extends ContainerAwareCommand { const EXIT_SUCCESS = 0; const EXIT_FAILURE = 1; const THROUGHPUT = 5; protected function configure() { $this->setName('sample:dbal-fetch'); } protected function …

SwiftMailとISO-2022-JPとワードラップ

SwiftMailでISO-2022-JPな日本語メールを送信する際に、次のような問題が生じる場合があります。 文字化け ワードラップ 「Swift MailerでISO-2022-JPなメールが送れなくなっていた件について - polidog lab++」を 参考にさせて頂きました。 検証コード clas…

Doctrine2 デバッグモードとEntityManager::clear()について

Doctrine2のパフォーマンスとメモリ使用量について、「デバッグモード」と「EntityManager::clear()」を検証します。 結論 以下の条件を満たす場合、パフォーマンスとメモリ使用量に影響が出るようです。 env が prod 以外で app/console の「--no-debug」オ…

Consoleコンポーネントをスタンドアロンで使ってみます

Symfony2のConsoleコンポーネントをスタンドアロンで使ってみます composer.json { "autoload": { "psr-0": {"": "src/"} }, "require": { "symfony/console": "dev-master" } } セットアップ $ curl -O http://getcomposer.org/composer.phar $ php compose…

Vagrant(ベイグラント)の備忘録

準備 VirtualBoxインストール https://www.virtualbox.org/ Vagrantインストール http://www.vagrantup.com/downloads.html 仮想マシンのセットアップとブート 以下、Cygwin上で作業しました。 Boxの追加 Usage: vagrant box add <name> <url> windowsの場合は、C:\User</url></name>…

Symfony2 PHPエラーを捕まえます

Debugコンポーネント を利用して、PHPエラーを捕まえてみようと思います。 You should never enable the debug tools in a production environment as they might disclose sensitive information to the user. ということなので、カスタマイズした例外ハン…

Apache JMeterについて

Apache JMeter についての備忘録です。 参考資料 http://www.jasst.jp/archives/jasst07e/pdf/C2-1.pdf ダウンロード http://jmeter.apache.org/download_jmeter.cgi 起動 管理者権限で bin/jmeter.bat を実行します。 テスト計画の作成 スレッドグループの…

phalconのインストール

「phalcon がいい感じですよ」と伺ったので、xampp環境にインストールしてみます。 インストール XAMPPへのインストール — Phalcon 1.3.1 ドキュメント を参考にしました。 XAMPPの場合、PHPインタプリタが32bitなので、「x86版」の php_phalcon.dll を xamp…

Symfony2 カスタムバリデータ

Symfony2標準の日付バリデータ (vendor/symfony/symfony/src/Symfony/Component/Validator/Constraints/DateValidator.php)は、 以下の様に書式が「YYYY-MM-DD」形式となっています。 const PATTERN = '/^(\d{4})-(\d{2})-(\d{2})$/'; 年月文字列「YYMM」や…

ab(apache bench)の使い方メモ

JSONリクエストを受け取るAPIのベンチマークを採りたいと思います。 BASIC認証が必要な場合は、「-A ユーザ名:パスワード」オプションで。 Content-Typeの指定は「-T」オプションで。 POSTデータは「-p」オプションにファイルパスを渡します。 xamppにバンド…

JSONスキーマバリデータとオリジナルのエラーメッセージ

PHP

justinrainbow/json-schema は大変便利なんですが、どの制約(Constraints)に引っかかったのか分かりません。 オリジナルのエラーメッセージの出し分けに'message'をヒントにしようと思います。 制約キーワード 分類 キーワード 必須系 require, defined 無効…

Doctrine2 DBAL フェッチのサンプル

実装コード class TestDoctrineDbalFetchCommand extends ContainerAwareCommand { const EXIT_SUCCESS = 0; const EXIT_FAILURE = 1; const THROUGHPUT = 5; protected function configure() { $this->setName('sample:dbal-fetch'); } protected function …

Symfony2 Console Table Helper を試してみます

実装コード use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class ConsoleTableHelperCommand extends ContainerAwareCo…

Symfony2 バンドル固有のパラメータ定義

バンドル固有のパラメータは、Resources/config/parameters.yml に定義するのが一般的の様です。 app/config/config.yml imports: - { resource: parameters.yml } - { resource: @FooBarBundle/Resources/config/parameters.yml } src/Foo/BarBundle/Resour…

Goutte でスクレイピング

Goutte は a screen scraping and web crawling library for PHP だそうです。 私は twilog をブックマーク代わりに使っているのですが、 Goutte を使ってツイートをスクレイピングしてみようと思います。 なお Goutte depends on PHP 5.4+ and Guzzle 4+. I…

Symfony2 phpunitでJSON-APIの機能テストをします

JSONテキストを返すAPIをSymfony2で実装して、実際にリクエストを投げてその応答をテストしてみようと思います。 テスト対象のAPIコントローラ use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Symfony\Component\HttpFoundation\Request; u…

Symfony2 一時ファイルに関して

Symfony2アプリケーション内で一時的なファイルを作成する場合、こちらによれば、キャッシュディレクトリ内がオススメの様です。 Kernel::getCacheDir() でキャッシュディレクトリのパスを取得できます。 ExtensionInterface::getAlias() でバンドル名のエイ…

Symfony2 カーネルが保持している情報について

簡易コードを書いて調べてみました。 use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class ShowConfigCommand extends …

Doctrine2 Mapping Type を確認します

Entity 以下の様なエンティティを用意して、 $ php app/console doctrine:schema:update --force で、DBスキーマを作ってみます。 use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="foobar") */ class FooBar { /** * @ORM\Id * @ORM…

Doctrine2 ORM のロック機構について

参考情報 : 9. Transactions and Concurrency — Doctrine 2 ORM 2.0.0 documentation 楽観的ロック と 悲観的ロックがあります 楽観的ロック : LockMode::OPTIMISTIC + version指定(任意) 悲観的ロック : LockMode::PESSIMISTIC_WRITE 楽観的ロックの場合、…

kriswallsmith/Buzz について色々

PHPのHTTPクライアントライブラリ kriswallsmith/Buzz について色々調べてみます。 検証コード use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Ou…

Symfony2 SecureRandom を試してみます。

Symfony2.2で追加された SecureRandom を試してみます。 お題 : 3byteの16進表記数値を求める こんな結果を得たいと思います。 $ php app/console sample:secure-random 65c5d8 0dc704 0c1f15 377ba6 8d9413 ae47ff 9abc51 b194bf ca1344 cefb1c 実装コード …

Doctrine2 ドキュメント翻訳

8. Working with Objects — Doctrine 2 ORM 2 documentation を翻訳してみようと思います。 8. Working with Objects この章は、EntityManager と UnitOfWork の理解を助けるものです。 Unit of Work は、オブジェクトレベルのトランザクションに似ています…

Phakeを試してみます

ロジックコードをテストしたいけど、EntityManager や Repository、データベースに依存している... そんな時のモック&スタブを面倒みてくれる Phake を試してみます。 テスト対象のメソッドを含むクラス class FooBar { protected $em; // コンストラクタに…

Symfony2 サービスにEntityManagerを注入します(Dependency Injection)

データベース操作を伴うサービス(ビジネスロジック)を開発する際、エンティティマネージャをどうやって求めれば良いでしょうか? 呼出側から都度もらう?自前でコンテナ経由で取得(ハードコード)する? んー、サービス呼出時にコンテナから注入してもらいま…

Symfony2 Doctrine2のEventManagerをコンテナから取得します

コンテナに登録されているサービスの抜粋は以下です。 $ php app/console container:debug | egrep '(^doctrine\s|^doctrine.+entity_manager)' doctrine container Doctrine\Bundle\DoctrineBundle\Registry doctrine.orm.default_entity_manager container…

Symfony2のparametersを使ってみます

こんな config/parameters.yml があったとします。 parameters: my_application: end_of_maintainance: 2015-01-01 12:34:56 is_stable: true release_manager: "Foo Bar" description: | This stable version is the right choice for projects that need t…

Symfony2 で DDD を学びます

PHPメンターズ さんの「PHPメンターズ -> Symfony2ベースのDDD仕様パターンの利用サンプルを公開しました」を題材に、Symfony2 で ドメイン駆動設計(DDD: Domain-Driven Design)を学んでみようと思います。 セットアップ phpmentors-jp/phpmentors-example-c…

cURLでlocalhostにリクエストで502エラー : proxyが原因でした

Cygwin上のphpunitで、cURLを利用したWebAPIクライアントをテスト中に「502 Bad Gateway」で少し詰まってしまいました。リクエスト先はlocalhost上のURL. でもwebブラウザだと問題ないのにナゼ? 環境変数「http_proxy」がlocalhostにも適用されてしまった事…

Doctrine2 トランザクションと並行性

Doctrine 2 ORM 2 documentation - 13. Transactions and Concurrency を翻訳してみようと思います。 13. トランザクションと並行性 13.1. トランザクションの境界設定 トランザクションの分割は、トランザクション境界を定義するタスクです。 適切なトラン…

Normalizerを試してみます

ゲッターを持つPHPオブジェクトを配列に変換する Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer を試してみます。 こちら には GetSetMethodNormalizer はもとから壊れています。 循環参照のあるオブジェクトを処理させると、ゲッターメ…

Doctrine2 ORM でバルクインサート

Doctrine2 ORM Batch Processing を参考に、バルクインサートを試してみます。 DBスキーマ mysql> desc mercury; +--------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+-----…

Doctrine2 ORM を試してみます

エンティティクラスの作成 プロパティとマッピング情報を定義します。 use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity * @ORM\Table(name="products") */ class Product { /** * @ORM\Id * @ORM\Column(type="integer") * @ORM\GeneratedValue(strateg…

PHPMDを試してみます

PHP

PHPの静的解析ツール PHPMD(PHP Mess Detector) を試してみます。 セットアップ // composer.json { // ... "require-dev": { // ... "pdepend/pdepend" : "1.1.*", "phpmd/phpmd": "1.4.*" } } $ php composer.phar update phpmd/phpmd // .bashrc alias ph…

Symfony2 JSONリクエストを受け取ります

JSONテキストでPOSTされてきたデータを処理するアクションを作ってみます。 JSONをデシリアライズして得たいオブジェクト class AcceptedObject { /** * @Serializer\Type("integer") */ private $id; /** * @Serializer\Type("string") */ private $name; p…

Symfony2 アクションでJSONを返します(その2)

POSTされたデータをそのままJSONで返す様なEchoサービスを作ってみます。 Resources/config/routing.yml path: /echo/ defaults: { _controller: xxxxxBundle:Echo:index } methods: [POST] POSTメソッドのみ許可します。 ルーティング定義のパラメータが、S…

Symfony2 アクションでJSONを返します

Symfony2のJsonResponse と JMSSerializerBundle を使って、JSONテキストを返すアクションを作ってみます。JMSSerializerのドキュメントはこちら。 セットアップ // composer.json { // ... require: { // ... "jms/serializer-bundle": "dev-master" } } $ …

Net_SFTPドキュメントを翻訳してみました。

PHP

http://phpseclib.sourceforge.net/documentation/net.html#net_sftp を翻訳してみました。 5.2.3. Net_SFTP の例 login('username', 'password')) { exit('Login Failed'); } echo $sftp->pwd() . "\r\n"; $sftp->put('filename.ext', 'hello, wo…

PHPでzipファイルを扱います

PHP

ZipArchiveを試して見たいと思います。 Symfony2のコマンドで実装っと。 class TestZipArchiveCommand extends ContainerAwareCommand { protected function configure() { $this->setName('sample:zip-archive'); $this->setDescription('ZipArchiveを試し…

Symfony2 - コントローラの基本形、フォーム送信データのバインドについて

フォーム送信データのバインドについて、日本語ドキュメント を見てみると2.0時代の書き方になっている様でしたので、本家の情報を確認してみました。 結論 コントローラの基本形は以下になります。 $form->handleRequest($request); if ($form->isSubmitted…

Phakeを試してみます

テストしたいクラスがあるけど、依存クラスの実装が終わっていないとき。 そんな時にモックを使ってテストするアプローチです。 class Model { public function login(Api $api, $id = 0) { $result = $api->auth($id); if ($result === 'OK'){ return true;…

モデル層でロギング

Symfony2で採用されているmonologは、PSR-3 Logger Interface(Psr/Log/LoggerInterface)準拠だそうで。 このmonologを使って、モデル層のクラスでロギングしたいなと思いました。 use Psr\Log\LoggerInterface; class FooBarModel { protected $logger; publ…

動的なクラスのロード

PHP

こんなクラスがありまして。 class Foo { public function getVersion() { return __CLASS__; } } こんな構成に配備したとして。 ./src/.../ ├── Ver_1_0 │ └── Foo.php └── Ver_1_1 └── Foo.php 動的にロードしてみます。 $version = '1.0'; $version = str…

phpseclib:SFTPの練習

PHP

phpseclibを使って、SFTPサーバにログイン。 カレントディレクトリのファイルリストを表示してみます。 use Sinner\Phpseclib\Net\Net_SFTP as NetSftp; $targetPattern = '/^data_/'; $sftp = new NetSftp('127.0.0.1'); $sftp->login('username', 'passwd'…

Symfony2のバリデーション - 制約のYAML定義とエラーメッセージの国際化

アノテーションがあまり好きではないので、バリデーションの制約をYAMLに定義することにしました。 ついでにエラーメッセージの国際化(翻訳)も試してみます。 バリデート対象のオブジェクトが以下だとします。 class SampleData { private $code; ... } Reso…

Symfony2のvalidatorコンポーネント(アノテーション編)

ポイントは以下でしょうか。 特にFormと連携しなくても、単独で使えます。 Symfony2のサービスコンテナに'validator'サービスとして登録されています。 制約は様々なフォーマットで設定できます。→ YAML、XML、アノテーション、PHP ただし、アノテーションを…

Symfony2からHTTPリクエストを投げます

sensiolabs/SensioBuzzBundle · GitHub を使います。 composer.json に { "require": { "sensio/buzz-bundle": "dev-master" } } を書いて composer update します。 $ php composer.phar update "sensio/buzz-bundle":"dev-master" Symfony2のサービスコン…

PHPでJSONバリデート

こちらを参考にさせて頂きました。→ JSON SchemaとPHP - 泥のように KnpJsonSchemaBundle by KnpLabs っていうのがあるみたいなのですが、 require php >=5.4 This bundle is in development stage!!! Do not use it in production. とのことなので、見送り…

PHPでUUID

PHP

ramsey/uuid を利用して、PHPでUUID(universally unique identifier)を生成します。 A 64-bit build of PHP and the Moontoast\Math library are recommended. However, this library is designed to work on 32-bit builds of PHP without Moontoast\Math, …