Home > rhaco

rhaco Archive

yahoo経由でamazonを検索する(rhacoネタ)

yahoo経由でamazonを検索するものを作りました。
それどこのYasazon – ヤサゾン?という感じで、完全に劣化コピーです、はい笑
いちおうAutoPagerize対応してますので、マウスくりくりで次ページのものがくっつきます。
それでYahoo!ウェブ検索APIをrhacoで使用するためのクラスがこちら。

<?php
Rhaco::import("network.http.ServiceRestAPIBase");

class yahooSearchApi extends ServiceRestAPIBase{
	var $appid;
	var $url;
	var $type='all';
	var $results=10;
	var $start=1;
	var $format='any';//any(デフォルト), html, msword, pdf, ppt, rss, txt, xls
	var $adult_ok='0';//値なし(デフォルト), 1
	var $similar_ok='0';//値なし(デフォルト), 1
	var $language='ja';//ja(デフォルト)
	var $country='0';//値なし(デフォルト)
	var $site='0';//値なし(デフォルト)
	
	/**
	 * コンストラクタ
	 *
	 * @param unknown_type $key
	 * @return yahooSearchApi
	 */
	function yahooSearchApi($key){
		parent::ServiceRestAPIBase();
		$this->url = "http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch";
		$this->appid = $key;
	}
	
	function search($keyword){
		
		$hash = array(
		"query"  => $keyword,
		"type" => $this->type,
		"results" => $this->results,
		"start" => $this->start,
		"format" => $this->format,
		"adult_ok" => $this->adult_ok,
		"similar_ok" => $this->similar_ok,
		"language" => $this->language,
		"country" => $this->country,
		"site" => $this->site
		);

		$pTag = new SimpleTag();
		$pTag->set($this->get($hash));
		return $pTag->toHash();
	}
	
	function buildUrl($hash){
		return parent::buildUrl($hash,array("appid"=>$this->appid));
	}
	
	/**
	 * アダルトOK
	 *
	 * @param int $adult_ok
	 */
	public function setAdult_ok($adult_ok) {
		$this->adult_ok = $adult_ok;
	}
	/**
	 * アダルトOK
	 *
	 * @return unknown
	 */
	public function getAdult_ok() {
		return $this->adult_ok;
	}
	/**
	 * 国別(日本jpn)
	 *
	 * @param unknown_type $country
	 */
	public function setCountry($country) {
		$this->country = $country;
	}
	/**
	 * 国別
	 *
	 * @return unknown
	 */
	public function getCountry() {
		return $this->country;
	}
	/**
	 * フォーマット(html, msword, pdf, ppt, rss, txt, xls)
	 *
	 * @param unknown_type $format
	 */
	public function setFormat($format) {
		$this->format = $format;
	}
	/**
	 * フォーマット
	 *
	 * @return unknown
	 */
	public function getFormat() {
		return $this->format;
	}
	/**
	 * 使用言語(ja)
	 *
	 * @param unknown_type $language
	 */
	public function setLanguage($language) {
		$this->language = $language;
	}
	/**
	 * 使用言語
	 *
	 * @return unknown
	 */
	public function getLanguage() {
		return $this->language;
	}
	/**
	 * 出力件数
	 *
	 * @param unknown_type $results
	 */
	public function setResults($results) {
		$this->results = $results;
	}
	/**
	 * 出力件数
	 *
	 * @return unknown
	 */
	public function getResults() {
		return $this->results;
	}
	/**
	 * 同じコンテンツを別の検索結果とするかどうか
	 *
	 * @param unknown_type $similar_ok
	 */
	public function setSimilar_ok($similar_ok) {
		$this->similar_ok = $similar_ok;
	}
	/**
	 * 同じコンテンツを別の検索結果とするかどうか
	 *
	 * @return unknown
	 */
	public function getSimilar_ok() {
		return $this->similar_ok;
	}
	/**
	 * 検索対象サイト
	 *
	 * @param unknown_type $site
	 */
	public function setSite($site) {
		$this->site = $site;
	}
	/**
	 * 検索対象サイト
	 *
	 * @return unknown
	 */
	public function getSite() {
		return $this->site;
	}
	/**
	 * 何ページ目を表示
	 *
	 * @param unknown_type $start
	 */
	public function setStart($start) {
		$this->start = $start;
	}
	/**
	 * 何ページ目を表示
	 *
	 * @return unknown
	 */
	public function getStart() {
		return $this->start;
	}
	/**
	 * 検索の仕方(all, any, phrase)
	 *
	 * @param unknown_type $type
	 */
	public function setType($type) {
		$this->type = $type;
	}
	/**
	 * 検索の仕方
	 *
	 * @return unknown
	 */
	public function getType() {
		return $this->type;
	}

}

?>

パラメータが多くてsetter/getterを作るのがめんどいなあと思ったのですが、setter/getterをオートで入れてくれるeclipseプラグインを見つけてさくっと作ることが出来ました。

setter/getterをオートで入れるっていうのは上記ツールの機能のほんの一部でしかないような気がしますが・・・。

住所から緯度経度を取得するAPI(Rhacoネタ)

仕事で使った書き捨てプログラムだけど、公開。

住所から緯度経度を取得するAPIといえばGeocoding APIが有名です。
単純な(量の少ない)住所=>緯度経度取得ならAPIを公開していただいているのでそれを使ってサクッとつくれます。
しかし、大量のリクエストを投げると「ちょwww」となって、APIが停止してしまいます。
最初に200件ほどの住所を投げたら止まってしまいました>Geocoding APIの中の人、ごめんなさい。

本家のgoogle様で既にgeocodingのAPIを公開してるんですね。
これとrhacoを使って、geocodingAPIクラスを作ってみました。

<?php
Rhaco::import("network.http.ServiceRestAPIBase");

class geocodingAPI extends ServiceRestAPIBase{
	var $url = "http://maps.google.co.jp/maps/geo";
	var $key;
	function geocodingAPI($key){
		parent::ServiceRestAPIBase();
		$this->key = $key;
	}
	function search($keyword){
		$hash = array("q"=>$keyword,"output" => "xml","ie"=>"UTF8");

		$pTag = new SimpleTag();
		if($pTag->set($this->get($hash),'Response')){
			//L::debug($pTag);
				
			if($pTag->getInValue('code')== '200'){
				foreach($pTag->getIn('coordinates') as $item){
					$list = $item->toHash();
					return $list;
				}
			}
		}
		return false;
	}
	function buildUrl($hash){
		return parent::buildUrl($hash,array("key"=>$this->key));
	}
}

?>

rhacoにはwebサービス(urlにリクエスト投げたらxmlで返ってくる、みたいな)を簡単に実装できる機能(クラス?)があります。
で、このクラスを実行するのはこんな感じ。

<?php
include_once("__init__.php");
Rhaco::import("geocodingAPI");

$geo = new geocodingAPI("ここにgooglemapのapikeyを取得して書く");
print_r($geo->search("東京都 千代田区千代田"));
?>

おもいっきり車輪の再開発だし、しょっぱいプログラムだけど、これを作ることが出来てすっごい助かりました。
これがなければ住所データをgoogleマップに貼付けて緯度経度をひたすらコピペする簡単なお仕事をするはめになったから。
ほんと、rhacoに感謝です。

ステッカーなんてものを注文してみた

先日買ったmacbookにカッコいいシールを貼ろう!と思い立ち、オリジナルステッカーを作ってくれる会社をgoogleで検索、数社をピックアップして問い合わせをしてみました。そのなかで、一番早くて丁寧な回答を頂けた上記の会社にさくっと発注しました。
会社で使うものならいろんなところに見積もり出してもらったりサンプルもらったりしてから決めた方が良いと思うのですが、まあ、個人で使うものなのであまり深く考えず(ぇー。
数枚とかの極小ロットでの注文はさすがにできず、50枚(!)からの注文となりました。
メールベースでの注文だったのですが非常にレスポンスが良くて(いまも入金確認のメールが来ました!)好印象です。
あとは「モノ」がどれだけよいかがちょっと心配です(笑

過去に作ったものをrhacoに置き換えてみる(psptube編)その2

前回つくったものをクラス化して、rhacoの素晴らしい機能である「doctest」を使ってみます。
rhacoの機能であるdoctestはこちらが詳しいです。

コメントにテストが書ける!というやつです。

今回はrhaco本体(開発版)のほかにrhacoの外部ライブラリであるYouTubeAPI.phpを使用しています。

ダウンロードしてrhacoのフォルダ内に放りこんでおいてください。

※YouTubeAPI.phpはエラーがあります!その部分を直して使ってください!
該当箇所は13行目の

	var $url = "http://www.youtube.com/api2_rest?";

?が余計ですので、これは削除しておいてください。

<?php
Rhaco::import("YouTubeAPI");

class YouTubeAPIex extends YouTubeAPI {
    function getFlvURL($v=null){
        /***
        * $h = new YouTubeAPIex('**********');
        * $r = $h->getFlvURL();
        * assert(!$r,'引数空っぽはだめ!');
        * $r = $h->getFlvURL('hoge');
        * assert(!$r,'id違う');
        * $r = $h->getFlvURL('3vdqWQScc7Y');
        * assert(isset($r),'id入りました');
        */
        $base_url = 'http://www.youtube.com/watch?v=';

        if(!isset($v)){
            return false;
        }

        $browser = new Browser();
        $page = StringUtil::encoding($browser->get($base_url.$v));
        $tag = new SimpleTag();
        $tag->set($page);
        $scripts= $tag->getIn('script');
        if(empty($scripts)){
            return false;
        }
        $lines = explode("\n",$scripts[2]->getValue());
        foreach($lines as $key => $value){
            if( preg_match("/additionalStatsHonorsUrl/",$value)){
                break;
            }
            if( preg_match("/swfArgs/",$value)){
                $buf = explode('=',$value);
                $search = array('@ @','@{@','@"@','@:@','@,@','@;@','@}@');
                $match  = array('','','','=','&','','');
                $data = preg_replace($search,$match,$buf[1]);
                return 'http://www.youtube.com/get_video?'.$data;
            }
        }
    }
    function tagSearchWithFlvURL($tag,$page=1,$perpage=10,$iscache=true){
        /***
        * $h = new YouTubeAPIex('**********');
        * $r = $h->tagSearchWithFlvURL('r1');
        * assert(isset($r),'タグサーチ');
        */
        $list = parent::tagSearch($tag,$page,$perpage,$iscache);
        foreach($list as $value){
            $buf = $this->getFlvURL($value['id']);
            if($buf){
                $list2[] = array_merge($value,array("flvURL" => $buf));
            }
        }
		if(empty($list2)){
			return false;
		}else{
	        return $list2;
		}
    }
}
?>

*****部分はdev_keyですので、youtubeで取得したdev_keyに置き換えてください。
たぶん、テストが通りません。
tagSearchWithFlvURLは1つ1つにスクレイピングをかけているので遅いです・・・うーん、どうやればいいかなあ??

YouTubeAPIex.php使ったサンプルサイト

いまさら、youtubeのflvをダウンロードできるURLが分かったところで…という感じですが。

過去に作ったものをrhacoに置き換えてみる(psptube編)

借りてるサーバでアクセス解析のサービスが開始されたので早速アクセス解析を眺めていたら、予想外のものがアクセストップだった。
いままではASP型のアクセス解析(Google Analyticsとか)を使っていたから全く気がつかなかった。
アクセス数ランキング
このファイルってば、むかーしPSPで直接youtubeが見れないだろうか?と試行錯誤しながら、結局PSPに入ってるFlashのバージョンが低くて使えなかったのでそのまま「youtubewall」にしたやつのパーツの一部です。

今現在は、サムネイルこそwall状に表示されますが、クリックしても再生されません。youtubeのサイト上をPHPでスクレイピングしてflvの場所を探し出し、それをFlashに渡すような仕様なのですが、youtubeのサイトが当時とは変わっているため当然その部分が動かなくなってます。
なので、これを再度動くように、Rhacoで改修してみた。

以下、その部分のソース。

<?php
include_once("__init__.php");
Rhaco::import("generic.Flow");
Rhaco::import('tag.model.SimpleTag');
Rhaco::import("network.http.Browser");
Rhaco::import("lang.StringUtil");

Rhaco::constant("YOUTUBE_BASE_URL","http://www.youtube.com/watch?v=");

$flow = new Flow();

//yutubeの個別ID(/watch?v=以降の値)を渡す
$v = $flow->getVariable("v","3vdqWQScc7Y");

//Browserでyoutube内のページを取得
$browser = new Browser();
$page = StringUtil::encoding($browser->get(YOUTUBE_BASE_URL.$v));

//SimpleTagでスクレイピング開始
$tag = new SimpleTag();
$tag->set($page);
$scripts= $tag->getIn('script');

$lines = explode("\n",$scripts[2]->getValue());
foreach($lines as $key => $value){
    if( preg_match("/additionalStatsHonorsUrl/",$value)){
        break;
    }
    if( preg_match("/swfArgs/",$value)){
        $buf = explode('=',$value);
        $search = array('@ @','@{@','@"@','@:@','@,@','@;@','@}@');
        $match  = array('','','','=','&','','');
        $data = preg_replace($search,$match,$buf[1]);
    }
}

//出力
header("Content-type: application/xml");
$flow->setVariable("parm",urlencode($data));
$flow->write("sample_template.html");
?>

テンプレートはこんな感じ。

<?xml version="1.0" encoding="utf-8"?>
<rss>
<item title="http://www.youtube.com/get_video?{$f.escape($parm)}" />
</rss>

最後の出力部分はxmlを出力したいのですが結構ひどい感じです。
Rhacoでのうまいやり方はどんな感じなんだろか?

実行した感じはこんなんです。title要素をFlashで取得してflv表示って感じですね

取締役補足マップ(一応、rhacoネタ?)

明日は東京マラソン2008ですが、うちの会社から取締役(!)が1名参加しています。
そこで、会社内で参加していない社員も盛り上がろうということで当日にGPS付き携帯(au)を持たせてgooglemaps上で補足し続けようという実験(?)をします。

持たせている携帯は5分おきにリロードする専用ページにアクセスして、サーバに位置情報を送ります。
それをデータベースに溜め込んでgooglemaps上に表示します・・・ってAPIが公開された当初に散々情報があふれ返っていたから、今更って話です、はい。
このブログでも過去エントリあります。

制作にはPHPフレームワークのRhacoを使用しています。
あとでソース部分を公開予定ですが、まあ、たいしたことは全くしてません。
googlemaps上への描画等はjavascriptはそもそもブラウザ上で見えるので気になった方見てください。

あ、一応携帯版(?)もあります。

AV女優の画像を取得する(Conveyorネタ)

以前に作った「Conveyor(旧名PRhagger)で日本のAV女優一覧のRSSを取得してみる」に追加する形でそこにAV女優の画像(顔写真)を検索して追加するようなworker(filter)を作ってみました。
画像はDMMアダルト AV女優情報の検索結果をスクレイピングする形で取得します。
DMMはアフィリエイトをしているので、urlにはconfigに入力したアフィリエイトIDを追加したURLを返すようにします。

<?php

Rhaco::import("model.FilterBase");
Rhaco::import("tag.feed.Rss20");
Rhaco::import('tag.model.SimpleTag');
Rhaco::import('network.http.Http');
Rhaco::import("network.http.Browser");
Rhaco::import("lang.StringUtil");
Rhaco::import("io.Cache");

/**
 *
 * FilterAvActressPict
 *
 * @author fumix
 * @license New BSD License
 * @copyright Copyright 2008- The Rhacophorus Project. All rights reserved.
 */
class FilterAvActressPict extends FilterBase{
    function execute($rss20)
    {
        $channel = $rss20->getChannel();
        $items =& $rss20->getItem();

        $rss20_filtered = new Rss20();
		$rss20_filtered->setChannel($channel->getTitle(),
			$channel->getDescription(),
			$channel->getLink(),
			"ja"
		);

        foreach ($items as $item) {
            $rtn = $this->searchAV($item->getTitle());
            $av = $item->getDescription().$rtn['img'];
            $item->setDescription($av);
            $item->setLink($rtn['url']);
            $rss20_filtered->setItem($item);
        }
        return $rss20_filtered;
    }

    /**
     * searchAV
     *
     * @access protected
     * @param string $message
     */
    function searchAV($message)
    {
        $cache = new Cache();
        $parm = urlencode(StringUtil::encoding($message,StringUtil::EUC()));
        $browser = new Browser();
        //キャッシュを利用
        if($cache->get($parm)){
    	   $page = $cache->get($parm);
        }else{
        	$page = StringUtil::encoding($browser->get("http://www.dmm.co.jp/search/?category=actress&analyze=V1EAAVYEUQs_&redirect=1&searchstr=".$parm));
        	$cache->set($parm,$page);
        }
		$tag = new SimpleTag();
		$tag->set($page);

        $tbl= $tag->getIn('table');
        $body = $tbl[1]->getIn('body');
        $a = $body[0]->getIn('a');
        $img = $body[0]->getIn('img');
        if(count($a)>2){
            if($a[3]->getValue() != '0'){
                $img = '<img src="'.preg_replace("/thumbnail\//","",$img[0]->getParameter("src")).'" />';
                $url = $a[3]->getParameter("href").$this->variable("id");
                return array("img" => $img, "url" => $url);
            }
        }
        return array("img" => "", "url" => "");
    }

    function description()
    {
        return "feedのタイトルからDMMのAV女優情報を検索して画像を取得";
    }

    function config(){
        $config = array(
            "id" => "アフィリエイト",
        );

        return $config;
    }
}
?>

ダウンロードして解凍後、workerフォルダに放りこんでください。

Conveyor上でCustomfeedAvActressと組み合わせて実行したイメージはこんな漢字です。
2008年デビューのAV女優の一覧です。

レシピはこんな感じ

<?php
require_once("__init__.php");
Rhaco::import("Conveyaml");
Conveyaml::execute(
<<< __YAML__
---
plugins:
  -
    module: CustomfeedAvActress.CustomfeedAvActress
    config:
      initial:
      name:
      yomi:
      debut: 2008
  -
    module: FilterAvActressPict.FilterAvActressPict
    config:
      id: dmmpress-001
  -
    module: HtmlOut.HtmlOut
__YAML__
);

?>

※ConveyorはPHPフレームワークであるRhaco上で動くwebアプリケーションです。

Conveyor(旧名PRhagger)で日本のAV女優一覧のRSSを取得してみる

元ネタ、というかほぼ「まんま」ですけど…。

仕組みとしては、 Wikipediaの日本のAV女優一覧というページのExportというXMLを出力するサービスから、 正規表現でごりごりスクレイピングしています。

WikipediaのページをXMLで取得できるというのは知らなかった。

これならPipesでも出来るんじゃない??と考えてやってみたのですが、「取得しようとするページがデカ過ぎですから!」といわれ(エラーになる)出来ませんでした。
なのでいくらでも実行できるようにローカルでPHP版Plaggerこと「Conveyor(旧名PRhagger)」を動かしてやってみました。

最初は標準で用意されている「CustomfeedFetchpage」や「FilterRegex」をメインに複数のworkerを組み合わせればいけるかなあ?と軽く考えていたのですがなかなかウマくいかず、さらにすっごく遅い!のでCustomfeed系のworkerを自作しました。

<?php
Rhaco::import("model.SubscriptionBase");
Rhaco::import("lang.DateUtil");
Rhaco::import("lang.StringUtil");
Rhaco::import("network.http.Browser");
Rhaco::import("tag.model.SimpleTag");
Rhaco::import("tag.feed.Rss20");
/**
 * CustomfeedAvActress
 * @author fumix
 * 

 * @license New BSD License
 * @copyright Copyright 2007- The Rhacophorus Project. All rights reserved.
 */
class CustomfeedAVActress extends SubscriptionBase{
    function execute($variable){
        $rss20 = new Rss20();
        $rss20->setChannel("AV ACTRESS",
            "description",
            "http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:Export/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7",
            "ja"
        );
        $source = new RssSource("http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:Export/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7","AV女優一覧 - Wikipedia");

		$browser = new Browser();
    	$page = StringUtil::encoding($browser->get("http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:Export/AV%E5%A5%B3%E5%84%AA%E4%B8%80%E8%A6%A7"));
		$tag = new SimpleTag();
		$tag->set($page);
		$counter = 0;

        $flg = false;
		foreach($tag->getIn("text") as $key => $text_tag){
		  $lines = explode("\n",$text_tag->getValue());
		  foreach($lines as $key => $value){
    		  if($value == "== 関連項目 =="){
        		  break;
    		  }
    		  if($value == "== あ行 =="){
        		  $flg = true;
    		  }
    		  if($flg == true){
                if ( preg_match("/===\s([あ-ん]*?)\s===\Z/",$value, $matches) ) {
                    $initial = $matches[1];
                }
                else if ( preg_match('/\[\[(.*?)\]\](.*)/',$value, $matches) ) {
                    $name = $matches[1];
                    $temp = $matches[2];
                    if ( preg_match('/(?:(|\()(.*?)(?:)|\)).*(?:(|\()\[\[(\d{4})年\]\](?:)|\))/',$temp, $matches) ){
                        $yomi = $matches[1];
                        $debut = $matches[2];
                    }
                    else if ( preg_match('/(?:(|\()\[\[(\d{4})年\]\](?:)|\))/',$temp,$matches) ) {
                        $yomi = "";
                        $debut = $matches[1];
                    }
                    else if ( preg_match('/(?:(|\()(.*?)(?:)|\))/',$temp,$matches) ) {
                        $yomi = $matches[1];
                        $debut = "";
                    }
                    if ( preg_match('/(.*)\|(.*)/',$name,$matches) ) {
                        $name = $matches[2];
                    }
                    if($yomi == ""){$yomi = $name;}
            		$description = $initial.",".$name.",".$yomi.",".$debut.",";

        	        if( ($initial == $this->variable("initial") || $this->variable("initial") == "") &&
        	        ($name == $this->variable("name") || $this->variable("name") == "") &&
        	        ($yomi == $this->variable("yomi") || $this->variable("yomi") == "") &&
        	        ($debut == $this->variable("debut") || $this->variable("debut") == "") )
        	        {

            	        $item = new RssItem20();
        			    $item->setTitle($name);

        			    $item->setDescription($description);
        			    $rss20->setItem($item);
        		    }
        		}
    		  }
    	  }
	    }
        $rss20 = $this->merge($variable,$rss20);
        return $rss20;
      }

    function description(){
    	return "WikipediaからAV女優名の一覧を取得";
    }
    function config(){
        $config = array(
            "initial" => "頭文字",
            "name" => "名前",
            "yomi" => "読み",
            "debut" => "デビュー(YYYY)",
        );

        return $config;
    }
    function rhacover() {
    	return "1.4.0";
    }
}

?>

ダウンロードして解凍後、workerフォルダに放りこんでください。
頭文字(あ?ん)・名前・よみがな・デビュー年(YYYY)でデータの絞り込みができます。
feedの形状は、titleに名前(漢字)、descriptionに頭文字(あ?ん)・名前・よみがな・デビュー年(YYYY)がカンマ区切り(csv?)で入っています。

「SubscriptionRequest」を組み合わせて使えば、configにrequestデータ渡して動的に絞り込みしたfeedが取得できるのかな?と思っていたのですが、できないっぽい?
使い方が違うのかなあ?

※ConveyorはPHPフレームワークであるRhaco上で動くwebアプリケーションです。

rhacoを使ってblogにtumblrの更新情報(RSS)を載せる

rhacoには強力なフィードパサー機能があります(とはいえ、他のフレームワークを使ったことは無いので、比較はできませんけど)。
これを使って、自分のブログ(WordPress)にtumblrの更新情報を載せてみました。
参考にしたのはこちら。

前回と同様にセットアップまわりは飛ばすことにします(笑)
「キャッシュ」に関しては「使用する」ことにしました。

フィルターの作成

今回、データとして引っ張ってくるのは更新日時、タイトル、リンクの3つです。
その中でタイトルに関して、tumblrは長くなることが多いので、ある程度の長さ以降は切ることにします。
この動作をフィルターとして制作します。
以下のソースをプロジェクトフォルダ/library以下にFeedFilter.phpとして保存します。

・プロジェクトフォルダ/library/FeedFilter.php


<?php
Rhaco
::import("lang.StringUtil");    //文字列を扱うユーティリティをインポート

class FeedFilter{
        function
cutString($arg1){
                
$filter = new StringUtil();
                
$buf = explode('---',$arg1);
                return
$filter->substring($buf[0],0,30)."…";    //30文字までを返す
        
}
}
?>

文字列を扱うユーティリティは「rhacoのAPIレファレンス」で機能を調べました。

explode(特定の文字列で、文字列を分割する)に相当する機能を使いたかったのですが、APIレファレンスでは発見できませんでしたので、PHPのexplode関数を直接使いました。

VIEW(index.php)の作成

プロジェクトフォルダ直下に以下のソースをindex.phpとして保存します。

・プロジェクトフォルダ/index.php


<?php
require_once("./__init__.php");
Rhaco::import("lang.DateUtil");
Rhaco::import("tag.HtmlParser");
Rhaco::import("tag.feed.FeedParser");
Rhaco::import("FeedFilter"); // <- filterクラスをimport

$parser = new HtmlParser();
$feed   = new FeedParser();

$items  = $feed->getItem(array(
  
"http://fragment.planet-ape.net/rss",
));

$parser->setVariable("items",$items);
$parser->setVariable("filter",new FeedFilter()); // <- filterをテンプレートで利用できるように定義
$parser->setVariable("DateUtil",new DateUtil()); // <- DateUtilをテンプレートで利用できるように定義
$parser->write("sample.html");

?>

先ほど作った「filter」とrhacoのAPIである「DateUtil(日付関係ユーティリティ)」をテンプレート上で使用するため上記の「テンプレートで・・・」のように定義します。

テンプレートの作成

プロジェクトフォルダ/resources/templates/以下にsample.htmlを作成します。
ブログに表示するためのものなので、htmlの一部(テーブル)のみとなっています。

・プロジェクトフォルダ/resources/templates/sample.html

<table width=”100%” border=”0″ cellpadding=”0″ cellspacing=”0″>
<tr>
<th class=”summary-date”>date</th>
<th scope=”col”>title</th>
</tr>
<rt:loop param=”{$items}” var=”item”>
<tr>
<td class=”summary-date”>{$DateUtil.format({$item.getPubDate()},”Y.m.d D H:i”)}</td>
<td><a href=”{$item.getLink()}” title=”{$item.getTitle()}”>{$filter.cutString({$item.getTitle()})}</a></td>
</tr>
</rt:loop>
</table>

太字の部分がfilterとDateUtilを適用した箇所です。
これで完成です。
実行すると以下のように表示されます!
実行画面

ブログに挿入

ブログツールはWordPressを使っています。
WordPressはテンプレートに直接PHPコードを書くことができますので、先ほど作成したものをinclude等で表示させたい箇所に記載すれば、それで表示されます。
現在はトップページに表示させています。

rhacoは使用したい機能を個々にインポートして、それを使ってアプリケーションを組み立てていくというイメージなのかな??
っていうかフレームワークというものはそういうものなのかな???

rhacoはじめ

PHP用の変態フレームワークとして有名な(?)rhacoを使って「なにか」作ってみようと思います、の記録。
PHPのフレームワークは他にもいっぱいありますが、rhacoを選んだ理由としては

  1. レンタルサーバにいれぽんで使える
  2. コンソールをたたかなくても使える(web画面で設定できる!!)
  3. Prhagger改め、Conveyorを使ってみたい
  4. 変態だから

というのがあります。
cakePHPも良さそうだったのですが、すでに素晴らしい連載をされいてる方がいるので、いまさら・・・という感じでやめ。
しかし、ドキュメントが殆ど無いので、いろいろ調べるのは大変そう・・・。
どうやらrhacoは、お一人で作っているらしくドキュメントまわりをそろえるところまで、手が回っていないようです。
そこが変態たるゆえんかもしれません。

なにはなくてもチュートリアル

まずは公式サイトにあるチュートリアルのrhaco.org – easy bookmark part 2を動かしてみました。
しかし、サイト上になぜかpart 1がなく、謎です。
そしていきなり、インストールと初期セットアップはぶっ飛ばします(ぇー

なんかエラー(?)が出てるんですが・・・

エラーメッセージ・・・

いきなりチュートリアルで挫折しそうだ・・・orz
/generic/Urls.phpの34行目、preg_match(正規表現処理部分??)がエラーだぞゴラァと言っているようなので、素直にみてみます。

・/generic/Urls.phpの34行目

if(!empty($pre) && preg_match(sprintf(“/%s/”,$pre),$url,$matchs)){

ん~??デリミタ部分(太字)が違うか?
ここには「/」も対象としてはいってくるので、デリミタが「/」だとマズいのではないか、と予想。

・/generic/Urls.phpの34行目の修正(赤字)

if(!empty($pre) && preg_match(sprintf(“|%s|”,$pre),$url,$matchs)){

デリミタを「/」から「|」に変えてみます。

エラーがとれた!!

うぉ!エラーがとれた!!!やった!!!
んー、でもフレームワークのほうを修正してもよいものか・・・。

詳細画面と編集画面がでない

エラーは取れたものの、一覧画面と、追加画面(create)以外の詳細画面(数字のリンクをクリック)と再編集画面(updateのリンクをクリック)へ画面が遷移しません。
今度はフレームワーク側のソースではなく、設置したアプリ側のソースを見てみます。

・一覧表示用のVIEWであるindex.php

<?php
require_once(“./__init__.php”);
Rhaco::import(“generic.Urls”);
Rhaco::import(“model.Bookmark”);

$parser = Urls::parser(array(
“^detail/([d]+)$”=>array(“bookmark_detail.html”,null,null,”detail”,new Bookmark()),
“^create$”=>array(“bookmark_form.html”,null,null,”create”,array(new Bookmark(),Rhaco::self())),
“^update/([d]+)”=>array(“bookmark_form.html”,null,null,”update”,array(new Bookmark(),Rhaco::self())),
“^”=>array(“bookmark_list.html”,null,null,”read”,new Bookmark()),
));
$parser->write();
?>

よくわかっていませんが、詳細画面用のテンプレートであるbookmark_detail.htmlと再編集画面用のテンプレートであるbookmark_form.htmlが入っている2行(太字)が怪しいとあたりをつけました。
さらに、ここはURLによって、処理を振り分けているんだろう??・・・ムムム!!
詳細画面のURLは
・アプリを設置したディレクトリ/detail/対応するブックマークの数字
再編集画面のURLは
・アプリを設置したディレクトリ/update/対応するブックマークの数字
それで上記の赤字部分は対応するURLへの正規表現なのではないかと予想。
となると、[d]は数字を表わしているのか?
数字って正規表現じゃ\dじゃなかったっけ??と思ったので、下記のように修正してみました。

・一覧表示用のVIEWであるindex.phpの修正(赤字部分)

<?php
require_once(“./__init__.php”);
Rhaco::import(“generic.Urls”);
Rhaco::import(“model.Bookmark”);

$parser = Urls::parser(array(
“^detail/(\d+)$”=>array(“bookmark_detail.html”,null,null,”detail”,new Bookmark()),
“^create$”=>array(“bookmark_form.html”,null,null,”create”,array(new Bookmark(),Rhaco::self())),
“^update/(\d+)”=>array(“bookmark_form.html”,null,null,”update”,array(new Bookmark(),Rhaco::self())),
“^”=>array(“bookmark_list.html”,null,null,”read”,new Bookmark()),
));
$parser->write();
?>

詳細画面!!

詳細画面

再編集画面!!

再編集画面

やった!!!できましたあ!!
今日はここまでにしよう。
長かった・・・。

ホーム > rhaco

Search
Feeds
Meta

Return to page top