Archive for the ‘php’ Category

    はてなブックマーク - CakePHPでPartialHelperはじめました
    このエントリーをはてなブックマークに追加

    こんにちは。
    今週末、GALAXY Sを買うFusicサクこと桜川です。
    ついに自分もスマートフォンにランクアップです。

    さて、今回は前回と同じくCakePHPになります。
    PartialHelper」というヘルパーを作成しましたのでご紹介させて頂きます。

    PartialHelper

    CakePHPはコントローラーに特化したelementを作りにくいと思ったことはないでしょうか?

    たとえば、shopsコントローラー内のみで使うelementを作る場合
    /app/views/elements/shop_form.ctp
    とか、
    /app/views/elements/shop/form.ctp
    といったような名前やディレクトリ名を付ける必要があります。

    これが1個2個くらいなら問題ないのですが、大規模案件になってくるとelementの数も膨大で管理が大変だったり、elementの名前を考えるだけでも大変になったりします。

    また、コントローラーに特化しているにも関わらず、elementというどこからでもアクセス可能な領域に配置しないといけないところも作りにくいポイントになるかと思います。

    PartialHelperを使うとelementファイルをviewファイルと同じディレクトリに配置できるようになり、コントローラーに特化したelementを作る場合にちょっとだけ楽にしてくれます。

    PartialHelperの使い方

    kozo’s PartialHelper at master – GitHub -

    1. PartialHelperをgithubからダウンロードします。
    2. PartialHelperの配置
      「/app/views/helpers」に配置します。
    3. PartialHelperの読み込み
    4. PartialHelper用のviewファイルの配置
      「/app/views/shops/_form.ctp」に配置します。
      ※Partialのviewファイルは先頭にアンダーバーをつけます。
    5. PartialHelperの使用
      ※読み込みの場合は先頭にアンダーバーをつけません。
    6. これでブラウザから「/shops/index」アクセスすると「PartialHelperのテスト」の文言が表示されるはずです。

    ポイント

    1. viewファイルと同じ位置にPartialViewファイルを配置する
    2. PartialViewファイルはファイル名の先頭にアンダーバーをつける
    3. PartialViewファイルの中身はelementとまったく同じである
    4. $this->Partial->render()の引数は$this->element()の引数とまったく同じである
    5. 機能面も読み込むファイルの位置が違うだけでelementとまったく同じである

    まとめ

    PartialHelperを導入することで、elementが全体で共通して使う小さいviewファイル、Partialがコントローラーに特化したviewファイルと切り分けることができすっきりします。
    ぜひPartialHelperをお使いください!!

      はてなブックマーク - PHPでのAmazonAPIの使い方
      このエントリーをはてなブックマークに追加

      3度目のアドベントカレンダーという、まさかの誕生日プレゼントをもらってしまいました・・・。
      小さいころの夢はお母さんを冥王星につれていくことだった、本日誕生日の萩原です。
      (bitshiftersの皆さん、昨日はありがとうございました。)

      アドベントカレンダーよりもっと別のプレゼントください。

      PHPでのAPI使い方の紹介

      さて、最近AmazonAPIを使って商品検索をする機会がありましたので、その使い方を簡単に紹介したいと思います。

      まずはじめにAmazonから自分のアクセスキーとシークレットキーを取得してきます。

      後は、実際にコードを。
      私はCakePHP使いなのでPHPを使って商品情報を取得します。
      前々回先頭のCを小文字にしてしまったら弊社小山から苦情が来ました・・・すみません・・・

      $access_key_id = 'アクセスキー';
      $secret_access_key = 'シークレットキー';
      // RFC3986 形式で URL エンコードする関数
      function urlencode_rfc3986($str) {
      return str_replace('%7E', '~', rawurlencode($str));
      }
      // 基本的なリクエストを作成します
      $baseurl = 'http://ecs.amazonaws.jp/onca/xml';
      $params = array();
      $params['Service'] = 'AWSECommerceService';
      $params['AWSAccessKeyId'] = $access_key_id;
      $params['Version'] = '2009-03-31'; //←バージョンを入れてください。
      $params['Operation'] = 'ItemSearch'; // ← ItemSearch オペレーションの例
      $params['SearchIndex'] = 'All';
      $params['Keywords'] = $word; // ← 検索ワード
      $params['ItemPage'] = $page;
      // Timestamp パラメータを追加します
      // - 時間の表記は ISO8601 形式、タイムゾーンは UTC(GMT)
      $params['Timestamp'] = gmdate('Y-m-d\TH:i:s\Z');
      // パラメータの順序を昇順に並び替えます
      ksort($params);
      // canonical string を作成します
      $canonical_string = '';
      foreach ($params as $k => $v) {
      $canonical_string .= '&'.urlencode_rfc3986($k).'='.urlencode_rfc3986($v);
      }
      $canonical_string = substr($canonical_string, 1);
      // 署名を作成します
      // - 規定の文字列フォーマットを作成
      // - HMAC-SHA256 を計算
      // - BASE64 エンコード
      $parsed_url = parse_url($baseurl);
      $string_to_sign = "GET\n{$parsed_url['host']}\n{$parsed_url['path']}\n{$canonical_string}";
      $signature = base64_encode(hash_hmac('sha256', $string_to_sign, $secret_access_key, true));
      // URL を作成します
      // - リクエストの末尾に署名を追加
      $url = $baseurl.'?'.$canonical_string.'&Signature='.urlencode_rfc3986($signature);
      //XMLで情報を取得。
      $xml = @simplexml_load_file($url);

       

      注意する点

      まず、一度に取得できる商品の件数は10件固定です。
      一度に飛ばせるリクエストの数は2件までなのでまとめて20件は表示することが可能です。

      私は今回5件ずつ取得したかったので、10件取得して前後5件ずつに分けることで対応しました。
      ちょっと無駄にデータを取ってきてしまうのが気にはなりましたけどね。

      次に、開発は基本皆さん仮想環境で開発を行っていると思います。
      その際、時間がずれていることがよくあるかと思いますが、時間がずれすぎているとAmazonからアクセスを拒否されます。
      多分10~15分くらいずれていると検索できません。
      私は取りあえずの対応で、cronで5分ごとに時間を合わせることで対応しました。(正確に合わせる必要はなかったので)

      後は、xmlを取得する際、エラー回避することを忘れないようにしましょう。
      エラーが出てしまうと、XMLの取得に使用するURLがそのまま出てしまうのですが、上記を見てもらえたらわかるとおりURLにはそのままアクセスキーとシークレットキーが書いてあります。ですので、エラーが出たら即情報が漏れてしまいます。

      今回は、デモでやっているのでとりあえず”@”をつけています。

      まとめ

      今回、こういったAPIを利用することは初めてだったので色々苦労しました。
      よくあることとは思いますが、Amazonに条件を投げて帰ってくるパターンは変えられないので、そのなかで自分がほしい情報に編集するのが少々面倒でした。
      また、XMLをいじることも初めてでしたし、javascriptでも苦労したことがあったのですが、これに関してはまた機会があれば。

      毎度おなじみどうでもいい化学豆知識

      炭素原子が三重結合までしかできないのは皆さん(多分)ご存知かと思いますが、タングステンやクロムなどは四重結合をすることがあります。
      まぁ、だからなんだと言われても困るんですけど。

      それでは、また。

        はてなブックマーク - PHPExcelとReviserの比較(後編)
        このエントリーをはてなブックマークに追加

        まさかの1日明けでアドベントカレンダーの順番が回ってきました。
        生まれ変わって元素になるなら、アルミニウムになりたい
        ・・・という設定らしい1年目の新人、萩原です。

        さて、前回はPHPExcelとReviserの機能について比較を行いました。
        機能としてReviserも十分な機能を持ち合わせていますが、PHPExcelの方が優れているという結論でした。

        スピードの比較

        さて、実際に運用していく上でスピードは重要なポイントだと思います。
        ファイルダウンロードに時間がかかってしまってはストレスもたまりますしね。
        というわけで、今日は、スピードについて検証していくことにします。

        今回、クリックしてからダウンロードを開始する直前までの時間を測定しています。
        ソースにmicrotime(‘now’)を埋め込んでいる&virtualBox上のCentOSなので時間自体は正確ではない(というか倍くらい時間がかかっている)ですが、相対的な値としては問題ないです。

        20回ずつ測定をして平均を取っているので比較としては十分かと思われます。

        まずは、何も書きこまれていないテンプレートに何も入力せずそのまま出力した結果です。
        参考までにPHPExcelでのExcel5形式出力も一緒に載せています。

        Reviser
        平均値:0.033(s)
        標準偏差:0.016

        PHPExcel(.xlsx)
        平均値:0.123(s)
        標準偏差:0.011

        PHPExcel(.xls)
        平均値:0.223(s)
        標準偏差:0.039

        かなり差がでましたね。
        ただ、Reviserと比べてPHPExcelの方が標準偏差が小さく安定はしているのかなという印象です。

        続いてテンプレートに横15、縦600すべてのセルに’test’と入力した状態で何も入力せずにそのまま出力した結果です。

        Reviser
        平均値:0.911(s)
        標準偏差:0.113

        PHPExcel(.xlsx)
        平均値:2.508(s)
        標準偏差:0.080

        PHPExcel(.xls)
        平均値:2.483(s)
        標準偏差:0.027

        こちらも差がでましたね。

        次に何も入力されていない空のテンプレートに横10、縦1000すべてのセルに’test’と入力して出力した結果です。
        ここからはPHPExcelのExcel5形式での出力は行っていません。

        Reviser
        平均値:0.871(s)
        標準偏差:0.026

        PHPExcel(.xlsx)
        平均値:2.798(s)
        標準偏差:0.034

        こちらも時間はPHPExcelの方が時間がかかっています。
        この辺りで20回測定するのが面倒になってきてちょっと後悔を始めました・・・。

        最後に上の条件にさらに該当セル全てに色と左右上下の罫線を引いてみました。

        Reviser
        平均値:0.873(s)
        標準偏差:0.049

        PHPExcel
        平均値:73.269(s)

        ・・・タイプミスじゃないですよ。。。100倍くらい差が出ましたよ。
        CentOS内部で73秒平均なのですが、多分3,4分くらいかかってる気がしないでもない・・・
        因みにPHPExcelは20回やる気力が流石になかったので(無駄だし)5回しか測定してません。

        罫線と色のどちらに時間がかかっているかと思って色をつけずに出力させてみたところ40.981(s)かかりました。

        どっちもどっちといったところですかね。

        まとめ

        というわけで2回にわたってReviserとPHPExcelの比較を行ってきました。
        ReviserとPHPExcel、どちらも長所短所あると思います。

        色や罫線がある場合ちょっと使用に耐えられないレベルだという結果に見えますが、そうではないと思います。
        例えば色をつけることについても全てのセルに色や罫線をつけるわけではないし、PHPExcelは個別に指定できますが、Reviserはテンプレートを準備しないといけません。
        極端な話セルのパターンが100パターンあればReviserならあらかじめ100パターンのテンプレートセルを準備する必要があるという問題点があります。
        また、xlsx形式はPHPExcelしか使えません。

        機能的な面で見ればやはり、PHPExcelの方が優れていると思います。

        まぁ一方で流石に何分もダウンロードに時間がかかってしまっては困るという面もあります。
        Excelの出力はPHPExcelにしてもReviserにしてもかなりメモリを食いますので他の作業を並行して行うことが難しいです。
        (両者ともini_set(“memory_limit” , -1);をつけている理由ですね。これを記述していないとまともに動かせません。)

        現に私がPHPExcelで作ったもの(社内システムですが)は長いものは出力に5分ほどかかりますし、使いどころが難しいですね。

        個人的には基本的にはReviserだと思いますが、xlsx形式を使いたい場合、Excel2007関数をどうしても使いたい場合など、PHPExcelでないと機能が実現できない場合も出てくると思います。

        最後に役に立たない化学豆知識を

        空気中に2番目に多く存在している、酸素
        実は常磁性、つまり磁石に引っ付くってこと、ご存知でしたか?
        実際、液体酸素を流しているところに磁石を近づけると流れの向きが変わります。

        それでは。