徒然なるままに プログラミングメモや日々の生活などつれづれとつづっていくblog

2013年6月23日

RSSリーダーを作ってみる

Filed under: PHP,アンテナサイト,ソース配布 — ranpei @ 7:19 AM

ブログやニュースなどの更新情報を配信するために用いられるRSS
これを利用して複数のサイトの情報を取得表示しているのがアンテナサイトです。
今回ふと思い立ってこのアンテナサイトを作ることにしたので数回に分けて作成までの道のりをつらつらとつづって行こうと思います。
まずはRSSを解析する仕組みが必要なのですがググって見つかるソースは拡張モジュールのcurlを利用しているものばかり
基本的に拡張モジュールは使いたくないので自力で作ってみることにした。

・rssLoader.php

<?php

require_once __DIR__."/channelBean.php";
require_once __DIR__."/itemBean.php";
require_once __DIR__."/rssException.php";
require_once __DIR__."/lib/httpConnecter.php";
require_once __DIR__."/lib/xmlLoader.php";

class rssLoader {

	const VERSION_1 = 1;
	const VERSION_2 = 2;

	const VERSION_ALL = 0;

	public function __construct() {
	}

	public function __destruct() {
	}

	/**
	 * RSSを読み込みchannelBeanで取得
	 *
	 * @param int $version 対象RSSバージョン指定
     *                    全バージョンのRSS  : rssLoader::VERSION_ALL
     *                    バージョン1.0のRSS : rssLoader::VERSION_1
     *                    バージョン2.0のRSS : rssLoader::VERSION_2
	 *
	 */
	public function loadRss($path, $version = self::VERSION_ALL) {

		/**
		 * RSSを取得
		 */
		$http = new httpConnecter();
		$http->connect($path);
		$rssStr = $http->loadText();
		if($rssStr === "") {

			// 取得できなければエラー
			throw rssException::notRss("RSSファイルの取得ができませんでした。");
		}

		/**
		 * RSSを解析
		 */
		$xml = new xmlLoader();
		$rssDom = $xml->parsor($rssStr);

		$channelBean = new channelBean();

		$channelBean->encoding = "UTF-8";

		// rss1.0
		if(isset($rssDom->attributes()->version) == false) {
			$channelBean->rssVersion = self::VERSION_1;
			$channelBean->rssUrl = $rssDom->channel->link;

			if($version != self::VERSION_1 && $version != self::VERSION_ALL) {

				throw rssException::notMatchVersion("このRSSはVertion1.0ではありません。");
			}
		}
		// rss2.0
		else if($rssDom->attributes()->version == 2) {

			$channelBean->rssVersion = self::VERSION_2;
			$channelBean->rssUrl = $rssDom->channel->link;

			if($version != self::VERSION_2 && $version != self::VERSION_ALL) {

				throw rssException::notMatchVersion("このRSSはVertion2.0ではありません。");
			}
		}

		// RSSの本体情報を取得
		if(isset($rssDom->channel->title)) {
			$channelBean->title = $rssDom->channel->title;
		}
		if(isset($rssDom->channel->link)) {
			$channelBean->link = $rssDom->channel->link;
		}
		if(isset($rssDom->channel->description)) {
			$channelBean->description = $rssDom->channel->description;
		}
		// dcの要素を取得
		$dc = $rssDom->channel->children('http://purl.org/dc/elements/1.1/');
		if(isset($dc->date)) {
			$channelBean->date = $dc->date;
		}
		if(isset($dc->language)) {
			$channelBean->language = $dc->language;
		}
		if(isset($dc->creator)) {
			$channelBean->creator = $dc->creator;
		}

		// 各記事を取得する
		foreach($rssDom->item as $item) {

			$itemBean = new itemBean();

			if(isset($item->title)) {
				$itemBean->title = $item->title;
			}
			if(isset($item->link)) {
				$itemBean->link = $item->link;
			}
			if(isset($item->description)) {
				$itemBean->description = $item->description;
			}
			if(isset($item->category)) {
				$itemBean->category = $item->category;
			}
			if(isset($item->pubDate)) {
				$itemBean->date = $item->date;
			}
			// dcの要素を取得
			$dc = $item->children('http://purl.org/dc/elements/1.1/');
			if(isset($dc->date)) {
				$itemBean->date = $dc->date;
			}
			if(isset($dc->subject)) {
				$itemBean->category = $dc->subject;
			}
			if(isset($dc->creator)) {
				$itemBean->creator = $dc->creator;
			}

			array_push($channelBean->itemList, $itemBean);
		}

		return $channelBean;
	}
}

rssLoaderで解析するとchannelBeanクラスが返却される。
このchannelBeanクラス内部にitemBeanのリストがありそこに個々の記事のデータがあるといった感じ
itemBeanがchannelBeanの内部にあるのはRSS2.0ではchannelタグの内部にitemタグがあるからといった理由から

使い方は以下
・rssTest.php

<?php

require_once "rssLoader.php";

$rssLoader = new rssLoader();
try {
	$channel = $rssLoader->loadRss("http://watch2ch.2chblog.jp/index.rdf");// ネットワーク上のファイルの場合
	//$channel = $rssLoader->loadRss("/var/www/html/rss.rdf");// ローカルファイルの場合
} catch (Exception $e) {

	echo $e->getMessage();
}

?>
<html lang="ja">
	<head>
		<meta charset="utf-8" />
		<title>RSS</title>
	</head>

	<body>
		<h2><?=$channel->title ?></h2>
		<table border="1">
			<tr>
				<th>タイトル一覧</th>
				<th>記事</th>
				<th>作成日</th>
			</tr>
			<?php foreach($channel->itemList as $item): ?>
			<tr>
				<td><?=$item->title ?></td>
				<td><?=$item->date ?></td>
			</tr>
			<?php endforeach; ?>
		</table>
	</body>
</html>

ソースコードのダウンロードはこちら:[download id=”1″]

これでRSSを読み込んで記事情報を取り出すことはできました。

次回に続きます。

追記
このrssLoaderにはRSS2.0が読み込めないバグがあります。
修正版は後日別の記事にて掲載いたします。

2010年5月17日

日本語表示対応JPalib配布開始しました

Filed under: NDSプログラミング,PC — ranpei @ 12:55 AM

ゴールデンウィーク前にはじめてはいいが、リアルの事情のせいで、全く開発に手をつけることができない・・・・

それでもPalibで検索して音連れている人はいるようなので

個人的にはまだまだ不満足なできではありますが新JPalibの配布を開始しようと思います。

本ライブラリは以前のライブラリと同じくひらがな、カタカナの表示にしか対応していません。
また、日本語キーボードが未実装状態です。

それでも良いという方は以下のサイトのdownloadよりダウンロードしてください

http://www.geocities.jp/ccfjd821/

使い方は、Palibを導入する代わりにフォルダに放りこめばいけるはずです。

漢字表示の基礎となる部分は出来上がっているので早いところ実装にもっていきたいものです。

2010年4月4日

PAlib0912xx_bateでの日本語表示に成功!

Filed under: NDSプログラミング,PC — ranpei @ 3:07 AM

NDSの開発環境の構築が終わったので

さっそくPAlibの改造をやってみました。

関数名に変更があったりしますが基本JPalib080220のコードから日本語化部分をコピペするだけですw

そして実際に動かした画面がこちら

久々に見て半角の文字間隔が広いな?と思いましたが

確か最初作ったものが全角半角でも文字間隔が同じ8×8ピクセルなので

違いを出すために半角だけ4×8ピクセルにしたんだったと思います。

PAlibが文字を表示する際にタイルを使用しているためにこういうことになります。

Bitmapフォントや8bitフォントを使えば解消できそうな気もしますが

できるだけ既存の機能で多くの人が使えるものとしてノーマルなtextを選んだのです

今後、表示できる文字を増やしたいと思っているのですが

このときに一番のネックになるのがタイルなんですよね^^;

PAlibは文字画像とタイルにしてメモリに格納し、表示する際にタイルを張り替えることで文字表示を実現しています。

タイルはメモリに1024までしかもてないため、

日本語では文字画像すべてをメモリに読み込むといったことが不可能になります

現JPAlibではPAlibの既存フォントの画像に空きがあるのを利用して

ひらがなカタカナを無理やり入れ込み表示を実現しています。

逆に言うとこんなやり方を使ってるためにひらがなカタカナしか表現できないわけで・・・・・・・

多くの文字を表示させたいのならば

PAlibの文字表示ロジックに頼らないやり方で文字表示をやることでしかないわけで・・・・

その方法を考えるのが今後の課題でしょうね・・・・・

あ、新型JPAlibの公開時期はまだ未定です^^;

2010年4月2日

devkitPro1.5.0でPAlib0912xx_bate導入 その2

Filed under: NDSプログラミング — ranpei @ 1:34 AM

前回、PAlibの再コンパイルで使えるようになることがわかりました。
今回は、プログラミング環境の構築をやろうと思います。

PAlibのプログラミング環境といえばvhamでした(070717時代)

0912xx_bateには付属しておらずWikiを見るとProgrammer’s Notepadを使うようなことが書かれています。

しかし、Visual Stdioを使うこともできるのですから機能の豊富なVisual Stdioを使うことにしましょう。

以前は、Wikiからダウンロードしたパッチを実行するだけで使えたのですがbateからフォルダの構成やMakefileが変わってしまっているので
そのままではコンパイルできませんでした。

Makefileの入れ替えと、ライブラリパスの変更をしてなんとか動くようになり
パッチも修正して配布しようかと思っていたら・・・・・・・・・・・・

PAlibフォルダの中にvctemplateというものを発見!
中のinstall.batを実行するだけで構築完了しちゃいました。

俺の5時間を返せ?orz

ちなみに入力したら候補が出るようにするには「プロジェクトおよびソリューション」からインクルードファイルに

$(PAPATH)\include\nds
$(PAPATH)\include\nds\arm9
$(PAPATH)\include\nds\arm9\cpp
$(PAPATH)\include\nds\arm9\gif
$(PAPATH)\include\nds\arm7

を追加すると候補が出るようになります。

さあ、ようやくすべての環境が整ったぞ^^;

2010年3月30日

devkitpro1.5.0でPAlib0912xx_bate導入

Filed under: NDSプログラミング — ranpei @ 2:59 AM

土日に時間が取れたので新JPAlib作成のための下準備にと開発環境を構築することにしました。

  • OS:Windows7
  • devkitpro 1.5.0
  • PAlib0912xx_bate

devkitproをダウンロードしてインストール

C:\devkitpro

PAlibをダウンロードしdevkitproフォルダに解凍

C:\devkitpro\PAlib

環境変数にパスを設定

PAPATH = C:\devkitpro\PAlib

と、ここまでは苦も無くやってこれたのですが

問題はdevkitARM・・・・

PAlib090801はr26

PAlib0912xx_bateはr27に対応ということなのですが

devkitproの配布先ではr28までしかない;

これは導入絶望的かな・・・・・・・・・

と、思っていたらwikiこんな記事を発見 http://www.palib-dev.com/wiki/doku.php?id=installation

「As of devkitARM R28, you will need to rebuild palib to compile without vrambank errors. To do so, go to /devkitPro/PAlib/source/ directory and run the clean.bat file, then the build.bat file.」

簡単に訳すと

「最新のdevkitARMでエラーなく使うにはdevkitARM_r28で再度コンパイルする必要がある」 のだと・・・・

試しに書いてあるように PAlib/source内にある clean.bat を実行後、同フォルダ内の build.bat を実行

コンパイルできた・w・

続いてexamples/Text/Normal/HelloWorldのサンプルをコンパイル

すると・・・・・・

コンパイル完了!!

フォルダ内にHelloWorld.ndsファイルができてる;x;

エミュレータで起動すると見事文字が表示されてます

これでようやくスタートラインに立てた^^;

ソースをさっと眺めてみましたが070717から内部の関数名など多くの点で変更がありますが

文字の表示の仕方は変わらないようです

JPalibを元にソースを書き換えればひらがな、カタカナの表示をサポートするのはそう難しくはないでしょう

まあ、私としては漢字までサポートできるようにしたいと思ってるんですが

これはPAlibの文字表示のロジックではまず無理なのでうまいやり方を考えないといけないんですよね^^;

(最終的な野望はUnicodeのようにすべての言語をサポートすることだったり・・・・・・)

P.S ちなみにPAlib0912xx_bateの再コンパイルですがdevkitARM_r30でもできました。

2010年3月19日

PS3 Linux使ってみた・x・

Filed under: PC — ranpei @ 2:45 AM

PS3を買って早10ヶ月・・・・・

最近はWii、DSよりもこちらのゲームをよくやるようになってました

そんな中PS3買ってからずっとやろうと思ってやってなかった事が・・・(ってか挫折した;

それは、PS3にLinuxをインストールすること・x・

最近、生活に余裕が出てきたので2度目のチャレンジをしてみました。

結果を言うと、

ものすごく苦労しましたww

今回インストールに選んだLinuxは「Ubuntu

以前雑誌で見たことがあるって理由ですがね・x・

まず、苦労したのは画面のサイズ

普通にインストーラーを起動すると標準では576×384なのですがこれではインストール画面が切れてしまいます

インストールしようと思えばできなくはないですが(タブとエンターの操作で切り抜けられる・x・)

やはり画面が見えねば操作を間違えるので解像度を変えます。

install video=ps3fb:mode:3

と入力します

「3」は720pを意味します。詳しくはこちら

ちなみに私はps3fbをps3fdと間違えて、あれ??なんで解像度変わらないの???ってなりました・w・

そして、解像度化変わってインストールを始めるとApt関連のインストールでエラーが発生

ググると言語設定を日本語にするとAptのところでエラーが出るんだと;x;

仕方なくEnglishでインストールしてインストール完了後に日本語に変えました

インストールしたLinuxを使ってみた感ですが

アプリを起動するのに若干もたつきがありますが起動さえすればとくに問題はありません

まあ、それでも複数アプリ起動すると重いですがね・x・

結論:PS3はPC変わりにはならない

さて、ココ1年まともにプログラミングをやってないので久しぶりにPalibのプログラミングに再度挑戦しますかね・w・

2010年3月3日

地デジTV購入その後・・・・

Filed under: 日常 — ranpei @ 1:47 AM

前回書いた地デジTVのことですが

その後5日ほど電気屋に通いつめて選定した結果、69800円の26型を買うことにしました

土曜日に買いに行くとちょうど型落ち品のセールに遭遇!

32型が79800円で

  • HDD録画付き(USB、内蔵両対応) 26型はUSBのみ
  • 1080iHDMI対応(フルHD画質が入力できる) 26型非対応
  • 120倍速(2倍速) 26型は未対応

残念ながらフルHD表示ではないものの

予定に+1万でこれなら買いだ!!!!

・・・・・・・・・・・・ということで即決^^v

?いや?いい買い物したな?♪

帰って財布を見てみると・・・・・・・

・・・・・・・・・・・・・・・・・・・・・・・・・・・・

2週間を1万円未満で過ごさなければいけなくなっていました;x;

家族と同居だしなんとかなるかな?(かかるのは昼食費と雑費ぐらい・・・・・まあ雑費(漫画)が多いんですけど・・・・・・

それでも些細な出費が痛手になる状況><

財布のひもをいつもよりきつく〆ねば・・・・・・・・

2010年2月17日

夢の32型・・・・・

Filed under: 日常 — ranpei @ 2:26 AM

おとといに家のTVが壊れてしまいました。

朝、めざましTVを見て会社に出かけ、帰ってきて電源を入れたらウンともスンとも言わない状態・・・・;x;

15型のテレビデオでしたがもともと安物中古だったのでいい加減寿命だったようです

家族からは見れないと暇でしょうがないと文句を言われ、早急に買い替えようと今日ヨ○バシに候補を探しにいきました^^;

私自身はあまりテレビを見ないのですが、それでもテレビにこだわりたい要素というものがあるわけで・・・・・・

上げるとするなら

推奨

  • 32型!!! : 大学の研究室にこの大きさのTVが置いてあったのでずっと憧れていました^^;
  • フルHD対応!! : PS3をフルHDでやりたいw

必須

  • 2、倍速対応 : 液晶TVでスポーツを観戦したときから像がブレまくっているのがずっと気になっていたので^^;

最小(あったらいいな?程度)

  • 録画機能(外付けHDDならなお良し) : 最近は録画しないけどねf^^;

予算

  • 5万円台(59,999円以下) : 私の財布的にはこれが限界・・・

PCソフトの動作環境表のように書いてますが

以上が私の求めるTVのスペックです

物色してみたところ推奨を除けば26型でこと足りそうです

とはいえ・・・・やっぱり32型がホスィ・・・・・・・・・・・・・・・・・・・

弟(学生)が26型買ってるんで兄(会社員)としてはそれを↑を買いたいという対抗意識があるので^^;

ヨドバシ以外にもドンキやヤマダなんかでも探して安いのを探してみますかね

場合によっては生活費切り詰めて・・・・・・・・・・・・・・・・

2009年12月21日

長らく放置していた問題・・・・

Filed under: PC — ranpei @ 2:18 AM

長らく放置していたブログの問題・・・

それは、外部から接続するとCSSが適用されていないということ

調べてみるとどうやらDBの中にブログのURLを保存して

そのURLを分割して各スクリプト、CSS、JavaScriptパスを割り振っているのです

ようするに当ブログはローカルで最初の設定を行っていたのでURLはローカルIPで設定されていたのです。

これの解決方法としてDBのURLをドメインに書き換えることで外部から接続してもCSSが適用されるようになりました。

?

ところが今度は別の問題発生!!

?

ローカルから見た場合CSSが適用されていない!

さらに、管理ページにローカルからログインすることもできなくなった・・・・・・

ググってみるとhostsか内部DNSで解決するしかないらしく、

・hosts OSの設定を書き換えたくない

・内部DNS 立てるのが面倒

という理由からずっと放置・・・(当然その間ブログの更新はできない)

?

ところが先日気が向いたので内部DNSをたてることを決意

四苦八苦したもののなんとか問題解決できた

2009年9月14日

ブログツールを変更しましたw

Filed under: 日常,未分類,PC — ranpei @ 12:13 AM

今までPBLOGというブログスクリプトを使用していたのですが

手違いでサーバーを吹っ飛ばしてブログのデータがすべて消えたことを気に

WordPressというブログスクリプトに変更しました。

前のスクリプトとはかなり勝手が違いますが機能がとても豊富で、プラグインで機能の拡張できたりと

この先使っていくのが楽しくなりそうです

« Newer Posts

Powered by WordPress