Posts Tagged ‘php’

    はてなブックマーク - PHPmatsriにてCsvCombinePluginを紹介してきました。
    このエントリーをはてなブックマークに追加

    ブログはお久しぶりです。萩原です。

    今回は、PHPmatsuriに弊社、小山、櫻川、杉本と、私の4人で行ってきました。

    PHPmatsuriの感想

    私は、ハッカソンという形式のイベントは初めてで、LTも初めてでしたので非常に緊張しましたが、何とか無事に発表まで終える事が出来て良かったです。

    発表でおーと声が上がった時は非常にうれしかったです。
    後、下記にも載せているホークスのスタメンを出したときに、「何でそんなマニアックな」と言って下さった方、ありがとうございます。
    あれが一番うれしかったりします(笑)。

    普段、私はCakePHPを扱っていますが、SymfonyやLithiumなどの他のフレームワークについてはまったくといっていいほど知りませんでしたので、その二つのセッションを両フレームワークの開発者から聞けたことも非常に貴重な機会でした。

    また、開発風景やLTの発表を見まして、皆さんすごい、もっと自分も頑張らないとと改めて感じました。

    CsvCombinePlugin

    さて、今回私がPHPmatsuriで紹介しました、CsvCombinePluginについてご紹介したいと思います。

    このプラグインはCSVの入出力の処理を簡単に行うことが出来るプラグインです。
    CakePHP1.3と2.0の両方のブランチをGithubで用意しています。

    せっかくですのでCakePHP2の方式で紹介したいと思います。

    まずはこちらのGithubの”cake2″というブランチよりダウンロードしてきて、Pluginディレクトリ内に”CsvCombine”とrenameして下さい。

    CSVの入力

    まずはCSVを添付して配列で返すメソッドを紹介します。

    モデルにBehaviorを宣言します。

    <?php
    App::uses(&#039;AppModel&#039;,&#039;Model&#039;);
    CakePlugin::load(&#039;CsvCombine&#039;);
    class CsvTest extends AppModel{
        var $actsAs = array(&#039;CsvCombine.CsvImport&#039;);
    }

    後は、コントローラで列ごとの配列のキー値を指定したらアクションをたたいて完了です。

    <?php
    App::uses(&#039;AppController&#039;,&#039;Controller&#039;);
        class CsvTestsController extends AppController{
        var $name = &#039;CsvTests&#039;;
    
        function index(){
            if ($this->request->is(&#039;post&#039;)) {
               /***基本必要な個所***/
               //配列のキー値を左から指定
                $list = array(&#039;打順&#039;, &#039;守備&#039;,&#039;名前&#039;,&#039;打率&#039;,&#039;HR&#039;,&#039;打点&#039;);
                //このアクションで配列が返ってくる
                $data = $this->CsvTest->csvData($list);
                 /***!基本必要な個所***/
                if ($data === false) {
                    print_r(&#039;MISS&#039;);
                    exit;
                }
                print_r($data);
                exit;
            }
     
        }

    これで下記の様なCSVを添付すると・・・(PHPmatsuri1日目夜の日のホークスのスタメンです・・・)

    1,遊,川﨑,.271,1,37
    2,二,本多,303,0,43
    3,左,内川,.341,12,73
    4,三,松田,.283,25,83
    5,中,長谷川,.293,4,34
    6,右,福田,.256,1,20
    7,DH,柴原,.077,0,0
    8,一,明石,.277,1,12
    9,捕,山崎,.191,0,11
    P,投,杉内,.200,0,3
    

    以下のような配列が返ってきます。(preで整形しています。

    Array
    (
        [0] => Array
            (
                [打順] => 1
                [守備] => 遊
                [名前] => 川﨑
                [打率] => .271
                [HR] => 1
                [打点] => 37
            )
    
        [1] => Array
            (
                [打順] => 2
                [守備] => 二
                [名前] => 本多
                [打率] => 303
                [HR] => 0
                [打点] => 43
            )
    
        [2] => Array
            (
                [打順] => 3
                [守備] => 左
                [名前] => 内川
                [打率] => .341
                [HR] => 12
                [打点] => 73
            )
    
        [3] => Array
            (
                [打順] => 4
                [守備] => 三
                [名前] => 松田
                [打率] => .283
                [HR] => 25
                [打点] => 83
            )
    
        [4] => Array
            (
                [打順] => 5
                [守備] => 中
                [名前] => 長谷川
                [打率] => .293
                [HR] => 4
                [打点] => 34
            )
    
        [5] => Array
            (
                [打順] => 6
                [守備] => 右
                [名前] => 福田
                [打率] => .256
                [HR] => 1
                [打点] => 20
            )
    
        [6] => Array
            (
                [打順] => 7
                [守備] => DH
                [名前] => 柴原
                [打率] => .077
                [HR] => 0
                [打点] => 0
            )
    
        [7] => Array
            (
                [打順] => 8
                [守備] => 一
                [名前] => 明石
                [打率] => .277
                [HR] => 1
                [打点] => 12
            )
    
        [8] => Array
            (
                [打順] => 9
                [守備] => 捕
                [名前] => 山崎
                [打率] => .191
                [HR] => 0
                [打点] => 11
            )
    
        [9] => Array
            (
                [打順] => P
                [守備] => 投
                [名前] => 杉内
                [打率] => .200
                [HR] => 0
                [打点] => 3
            )
    
    )
    

    CSVの出力

    CSVの出力はコントローラでComponentを宣言して、出力したい配列を準備してアクションをたたいて完了です。(今度は同日の阪神のスタメンです・・・大阪でしたし。)

    <?php
    App::uses(&#039;AppController&#039;, &#039;Controller&#039;);
    CakePlugin::load(&#039;CsvCombine&#039;);
    
    /**
     * ParentEnquetes Controller
     *
     * @property ParentEnquete $ParentEnquete
     */
    class CsvTestsController extends AppController {
     
        var $components = array(&#039;CsvCombine.CsvExport&#039;);
    
        function export(){
            $list[] = array(&#039;1&#039;,&#039;二&#039;,&#039;平野&#039;,&#039;.297&#039;,&#039;1&#039;,&#039;28&#039;);
            $list[] = array(&#039;2&#039;,&#039;中&#039;,&#039;柴田&#039;,&#039;.280&#039;,&#039;0&#039;,&#039;8&#039;);
            $list[] = array(&#039;3&#039;,&#039;遊&#039;,&#039;鳥谷&#039;,&#039;.300&#039;,&#039;5&#039;,&#039;49&#039;);
            $list[] = array(&#039;4&#039;,&#039;三&#039;,&#039;新井&#039;,&#039;.274&#039;,&#039;17&#039;,&#039;89&#039;);
            $list[] = array(&#039;5&#039;,&#039;一&#039;,&#039;ブラゼル&#039;,&#039;.282&#039;,&#039;15&#039;,&#039;66&#039;);
            $list[] = array(&#039;6&#039;,&#039;右&#039;,&#039;マートン&#039;,&#039;.316&#039;,&#039;13&#039;,&#039;57&#039;);
            $list[] = array(&#039;7&#039;,&#039;左&#039;,&#039;金本&#039;,&#039;.218&#039;,&#039;12&#039;,&#039;37&#039;);
            $list[] = array(&#039;8&#039;,&#039;捕&#039;,&#039;藤井&#039;,&#039;.218&#039;,&#039;2&#039;,&#039;15&#039;);
            $list[] = array(&#039;9&#039;,&#039;投&#039;,&#039;スタンリッジ&#039;,&#039;.095&#039;,&#039;0&#039;,&#039;0&#039;);
    
            $this->CsvExport->export($list);
        }
    }

    以下のCSVが出力されます。

    1,二,平野,.297,1,28
    2,中,柴田,.280,0,8
    3,遊,鳥谷,.300,5,49
    4,三,新井,.274,17,89
    5,一,ブラゼル,.282,15,66
    6,右,マートン,.316,13,57
    7,左,金本,.218,12,37
    8,捕,藤井,.218,2,15
    9,投,スタンリッジ,.095,0,0
    

    以上が、PHPmatsuriで発表してきました、CsvCombinePluginの紹介でした。
    このプラグインは実際にはオプションで区切り文字など指定が出来ますので、TSVなどにも対応が可能です。
    GithubのREADMEに詳しく書いているのでそちらもご覧頂けたらと思います。
    よろしければお使いください!

    最後に

    このような、有意義で楽しいイベントを準備、運営していただいた皆さん。ありがとうございました。
    次も参加したいと思えるイベントでした!

    それでは、弊社二人目が明日、また書きますのでよろしくお願いします!

      はてなブックマーク - TwitterAPIの導入について
      このエントリーをはてなブックマークに追加

       まあ、有りますよね、二度目。

       Fusic2年目仁井です。よろしくお願いいたします。

       今回の記事は何にするか悩みました。iPadでゲーム作る記事にするとかダイエットの成功の記事にするとか色々考えたのですが、前回がTwitterでしたので今回も素直にTwitterで行きたいと思います。

       なんだかReturnキーが潰れてきた気がしますがそれは気にせずに。ええ。

      Twitter API

       ツイッターが市民権を得て随分と経ち、それに合わせて様々なツールやアプリケーションが開発されているかと思います。
       そんな開発に必須とも言えるのが、このTwitterAPIなんだよ、ジェシー! そうなのね、マイク!
       そうなんです。
       利用しているものとして想像しやすいのは、Botやクライアントあたりでしょう。
       リプライ、リツイート、フォロー、等々。ツイッターの代表的な機能をこれを使うことで自由に利用できます。
       それではその導入方法について、簡単に説明させていただきます。

      準備編:1

       それでは、TwitterAPIを使う準備を。
       まずクライアント製作者のアカウントでログインした状態でこのページにアクセスしてください。
       作成したクライアントは、この時ログインしているユーザとひもづけられます。
       ここで、アプリケーションの登録を行います。

       まず「新しいアプリケーションを登録する」をクリック。
       必要情報を入力しますが、注意すべきは2点。
      ・「アプリケーションの種類」は「クライアント」
      ・「標準のアクセスタイプ」は「Read&Write」
       をそれぞれ選択してください。間違えてもあとで修正できますので問題ないです。
       特に「標準のアクセスタイプ」を「Read-Only」にすると投稿などができなくなるので注意です。
      Image

      準備編:2

       つづいて、アプリケーション側の準備を。
       今回の環境はPHP5.2です。PHPは5以上で「curl」が使える環境であれば問題ありません。
       PHP環境が準備できたら今度はここの「Download」からファイルをダウンロードしてください。
       ファイルを解凍して、twitteroauthの中の「OAuth.php」と「twitteroauth.php」を取り出してください。この2つのファイルを使用します。

      実装編

       それでは実装について。
       以下のコードを参照してください。

      require_once("./twitteroauth.php");
       
      $to = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);
       
      $sendMessage = "さあ、呟いてみませんか";
      $req = $to->OAuthRequest('https://twitter.com/statuses/update.xml', 'POST', array('status' => $sendMessage));
       
      header("Content-Type: application/xml");
      echo $req;

      このスクリプトを実行すると、自分のアカウントに「さあ、呟いてみませんか」というツイートが投稿されます。
      なんとなく、botの姿が見えてきた感がありますね。
      ここで肝になるのが、オブジェクトの生成の時に与えている引数です。

      CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET

      この4つの値は全て、先ほどアプリケーション登録を行ったページから参照することができます。
      もう一度先程のページにアクセスします。
      すると「現在登録されているアプリケーション一覧」の中に、先ほど登録したアプリケーションが並んでいることと思います。
      それをクリックすると、下の方に「Consumer key」と「Consumer secret」の値が。
      さらにページ内の「My Access Token」のリンクの先には「Access Token」「Access Token Secret」があります。
      この値をそれぞれ引数にあたえるだけです。

      これで、Twitter APIを利用したツイートの投稿が可能になりました。

      注意点

       便利なTwitterAPIですが、注意点もございます。
       各機能には、それぞれ制限が設けられています。
       例えば、1時間の間に呟ける回数や、フォロー出来る人数など、それぞれに回数制限が存在しています。
       オーバーしたりするとアカウントを凍結されてしまうおそれも有りますので、使用の際は十分に注意をしてください。
       botを作って、誰彼構わず反応するようにしていると、あっという間に制限数を超えてしまうかも。
       ちなみに前回紹介した検索機能は
      ・1時間に150回
      ・1日に1000回
       の使用制限がIPベースで設けられています。

      最後に

       APIを使用することで、タイムラインの取得も可能です。
       そのなかから、自分に対するリプライや、リツイート等も取得可能です。パラメータの与え方次第で必要な情報をうまいこと集めましょう。
       ここまで出来るようになると、Twitterクライアントの作成も不可能ではありません。いえ、私はやりませんが。
       こちらのドキュメントの日本語訳が分かりやすく、大変お世話になりました。
       いい加減Returnキーの潰れ具合が腹に据えかねて来たので、このへんで筆を置く事と致します。
       それでは。クリスマス爆発しろ。仁井でした。

        はてなブックマーク - 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でも苦労したことがあったのですが、これに関してはまた機会があれば。

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

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

        それでは、また。