Motivation
W-ZERO3でWikiのページをつくるとき、やっぱりブラウザからだとやりづらいのです。
あと、大量にあるBlosxomのエントリを、Wikiにまとめて移行したいけれど、手作業でやるには面倒すぎる。うまいこと自動化したいのです。
これらを解決するために、XML-RPCでWikiにエントリをPOSTするようなスクリプトを書きました。
hiki_client.rb
さっさと書いてみました。
40行程度。
require 'xmlrpc/client'
class HikiClient
def initialize(url)
@url = url
@rpc = XMLRPC::Client.new2(@url)
end
def getAllPages
@rpc.call('wiki.getAllPages')
end
def getPage(p)
@rpc.call('wiki.getPage', p)
end
def getPageInfo(p)
@rpc.call('wiki.getPageInfo', p)
end
def getTaggedPages(tag)
@rpc.call('wiki.getTaggedPages', tag)
end
def putPage(p, c, a)
begin
pages = @rpc.call('wiki.putPage', p, c, a)
rescue XMLRPC::FaultException => e
puts 'XMLRPC::FaultException : -----------------'
puts e.faultCode
puts e.faultString
puts '-----------------------'
end
end
def set_auth(u, p)
@rpc.user = u
@rpc.password = p
end
end
見たままのコードです。いちおうBasic認証にも対応。
wiki_post.rb
#!/usr/bin/env ruby
require 'hiki_client'
require 'tmail'
require 'kconv'
WIKI_URL = 'http://some.wiki.host/address/'
hc = HikiClient.new(WIKI_URL)
mail = TMail::Mail.parse(ARGF.read)
body = Kconv.toutf8(mail.body)
body = body.split(/n/)
title = body.shift
keywords = body.shift.split(/,/)
hc.putPage(title, body.join("n"), {'keyword' => keywords})
たったこれだけ。とっても簡単。
まとめ
これで、メールから手軽にWikiエントリが送れるようになりました。編集とかは面倒なのであとまわしです。
やっぱり言語にとって大切なのは、便利なライブラリがそろっていることと、お手軽さだということがよく分かります。実現したい機能をさっとつくれることが何よりも大事。
xmlrpc.rbとtmail.rbサマサマです。
先週
買って早々修理に出したMacBookがまだ返ってきません。
AppleStoreで聞いたときにはだいたい1週間で済むという話だっ
たのですが。
毎日一度はAppleの修理状況確認ページに行ってチェックするの
ですが、いっこうに部品注文中から進もうとしないのです。
と、嘆いていても返ってくるわけではないので、今できることをやって
おこうと思いました。
今週ののだめでも、千秋先輩が「今できることをやるしかないんだ」と
言っていたし。
コンピュータがなくてもできることはたくさんあります。
本を読んだり、アイデアを出したり。プログラミングさえ出来ます。
むしろ、紙とペンさえあればたいていのことはできるということが、コ
ンピュータから離れてみて改めて分かるようです。
制約が工夫を生むなら、いまMacBookがなかなか返ってこないと
いう状況を、どうやってうまく使い倒すことができるか、という
ところにクリエイティビティを発揮しないと。
この前受けたTOEICの結果が返ってきました。
今年はじめにBerlitzに3ヶ月通っていたとか、海外に行っ
てみたとかあったので、どれくらいの成果があったかが注目されていま
した。
結果は、100点アップ。ようやく800点越えしました。
リスニングが大幅に上がっているのが効いています。
やはり話す機会を増やしたことが、結果につながったのではないでしょ
うか。実戦で鍛えられると。
リスニングの音声とか聴いていても、実際の会話とはスピードもぜんぜ
ん違うし。
それにしても、900点台への道はまだ通そうです。
以前に、Apache2でAuthありのXML-RPCができないと書いていたのですが、今日あっさり動くようになりました。
経緯
この問題に再びチャレンジしてみたのです。そしたらやっぱりApache2だと”400 Bad Request”が返されてしまう。
google:400 (xmlrpc OR XML-RPC)してみたところ、Perl での XML-RPC の使い方 というページがヒットしました。そして”bad request” とかでgrepしていくと、どうやらContent-typeが”text/xml”でない場合に跳ねられそうです。
試しに、xmlrpc/client.rb の503行目
"Content-Type" => "text/xml; charset=utf-8"
の”charset=utf-8″を削ってみたところ、うまい具合にXML-RPCが成功した、というわけです。
まとめ
ちょっとがんばって深追いしてみると、案外あっさり解決法は見つかるもの。ただし、筋のいい追い方をした場合。
11/28 00:10 追記
もうちょっと探してみたら、
ruby-dev:27209 にまったく同じ件のpatchがあがっていました… otz
Hikiで、あるキーワードを持つWikiページの集合を返すようなXML-RPC拡張を書きました。19行程度。
背景
HikiでXML-RPCを使ったmigrationツールを書いています。
あるキーワードを持っているWikiページ郡をまとめて別のWikiにコピーする必要がありました。
Hikiに元々備わっているXML-RPCのインターフェイスを使ってやるには、
def getTaggedPages(tag)
pages = wiki.getAllPage();
acm = []
pages.each do |p|
info = wiki.getPageInfo(p)
if (info['keyword'].include? tag)
acm.push p
end
end
end
みたいなコードを書く必要がありそうです。
このコードでは、すべてのWikiページに対してwiki.getPageInfoのXML-RPCリクエストが飛ぶことになり、Wikiページ数に対してスケールしません。実際、手元でやってみたところえらく時間がかかります。
XML-RPCインターフェイスを拡張する
XML-RPCインターフェイスを定義している $HIKI/hiki/xmlrpc.rb を見たところ、ちょこっと書き加えるだけでXML-RPCインターフェイスは追加できそうです。なので、ちょこちょこと書いてみました。
--- xmlrpc.rb.orig 2006-11-26 18:51:13.000000000 +0900
+++ xmlrpc.rb 2006-11-26 18:52:49.000000000 +0900
@@ -86,6 +86,25 @@
#add_multicall
#add_introspection
+
+ #
+ # getTaggedPages
+ # retrieve all pages having specified tag.
+ #
+ @server.add_handler('wiki.getTaggedPages') do |tag|
+ tag = utf8_to_euc( tag )
+ conf = Hiki::Config::new
+ db = Hiki::HikiDB::new( conf )
+
+ ret = []
+ db.pages.each do |p|
+ kws = db.get_attribute( p, :keyword )
+ if kws.include? tag
+ ret.push XMLRPC::Base64.new( euc_to_utf8( p ) )
+ end
+ end
+ ret
+ end
end
end
これで、1つのXML-RPCリクエストだけでキーワードを含む全てのWikiページを得ることができます。
まとめ
rubyのXML-RPCライブラリはお手軽で便利。
ActionScriptとかWebServiceKitだとこうさくっとは書けません。
ふと、FlashでXML-RPCを使ったプログラムを書いてみたくなり、いろいろやってみました。2時間ほどやってみたのですが、どんどん深みにはまっていってしまってちょっと頓挫してます。
1. フリーの開発環境を用意
MTASCというActionScriptコンパイラがあったので、試してみました。普通のActionScriptなら難なくコンパイルできてグッドです。
cf : CodeZine : フリーのFlashコンパイラMTASCを使ってお絵かきツールを作る
2. XMLRPCライブラリを使う
SourceForgeにxmlrpcflashというプロジェクトがあったので、使ってみることにしました。
さっそくクラスパスの設定ではまりました。
サンプルコードの名前空間が”XMLRPC“なのですが、現在のライブラリの名前空間は”xmlrpc“になっているといった罠があったり、メソッド名が変わっているとか。ちょっとメンテが放置されている感があり、このままライブラリを使うかどうか躊躇してしまいます。
それでもなんとかコンパイルでエラーは言われないところまできました。しかし、肝心のRPC通信が全然行われません。困った。
3. traceをなんとかしたい
MTASCは、ふつうのMacromedia FlashのIDE環境とは違って、traceで出力する場所を持っていません。ドキュメントによると、Custoim Traceをくっつけることができるよとあるので、試してみたのですがいまひとつ動きません。
traceできないと、ライブラリのデバッグもできなくて困るよぅと、他の手段を探してみると、Firefox ExtensionでFlashのtraceを見ることのできるものがあると。これを使うには、Flash Playerのdebug版が必要だと。従順にインストールしました。
し か し、やはりダメです。traceの結果が表示されません。
むー、困ったにゃー。
上手くいかないことがこうも続くと、さすがに気が滅入ってきます。フリーでなんとかするというのは、ハードルが高いものなのだなぁと改めてしみじみ。

着々と物事はすすんでいるようです。部品を注文中なのだとか。
いまかいまかと待ち遠しい。
Published on
November 24, 2006 in
book.
あっという間に読み終えました。行きの電車の20分で読了。
これほどさっさと読めた新書もそうありません。
88個のありがちな口ぐせについて、厳しいコメントをつけている本です。
正直、タイトルはどうかと思います。キャチコピーとしてはいいのかもしれないけれど。
タイトルは「頭がいい/悪い」となっていますが、実際にこうした口ぐせを使うのは頭の善し悪しではないでしょう。
相手の気持ちに添うことができるかどうか、なのだと思います。
著者の考えが明瞭なのは良いのですが、これはだめだ、あれはだめだという言葉が連呼されていると、読んでいてめげてしまいます。添削をお仕事にされている方らしいので、日頃からだめだと思う文章によくあたられているのでしょうか。読んでいると著者の前でダメ出しをされている気分になってきます。
さらっと読んでひっかかったいくつかを、しばらく会話の際に気に留めていると良さそうです。
樋口 裕一
PHP研究所
売り上げランキング: 39549
おすすめ度の平均:


何か物足りない

2番煎じの感は否めませんが…

豪快なデジタル思考!
Published on
November 24, 2006 in
book.
強運の持ち主は、おだやかな作品。この前読んだ温室デイズ
とはだいぶ違っています。というか温室デイズがちょっと瀬尾さんの作品の中では異質なのかも。
「ニベア」とか「ダイエー」といったものすごく普通の生活に近いところを舞台としているのだけれど、心あたたまるストーリーが描き出されていきます。
だれの日常生活にでもハプニングや幸せがあって、あんな風に見えても家に帰ったら実はすごい別の顔があるのかも、とかいうことを、満員電車にぎゅうぎゅうに潰されながら立ち、座って口を開けながら眠っている中年サラリーマンを見て思っていました。
瀬尾 まいこ
文芸春秋
売り上げランキング: 83568
おすすめ度の平均:


心が微妙に揺れる

占いと言うより

毎日何かが終わる

MacBookは届いてはや2日で修理に旅立ちました。
銀座のAppleStoreに持ち込んで相談してみました。
光学式ドライブにディスクを入れると、ものすごい轟音がすることが多々あるということで。
ネットのAppleStoreで買った場合は、電話で相談するのがストレートなやり方ですとのこと。
しかし、ここまで来ておいていまさら帰って電話するのも面倒だったので、その場で修理を依頼しておきました。直って届くのは、1週間後くらいとのこと。長い…
まだロクに中身をいじっていなかったので、ダメージは少ないのです。でもいったんあの速さを知ってしまうと、PowerBook 12”はなんて遅いのだろうと。
AppleStoreの人は、対応の感じが良くてすばらしい。なんかスタバの店員さんと接し方が似ているように思います。