WordPress 3.1 の新しい XMLRPC API

RC3 まできてもうすぐ出ると思われる WordPress 3.1!。

つらつら changelog をみていますと、XMLRPC の API にメディアライブラリ系の API が追加になっていましたので、ここ hiromasa.another の 3.1 テストもかねまして遊んでみました。 :)。

新しく追加になったのは、wp.getMediaLibrary、wp.getMediaItem、wp.getPostFormats で前2つはメディアライブラリに関するもの、最後は投稿フォーマットに関するものです。

というわけで、せっかくですので練習もかねて Groovy  からレッツアクセス。 😀

import groovy.net.xmlrpc.*
 
class WPXMLRPCProxy {
    def proxy
    def user
    def passwd
    def currentArgs
    
    def methods = [
        getMediaLibrary :
            { [blog_id, this.@user, this.@passwd, struct]},
        getMediaItem :
            { [blog_id, this.@user, this.@passwd, attachment_id] },
        getPostFormats :
            { [blog_id, this.@user, this.@passwd] }
    ]
    
    def invokeMethod(String method, Object args) {
        currentArgs = args[0]
        def wpargs = methods[(method)]()
        method = "wp." + method
        proxy."$method"(wpargs)
    }
    
    def getProperty(String name) { currentArgs[name] }
}
 
def wp = new WPXMLRPCProxy(
    proxy : new XMLRPCServerProxy("https://another.maple4ever.net/xmlrpc.php")
    , user : ""
    , passwd : "")
 
wp.getMediaLibrary(blog_id:0
    , struct:[number: 1, mime_type:"image/jpeg"]).each {
    println it
}
 
println wp.getMediaItem(blog_id:0, attachment_id: 1394).metadata
 
println wp.getPostFormats(blog_id:0)

 

わざわざこんなことしなくてもいいかもですが、invokeMethod と getProperty の練習がてら Groovy に備わるリフレクションの仕組みでメソッドとプロパティを動的に生成して WordPress の API と同じ形で呼べるようにしています。

フィールドの methods マップにメソッド名と引数クロージャを追加していけば、wp.* 系の API がそのまま呼べるはずです。(今は新 API だけ入れています)

実行!

wp.getMediaLibrary

[title:DVC00169.jpg, thumbnail:https://another.maple4ever.net/wp-content/uploads/2011/01/DVC00169-150x150.jpg, date_created_gmt:Sun Jan 23 09:33:11 JST 2011, description:, link:https://another.maple4ever.net/wp-content/uploads/2011/01/DVC00169.jpg, parent:1396, caption:, metadata:[sizes:[thumbnail:[height:150, file:DVC00169-150x150.jpg, width:150], medium:[height:225, file:DVC00169-300x225.jpg, width:300]], height:308, file:2011/01/DVC00169.jpg, width:410, hwstring_small:height='96' width='128', image_meta:[focal_length:0, title:DVC00169, shutter_speed:0, iso:0, camera:SH906i, created_timestamp:1295293049, caption:copy="NO" SH906i, copyright:, credit:, aperture:0]]]

wp.getMediaItem

[sizes:[thumbnail:[height:150, file:DVC00169-150x150.jpg, width:150], medium:[height:225, file:DVC00169-300x225.jpg, width:300]], height:308, file:2011/01/DVC00169.jpg, width:410, hwstring_small:height='96' width='128', image_meta:[focal_length:0, title:DVC00169, shutter_speed:0, iso:0, camera:SH906i, created_timestamp:1295293049, caption:copy="NO" SH906i, copyright:, credit:, aperture:0]]

wp.getPostFormats

audio:Audio, standard:Standard, status:Status, gallery:Gallery, quote:Quote, link:Link, image:Image, chat:Chat, aside:Aside, video:Video

なーるほどざ、にゃんこ。 🙂

あとはちょいちょいプログラムかけば、条件指定してクライアントアプリから画像ひっぱるとか簡単ですね。

xmlrpc01 

よいよい、簡単。 これは swing ですが次は SWT バインディングに挑戦してみたいです。 😀

最近のスクリプト言語

といっても全然最近ではないのですが。 🙂

前のエントリでも書きましたが恥ずかしながら Ruby とかやったことがなく、実はいつだったか Ruby のソースをみたときに処理は分かれど、ライブラリの中身がどうやっているのか理解できず、ショックで引退を考えたことがありましたので最近ようやく勉強を始めました(笑)

ちょっと仕事に近いところというところで、Ruby じゃなくて Groovy でやってます。

DVC00169

Groovy In Action は絶版になっているのか Amazon ですごい値段がついていましたが、ジュンク堂で無事ゲット。 2008 年の本なのでぼくがみても現行バージョンと変わっているなと思う点もありますが(HashMap が LinkedHashMap になっている等)、それほど困ることはなさそうです。 この本は技術書としてもとても面白かったです。 🙂

Groovy はマップ・リスト操作、動的系の機能とクロージャなどのシンタックスを限りなく最小限に抑えている他、JDK にリフレクションで追加する形でクロージャを用いて処理を差し込むパターンのメソッドが多数用意してあるため、ソースから冗長な記述を削除できすっきりとしたソースをかくことができるようです。

というわけで Groovy In Action を読んで仕掛けが何となく分かったので、試しに RSS から画像を取得してファイル保存するプログラムをかいてみました。

// @Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.1')
import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.Method.*
import static groovyx.net.http.ContentType.*
 
rssUrl = "http://feedblog.ameba.jp/rss/ameblo/nakagawa-shoko/rss20.xml"
pUrl  = /<img [^>]*src\s*=\s*[\"']?([^\"'> ]+.jpg)/
pFile = /([^\/]+?\.jpg)$/
 
new HTTPBuilder(rssUrl).request(GET, XML) {
   response.success = { res, rss ->
      rss.channel.item.each {
         it.description.text().eachMatch(pUrl) {
            filename = it[1].toURI().path =~ pFile
            new HTTPBuilder(it[1]).request(GET, BINARY) {
               response.success = { res2, image ->
                  new File("./file/${filename[0][0]}").bytes = image.bytes
               }
            }
         }
      }
   }
}

もうちょっと短く書く方法もあるとは思うですが、例えば PHP でかいた場合と違って、http アクセス失敗とか File のオープンクローズとかの処理がソース上に現れていないにもかかわらず、これでうまくいってしまうであろうところが良いですね。

XML パースにはダイナミックランゲージの機能が使われているのが分かります。 あとは String の eachMatch にクロージャ渡せるとか便利です。

  • メソッドの引数の括弧は省略できる。 また、一番外側の引数がクロージャだった場合は括弧にいれなくてOK。
  • インスタンスのフィールドは getter/setter が勝手に生成され、プロパティみたいにフィールド名かけばアクセスできる。

他にもコンストラクタにマップ渡すとフィールドを key/value で初期化できるとか、その際のマップの記述は [] つけなくていいとか、なんだか知らないとぱっと見分からないことでいっぱいだったりするのですが、慣れると便利そうです。

動的型付け、動的言語機能は IDE がほぼ無力になるのでドキュメントとにらめっこするのがちょっと大変ですし、ランタイムエラーをやっぱり出しがちですが、どこで苦労するかのバランスは悪くないように思いました。

というわけで実行。

groovy10 

[tegaki]わーい。 とれた。[/tegaki]

…引退します。。(笑)

2011 年スタート!

気が付けば 2010 年も終わりまして、2011 年がスタートしよりました。 あけましておめでとうございます!。

2010 年はお仕事先が何回か変わったり、WordCamp Yokohama、OSC 北海道以降いろいろな方にお会いすることができたり、刺激が多かった年だったように思います。 🙂

まぁまぁ長いお付き合いの方たちは薄々気が付いていると思いますが、変化はあれど相変わらず性格はひろまさです(いいんだか悪いんだか、、)、、今年もよろしくお願いいたします!。

せっかくブログっぽい書き出しなので、今年やってみたいことなど。

一応変化の速いコンピュータ業界にいますので、たまに勉強しとかないと置いてかれちゃうのですが、まずは今さらで恥ずかしながら、近代的な Lightweight Language を理解していこうかと思います。

C# とかもこの辺の言語の要素を取り入れて進化していますので、そろそろ本職にも登場してくるんじゃないかなというイメージを持っています。

DVC00143

あとは、、趣味のコンピュータとして、OpenGL とか SWT とか E4/XWT とかその辺を使って練習がてら LL からめて何かつくってみたいです。

さて、今年は WordPress が商用サイト向け CMS として躍進した印象を肌で感じました。 ぼくは Web 制作のほうは全然詳しくないので、既に役立つものをつくるのも役立つお話をするのもできなくなっている気もしているのですが、そこはマイワールドひろまさくん。 面白いこと見つけたらやってみる、相変わらずの感じで行こうと思います。 🙂

[tegaki]もてるプログラマーに![/tegaki]

というわけで、今年もこんな感じです(笑)

みなさんにとって良い年でありますように。 今年もよろしくお願いいたします。 😀