<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>planet-ape&#124;blog &#187; PHP</title>
	<atom:link href="http://www.planet-ape.net/blog/archives/category/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.planet-ape.net/blog</link>
	<description>We Love WordPress</description>
	<lastBuildDate>Sun, 20 Nov 2011 09:36:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>yahoo経由でamazonを検索する（rhacoネタ）</title>
		<link>http://www.planet-ape.net/blog/archives/602</link>
		<comments>http://www.planet-ape.net/blog/archives/602#comments</comments>
		<pubDate>Sat, 05 Jul 2008 14:12:40 +0000</pubDate>
		<dc:creator>fumix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[rhaco]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[Webサービス]]></category>
		<category><![CDATA[Yahoo]]></category>

		<guid isPermaLink="false">http://www.planet-ape.net/?p=602</guid>
		<description><![CDATA[Amahoo!2.0 yahoo経由でamazonを検索するものを作りました。 それどこのYasazon &#8211; ヤサゾン？という感じで、完全に劣化コピーです、はい笑 いちおうAutoPagerize対応してます [...]]]></description>
			<content:encoded><![CDATA[				<ul class="link">
				<li><a href="http://www.planet-ape.net/amahoo2/">Amahoo!2.0</a></li>
				</ul>
				<p>yahoo経由でamazonを検索するものを作りました。<br />
				それどこの<a href="http://yasazon.com/">Yasazon &#8211; ヤサゾン</a>？という感じで、完全に劣化コピーです、はい笑<br />
				いちおうAutoPagerize対応してますので、マウスくりくりで次ページのものがくっつきます。<br />
				それで<a href="http://developer.yahoo.co.jp/search/web/V1/webSearch.html">Yahoo!ウェブ検索API</a>をrhacoで使用するためのクラスがこちら。</p>
				<pre class="brush: php">
&lt;?php
Rhaco::import("network.http.ServiceRestAPIBase");

class yahooSearchApi extends ServiceRestAPIBase{
&#9;var $appid;
&#9;var $url;
&#9;var $type='all';
&#9;var $results=10;
&#9;var $start=1;
&#9;var $format='any';//any&#65288;&#12487;&#12501;&#12457;&#12523;&#12488;&#65289;, html, msword, pdf, ppt, rss, txt, xls
&#9;var $adult_ok='0';//&#20516;&#12394;&#12375;&#65288;&#12487;&#12501;&#12457;&#12523;&#12488;&#65289;, 1
&#9;var $similar_ok='0';//&#20516;&#12394;&#12375;&#65288;&#12487;&#12501;&#12457;&#12523;&#12488;&#65289;, 1
&#9;var $language='ja';//ja&#65288;&#12487;&#12501;&#12457;&#12523;&#12488;&#65289;
&#9;var $country='0';//&#20516;&#12394;&#12375;&#65288;&#12487;&#12501;&#12457;&#12523;&#12488;&#65289;
&#9;var $site='0';//&#20516;&#12394;&#12375;&#65288;&#12487;&#12501;&#12457;&#12523;&#12488;&#65289;
&#9;
&#9;/**
&#9; * &#12467;&#12531;&#12473;&#12488;&#12521;&#12463;&#12479;
&#9; *
&#9; * @param unknown_type $key
&#9; * @return yahooSearchApi
&#9; */
&#9;function yahooSearchApi($key){
&#9;&#9;parent::ServiceRestAPIBase();
&#9;&#9;$this-&gt;url = "http://api.search.yahoo.co.jp/WebSearchService/V1/webSearch";
&#9;&#9;$this-&gt;appid = $key;
&#9;}
&#9;
&#9;function search($keyword){
&#9;&#9;
&#9;&#9;$hash = array(
&#9;&#9;"query"  =&gt; $keyword,
&#9;&#9;"type" =&gt; $this-&gt;type,
&#9;&#9;"results" =&gt; $this-&gt;results,
&#9;&#9;"start" =&gt; $this-&gt;start,
&#9;&#9;"format" =&gt; $this-&gt;format,
&#9;&#9;"adult_ok" =&gt; $this-&gt;adult_ok,
&#9;&#9;"similar_ok" =&gt; $this-&gt;similar_ok,
&#9;&#9;"language" =&gt; $this-&gt;language,
&#9;&#9;"country" =&gt; $this-&gt;country,
&#9;&#9;"site" =&gt; $this-&gt;site
&#9;&#9;);

&#9;&#9;$pTag = new SimpleTag();
&#9;&#9;$pTag-&gt;set($this-&gt;get($hash));
&#9;&#9;return $pTag-&gt;toHash();
&#9;}
&#9;
&#9;function buildUrl($hash){
&#9;&#9;return parent::buildUrl($hash,array("appid"=&gt;$this-&gt;appid));
&#9;}
&#9;
&#9;/**
&#9; * &#12450;&#12480;&#12523;&#12488;OK
&#9; *
&#9; * @param int $adult_ok
&#9; */
&#9;public function setAdult_ok($adult_ok) {
&#9;&#9;$this-&gt;adult_ok = $adult_ok;
&#9;}
&#9;/**
&#9; * &#12450;&#12480;&#12523;&#12488;OK
&#9; *
&#9; * @return unknown
&#9; */
&#9;public function getAdult_ok() {
&#9;&#9;return $this-&gt;adult_ok;
&#9;}
&#9;/**
&#9; * &#22269;&#21029;&#65288;&#26085;&#26412;jpn&#65289;
&#9; *
&#9; * @param unknown_type $country
&#9; */
&#9;public function setCountry($country) {
&#9;&#9;$this-&gt;country = $country;
&#9;}
&#9;/**
&#9; * &#22269;&#21029;
&#9; *
&#9; * @return unknown
&#9; */
&#9;public function getCountry() {
&#9;&#9;return $this-&gt;country;
&#9;}
&#9;/**
&#9; * &#12501;&#12457;&#12540;&#12510;&#12483;&#12488;&#65288;html, msword, pdf, ppt, rss, txt, xls&#65289;
&#9; *
&#9; * @param unknown_type $format
&#9; */
&#9;public function setFormat($format) {
&#9;&#9;$this-&gt;format = $format;
&#9;}
&#9;/**
&#9; * &#12501;&#12457;&#12540;&#12510;&#12483;&#12488;
&#9; *
&#9; * @return unknown
&#9; */
&#9;public function getFormat() {
&#9;&#9;return $this-&gt;format;
&#9;}
&#9;/**
&#9; * &#20351;&#29992;&#35328;&#35486;&#65288;ja)
&#9; *
&#9; * @param unknown_type $language
&#9; */
&#9;public function setLanguage($language) {
&#9;&#9;$this-&gt;language = $language;
&#9;}
&#9;/**
&#9; * &#20351;&#29992;&#35328;&#35486;
&#9; *
&#9; * @return unknown
&#9; */
&#9;public function getLanguage() {
&#9;&#9;return $this-&gt;language;
&#9;}
&#9;/**
&#9; * &#20986;&#21147;&#20214;&#25968;
&#9; *
&#9; * @param unknown_type $results
&#9; */
&#9;public function setResults($results) {
&#9;&#9;$this-&gt;results = $results;
&#9;}
&#9;/**
&#9; * &#20986;&#21147;&#20214;&#25968;
&#9; *
&#9; * @return unknown
&#9; */
&#9;public function getResults() {
&#9;&#9;return $this-&gt;results;
&#9;}
&#9;/**
&#9; * &#21516;&#12376;&#12467;&#12531;&#12486;&#12531;&#12484;&#12434;&#21029;&#12398;&#26908;&#32034;&#32080;&#26524;&#12392;&#12377;&#12427;&#12363;&#12393;&#12358;&#12363;
&#9; *
&#9; * @param unknown_type $similar_ok
&#9; */
&#9;public function setSimilar_ok($similar_ok) {
&#9;&#9;$this-&gt;similar_ok = $similar_ok;
&#9;}
&#9;/**
&#9; * &#21516;&#12376;&#12467;&#12531;&#12486;&#12531;&#12484;&#12434;&#21029;&#12398;&#26908;&#32034;&#32080;&#26524;&#12392;&#12377;&#12427;&#12363;&#12393;&#12358;&#12363;
&#9; *
&#9; * @return unknown
&#9; */
&#9;public function getSimilar_ok() {
&#9;&#9;return $this-&gt;similar_ok;
&#9;}
&#9;/**
&#9; * &#26908;&#32034;&#23550;&#35937;&#12469;&#12452;&#12488;
&#9; *
&#9; * @param unknown_type $site
&#9; */
&#9;public function setSite($site) {
&#9;&#9;$this-&gt;site = $site;
&#9;}
&#9;/**
&#9; * &#26908;&#32034;&#23550;&#35937;&#12469;&#12452;&#12488;
&#9; *
&#9; * @return unknown
&#9; */
&#9;public function getSite() {
&#9;&#9;return $this-&gt;site;
&#9;}
&#9;/**
&#9; * &#20309;&#12506;&#12540;&#12472;&#30446;&#12434;&#34920;&#31034;
&#9; *
&#9; * @param unknown_type $start
&#9; */
&#9;public function setStart($start) {
&#9;&#9;$this-&gt;start = $start;
&#9;}
&#9;/**
&#9; * &#20309;&#12506;&#12540;&#12472;&#30446;&#12434;&#34920;&#31034;
&#9; *
&#9; * @return unknown
&#9; */
&#9;public function getStart() {
&#9;&#9;return $this-&gt;start;
&#9;}
&#9;/**
&#9; * &#26908;&#32034;&#12398;&#20181;&#26041;&#65288;all, any, phrase&#65289;
&#9; *
&#9; * @param unknown_type $type
&#9; */
&#9;public function setType($type) {
&#9;&#9;$this-&gt;type = $type;
&#9;}
&#9;/**
&#9; * &#26908;&#32034;&#12398;&#20181;&#26041;
&#9; *
&#9; * @return unknown
&#9; */
&#9;public function getType() {
&#9;&#9;return $this-&gt;type;
&#9;}

}

?&gt;
</pre>
				<p>パラメータが多くてsetter/getterを作るのがめんどいなあと思ったのですが、setter/getterをオートで入れてくれるeclipseプラグインを見つけてさくっと作ることが出来ました。</p>
				<ul class="link">
				<li><a href="http://blog.xole.net/article.php?id=642">ハタさんのブログ : S2Dao.PHP5 Eclipse Plugin for PDT できたよー＼(^o^)／</a></li>
				</ul>
				<p>setter/getterをオートで入れるっていうのは上記ツールの機能のほんの一部でしかないような気がしますが・・・。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.planet-ape.net/blog/archives/602/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>過去に作ったものをrhacoに置き換えてみる（psptube編）その2</title>
		<link>http://www.planet-ape.net/blog/archives/576</link>
		<comments>http://www.planet-ape.net/blog/archives/576#comments</comments>
		<pubDate>Mon, 25 Feb 2008 11:09:45 +0000</pubDate>
		<dc:creator>fumix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[rhaco]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://www.planet-ape.net/archives/576</guid>
		<description><![CDATA[前回つくったものをクラス化して、rhacoの素晴らしい機能である「doctest」を使ってみます。 rhacoの機能であるdoctestはこちらが詳しいです。 rhacoアプリ開発日誌 &#8211; 逆引きrhaco( [...]]]></description>
			<content:encoded><![CDATA[				<p><a href="http://www.planet-ape.net/archives/573" title="planet-ape|blog ≫ Blog Archive ≫ 過去に作ったものをrhacoに置き換えてみる（psptube編）">前回つくったもの</a>をクラス化して、rhacoの<strong>素晴らしい機能</strong>である「doctest」を使ってみます。<br />
				rhacoの機能であるdoctestはこちらが詳しいです。</p>
				<ul class="link">
				<li><a href="http://blog.shigepon.com/snippet18" title="rhacoアプリ開発日誌 - 逆引きrhaco(?)18:doctestを使う">rhacoアプリ開発日誌 &#8211; 逆引きrhaco(?)18:doctestを使う</a></li>
				</ul>
				<p>コメントにテストが書ける！というやつです。</p>
				<p>今回はrhaco本体（開発版)のほかにrhacoの外部ライブラリであるYouTubeAPI.phpを使用しています。</p>
				<ul class="link">
				<li><a href="http://lib.rhaco.org/view/network/services/YouTubeAPI.php" title="lib.rhaco.org">lib.rhaco.org</a></li>
				</ul>
				<p>ダウンロードしてrhacoのフォルダ内に放りこんでおいてください。</p>
				<p>※YouTubeAPI.phpはエラーがあります！その部分を直して使ってください！<br />
				該当箇所は13行目の</p>
				<pre class="brush: php">
	var $url = "http://www.youtube.com/api2_rest?";
</pre>
				<p>の<strong>?</strong>が余計ですので、これは削除しておいてください。</p>
				<ul class="link">
				<li>YouTubeAPIex.php</li>
				</ul>
				<pre class="brush: php">
&lt;?php
Rhaco::import("YouTubeAPI");

class YouTubeAPIex extends YouTubeAPI {
    function getFlvURL($v=null){
        /***
        * $h = new YouTubeAPIex('**********');
        * $r = $h-&gt;getFlvURL();
        * assert(!$r,'&#24341;&#25968;&#31354;&#12387;&#12413;&#12399;&#12384;&#12417;&#65281;');
        * $r = $h-&gt;getFlvURL('hoge');
        * assert(!$r,'id&#36949;&#12358;');
        * $r = $h-&gt;getFlvURL('3vdqWQScc7Y');
        * assert(isset($r),'id&#20837;&#12426;&#12414;&#12375;&#12383;');
        */
        $base_url = 'http://www.youtube.com/watch?v=';

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

        $browser = new Browser();
        $page = StringUtil::encoding($browser-&gt;get($base_url.$v));
        $tag = new SimpleTag();
        $tag-&gt;set($page);
        $scripts= $tag-&gt;getIn('script');
        if(empty($scripts)){
            return false;
        }
        $lines = explode("\n",$scripts[2]-&gt;getValue());
        foreach($lines as $key =&gt; $value){
            if( preg_match("/additionalStatsHonorsUrl/",$value)){
                break;
            }
            if( preg_match("/swfArgs/",$value)){
                $buf = explode('=',$value);
                $search = array('@ @','@{@','@"@','@:@','@,@','@;@','@}@');
                $match  = array('','','','=','&amp;','','');
                $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-&gt;tagSearchWithFlvURL('r1');
        * assert(isset($r),'&#12479;&#12464;&#12469;&#12540;&#12481;');
        */
        $list = parent::tagSearch($tag,$page,$perpage,$iscache);
        foreach($list as $value){
            $buf = $this-&gt;getFlvURL($value['id']);
            if($buf){
                $list2[] = array_merge($value,array("flvURL" =&gt; $buf));
            }
        }
&#9;&#9;if(empty($list2)){
&#9;&#9;&#9;return false;
&#9;&#9;}else{
&#9;        return $list2;
&#9;&#9;}
    }
}
?&gt;
</pre>
				<p>*****部分はdev_keyですので、youtubeで取得したdev_keyに置き換えてください。<br />
				たぶん、テストが通りません。<br />
				tagSearchWithFlvURLは1つ1つにスクレイピングをかけているので遅いです・・・うーん、どうやればいいかなあ？？</p>
				<p>YouTubeAPIex.php使ったサンプルサイト</p>
				<ul class="link">
				<li><a href="http://www.planet-ape.net/psptube/sample.php" title="youtube search with flvURL">youtube search with flvURL</a></li>
				</ul>
				<p>いまさら、youtubeのflvをダウンロードできるURLが分かったところで…という感じですが。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.planet-ape.net/blog/archives/576/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>過去に作ったものをrhacoに置き換えてみる（psptube編）</title>
		<link>http://www.planet-ape.net/blog/archives/573</link>
		<comments>http://www.planet-ape.net/blog/archives/573#comments</comments>
		<pubDate>Mon, 18 Feb 2008 10:36:01 +0000</pubDate>
		<dc:creator>fumix</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[rhaco]]></category>
		<category><![CDATA[PSP]]></category>

		<guid isPermaLink="false">http://www.planet-ape.net/archives/573</guid>
		<description><![CDATA[アクセス解析機能をリリースしました。 &#8211; 大容量・高機能レンタルサーバー「heteml」 借りてるサーバでアクセス解析のサービスが開始されたので早速アクセス解析を眺めていたら、予想外のものがアクセストップだっ [...]]]></description>
			<content:encoded><![CDATA[				<ul class="link">
				<li><a href="http://heteml.jp/news/529.html">アクセス解析機能をリリースしました。 &#8211; 大容量・高機能レンタルサーバー「heteml」</a></li>
				</ul>
				<p>借りてるサーバでアクセス解析のサービスが開始されたので早速アクセス解析を眺めていたら、予想外のものがアクセストップだった。<br />
				いままではASP型のアクセス解析（<a href="https://www.google.com/analytics/home/?et=reset&#038;hl=ja-JP" title="Google Analytics">Google Analytics</a>とか）を使っていたから全く気がつかなかった。<br />
				<img src='http://www.planet-ape.net/wp-content/uploads/2008/02/access001.gif' alt='アクセス数ランキング' /><br />
				このファイルってば、むかーしPSPで直接youtubeが見れないだろうか？と試行錯誤しながら、結局PSPに入ってるFlashのバージョンが低くて使えなかったのでそのまま「youtubewall」にしたやつのパーツの一部です。</p>
				<ul class="link">
				<li><a href="http://www.planet-ape.net/archives/326" title="planet-ape|blog ≫ Blog Archive ≫ PSPでYouTubeを見る！（っていうか見たい）">planet-ape|blog ≫ Blog Archive ≫ PSPでYouTubeを見る！（っていうか見たい）</a></li>
				</ul>
				<p>今現在は、サムネイルこそwall状に表示されますが、クリックしても再生されません。youtubeのサイト上をPHPでスクレイピングしてflvの場所を探し出し、それをFlashに渡すような仕様なのですが、youtubeのサイトが当時とは変わっているため当然その部分が動かなくなってます。<br />
				なので、これを再度動くように、<a href="http://rhaco.org/">Rhaco</a>で改修してみた。</p>
				<p>以下、その部分のソース。</p>
				<ul class="link">
				<li>psptube.php5</li>
				</ul>
				<pre class="brush: php">
&lt;?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&#12398;&#20491;&#21029;ID&#65288;/watch?v=&#20197;&#38477;&#12398;&#20516;&#65289;&#12434;&#28193;&#12377;
$v = $flow-&gt;getVariable("v","3vdqWQScc7Y");

//Browser&#12391;youtube&#20869;&#12398;&#12506;&#12540;&#12472;&#12434;&#21462;&#24471;
$browser = new Browser();
$page = StringUtil::encoding($browser-&gt;get(YOUTUBE_BASE_URL.$v));

//SimpleTag&#12391;&#12473;&#12463;&#12524;&#12452;&#12500;&#12531;&#12464;&#38283;&#22987;
$tag = new SimpleTag();
$tag-&gt;set($page);
$scripts= $tag-&gt;getIn('script');

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

//&#20986;&#21147;
header("Content-type: application/xml");
$flow-&gt;setVariable("parm",urlencode($data));
$flow-&gt;write("sample_template.html");
?&gt;
</pre>
				<p>テンプレートはこんな感じ。</p>
				<ul class="link">
				<li>sample_template.html</li>
				</ul>
				<pre class="brush: php">
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;rss&gt;
&lt;item title="http://www.youtube.com/get_video?{$f.escape($parm)}" /&gt;
&lt;/rss&gt;
</pre>
				<p>最後の出力部分はxmlを出力したいのですが結構ひどい感じです。<br />
				Rhacoでのうまいやり方はどんな感じなんだろか？</p>
				<p>実行した感じはこんなんです。title要素をFlashで取得してflv表示って感じですね</p>
				<ul class="link">
				<li><a href="http://www.planet-ape.net/psptube/psptube.php5">実行画面</a></li>
				<li><a href="http://www.planet-ape.net/psptube/">psptube</a></li>
				</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.planet-ape.net/blog/archives/573/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>取締役補足マップ（一応、rhacoネタ？）</title>
		<link>http://www.planet-ape.net/blog/archives/572</link>
		<comments>http://www.planet-ape.net/blog/archives/572#comments</comments>
		<pubDate>Sat, 16 Feb 2008 09:01:14 +0000</pubDate>
		<dc:creator>fumix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[rhaco]]></category>
		<category><![CDATA[googlemaps]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[mobile]]></category>

		<guid isPermaLink="false">http://www.planet-ape.net/archives/572</guid>
		<description><![CDATA[東京マラソン2008 明日は東京マラソン2008ですが、うちの会社から取締役（！）が1名参加しています。 そこで、会社内で参加していない社員も盛り上がろうということで当日にGPS付き携帯（au）を持たせてgooglema [...]]]></description>
			<content:encoded><![CDATA[				<ul class="link">
				<li><a href="http://www.tokyo42195.org/">東京マラソン2008</a></li>
				</ul>
				<p>明日は東京マラソン2008ですが、うちの会社から取締役（！）が1名参加しています。<br />
				そこで、会社内で参加していない社員も盛り上がろうということで当日にGPS付き携帯（au）を持たせてgooglemaps上で補足し続けようという実験（？）をします。</p>
				<ul class="link">
				<li><a href="http://marathon.planet-ape.net/map.html">取締役補足マップ</a></li>
				</ul>
				<p>持たせている携帯は5分おきにリロードする専用ページにアクセスして、サーバに位置情報を送ります。<br />
				それをデータベースに溜め込んでgooglemaps上に表示します・・・ってAPIが公開された当初に散々情報があふれ返っていたから、今更って話です、はい。<br />
				このブログでも過去エントリあります。</p>
				<ul class="link">
				<li><a href="http://www.planet-ape.net/archives/383">planet-ape|blog ≫ Blog Archive ≫ au携帯をGPS-CS1Kにする！</a></li>
				</ul>
				<p>制作にはPHPフレームワークの<a href="http://www.rhaco.org/">Rhaco</a>を使用しています。<br />
				あとでソース部分を公開予定ですが、まあ、たいしたことは全くしてません。<br />
				googlemaps上への描画等はjavascriptはそもそもブラウザ上で見えるので気になった方見てください。</p>
				<p>あ、一応携帯版（？）もあります。</p>
				<ul class="link">
				<li><a href="http://marathon.planet-ape.net/mobile.php">http://marathon.planet-ape.net/mobile.php</a></li>
				</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.planet-ape.net/blog/archives/572/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AV女優の画像を取得する（Conveyorネタ）</title>
		<link>http://www.planet-ape.net/blog/archives/570</link>
		<comments>http://www.planet-ape.net/blog/archives/570#comments</comments>
		<pubDate>Sat, 09 Feb 2008 11:10:08 +0000</pubDate>
		<dc:creator>fumix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[rhaco]]></category>
		<category><![CDATA[Conveyor]]></category>

		<guid isPermaLink="false">http://www.planet-ape.net/archives/570</guid>
		<description><![CDATA[以前に作った「Conveyor(旧名PRhagger)で日本のAV女優一覧のRSSを取得してみる」に追加する形でそこにAV女優の画像（顔写真）を検索して追加するようなworker（filter）を作ってみました。 画像は [...]]]></description>
			<content:encoded><![CDATA[				<p>以前に作った「<a href="http://www.planet-ape.net/archives/566">Conveyor(旧名PRhagger)で日本のAV女優一覧のRSSを取得してみる</a>」に追加する形でそこにAV女優の画像（顔写真）を検索して追加するようなworker（filter）を作ってみました。<br />
				画像は<a href="http://actress.dmm.co.jp/-/top/">DMMアダルト AV女優情報</a>の検索結果をスクレイピングする形で取得します。<br />
				DMMはアフィリエイトをしているので、urlにはconfigに入力したアフィリエイトIDを追加したURLを返すようにします。</p>
				<ul class="link">
				<li><a href='http://www.planet-ape.net/wp-content/uploads/2008/02/filteravactresspict.zip' title='filteravactresspict.zip'>FilterAvActressPict.zip</a></li>
				</ul>
				<pre class="brush: php">
&lt;?php

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

/**
 *
 * 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-&gt;getChannel();
        $items =&amp; $rss20-&gt;getItem();

        $rss20_filtered = new Rss20();
		$rss20_filtered-&gt;setChannel($channel-&gt;getTitle(),
			$channel-&gt;getDescription(),
			$channel-&gt;getLink(),
			&quot;ja&quot;
		);

        foreach ($items as $item) {
            $rtn = $this-&gt;searchAV($item-&gt;getTitle());
            $av = $item-&gt;getDescription().$rtn['img'];
            $item-&gt;setDescription($av);
            $item-&gt;setLink($rtn['url']);
            $rss20_filtered-&gt;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-&gt;get($parm)){
    	   $page = $cache-&gt;get($parm);
        }else{
        	$page = StringUtil::encoding($browser-&gt;get(&quot;http://www.dmm.co.jp/search/?category=actress&amp;analyze=V1EAAVYEUQs_&amp;redirect=1&amp;searchstr=&quot;.$parm));
        	$cache-&gt;set($parm,$page);
        }
		$tag = new SimpleTag();
		$tag-&gt;set($page);

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

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

    function config(){
        $config = array(
            &quot;id&quot; =&gt; &quot;アフィリエイト&quot;,
        );

        return $config;
    }
}
?&gt;
</pre>
				<p>ダウンロードして解凍後、workerフォルダに放りこんでください。</p>
				<p>Conveyor上でCustomfeedAvActressと組み合わせて実行したイメージはこんな漢字です。<br />
				2008年デビューのAV女優の一覧です。</p>
				<ul class="link">
				<li><a href="http://www.planet-ape.net/conveyor_dev/publish/avtest.php">AV ACTRESS</a></li>
				</ul>
				<p>レシピはこんな感じ</p>
				<pre class="brush: php">
&lt;?php
require_once(&quot;__init__.php&quot;);
Rhaco::import(&quot;Conveyaml&quot;);
Conveyaml::execute(
&lt;&lt;&lt; __YAML__
---
plugins:
  -
    module: CustomfeedAvActress.CustomfeedAvActress
    config:
      initial:
      name:
      yomi:
      debut: 2008
  -
    module: FilterAvActressPict.FilterAvActressPict
    config:
      id: dmmpress-001
  -
    module: HtmlOut.HtmlOut
__YAML__
);

?&gt;
</pre>
				<ul class="link">
				<li><a href="http://conveyor.rhaco.org/manual/">Conveyor &#8211; Conveyorについて</a></li>
				<li><a href="http://www.rhaco.org/">rhaco.org &#8211; Meet Rhaco</a></li>
				</ul>
				<p>※ConveyorはPHPフレームワークであるRhaco上で動くwebアプリケーションです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.planet-ape.net/blog/archives/570/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>なぜPHPなのか？</title>
		<link>http://www.planet-ape.net/blog/archives/569</link>
		<comments>http://www.planet-ape.net/blog/archives/569#comments</comments>
		<pubDate>Mon, 04 Feb 2008 04:44:32 +0000</pubDate>
		<dc:creator>fumix</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.planet-ape.net/archives/569</guid>
		<description><![CDATA[[PHP][Maple] なぜPHPなのか？ このところ、PHPがdisられまくって凹んでいた身（笑）としては、ひっじょうに「ぐっ」とくるエントリ。 特に「ビジネスになるから」と明言しているところはシビれた。 Maple [...]]]></description>
			<content:encoded><![CDATA[				<ul class="link">
				<li><a href="http://d.hatena.ne.jp/kunit/20080204" title="2008-02-04 - kunitの日記">[PHP][Maple] なぜPHPなのか？</a></li>
				</ul>
				<p>このところ、PHPがdisられまくって凹んでいた身（笑）としては、ひっじょうに「ぐっ」とくるエントリ。<br />
				特に「ビジネスになるから」と明言しているところはシビれた。<br />
				Mapleに関しては、開発リーダーに勧めたことがあったのですが、ちょうどMapleが停滞期に入っていたころで、結局会社で使用するフレームワークはcakePHPとなってしまいました。<br />
				Maple4はいい感じになるのかな？<br />
				会社での開発手法をいまから変えるのはなかなか難しいけど、個人ではまたMapleを勉強してみようかな？<br />
				いまはRhacoが面白いのでそっちばっかですが笑</p>
				<blockquote><p>＃うーむ、このエントリは敵をたくさん作ったかな・・・</p></blockquote>
				<p>そんなことはないとおもいます。<br />
				最近のPHPバッシングに凹んでいたPHPerには響いたんじゃないかなあ？<br />
				僕は響いたです。<br />
				「それを使ったら楽になんだよねー」って思ってる程度の人、にはならないようにしないと。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.planet-ape.net/blog/archives/569/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Conveyor(旧名PRhagger)で日本のAV女優一覧のRSSを取得してみる</title>
		<link>http://www.planet-ape.net/blog/archives/566</link>
		<comments>http://www.planet-ape.net/blog/archives/566#comments</comments>
		<pubDate>Mon, 31 Dec 2007 04:46:21 +0000</pubDate>
		<dc:creator>fumix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[rhaco]]></category>

		<guid isPermaLink="false">http://www.planet-ape.net/archives/566</guid>
		<description><![CDATA[元ネタ、というかほぼ「まんま」ですけど…。 ゆーすけべー日記: 日本のAV女優一覧を取得するPerlモジュール「Acme::JapaneseAvActress」をCodeReposに 仕組みとしては、 Wikipedia [...]]]></description>
			<content:encoded><![CDATA[				<p>元ネタ、というかほぼ「まんま」ですけど…。</p>
				<ul class="link">
				<li><a href="http://yusukebe.com/archives/07/12/05/103614.html">ゆーすけべー日記: 日本のAV女優一覧を取得するPerlモジュール「Acme::JapaneseAvActress」をCodeReposに</a></li>
				</ul>
				<blockquote><p>仕組みとしては、 Wikipediaの日本のAV女優一覧というページのExportというXMLを出力するサービスから、 正規表現でごりごりスクレイピングしています。 </p></blockquote>
				<p>WikipediaのページをXMLで取得できるというのは知らなかった。</p>
				<p>これなら<a href="http://pipes.yahoo.com/pipes/">Pipes</a>でも出来るんじゃない？？と考えてやってみたのですが、「取得しようとするページがデカ過ぎですから！」といわれ（エラーになる）出来ませんでした。<br />
				なのでいくらでも実行できるようにローカルでPHP版Plaggerこと「<a href="http://conveyor.rhaco.org/manual/">Conveyor(旧名PRhagger)</a>」を動かしてやってみました。</p>
				<p>最初は標準で用意されている「CustomfeedFetchpage」や「FilterRegex」をメインに複数のworkerを組み合わせればいけるかなあ？と軽く考えていたのですがなかなかウマくいかず、さらにすっごく遅い！のでCustomfeed系のworkerを自作しました。</p>
				<ul class="link">
				<li><a href='http://www.planet-ape.net/wp-content/uploads/2008/01/customfeedavactress.zip' title='CustomfeedAvActress.zip'>CustomfeedAvActress.zip</a></li>
				</ul>
				<pre class="brush: php">
&lt;?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-&gt;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-&gt;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-&gt;set($page);
		$counter = 0;

        $flg = false;
		foreach($tag-&gt;getIn("text") as $key =&gt; $text_tag){
		  $lines = explode("\n",$text_tag-&gt;getValue());
		  foreach($lines as $key =&gt; $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-&gt;variable("initial") || $this-&gt;variable("initial") == "") &#038;&#038;
        	        ($name == $this-&gt;variable("name") || $this-&gt;variable("name") == "") &#038;&#038;
        	        ($yomi == $this-&gt;variable("yomi") || $this-&gt;variable("yomi") == "") &#038;&#038;
        	        ($debut == $this-&gt;variable("debut") || $this-&gt;variable("debut") == "") )
        	        {

            	        $item = new RssItem20();
        			    $item-&gt;setTitle($name);

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

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

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

?&gt;
</pre>
				<p>ダウンロードして解凍後、workerフォルダに放りこんでください。<br />
				頭文字（あ?ん）・名前・よみがな・デビュー年（YYYY）でデータの絞り込みができます。<br />
				feedの形状は、titleに名前（漢字）、descriptionに頭文字（あ?ん）・名前・よみがな・デビュー年（YYYY）がカンマ区切り（csv?）で入っています。</p>
				<p>「SubscriptionRequest」を組み合わせて使えば、configにrequestデータ渡して動的に絞り込みしたfeedが取得できるのかな？と思っていたのですが、できないっぽい？<br />
				使い方が違うのかなあ？</p>
				<ul class="link">
				<li><a href="http://conveyor.rhaco.org/manual/">Conveyor &#8211; Conveyorについて</a></li>
				<li><a href="http://www.rhaco.org/">rhaco.org &#8211; Meet Rhaco</a></li>
				</ul>
				<p>※ConveyorはPHPフレームワークであるRhaco上で動くwebアプリケーションです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.planet-ape.net/blog/archives/566/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>rhacoを使ってblogにtumblrの更新情報（RSS)を載せる</title>
		<link>http://www.planet-ape.net/blog/archives/544</link>
		<comments>http://www.planet-ape.net/blog/archives/544#comments</comments>
		<pubDate>Fri, 17 Aug 2007 09:52:06 +0000</pubDate>
		<dc:creator>fumix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[rhaco]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.planet-ape.net/archives/544</guid>
		<description><![CDATA[rhacoには強力なフィードパサー機能があります（とはいえ、他のフレームワークを使ったことは無いので、比較はできませんけど）。 これを使って、自分のブログ（WordPress）にtumblrの更新情報を載せてみました。  [...]]]></description>
			<content:encoded><![CDATA[				<p>rhacoには強力なフィードパサー機能があります（とはいえ、他のフレームワークを使ったことは無いので、比較はできませんけど）。<br />
				これを使って、自分のブログ（WordPress）にtumblrの更新情報を載せてみました。<br />
				参考にしたのはこちら。</p>
				<ul class="link">
				<li><a href="http://www.rhaco.org/tutorial/aggregator_2" title="rhaco.org - easy aggregator part 2">rhaco.org &#8211; easy aggregator part 2</a></li>
				</ul>
				<p><a href="http://www.planet-ape.net/archives/537">前回</a>と同様にセットアップまわりは飛ばすことにします(笑）<br />
				「キャッシュ」に関しては「使用する」ことにしました。</p>
				<h3>フィルターの作成</h3>
				<p>今回、データとして引っ張ってくるのは更新日時、タイトル、リンクの3つです。<br />
				その中でタイトルに関して、tumblrは長くなることが多いので、ある程度の長さ以降は切ることにします。<br />
				この動作をフィルターとして制作します。<br />
				以下のソースをプロジェクトフォルダ/library以下にFeedFilter.phpとして保存します。</p>
				<p>・プロジェクトフォルダ/library/FeedFilter.php</p>
				<blockquote><p>
				<code><span style="color:#000000"><br />
				<font color="#0000BB">&lt;?php<br />
				Rhaco</font></span><span style="color:#007700">::</span><span style="color:#0000BB">import</span><span style="color:#007700">(</span><span style="color:#DD0000">"lang.StringUtil"</span><span style="color:#007700">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#FF8000">//文字列を扱うユーティリティをインポート</p>
				<p></span><span style="color:#007700">class </span><span style="color:#0000BB">FeedFilter</span><span style="color:#007700">{<br />
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function </span><span style="color:#0000BB">cutString</span><span style="color:#007700">(</span><span style="color:#0000BB">$arg1</span><span style="color:#007700">){<br />
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#0000BB">$filter </span><span style="color:#007700">= new </span><span style="color:#0000BB">StringUtil</span><span style="color:#007700">();<br />
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#0000BB">$buf </span><span style="color:#007700">= </span><span style="color:#0000BB">explode</span><span style="color:#007700">(</span><span style="color:#DD0000">'---'</span><span style="color:#007700">,</span><span style="color:#0000BB">$arg1</span><span style="color:#007700">);<br />
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return </span><span style="color:#0000BB">$filter</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">substring</span><span style="color:#007700">(</span><span style="color:#0000BB">$buf</span><span style="color:#007700">[</span><span style="color:#0000BB">0</span><span style="color:#007700">],</span><span style="color:#0000BB">0</span><span style="color:#007700">,</span><span style="color:#0000BB">30</span><span style="color:#007700">).</span><span style="color:#DD0000">"…"</span><span style="color:#007700">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#FF8000">//30文字までを返す<br />
				&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color:#007700">}<br />
				}<br />
				</span><span style="color:#0000BB">?&gt;</span><br />
				</code>
				</p></blockquote>
				<p>文字列を扱うユーティリティは「rhacoのAPIレファレンス」で機能を調べました。</p>
				<ul class="link">
				<li><a href="http://bobchin.net/rhaco/index.html" title="PHPXRef 0.7 : rhaco : /">PHPXRef 0.7 : rhaco : /(APIレファレンス）</a></li>
				</ul>
				<p>explode（特定の文字列で、文字列を分割する）に相当する機能を使いたかったのですが、APIレファレンスでは発見できませんでしたので、PHPのexplode関数を直接使いました。</p>
				<h3>VIEW（index.php）の作成</h3>
				<p>プロジェクトフォルダ直下に以下のソースをindex.phpとして保存します。</p>
				<p>・プロジェクトフォルダ/index.php</p>
				<blockquote><p><code><span style="color:#000000"><br />
				<font color="#0000BB">&lt;?php<br />
				</font></span><span style="color:#007700">require_once(</span><span style="color:#DD0000">"./__init__.php"</span><span style="color:#007700">);<br />
				</span><span style="color:#0000BB">Rhaco</span><span style="color:#007700">::</span><span style="color:#0000BB">import</span><span style="color:#007700">(</span><span style="color:#DD0000">"lang.DateUtil"</span><span style="color:#007700">);<br />
				</span><span style="color:#0000BB">Rhaco</span><span style="color:#007700">::</span><span style="color:#0000BB">import</span><span style="color:#007700">(</span><span style="color:#DD0000">"tag.HtmlParser"</span><span style="color:#007700">);<br />
				</span><span style="color:#0000BB">Rhaco</span><span style="color:#007700">::</span><span style="color:#0000BB">import</span><span style="color:#007700">(</span><span style="color:#DD0000">"tag.feed.FeedParser"</span><span style="color:#007700">);<br />
				</span><span style="color:#0000BB">Rhaco</span><span style="color:#007700">::</span><span style="color:#0000BB">import</span><span style="color:#007700">(</span><span style="color:#DD0000">"FeedFilter"</span><span style="color:#007700">); </span><span style="color:#FF8000">// &lt;- filterクラスをimport</p>
				<p></span><span style="color:#0000BB">$parser </span><span style="color:#007700">= new </span><span style="color:#0000BB">HtmlParser</span><span style="color:#007700">();<br />
				</span><span style="color:#0000BB">$feed&nbsp;&nbsp;&nbsp;</span><span style="color:#007700">= new </span><span style="color:#0000BB">FeedParser</span><span style="color:#007700">();</p>
				<p></span><span style="color:#0000BB">$items&nbsp;&nbsp;</span><span style="color:#007700">= </span><span style="color:#0000BB">$feed</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">getItem</span><span style="color:#007700">(array(<br />
				&nbsp;&nbsp;</span><span style="color:#DD0000">"http://fragment.planet-ape.net/rss"</span><span style="color:#007700">,<br />
				));</p>
				<p></span><span style="color:#0000BB">$parser</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">setVariable</span><span style="color:#007700">(</span><span style="color:#DD0000">"items"</span><span style="color:#007700">,</span><span style="color:#0000BB">$items</span><span style="color:#007700">);<br />
				</span><span style="color:#0000BB">$parser</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">setVariable</span><span style="color:#007700">(</span><span style="color:#DD0000">"filter"</span><span style="color:#007700">,new </span><span style="color:#0000BB">FeedFilter</span><span style="color:#007700">()); </span><span style="color:#FF8000">// &lt;- filterをテンプレートで利用できるように定義<br />
				</span><span style="color:#0000BB">$parser</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">setVariable</span><span style="color:#007700">(</span><span style="color:#DD0000">"DateUtil"</span><span style="color:#007700">,new </span><span style="color:#0000BB">DateUtil</span><span style="color:#007700">()); </span><span style="color:#FF8000">// &lt;- DateUtilをテンプレートで利用できるように定義<br />
				</span><span style="color:#0000BB">$parser</span><span style="color:#007700">-&gt;</span><span style="color:#0000BB">write</span><span style="color:#007700">(</span><span style="color:#DD0000">"sample.html"</span><span style="color:#007700">);</p>
				<p></span><span style="color:#0000BB">?&gt;</span></p>
				<p></code>
				</p></blockquote>
				<p>先ほど作った「filter」とrhacoのAPIである「DateUtil（日付関係ユーティリティ）」をテンプレート上で使用するため上記の「テンプレートで・・・」のように定義します。</p>
				<h3>テンプレートの作成</h3>
				<p>プロジェクトフォルダ/resources/templates/以下にsample.htmlを作成します。<br />
				ブログに表示するためのものなので、htmlの一部（テーブル）のみとなっています。</p>
				<p>・プロジェクトフォルダ/resources/templates/sample.html</p>
				<blockquote><p>&lt;table width=&#8221;100%&#8221; border=&#8221;0&#8243; cellpadding=&#8221;0&#8243; cellspacing=&#8221;0&#8243;&gt;<br />
				&#9;&lt;tr&gt;<br />
				&#9;&#9;&lt;th class=&#8221;summary-date&#8221;&gt;date&lt;/th&gt;<br />
				&#9;&#9;&lt;th scope=&#8221;col&#8221;&gt;title&lt;/th&gt;<br />
				&#9;&lt;/tr&gt;<br />
				&#9;&lt;rt:loop param=&#8221;{$items}&#8221; var=&#8221;item&#8221;&gt;<br />
				&#9;&lt;tr&gt;<br />
				&#9;&#9;&lt;td class=&#8221;summary-date&#8221;&gt;<strong>{$DateUtil.format({$item.getPubDate()},&#8221;Y.m.d D H:i&#8221;)}</strong>&lt;/td&gt;<br />
				&#9;&#9;&lt;td&gt;&lt;a href=&#8221;{$item.getLink()}&#8221; title=&#8221;{$item.getTitle()}&#8221;&gt;<strong>{$filter.cutString({$item.getTitle()})}</strong>&lt;/a&gt;&lt;/td&gt;<br />
				&#9;&lt;/tr&gt;<br />
				&#9;&lt;/rt:loop&gt;<br />
				&lt;/table&gt;
				</p></blockquote>
				<p>太字の部分がfilterとDateUtilを適用した箇所です。<br />
				これで完成です。<br />
				実行すると以下のように表示されます！<br />
				<img src='http://www.planet-ape.net/wp-content/uploads/2007/08/rhaco0012.gif' alt='実行画面' /></p>
				<h3>ブログに挿入</h3>
				<p>ブログツールはWordPressを使っています。<br />
				WordPressはテンプレートに直接PHPコードを書くことができますので、先ほど作成したものをinclude等で表示させたい箇所に記載すれば、それで表示されます。<br />
				現在はトップページに表示させています。</p>
				<ul class="link">
				<li><a href="http://www.planet-ape.net/" title="planet-ape|blog">planet-ape|blog</a></li>
				</ul>
				<p>rhacoは使用したい機能を個々にインポートして、それを使ってアプリケーションを組み立てていくというイメージなのかな？？<br />
				っていうかフレームワークというものはそういうものなのかな？？？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.planet-ape.net/blog/archives/544/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rhacoはじめ</title>
		<link>http://www.planet-ape.net/blog/archives/537</link>
		<comments>http://www.planet-ape.net/blog/archives/537#comments</comments>
		<pubDate>Mon, 13 Aug 2007 13:12:22 +0000</pubDate>
		<dc:creator>fumix</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[rhaco]]></category>

		<guid isPermaLink="false">http://www.planet-ape.net/archives/537</guid>
		<description><![CDATA[PHP用の変態フレームワークとして有名な（？）rhacoを使って「なにか」作ってみようと思います、の記録。 PHPのフレームワークは他にもいっぱいありますが、rhacoを選んだ理由としては レンタルサーバにいれぽんで使え [...]]]></description>
			<content:encoded><![CDATA[				<p>PHP用の<strong>変態フレームワーク</strong>として有名な（？）<a href="http://www.rhaco.org/" title="rhaco.org - Community">rhaco</a>を使って「なにか」作ってみようと思います、の記録。<br />
				PHPのフレームワークは他にもいっぱいありますが、rhacoを選んだ理由としては</p>
				<ol>
				<li>レンタルサーバにいれぽんで使える</li>
				<li>コンソールをたたかなくても使える（web画面で設定できる！！）</li>
				<li>Prhagger改め、Conveyorを使ってみたい</li>
				<li><strong>変態</strong>だから</li>
				</ol>
				<p>というのがあります。<br />
				<a href="http://www.cakephp.org/">cakePHP</a>も良さそうだったのですが、すでに<a href="http://www.ideaxidea.com/archives/cakephp/">素晴らしい連載をされいてる方</a>がいるので、いまさら・・・という感じでやめ。<br />
				しかし、ドキュメントが殆ど無いので、いろいろ調べるのは大変そう・・・。<br />
				どうやらrhacoは、お一人で作っているらしくドキュメントまわりをそろえるところまで、手が回っていないようです。<br />
				そこが変態たるゆえんかもしれません。</p>
				<h3>なにはなくてもチュートリアル</h3>
				<p>まずは公式サイトにあるチュートリアルの<a href="http://www.rhaco.org/tutorial/bookmark_2" title="rhaco.org - easy bookmark part 2">rhaco.org &#8211; easy bookmark part 2</a>を動かしてみました。<br />
				しかし、サイト上になぜかpart 1がなく、謎です。<br />
				そしていきなり、インストールと初期セットアップはぶっ飛ばします（ぇー</p>
				<h3>なんかエラー（？）が出てるんですが・・・</h3>
				<p><img src='http://www.planet-ape.net/wp-content/uploads/2007/08/rhaco001.gif' alt='エラーメッセージ・・・' /></p>
				<p>いきなりチュートリアルで挫折しそうだ・・・orz<br />
				/generic/Urls.phpの34行目、preg_match（正規表現処理部分？？）がエラーだぞゴラァと言っているようなので、素直にみてみます。</p>
				<p>・/generic/Urls.phpの34行目</p>
				<blockquote><p>if(!empty($pre) &amp;&amp; preg_match(<strong>sprintf(&#8220;/%s/&#8221;,$pre)</strong>,$url,$matchs)){
				</p></blockquote>
				<p>ん～？？デリミタ部分（太字）が違うか？<br />
				ここには「/」も対象としてはいってくるので、デリミタが「/」だとマズいのではないか、と予想。</p>
				<p>・/generic/Urls.phpの34行目の修正（赤字）</p>
				<blockquote><p>if(!empty($pre) &amp;&amp; preg_match(<strong><font color="#FF0000">sprintf(&#8220;|%s|&#8221;,$pre)</font></strong>,$url,$matchs)){
				</p></blockquote>
				<p>デリミタを「/」から「|」に変えてみます。</p>
				<p><img src='http://www.planet-ape.net/wp-content/uploads/2007/08/rhaco002.gif' alt='エラーがとれた！！' /></p>
				<p>うぉ！エラーがとれた！！！やった！！！<br />
				んー、でもフレームワークのほうを修正してもよいものか・・・。</p>
				<h3>詳細画面と編集画面がでない</h3>
				<p>エラーは取れたものの、一覧画面と、追加画面（create）以外の詳細画面（数字のリンクをクリック）と再編集画面（updateのリンクをクリック）へ画面が遷移しません。<br />
				今度はフレームワーク側のソースではなく、設置したアプリ側のソースを見てみます。</p>
				<p>・一覧表示用のVIEWであるindex.php</p>
				<blockquote><p>&lt;?php<br />
				require_once(&#8220;./__init__.php&#8221;);<br />
				Rhaco::import(&#8220;generic.Urls&#8221;);<br />
				Rhaco::import(&#8220;model.Bookmark&#8221;);</p>
				<p>$parser = Urls::parser(array(<br />
				        <strong><font color="#FF0000">&#8220;^detail/([d]+)$&#8221;</font>=&gt;array(&#8220;bookmark_detail.html&#8221;,null,null,&#8221;detail&#8221;,new Bookmark()),</strong><br />
				        &#8220;^create$&#8221;=&gt;array(&#8220;bookmark_form.html&#8221;,null,null,&#8221;create&#8221;,array(new Bookmark(),Rhaco::self())),<br />
				        <strong><font color="#FF0000">&#8220;^update/([d]+)&#8221;</font>=&gt;array(&#8220;bookmark_form.html&#8221;,null,null,&#8221;update&#8221;,array(new Bookmark(),Rhaco::self())),</strong><br />
				        &#8220;^&#8221;=&gt;array(&#8220;bookmark_list.html&#8221;,null,null,&#8221;read&#8221;,new Bookmark()),<br />
				));<br />
				$parser-&gt;write();<br />
				?&gt;
				</p></blockquote>
				<p>よくわかっていませんが、詳細画面用のテンプレートであるbookmark_detail.htmlと再編集画面用のテンプレートであるbookmark_form.htmlが入っている2行（太字）が怪しいとあたりをつけました。<br />
				さらに、ここはURLによって、処理を振り分けているんだろう？？・・・ムムム！！<br />
				詳細画面のURLは<br />
				・アプリを設置したディレクトリ/detail/<strong>対応するブックマークの数字</strong><br />
				再編集画面のURLは<br />
				・アプリを設置したディレクトリ/update/<strong>対応するブックマークの数字</strong><br />
				それで上記の赤字部分は対応するURLへの正規表現なのではないかと予想。<br />
				となると、<strong>[d]</strong>は数字を表わしているのか？<br />
				数字って正規表現じゃ<strong>\d</strong>じゃなかったっけ？？と思ったので、下記のように修正してみました。</p>
				<p>・一覧表示用のVIEWであるindex.phpの修正(赤字部分）</p>
				<blockquote><p>&lt;?php<br />
				require_once(&#8220;./__init__.php&#8221;);<br />
				Rhaco::import(&#8220;generic.Urls&#8221;);<br />
				Rhaco::import(&#8220;model.Bookmark&#8221;);</p>
				<p>$parser = Urls::parser(array(<br />
				        <strong>&#8220;^detail/(<font color="#FF0000">\d</font>+)$&#8221;=&gt;array(&#8220;bookmark_detail.html&#8221;,null,null,&#8221;detail&#8221;,new Bookmark()),</strong><br />
				        &#8220;^create$&#8221;=&gt;array(&#8220;bookmark_form.html&#8221;,null,null,&#8221;create&#8221;,array(new Bookmark(),Rhaco::self())),<br />
				        <strong>&#8220;^update/(<font color="#FF0000">\d</font>+)&#8221;=&gt;array(&#8220;bookmark_form.html&#8221;,null,null,&#8221;update&#8221;,array(new Bookmark(),Rhaco::self())),</strong><br />
				        &#8220;^&#8221;=&gt;array(&#8220;bookmark_list.html&#8221;,null,null,&#8221;read&#8221;,new Bookmark()),<br />
				));<br />
				$parser-&gt;write();<br />
				?&gt;
				</p></blockquote>
				<h3>詳細画面！！</h3>
				<p><img src='http://www.planet-ape.net/wp-content/uploads/2007/08/rhaco003.gif' alt='詳細画面' /></p>
				<h3>再編集画面！！</h3>
				<p><img src='http://www.planet-ape.net/wp-content/uploads/2007/08/rhaco004.gif' alt='再編集画面' /></p>
				<p>やった！！！できましたあ！！<br />
				今日はここまでにしよう。<br />
				長かった・・・。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.planet-ape.net/blog/archives/537/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prhagger用の全文取得プラグインを書いた</title>
		<link>http://www.planet-ape.net/blog/archives/518</link>
		<comments>http://www.planet-ape.net/blog/archives/518#comments</comments>
		<pubDate>Sat, 21 Apr 2007 14:18:10 +0000</pubDate>
		<dc:creator>fumix</dc:creator>
				<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.planet-ape.net/archives/518</guid>
		<description><![CDATA[Prhaggerとは、あの有名なプラガブルフィードアグリゲータ、PlaggerのPHP版のことです。 なぜかあまりネット上に情報があがってなくてインストールにも苦労したのですが、そのPrhaggerのプラグインを書きまし [...]]]></description>
			<content:encoded><![CDATA[				<p><a href="http://project-p.jp/halt/kinowiki.php/page/php/Prhagger">Prhagger</a>とは、あの有名なプラガブルフィードアグリゲータ、<a href="http://plagger.org/trac">Plagger</a>のPHP版のことです。<br />
				なぜかあまりネット上に情報があがってなくてインストールにも苦労したのですが、そのPrhaggerのプラグインを書きました。<br />
				全文配信していないRSSを全文取得してくれるプラグインです。<br />
				こんなものは誰が既に作ってるだろうと思ってネットを漁ったのですが、探し方が悪いのか全然ひっかからないので自分でつくりました。<br />
				Prhaggerってば全然人気ないのかなあ・・・そりゃみんなplagger使うよな・・・ピザも頼めるし、あっちは。</p>
				<p>ダウンロード：<a href='http://www.planet-ape.net/wp-content/uploads/2007/04/filterentryfulltextphp.zip' title='filterentryfulltextphp.zip'>filterentryfulltextphp.zip</a></p>
				<p>使い方：</p>
				<p>/library/plugins/に解凍したファイルFilterEntryFullText.phpを入れます。<br />
				そうするとPrhaggerのセットアップ画面の「filter」の欄に「FilterEntryFullText」が追加されます。<br />
				<a href='http://www.planet-ape.net/wp-content/uploads/2007/04/pict001.jpg' title='pict001.jpg'><img src='http://www.planet-ape.net/wp-content/uploads/2007/04/pict001.thumbnail.jpg' alt='pict001.jpg' /></a></p>
				<p>「FilterEntryFullText」にチェックを入れるとテキストボックスが2つ出てきます。<br />
				<a href='http://www.planet-ape.net/wp-content/uploads/2007/04/pict002.jpg' title='pict002.jpg'><img src='http://www.planet-ape.net/wp-content/uploads/2007/04/pict002.thumbnail.jpg' alt='pict002.jpg' /></a><br />
				最初の欄には抜き出し箇所の最初の部分を、下の欄には抜き出し箇所の最後の部分を指定します。<br />
				これは、抜き出したいウェブサイト（大概はブログ？）の個別のエントリーのhtmlを見て、抜き出したい部分を見極めます。<br />
				っていうか全文配信をしていない「<a href="http://gigazine.net/index.php">GIGAZINE</a>」を<a href="http://reader.livedoor.com/">livedoorReader</a>で全文読めるようにするため用に作ったようなものなので、それ以外のブログ等をあまり考えていません（ぇー）。</p>
				<p><a href="http://gigazine.net/index.php">GIGAZINE</a>であれば、上の欄には「&lt;!&#8211; google_ad_section_start &#8211;&gt;」、下の欄には「&lt;!&#8211; google_ad_section_end &#8211;&gt;」と書くとエントリーの中身を全部持ってこれます。<br />
				<a href="http://gigazine.net/index.php">GIGAZINE</a>はgoogleアドセンス対策を施しているので楽です。</p>
				<p>ただ、これで出来たfeedをfirefoxで見ようとするとなぜか「ダウンロード」になってしまいました（マックでは）。<br />
				なのでfeedを<a href="http://reader.livedoor.com/">livedoorReader</a>へ登録するときはブックマークレットが使えないので、出来たfeedのURLを直接<a href="http://reader.livedoor.com/">livedoorReader</a>上に打ち込んで登録しました。<br />
				safariでは普通に見れたのですが、何がおかしいのだろう？？</p>
				<p>参考にしたサイト：<br />
				・<a href="http://d.hatena.ne.jp/yonekawa/20070222/1172151583" title="yonekawaのはてなダイアリー - Prhaggerプラグインを書こうその2?Subscription">yonekawaのはてなダイアリー &#8211; Prhaggerプラグインを書こうその2?Subscription</a><br />
				・<a href="http://project-p.jp/halt/kinowiki.php/page/php/Prhagger" title="php/Prhagger - EthnaWiki">php/Prhagger &#8211; EthnaWiki</a><br />
				・<a href="http://www.rhaco.org/" title="rhaco.org">rhaco.org</a></p>
				<p>そうそう、PrhaggerはrhacoというPHPフレームワーク上で動いているソフトなのですが、rhaco自体が結構面白そうです。<br />
				今度テストもかねて何か作ってみたいです、rhacoで。<br />
				でもあんまりネット上に情報が・・・中にいるエロい人、もっとドキュメント（日本語で・・・）を！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.planet-ape.net/blog/archives/518/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

