エセプログラマーの戯言

プログラムやリナックスなどについてのメモです

過去の投稿日別表示

[ リスト | 詳細 ]

全1ページ

[1]

WebAPIクラス

最近、WebAPIを使うことが多くなってきたので、以前作ったクラスを紹介したいと思います。


とりあえず、わかりきってる処理は、全て抽象クラスで実装しちゃおうって考えです。
ちなみに、xmlしか対応してません。

抽象クラス

  /******************************
   * WebAPIの抽象クラス
   * 2008.06.22 (C) よっくん
   *****************************/

abstract class AbstractWebApi{
  protected $appid;
  protected $url;
  protected $id;
  protected $param;
  protected $results;

  public function __construct($appid){
    $this->appid = $appid;
    $this->url = $url;
    $this->id = 0;
    $this->param = array();
    $this->results = array();
  }

  abstract public function results_set($xml);

  public function set($index, $value){
    foreach(array_keys($this->param) as $key){
      if($index == $key){
        $this->param[$index] = $value;
        break;
      }
    }
  }

  public function record($id){
    if(!isset($this->results[$id])){
      return false;
    }
    $this->id = $id;
    return true;
  }

  public function get($index, $default=""){
    return isset($this->results[$this->id]->$index) ? $this->results[$this->id]->$index : $default;
  }

  public function request_url_set($url){
    foreach($this->param as $key => $value){
      if($value !== null){
        $this->url .= '&'.$key. "=".$value;
      }
    }
  }

  public function request(){
    $this->request_url_set();
    $xml = simplexml_load_file($this->url);
    $this->results_set($xml);
  }
}

サブクラス

さて、サブクラスは、例えば、ぐるなびのWebサービスを実装する場合、
  /**********************************
   * ぐるなびレストラン検索 クラス
   * 2008.06.22 (C) よっくん
   *********************************/
require_once 'AbstractWebApi.class.php';

class GnaviShopSearch extends AbstractWebApi{

  public function __construct($appid){
    parent::__construct($appid);
    $this->url = 'http://api.gnavi.co.jp/ver1/RestSearchAPI/?keyid='.$this->appid;
    $this->param['id'] = null;
    $this->param['name'] = null;
    $this->param['name_kana'] = null;
    $this->param['tel'] = null;
    $this->param['address'] = null;
    $this->param['area'] = null;
    $this->param['pref'] = null;
    $this->param['category_l'] = null;
    $this->param['category_s'] = null;
    $this->param['input_coordinates_mode'] = null;
    $this->param['equipment'] = null;
    $this->param['coordinates_mode'] = null;
    $this->param['latitude'] = null;
    $this->param['longtitude'] = null;
    $this->param['range'] = null;
    $this->param['sort'] = null;
    $this->param['offset'] = null;
    $this->param['hit_per_page'] = null;
    $this->param['offset_page'] = null;
    $this->param['freeword'] = null;
    $this->param['freeword_condition'] = null;
  }

  public function results_set($xml){
    $this->results = $xml->rest;
  }
}

まず、リクエストパラメータを格納する$this->paramをnullで定義します。
必要なパラメータだけで良いんですが、とりあえず、全部定義してました。

んで、結果を格納する$this->resultsに、結果で欲しいものを格納します。この場合、レストラン情報が欲しいので、$xml->restを格納しています。

使い方

このクラスの使い方は、

require_once 'GnaviShopSearch.class.php';

$keyid='xxxxxxxxxx'; //発行されたアクセスキー
$shop = new GnaviShopSearch($keyid);
$shop->set('freeword', '沖縄そば'); //リクエストパラメータをセット
$shop->request();

for($i=0; $shop->record($i); $i++){
   echo $shop->get('name')."<br />";
}

まぁ、こんなクラスを作らなくても、簡単に出来るのが、WebAPIなんですが、管理しやすくなるんじゃないかなぁと思います。

何かおかしいところとか、意見とかありましたら、よろしくお願いします。

Image::Seek

お久しぶりです。

最近忙しくて全然手を付けていませんでしたが、今日から、また再開したいと思います。


今日は、Perlのモジュール「Image::Seek」について書こうと思います。
参考:Perl で作る画像類似検索システムの考察

Image::Seekとは

ImgSeekという類似画像検索システムをperl-XSにポーティングしたもののようです。


Image::Seek
ImgSeek (http://www.imgseek.net/) is an implementation of Haar wavelet decomposition techniques to find similar pictures in a library. This module is port of the ImgSeek library to Perl's XS. It can deal with image objects produced by the Imager and Image::Imlib2 libraries.

インストール

上の文にもありますが、とりあえず、Imagerか、Image::Imlib2が必要です。

今回は、Image::Imlib2の方でやりたいと思います。(Imagerでやったら、インストールは出来たものの、なぜかうまく動かなかった。)

imlib2、imlib2_devをインストール
# yum install Imlib2 Imlib2_dev

続いて、Image::Imlib2
# cpan install Image::Imlib2

ここで、エラー発生。ExUtils::CBuilderをインストールしろと言われるので、インストール。

# cpan install ExUtils::CBuilder

んで、再度挑戦

# cpan install Image::Imlib2

成功。最後に、Image::Seekのインストール

# cpan install Image::Seek

無事インストール完了しました。

使ってみる


とりあえず、画像を何個か用意して、試してみました。

画像データベースの作成
use strict;
use Image::Imlib2;
use Image::Seek qw(loaddb add_image query_id savedb);

loaddb("image.db");
for (10..30){
  my $img = Image::Imlib2->load("${_}.jpg");
  add_image($img, $_);
}
savedb("image.db");

とりあえず、id=10に類似したものを検索してみる
use strict;
use Image::Imlib2;
use Image::Seek qw(loaddb add_image query_id savedb);

loaddb("image.db");

my @results = query_id(10, 5); //id=10の画像に類似したものを5件取得
foreach(@results){
   foreach (@$_){
      print $_ . "\t";
   }
   print "\n";
}

結果
10      -33.3800005018711
21      -21.8256015831392
11      -21.6441377225683
20      -19.7209152092057
22      -8.4882187503716
17      -7.35577595067657

二番目の要素が、小さい方がより類似している画像ということになります。
最初は、当然オリジナルがヒットしています。

全1ページ

[1]


.


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事