Archive for the ‘php’ Category

    はてなブックマーク - CakePHP Clickinit Pluginが意外に便利
    このエントリーをはてなブックマークに追加

    Fusic Advent Calendar発起人の小山です。
    最近はPortisheadばかり聴いています。
    さて、Fusic Advent Calendarもクリスマスバージョンが無事終わり(自分は見事に当たりませんでした)、
    エクストラステージ「日本式アドベントカレンダー」に突入しております。
    「も〜うい〜くつね〜る〜と〜」のあれです。

    ブラウザから確認

    Webシステムを作成していると、やっぱりブラウザから挙動をテストをしたりしますよね。
    その時に、便利なのがSeleniumです。
    簡単な挙動確認ならば、Selenium IDEで操作の記録をすることで、何度も同じ操作の確認を行うことができます。

    では、ユーザの新規登録はどうしますか?

    さらにメールアドレスを登録して、確認メールが来るようなテストはどうしていますか?

    一度登録してしまうともう一度そのメールアドレスは登録できなかったりしますよね。

    ブラウザから初期化

    方法はいろいろあると思います。
    データベースを直接操作してもいいですし、そもそもSeleniumを使っているならば、Selenium RCなどを利用する際にデータベースを初期化してもいいかもしれません。
    ただ、ブラウザからちょっと簡単に操作したいと思ってCakePHPのPluginを作成してみたので紹介したいと思います。

    Clickinit Plugin

    Clickinit Pluginはブラウザ側からサーバサイドで処理を実行するためのプラグインです。

    github.com/k1LoW/clickinit

    以下のようにAppContollerの$componentsに登録するだけで、まずは設置完了です。

    次に、実際にサーバサイドで行う処理を書いたスクリプトをapp/vendor/shells/に設置します。
    その時に、ファイル名の先頭には数字を付与してください。これは実行すべきファイルの判別と、実行順序を判定するために利用しています。
    (例:00-initdb.php, 01-clearcache.php)

    あとはページの左上に表示されたタブをクリックするだけで、すべてのスクリプトを実行することができます。
    スクリプトの実行はrequire()を利用しているので、CakePHPの定数やクラスなども使えます。

    たったこれだけのプラグインです。
    Clickinitはサーバのスクリプトを実行するスイッチ的なものです。
    たったこれだけですが、意外に便利です。
    例えば、データベースの初期化だけでなく、CakePHPのキャッシュを一旦削除して挙動を確認するときにも便利です。

    ブラウザから操作ができるので、開発時のSelenium IDEのテストケースに追加してもいいかもしれません。

    注意

    Clickinit Pluginはあくまで開発時に使うプラグインです
    特にサーバ内スクリプトを動かすものになりますので、デプロイ時には外すようにしましょう

    まとめ

    ブラウザからサーバ内スクリプトを実行するClickinitを紹介しました。

    ブラウザから初期化ができるだけで、意外に効率もあがります。
    もし良かったら皆さんも試してみてください。

      はてなブックマーク - CakePHP 静的コンテンツのURLについて
      このエントリーをはてなブックマークに追加

      こんにちは、一年前に買ったデニムのサイズが合わなくなってきた島田です。

      皆さん食べ過ぎには注意しましょう。。。
      (俺が悪いんじゃない、会社周辺に美味しいお店が多いからいけないんだ!!)

      では、早速本題。

      CakePHP環境下で静的コンテンツは、通常『インストールフォルダ/app/webroot』の配下に設置しますよね。

      /app/webroot/test/index.html

      にファイルを設置すれば、

      example.com/test/index.html
      example.com/test/

      といった感じのURLでアクセスできます。

      ではこの状態で、 example.com/test (『/』なし)にアクセスするとどうでしょう?

      どん!

      example.com/app/webroot/test/

      そうなんです。

      『/app/webroot/』 が付いた状態にリダイレクトされちゃうんです。
      mod_rewite をとおさず直接アクセスしてますねぇ。

      画像やCSSファイルへのパスは、相対的位置関係が変わらないので、表示が崩れるということはありませんが、なんだか気持ち悪い。。。
      同じ情報のページに2URLからアクセス出来るのはSEO的に良くないし、
      Google Analytics などでアクセスログを取得しているときは、同一コンテンツなのに集計結果がわかれてしまう。。。

      ということで、こいつを解決しちゃいます。

      まずは Apache のログを見てみよう

      問題の解決に移る前にまず Apache のログを見てみましょう。

      192.168.0.1 - - [19/Dec/2010:23:08:06 +0900] "GET /test HTTP/1.1" 301 354 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
      192.168.0.1 - - [19/Dec/2010:23:08:07 +0900] "GET /app/webroot/test/ HTTP/1.1" 200 928 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"

      301エラーを返したあとで、『/app/webroot/test/』にリダイレクトしています。

      簡単にいうとこんな感じです。

      1. スラッシュなしでアクセスしたため、Apache がファイルとして『test』を検索
      2. ファイルは見当たらなかったがディレクトリは見つかったので、クライアントに301エラーとリダイレクトメッセージ(『/』つきのURL)を返す
      3. リダイレクトメッセージにあるURLに再度リクエストを投げる
      4. コンテンツを表示

      2. で返ってくる『リダイレクトメッセージ』を直してリダイレクト先を変えてやればいいのか思いきや、
      それだと直接『example.com/app/webroot/test/』にアクセスされてしまう。。。

      というわけで、今回は

      example.com/app/webroot/test/

      に飛んできたURLを

      example.com/test/

      にリダイレクトさせるという方法で問題を解決しちゃいます。

      .htaccess を改変しよう

      CakePHP ではデフォルトで 3つの .htaccess が設置されていますが、今回は『インストールフォルダ/app/webroot/.htaccess』を改変します。

      <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
      </IfModule>

      インストール時のままだとこんな感じです。
      これをこんな感じに改変します。

      <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
      RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
      RewriteRule ^(.*?)$ %2/%3 [R=301,L]

      </IfModule>

      THE_REQUEST とは 先程のログの 『”GET /app/webroot/test/ HTTP/1.1″』 の部分を返します。
      要するにホストネーム以下のURLに /app/webroot/ が含まれていたら、それを省いたものへリダイレクトすると書かれています。

      Apache のログはこんな感じ

      192.168.0.1 - - [19/Dec/2010:23:18:06 +0900] "GET /test HTTP/1.1" 301 354 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
      192.168.0.1 - - [19/Dec/2010:23:18:06 +0900] "GET /app/webroot/test/ HTTP/1.1" 301 342 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"
      192.168.0.1 - - [19/Dec/2010:23:18:07 +0900] "GET /test/ HTTP/1.1" 200 928 "-" "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; ja-jp) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4"

      二回リダイレクトして目的のURLにたどりついているのがわかります。

      最後に

      今回の解法は、Rewriteの条件を追加していますので、どうしてもその部分にコストが追加でかかってしまいます。
      レスポンススピードをシビアに求められるコンテンツには向かない場合もありますので、注意してください。

      それでは、また次回お会いしましょう。
      さようなら。

      追記

      RewriteRule でURLを書き換えた時、自動的に URLエンコード が行われてしまいます。
      クエリ文字列に特殊文字を含む場合、意図しないURLに書き変わってしまいますので、 NEフラグを指定してエンコードを行わないようにした方がよいでしょう。

      <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
      RewriteCond %{THE_REQUEST} "^(.+?) (.*?)/app/webroot/(.*?) (.+?)$"
      RewriteRule ^(.*?)$ %2/%3 [R=301,L,NE]

      </IfModule>

        はてなブックマーク - 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キーの潰れ具合が腹に据えかねて来たので、このへんで筆を置く事と致します。
         それでは。クリスマス爆発しろ。仁井でした。