木曜日, 2月 22, 2007

cakephpでwebサービスapiを活用したサンプルサイトを作ってみる4

前回cakephpで作ったシンプルなamazon検索ページをちょっと改良。
セキュリティ的なことがまだ考慮できてないのでデモページは公開せず。
勉強用の参考資料としてソースのみ公開。

今回の改良で、
cakeデイレクトリ/amazon/search/キーワード(日本語の場合はURLエンコード)

というアドレスで検索結果が表示されるようになった。これで直接検索結果にリンクを貼れる。

amazon_controller.php
<?php

class Amazon_Info {
    const ACCECSS_KEY_ID = '自分のamazonwebserviceのアクセスキー';
    // アフィリエイトIDを使いたい場合に指定
    const ASSOC_ID = '自分のアフィリエイトID';
}

require_once 'Services/AmazonECS4.php';

class AmazonController extends AppController {

    var $name = 'Amazon';
    var $uses = array();
    var $helpers = array('Html', 'Form');
    
    function index()
    {
        if(empty($this->
data)) {
            $this->render();
        } else {
            $this->redirect('/amazon/search/'. $this->data['Amazon']['words']);
        }
    }
    
    function search($words = null)
    {
        if(empty($words)){
            $this->render("index");
        } else {
            $amazon = new Services_AmazonECS4(
                Amazon_Info::ACCECSS_KEY_ID,
                Amazon_Info::ASSOC_ID
            );
            
            $result = $amazon->setLocale('JP');
            
            $options['Keywords'] = $words;
            $options['ResponseGroup'] = 'Medium';
            
            $result = $amazon->ItemSearch('Books', $options);
            
            $this->set('words', $words);
            $this->set('result', $result);
            $this->render();
        }
    }
}
?>


index.thtml
<form action="<?php echo $html->url('/amazon'); ?>"
method="post">

        <?php echo $html->input('Amazon/words'); ?>
        <?php echo $html->submit('search');?>
</form>


search.thtml
<form action="<?php echo $html->url('/amazon'); ?>" method="post">

        <?php echo $html->input('Amazon/words', array('value'=>$words)); ?>
        <?php echo $html->submit('search');?>
</form

<?php
foreach ($result['Item'] as $item) {
    displayOne($item);  // 一件分の表示
}

/** 一件分の結果を表示する関数 */
function displayOne($item) {
    $attributes = $item['ItemAttributes'];

    // HTMLで表示して問題の無い形式にエスケープ
    $title = htmlspecialchars(
        $attributes['Title'], ENT_QUOTES);
    if (isset($attributes['Author'])) {
        $author = htmlspecialchars(
            // 複数著者はカンマでまとめる
            implode(',', $attributes['Author']),
            ENT_QUOTES);
    } else {
        $author = '(著者無し)';
    }
    $detailUrl = htmlspecialchars(
        $item['DetailPageURL'], ENT_QUOTES);
    $imageUrl = htmlspecialchars(
        $item['MediumImage']['URL'], ENT_QUOTES);
    $formattedPrice = htmlspecialchars(
        $attributes['ListPrice']['FormattedPrice'], ENT_QUOTES);
    $asin = htmlspecialchars(
        $item['ASIN'], ENT_QUOTES);
    $salesRank = (integer)($item['SalesRank']);

    // 整形して表示
    echo "<h3>
タイトル: ${title}</h3>";
    echo "
<a href=\"${detailUrl}\">";
    echo "
<img src=\"${imageUrl}\" />";
    echo "
</a>";
    echo "
<dl>";
    echo "
<dt>著者</dt><dd>${author}</dd>";
    echo "
<dt>価格</dt><dd>$formattedPrice</dd>";
    echo "
<dt>ASIN</dt><dd>$asin</dd>";
    echo "
<dt>売り上げランク</dt><dd>${salesRank}位</dd>";
    echo "
</dl>";
}
?>


残りの問題
・POSTデータの入力値チェックがされていない(たぶん。cakephp側でなんらかのチェックが自動でなされているのかどうか調査の必要あり)。
・エラー発生時の処理を記述してない。

・なぜか表示が崩れる?
・商品イメージや売上ランク等の情報が取得できなかった場合の処理が必要そう。

・キャッシュ機能が実装されていない。

cakephpでwebサービスapiを活用したサンプルサイトを作ってみる3

とりあえず極力シンプルにamazon検索機能のあるページをcakephpで作成。

amazon_controller.php
<?php

class Amazon_Info {
    const ACCECSS_KEY_ID = '自分のamazonwebserviceのアクセスキー';
    // アフィリエイトIDを使いたい場合に指定
    const ASSOC_ID = '自分のアフィリエイトID';
}

require_once 'Services/AmazonECS4.php';

class AmazonController extends AppController {

    var $name = 'Amazon';
    var $uses = array();
    var $helpers = array('Html', 'Form');
    
    function index()
    {
        if(empty($this->
data)) {
            $this->render();
        } else {
            $words = $this->data['Amazon']['words'];
            
            $amazon = new Services_AmazonECS4(
                   Amazon_Info::ACCECSS_KEY_ID,
                   Amazon_Info::ASSOC_ID
            );
            
            $result = $amazon->setLocale('JP');
            
            $options['Keywords'] = $words;
            $options['ResponseGroup'] = 'Medium';
            
            $result = $amazon->ItemSearch('Books', $options);
            
            $this->set('result', $result);
            $this->render("search");
        } 
    }
}
?>

index.thtml
<form action="<?php echo $html->url('/amazon'); ?>"
method="post">

        <?php echo $html->input('Amazon/words'); ?>
        <?php echo $html->submit('search');?>
</form>


search.thtml
<form action="<?php echo $html->url('/amazon'); ?>"
method="post">

        <?php echo $html->input('Amazon/words'); ?>
        <?php echo $html->submit('search');?>
</form

<?php
foreach ($result['Item'] as $item) {
    displayOne($item);  // 一件分の表示
}

/** 一件分の結果を表示する関数 */
function displayOne($item) {
    $attributes = $item['ItemAttributes'];

    // HTMLで表示して問題の無い形式にエスケープ
    $title = htmlspecialchars(
        $attributes['Title'], ENT_QUOTES);
    if (isset($attributes['Author'])) {
        $author = htmlspecialchars(
            // 複数著者はカンマでまとめる
            implode(',', $attributes['Author']),
            ENT_QUOTES);
    } else {
        $author = '(著者無し)';
    }
    $detailUrl = htmlspecialchars(
        $item['DetailPageURL'], ENT_QUOTES);
    $imageUrl = htmlspecialchars(
        $item['MediumImage']['URL'], ENT_QUOTES);
    $formattedPrice = htmlspecialchars(
        $attributes['ListPrice']['FormattedPrice'], ENT_QUOTES);
    $asin = htmlspecialchars(
        $item['ASIN'], ENT_QUOTES);
    $salesRank = (integer)($item['SalesRank']);

    // 整形して表示
    echo "<h3>
タイトル: ${title}</h3>";
    echo "
<a href=\"${detailUrl}\">";
    echo "
<img src=\"${imageUrl}\" />";
    echo "
</a>";
    echo "
<dl>";
    echo "
<dt>著者</dt><dd>${author}</dd>";
    echo "
<dt>価格</dt><dd>$formattedPrice</dd>";
    echo "
<dt>ASIN</dt><dd>$asin</dd>";
    echo "
<dt>売り上げランク</dt><dd>${salesRank}位</dd>";
    echo "
</dl>";
}
?>


ただし、このコードにはいろんなものを省き過ぎていて以下の問題点と課題がある。

・POSTデータの入力値チェックがされていない(たぶん。cakephp側でなんらかのチェックが自動でなされているのかどうか調査の必要あり)。
・エラー発生時の処理を記述してない。

・なぜか表示が崩れる?
・商品イメージや売上ランク等の情報が取得できなかった場合の処理が必要そう。
・GETクエリではないので直接リンクを貼ったりできない。

・キャッシュ機能が実装されていない。

とりあえずこれを土台にコードの改善を試みてみる。

月曜日, 2月 19, 2007

cakephpでwebサービスapiを活用したサンプルサイトを作ってみる2

普段windows系のOSを使ってる、けど実際にWEBページを作って公開するのはunix系のレンタルサーバーという感じなので(そういう人多いと思いますが)、開発環境として必要なものを一括セットアップできる

XAMPP

をインストール。

これで開発環境完成。

つづいてcakephpの仕組みを勉強しつつサンプルコードの乗せかえをしよう。

cakephpでwebサービスapiを活用したサンプルサイトを作ってみる1

最近はやりのweb2.0的なマッシュアップサイトを作れるようになりたい人は結構多いはず。

マッシュアップはアイディア次第のものなので、なかなか実用的な便利なものを思いつきづらい、あるいはすでに他の人がやってることが多い。

いつかおもしろいマッシュアップを思いついたときにすぐに作成できるように効率的にwebサービスapiを使ったサイトを作る練習をしてみようかと。

お題
『フレームワークにcakephp、webサービスはamazonを使ってシンプルな検索サイトを作る(で、たぶん楽に作ろうとするとpearを使うことになる)』

ポイント
・とにかくなるべく楽をできるようにcakephpとpearを使う。
・検索結果URLをなるべくシンプルにする。

まずは

Amazon.co.jp: PHP×WebサービスAPIコネクションズ: 本: 秋元 裕樹

を一通り読む。
具体的なコードが全部のってて非常にわかりやすいです。

とりあえずこの本のサンプルコードをcakephpに乗せかえる、という作業をすることで諸々身につけれらるよう勉強してみようかと。

phpのframework,library&webservice api

phpを使ってプログラミングするときに生産性をあげるにはどうすればいいか現状まとめ。

いわゆるフレームワーク的なものを使用する。
>今だったらcakephpが良さそう。

ライブラリとしてpearを活用できるようにしたい。
>せっとアップさえできれば使い方は簡単なのでセットアップをがんばる。

webサービス(ネット上で公開されているAPI)
>アイディア次第で簡単に動的な情報を組み合わせた便利なページが作れる。

ということでひとまずcakephpを使ってpear・webサービスを使ったページを作れるようになる、とひとつ壁を越えたことになりそう、ということでこれにチャレンジしてみます♪

水曜日, 2月 14, 2007

eclipse3.2にsubclipseをインストールするときのトラブル解決メモ

eclipse3.2にsubclipseをインストールするときのトラブル解決メモ。

以下のページを参考にインストールにチャレンジ(わかりやすい)。

Subclipseのインストール方法
Subclipseのインストール方法

『はまったところ』
更新マネージャを使ってsubclipseをインストールしようとしたら、

「org.eclipse.mylar.tasks.coreというプラグインが必須」

というアラートが出たのでググッて見つけてインストール・・・しようとしたらさらに

「org.eclipse.pde.junit.runtimeというプラグインが必須」

というアラートが出てげんなり。。検索しても一向に引っかからないのでかなりいらいらしたが、

更新アクセス先サイトに「Eclipse プロジェクト更新サイト(日本語化したので英語の名称は不明)」というのがあるのでこれにチェックを入れて諸々インストールするとOKになります。

これをやって再起動、org.eclipse.mylar.tasks.coreを入れて再起動、subclipseを入れて再起動、とやってようやくsubclipseのインストール完了。

日曜日, 2月 11, 2007

うーん

具合が悪い(@_@。
明日までに治ればいいなあ。

火曜日, 2月 06, 2007

ALL WASEDA OB SKI GAME2007

この週末は栂池高原スキー場にてオールワセダOB戦(ALL WASEDA OB SKI GAME2007)にいってきました!

雪不足が心配されましたが前日と初日夜に雪が降り、大会当日は二日間ともゲレンデ状況最高、天気も快晴でした!

今回は全国各地から総勢30名強のOB・現役が集まり、常に笑いの絶えない楽しい大会となりました!


今大会のリザルトと大会写真をアップしましたのでどうぞご覧ください!

大会リザルト
大会写真1
大会写真2

今回はみんなで協力してビデオ撮影もしましたのでそのうち公開される?予定です!

また、参加者の方で写真やビデオ撮影していた方もたくさんいらっしゃいましたので公開されましたら是非お知らせください!


忙しい状況の中、今回大会運営にご協力いただきました皆様、
大会にご参加いただきましたOB・現役の皆様、
どうもありがとうございました!!

今回のイベントを通じてスキーの楽しさとそれを一緒に楽しむ仲間の拡がりを少しでも感じていただけていたら成功かなと思います!

みなさんまたどこかで一緒に滑りましょう!!

シーズンオフになったら東京でみんなで飲むのもいいかなと思います(名古屋・大阪方面の方も是非!)♪