Author Archives: yuki

ComposerでPSR-4仕様のオートロードを設定する

雪が降ったら雪見酒がしたい。yukiです。

昨年の3日にPSR-0で提言されていたオートローダーの仕様を、現状に合わせてアップデートしたPSR-4が承認されました。

PSR-4のクラス名仕様

説明の中で完全修飾クラス名というのが出てきますが、次のような定義になっています。

  • 完全修飾クラス名はベンター名のネームスペースをトップレベルに持っていること。
  • 完全修飾クラス名は1つ以上のサブネームスペースを持つことができる。
  • 完全修飾クラス名の最後はクラス名になっていること。
  • アンダースコアはディレクトリの区切りではなく、そのまま名前として使用される。
  • 完全修飾クラス名は、アルファベットの大小を好きなように組み合わせることができる。
  • クラスを参照する時はアルファベットの大小を区別すること。

さきほどの完全修飾クラス名の定義を書き直すと次のようになります。

 

Composerのオートロード設定

Composerも今年の3日にPSR-4へ対応されました。
https://github.com/composer/composer/commit/b23742e30c88e288db70685cfe2022f6b120c75b

PSR-0の頃の設定を見比べてみます

psr-0psr-4以外記述方法に違いはありませんが、設定値の意味が変わっています。

 

PSR-0とPSR-4のクラスファイルの解決方法の違いについて

PSR-0の場合

  • アンダースコアとネームスペースの区切りがディレクトリの区切りとなる。
  • 指定したネームスペースがベースディレクトリ内に存在する。
  • ファイル名は<クラス名>.phpとなる。

PSR-4の場合

  • ネームスペースの区切りがディレクトリの区切りとなる。
  • 完全修飾クラス名の指定したネームスペースプレフィックス以降がベースディレクトリ内に存在する。
  • ファイル名は<クラス名>.phpとなる。

 

先程の設定例を適用すると次の構造に対応します。

完全修飾クラス名 ファイルパス
\Menue\Foo psr0/lib/Menue/Foo.php
\Menue\Test\Bar psr0/lib/Menue/Test/Bar.php
\Menue\Baz psr0/lib/Menue/Test/Baz.php
\Menue\Hoge psr4/lib/Hoge.php
\Menue\Test\Fuga psr4/tests/Fuga.php

ZendService\Amazonを使う

GithubのContributions Graphって素敵やん。yukiです。

この記事はAdvent Calendar 2013とは何の関係もありません。

ZendFrameworkにはフレームワークのコアとなるZendの他に、他サービスとのインターフェイス用のZendServiceというパッケージがあります。

大体の有名なサービスには対応していて、Composerにも対応しているので利用価値はあります。

さて、今回はその中にある、ZendService\Amazonというライブラリを使いましたので、一通りの使い方をまとめたいと思います。

 

インストール

Packagistに登録されているので、Composerにてインストールできます。
次のようにcomposer.jsonに設定を書きます。

 

サービスの初期化

ZendService\Amazonにはサービスへのアクセス方法が二通り用意されています。

基本的なのはZendService\Amazon\Amazonです。
もう1つはZendService\Amazon\Amazonを流れるようなインターフェイスで利用できるようにするための、ZendService\Amazon\Queryです。

どちらも初期化方法は一緒で、次のようになります。

第2引数はAPIのネームスペースの指定で、次のような定義になっています。

初期化されたサービスを利用してAmazonの各APIとやり取りしますが、気をつけなければいけないのは、AssociateTagの指定が必須になっていることです。

 

商品の検索

アマゾンから商品を検索するにはItemSearchというAPIを利用します。

$resultsには検索結果として、ZendService\Amazon\ResultSetが入ります。

ResultSetは\SeekableIteratorが実装されているので、foreachで回すことができます。

ResultSetから取得できるのはZendService\Amazon\Itemです。

 

商品の詳細情報の取得

商品の詳細情報を取得するにはASINを用いてItemLookupというAPIを利用します。

$resultsには、検索結果がエラーや複数のアイテムがある場合はResultSetが、1つだけの場合はItemが返されます。

 

画像について

取得した情報の中にある、画像の情報はZendService\Amazon\Imageとして取得されます。

URLを文字列で取得したい場合は次のようにします。

Image#UrlはZend\Uri\Uriなので、文字列として扱われる時に自動でtoString()が呼び出されるため

としても同じ結果となります。

 

RequestThrottled問題

バージョン2.0.2の時点で、アクセス超過の場合RequestThrottledがエラーとして返されますが、ネームスペースがecs.amazonaws.comと古いネームスペースのため、ZendService\Amazon\ResultSetが理解できず、空のResultSetが作られてしまうという問題があります。

また、それを回避するためにResultSet#totalResults()を使って件数の確認を行なおうとすると、NOTICEが出てしまいます。

NOTICEが出る問題は既に修正されているのですが、まだ正式バージョンとしてはリリースされておりませんので、気になる場合はdev-masterを利用しましょう。

 

だいたいこんな感じでした。

Composerのススメ(3)

Packagistに続々とライブラリが登録されているのを見ながら、PEAR2/pyrusとは一体なんだったのか。。。と考えたり考えなかったりしているyukiです。

前回ではPackagist以外のリポジトリを指定する方法を説明しました。
今回はzipなどのアーカイブでしか配布されていないライブラリや、プロジェクト固有のソースをオートロードさせる方法を説明します。

Composerでそれらのライブラリをオートロードに追加するには、autoloadを設定します。
マニュアルではSchema#autoloadの部分になります。

Continue reading

Composerのススメ(2)

Composerを使うと「PEARでいいじゃん」という声が寄せられます。

そんな人には「ComposerでPEARを管理できるよ」と優しく教えてあげたい、yukiです。

前回は標準的な依存ライブラリの指定方法を示しました。
今回はPackagist以外にあるライブラリの指定方法を書きたいと思います。

Packagist以外のライブラリを指定する場合はrepositoriesの設定を使います。

Continue reading

Composerのススメ(1)

yukiです。

もう全てのライブラリはComposer経由でプロジェクトローカルに入れてしまえ!と思ってる今日この頃です。

自分の精神衛生上のためにも普及してほしいので、Composerの使い方をいくつか書きたいと思います。
Composerのインストール方法は*nix/Windowsの方法が公式ドキュメントで解説されてますので、そちらを参照してください。

Continue reading

jQueryでCSS3のtransitionの終了イベントを検知する

yukiです。

JavaScriptを使わずとも基本的なアニメーションが実現できちゃう、CSS3のtransform(2d or 3d)は便利ですよねー。

jQueryでもanimate()を使うと簡単にアニメーション処理ができますが、transformはデバイスによってはGPUを使ってくれるので、より滑らかなアニメーションになる場合があります。
animate()はjQueryオブジェクトなので、Deferredを使ってアニメーションの完了イベントを通知することができますが、CSSであるtransformの場合はイベント通知を受け取ることができるのでしょうか?

Continue reading

rbenvで複数の環境用のRubyを管理する

yukiです。

最近は色々と管理ツール系でRubyを使う機会が増えてきました。
インストールは簡単なのですが、プロジェクトによってはバージョンが違っていたり、入っているパッケージのバージョンが違っていたりして、その管理が大変です。
そこでrbenvとrbenv-gemsetを使って複数の環境用のRubyが管理できるようにしましょう。

Continue reading