2007年10月アーカイブ
埃まみれになった扇風機を、洗剤で拭いてキレイにした。結果、中の羽がこんなにも透明だったのかと驚かされた。モーターのカバーも開けて、グリースとそれにまとわりついた埃を拭き取って、可動部の Shimano Dura-ace のグリースで再度グリースアップ。カバーを開けたままスイッチを入れるのはちょっとスリリング。
異音がなくなったり、目に見えて動きがスムーズになるわけではないけど、埃や粉塵で黒くなったグリースがなくなって緑の透明のになった様は気持ちが良いものだ。
先週と今週と土曜日の夕ご飯は水餃子だった。
今日の中身は白菜、椎茸、ニラ、豚肉、レンコン。作るのは思ったほど面倒くさくない、野菜をみじん切りして塩で水抜きして、肉を入れて粘りけが出るまで良く混ぜる。そして少しの醤油と塩コショウで味付け。皮で包むのはテレビでも見ながらやれば、苦痛じゃない。
昆布で出汁を取った湯をはった土鍋でゆでて、黒酢で食べる。画像がないのが残念だけど来週も作ることになったらぜひ写真を up したいと思う。皮は出来合いのモノだけど、先週より今週の方が美味しかった。
余ったネタは、崩れないように片栗粉をまぶして蒸し団子にでもして明日の昼ご飯に。
読んだのはずいぶん前になるんだけど。高校で日本史を履修しなかったので、私の日本の歴史に関しては平均以下の知識なのです。特に幕末のところは全然意味が分からない。ということで、この本は自分で飼ったものではなくて、カミさんの実家のお父さんから借りて読んだものです。自分じゃ買わない類の本。
私の頭の中では、徳川慶喜が大政奉還した次の瞬間には伊藤博文が総理大臣になり五箇条のご誓文を出して、板垣退助が死んだ次の瞬間には日清戦争だったりします。いきなり初登場の人が偉かったりして「おまえ今までどこにおったんや」的ツッコミどころだらけで全然分からないのです。伊藤博文だって昔のお札じゃ偉そうな顔してますけど、長州での下っ端時代があったはずで、授業じゃそこがないから面白くない。面白くないし必然性に基づいた流れを感じることができないのが苦手の原因なんだと自己分析していますが、したがって、坂本龍馬が暗殺されたのは知っているけど、それ薩長がどうとか新撰組がどうとかの関係が全然分からない。でも、オレ流解釈する人の足元にも及びませんが、この本を読んで少しは分かった気になれました。
明治時代の初めは国内で戦争が起きていたんですね。京都から始まって最終的には北海道まで。「江戸の末期の倒幕派が起こしたクーデターに端を発して、新政府と反対派の国内紛争が明治初期にかけてありました」っていってくれた方がよほどわかりよいのに。そしたら四字熟語にはならんのだけど。
これと「右翼と左翼」をセットで読むと相互に理解が深まるような気がします。こちらはgakkie に借りて読みましたが、右翼と左翼のそもそも論から日本における右翼と左翼の歴史まで非常に良くまとまっていると感じました。なぜ右翼が「改憲」で左翼が「護憲」なのか、それについて学びたい人はおすすめです。
1. mtsuyugu All Feed: フィードを登録していただく方は通常こちらをお願いします。
2. Twitter: 僕の Twitter の RSS。All Feed からのアップデートも含まれているので。1 と 2 を購読するとちょっとうるさいかもしれません。
3. Twitter 上での呟きだけのフィードもあります。
ユースケースにあわせた 2 タイプ。
1つめ。 RSS リーダーのみで生活している人向け。 1 と 3 の組み合わせがおすすめです。これだと漏れも重複もありません。
Twitter をよく使う人向け。 Twitter を使ってください。僕の更新情報はすべて Twitter にも出るようにしています。ただ Twitter の RSS を購読してくださるぐらいなら All Feed の購読をおすすめします。ブログの本文や Flickr の画像、はてブの登録人数などが出る分、All Feeds の方が使い出があると思います。
libcurl の C++ ラッパライブラリ curlpp を使って HTTP 経由でコンテンツをやり取りしようという試みです。
ネット上の何処かにあるフィードのデータを整形して Twitter へ投げるような場合にはフィードのデータを GET する場合と、Twitter へ データを POST する。2つのパターンがありますが、まずは GET 編。
いきなり答えですが、単純に URL へ GET リクエストを送るという最小限のコードはこれだけ。
cleaner はコンストラタとデストラクタで cURLpp の初期化、終了化をやってくれるもの。 あとの 3 行はほぼ見たままなのだけど、setOpt の仕方が少々変わっていてのようにでファインマクロは使わなくなっています。 libcurl でいうところの CURL_OPT_XXXX のデファインに対応するクラスが cURLpp::Options に準備されているようです。そして、そのクラスのインスタンスを setOpt に渡すことで curl ハンドラの設定行います。
でも、これだと単に標準出力にコンテンツを出力しておしまいなので、画面に出さずにメモリに入れるようにしてみたいのですが、それにはURL を設定した行の下に下の 2 行を追加すれば大丈夫です。
ちょっと分かりにくいけど、データを受け取ったら CurlHandler::writeMemoryCallback にデータを渡すようにする設定です。 libcurl でいうところの CURLOPT_WRITEFUNCTION の設定です。libcurl のドキュメント には size_t function( void *ptr, size_t size, size_t nmemb, void *stream) とか書いてるわりに、curlpp では 4 つ引数のある関数は受け取ってもらえませんでしたので、3 つで我慢しました。この関数は一回のリクエストで何回呼ばれるかは保証されていませんので、呼ばれるごとに受信したデータを後ろに繋いでいく必要があります。こんな感じで:
以上で、ざーっと curlpp で GET してレスポンスのデータをメモリに代入するところまでやってきました。最後に全体を貼り付けておきます。昼前にお茶の水へ出かけて、そこからカミさんと散歩。駅前の丸善で来年のカレンダーを売っていたので衝動的に買ってはみたものの、こんな時期に買ったことがないので使う頃には買ったことを忘れていそうでちょっと怖い。散歩の目的地は神田小川町の丸香。決して安くはないし、始めていったときの驚きももうないけど、このうどんはクセになる。うどんってそう言うもんだと思う。食後は小川町駅まで歩いて電車で。
もうひとつ僕が良く行くうどん屋の野らぼーは土日休みと思っていたのけど、土曜日もやってるところがあるのね。よし、来週は野らぼーだ。
前回は xpath で簡単に RSS からタイトルを抜き出す方法を書いたのですが、下記のようにデフォルトの名前空間が指定されている RSS1.0 では、xpath "//title/item" では 取得できないことが分かりました。
<rdf:RDF xmlns="http://purl.org/rss/1.0/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xml:lang="ja">
つまり、xpath "//item" は名前空間なしの素の item エレメントであって、デフォルト名前空間の下にある item という名前のエレメントにはマッチしないということらしいのです。じゃあどうやってそれを xpath で表すかというと、表す方法はないとか…あわわ。
ということで、以下のような感じでなんとかクリア。 get_children で地道に辿っていく方法もあるのですが、 RSS1.0 と 2.0 では item ノードの階層が違うので、共通で使えるコードとなると xpath の方が単純に書けていいと思います。厳密さを撮るか簡便さを取るか、ですね。
#include <iostream>
#include <libxml++/document.h>
#include <libxml++/parsers/domparser.h>
#include <libxml++/nodes/node.h>
#include <libxml++/nodes/element.h>
#include <libxml++/nodes/textnode.h>
using namespace std;
using namespace xmlpp;
int main ( void ){
DomParser parser;
parser.parse_memory( string_rss );
Element *root = parser.get_document()->get_root_node();
NodeSet items = root->find("//*[name()='item']");
for( NodeSet::iterator it = items.begin();
it != items.end(); it++ ){
const NodeSet value = (*it)->find( "//*[name()='title']" );
string title = dynamic_cast< Element *>(value[0])
->get_child_text()->get_content();
cout << "Title: " + title << endl;
}
return 0;
}
find ではなく get_children を使って書くと item の NodeList を取るのは以下のようになります。それほど複雑でもないので xpath に慣れていない場合はこっちの方が良いかも。
/* RSS 2.0 */
Node::NodeList items = root->get_children("item");
/* RSS 1.0 */
if( items.empty() ){
const Node::NodeList ch = root->get_children("channel");
if( ! ch.empty() ){
items = ch.front()->get_children("item");
}
} ちょっとしたプログラムを書くなら、開発の手軽さとライブラリの豊富さから考えても使う言語は Perl か PHP あたりのスクリプト言語になるのですが、一方で C や C++ のようなコンパイル言語を全く使わないかというと、実は全然そうでもなくて、とはいってももっぱら読む方が多いのですが、C++ のライブラリとかってあまり使ったことがないので、libxml の C++ ラッパライブラリの libxml++を使ってみました。
ドキュメントを読んで、RSS から title を抜き出すのを作ってみました。以下のような感じ。エラー処理とかは一切ないですが。
#include <iostream>
#include <libxml++/document.h>
#include <libxml++/parsers/domparser.h>
#include <libxml++/nodes/node.h>
#include <libxml++/nodes/element.h>
#include <libxml++/nodes/textnode.h>
using namespace std;
using namespace xmlpp;
int main ( void ){
DomParser parser;
parser.parse_memory( string_rss );
Element *root = parser.get_document()->get_root_node();
NodeSet items = root->find("//item");
for( NodeSet::iterator it = items.begin();
it != items.end(); it++ ){
const NodeSet value = (*it)->find( "title" );
string title = dynamic_cast< Element *>(value[0])
->get_child_text()->get_content();
cout << "Title: " + title << endl;
}
return 0;
}
get_root_node で ルートノードを取ってきた後は、ルートノードに対して find で欲しいノードを検索して、見つかったノードの集合をイテレータを使って各ノードにアクセスするという形です。 find は XPath を引数にして欲しいノードを取ってこれるので、 思っていたより簡単にできました。タイトルだけを抜き出すなら本当は find("//item/title") でも良いのですが、title の他にも link や pubDate を取ってきたいときは上記のような形になります。
とまあ、これだけでは何ですので、pipes で集約した RSS をポーリングして twitter に更新するプログラムを C++ で作って見ようかななんて思ったり思わなかったりしています。なので次回は curlpp の説明になるかもしれません。














最近のコメント