タグ: XML-RPC

  • まつりレポート2:The Cocoa XML-RPC Framework 1.5 リリース

    ちょっと前のことですが、Kaku が採用している The Cocoa XML-RPC Framework の新バージョン、バージョン 1.5 が リリース されました。

    Kaku で使っているものは、僕が細々と不具合を修正してきたものなのですが、これも今年の始め、ブログもなく、ほとんど更新されていない開発者の方のウェブサイトをたまたま訪れたところ、ちょうど「新バージョンに向けてご意見・ご要望を募集中云々」といったことが書かれていたので、僕が修正したコードを送ってみたところ、それが一部採用されることになった、という次第です。

    僕が参加した証として分かりやすいのは、-[XMLRPCDecoder trueDecodeObject:]という、ちょっとアレなメソッドでしょうか(ちょっとダーティーなんですが、確かこうしないと、関連するコードを大幅に書き換えないといけなくなるので逃げてます。てか結構そのまま採用されてる…笑)。

    …というわけで、もし興味のある方は、試してみてください。僕も実はまだ試してない(おい)のですが、遠くないうちに Kaku に搭載してテストすることになると思います。

  • BlogWrite の作者から AtomPub テスト用クライアントソフトが公開

    国産ブログエディタの代表といえる BlogWrite の作者から、Fude という、AtomPub のテスト用クライアントソフトがリリースされています。動作環境は Win98SE 以降。

    Kaku を AtomPub に対応させるのもそんなには難しくないはず、と(現時点での AtomPub に対する僕の理解では)思っていますが、正直まだ、よく分かっていません。Kaku にもうちょっと最低限の機能がついたら、これも使わせてもらいつつ、勉強したいと思います。

    ところで、BlogWrite の作者(というかなんというか、「ウィザシステム社の」という感じのブログでもないからなあ)の ブログ は、以前から購読させていただいていたのですが、最近更新されていないな、と思ったら、英語版 に移行していたようです。

    日本発で、海外でも評価されているソフトのあまりの少なさ(そうでもない?)を悲しく思っている僕としては、別の意味でも期待してしまいます。

    UPDATE:「作者さん」は気持ち悪いので修正。こんどは呼び捨てみたいだけど。

  • Notes:(調査中)Leopard AppleScript 日本語を使った XML-RPC が不安定に

    Leopard には、もちろん素晴らしいところが多々あるのですが、またイヤな情報をひとつ。Leopard 上で Kaku の動作をほとんど殺してくれている不具合について、少なくともどの辺にありそうかは分かってきました。

    「不安定に」と少し曖昧に書いていますが、僕が知る限り、2つの問題が組合わさっています。

    問題1. パラメータに日本語を含む XML-RPC を行うと、高い確率でクラッシュする

    スクリプトエディタから実行した場合はスクリプトエディタが、AppleScript Studio アプリから実行した場合は、そのアプリがクラッシュします。

    例えば、AppleScript Studio アプリから、日本語パラメータを含む XML-RPC を行うと、次のようなメッセージを残して、アプリがクラッシュします:

    XMLRPC Test(10908) malloc: *** error for object 0x2d4290: incorrect checksum for freed object - object was probably modified after being freed.
    *** set a breakpoint in malloc_error_break to debug

    パラメータに英数字を設定していれば、何の問題もありません。日本語の文字列の扱いでトラブっているでは、と想像できます。

    Leopard からは、スクリプト内に Unicode 文字を含めることが出来るようになりましたが、その辺との関連で、齟齬が起きているのかもしれません。

    問題2. パラメータに日本語を含む XML-RPC が成功したとしても、WordPress で文字化けする

    スクリプトエディタを使っている場合、問題1 が発生してスクリプトエディタが強制終了したあと、もう一度そのスクリプトファイルを開いて、すぐ実行すると、XML-RPC が成功する場合があります。

    しかし例えば、そうやって WordPress に記事を送信したとすると、記事の内容は「?」の羅列に化けてしまいます。

    問題1 が発生している時点ですでにあやしいですが、AEXMLTutor(Leopard でも動くことに感動)で送信している生の XML データを確認すると、次のようになっています(ちなみに記事の内容は「あああああ」):

    description あああああ

    文字参照になっているのが分かります。これが文字化けの原因だと思うのですが、この辺は(…というか、よく知っていること以外はだいたい)かなりうといので、よく分かりません。

    興味深いのは、これが Movable Type や P_BLOG × XML-RPC for P_BLOG (revision e) では、発生しないことです。これは、決して WordPress が悪いわけではなくて、たぶん、構図は:

    • 犯人
      • AppleScript
    • 犯行内容
      • 送信するデータがおかしい
    • 関係者
      • Moveble Type → なんとか対応
      • XML-RPC for P_BLOG (revision e) → なんとか対応
      • WordPress → 爆死

    …ということなんだろうと想像しますが、WordPress の実装は、他の2つとどう違うんでしょうか…?

    もしこれらに関して、新たに分かったことがあれば、ここに追記します。

    しかし、少なくともこれで、XML-RPC を AppleScript に任せたままで、手っ取り早く解決する方法はなさそうだ、ということは分かりました。なんとかせねば…

  • Notes: AppleScript による XML-RPC で、受信した日付情報が勝手に変更される

    ひとつ前の記事 でご紹介した対策を施しても、Kaku での WordPress の記事の日付表示が一向に直らないので、さらに調べてみたところ、AppleScript で行う XML-RPC で受信した日付情報がおかしくなってしまう不具合を見つけました。

    問題

    • (舞台裏での XML データの受信は問題ないようだが、)受信した XML データを AppleScript 内で使えるよう変換を行う際、すべての日付情報("«data isotXXXX...»" という形のデータ。中身は ISO 8601 形式)に、UTC であることを表すためのタイムゾーン指定子 Z を付加してしまう。
    • かと言って、前述の記述情報を date 型に変換("... as date")しても、UTC の指定が考慮されるわけではなく、ローカルタイムとして(Z が付いていないときと同じように)扱われる。

    対策

    • 直接的なものはない。XML-RPC に AppleScript を使わないようにするしかない。

    date 型に変換したとき UTC の指定が考慮されないのはまだしも(もともとそんなのには対応していなさそうだし)、isot が受信されたデータを忠実に保持してさえいてくれれば、文字列に変換して、いくらでも処理できるのですが…。もとの情報は正確に送られてきている(後述)ので、もったいない不具合です。

    以下では、(ここまで読めば分かる人もいるかもしれませんが)なぜ WordPress だけ直らないのかを説明しておきます。

    なぜ WordPress の記事の日付表示だけ直らないのか

    ブログクライアントソフトに日付情報を返すとき、WordPress は UTC で、Movable Type や P_BLOG は(たぶん)サーバーのある場所のローカルタイムで返します。

    これらのうち複数のブログシステムを使っておられる方は、ecto で ウィンドウ →「コンソール」 を開いて(あるいは MarsEdit で Windiow →「RPC Console」)、WordPress と、Movable Type/P_BLOG の記事を再読み込みして、表示されるデータのうち、どこかにある「timeDate.iso8601」と書かれている部分をそれぞれ比較してみてください。WordPress のときは、最後に Z がついて おり、Movable Type/P_BLOG のときには ない ことが分かると思います。

    次に、Kaku で 環境設定パネル →「一般」タブ → 「ログを出力する」を有効にして、「コンソール.app」を見ながら、同様に記事の読み込みを試してみると、WordPress に関しては変わらず、Movable Type/P_BLOG に関しては、本来ついていないはずの Z が付加されている ことが分かります。

    しかし、最初に書いた通り、AppleScript では、これらは すべてローカルタイムとして扱われます。結果として、WordPress の記事に関しては、実際より9時間遅い 表示に(UTC と日本時間との差が考慮されなかったため)、Movable Type/P_BLOG は、Z が付加されているのに UTC の日付として処理されないので、(なんとか)事なきを得ています。

    ちなみに、Kaku の紹介ページ →「使い方」タブ → 「トラブルシューティング」で書いた方法で確認すると、受信した生データには異常がない ことが分かると思います。

    …つまり、Kaku ではこれまで一度もまともに日付情報を認識できていなかったということ(涙) これを解決するには、根本的な変更が必要ですが、それには困難が伴うので、まだ放置しておこうと思っています…。

  • Notes: WordPress XML-RPC API

    この記事では特に、WordPress 2.2 で 追加された、WordPress 独自の XML-RPC API の情報を掲載しています。

    WordPress が対応している他の XML-RPC API や、名前などを見れば容易に推察できるであろう部分に関しては、負担となりますので、説明を省略しています。WordPress の XML-RPC API は、基本的に Movable Type と互換性があります。Movable Type のマニュアル や、Tsurupone さんによる解説ページ も参照してください。

    また、内容の正確性については保証できません。もし間違いなどありましたら、この記事のコメント欄などからご報告いただければ、ありがたく思います。

    メソッドの一覧

    メソッドの詳細

    wp.getPage

    機能
    page_id で指定された WordPress ページを取得する
    パラメータ
    (String) blog_id, (String) page_id, (String) username, (String) password
    返り値
    struct page_struct または fault

    wp.getPages

    機能
    各 WordPress ページのすべての内容を含んだ完全なリストを取得する
    パラメータ
    (String) blog_id, (String) username, (String) password
    返り値
    struct page_structarray または fault

    wp.newPage

    機能
    新しい WordPress ページを作成し、その page_id を返す。最終的な処理は、拡張された metaWeblog.newPost で行われる
    パラメータ
    (String) blog_id, (String) username, (String) password, (struct) page → page_struct, (boolean) publish
    返り値
    String page_id または fault

    wp.deletePage

    機能
    page_id で指定された WordPress ページを削除する
    パラメータ
    (String) blog_id, (String) username, (String) password, (String) page_id
    返り値
    true または fault

    wp.editPage

    機能
    page_id で指定したページの内容を更新する。最終的な処理は、拡張された metaWeblog.editPost で行われる
    パラメータ
    (String) blog_id, (String) username, (String) password, (String) page_id, (struct) contentpage struct, (boolean) publish
    返り値
    String page_id または fault

    wp.getPageList

    機能
    page_id などの情報を含む、すべての WordPress ページの簡易リストを取得する
    パラメータ
    (String) blog_id, (String) username, (String) password
    返り値
    struct short_page_infoarray または fault

    wp.getAuthors

    機能
    WordPress システムに登録されているユーザーのリストを取得する
    パラメータ
    (String) blog_id, (String) username, (String) password
    返り値
    struct author_infoarray または fault

    wp.getCategories

    機能
    メソッド metaWeblog.getCategories のエイリアス。このメソッドは mt.getCategoryList と同じように使えるが、返り値に含まれる情報が増えているので、知らない人はチェックすること。

    wp.newCategory

    機能
    新しいカテゴリーを作成する
    パラメータ
    (String) blog_id, (String) username, (String) password, (struct) category
    返り値
    String categoryid または fault

    wp.suggestCategories

    機能
    category に指定した文字列で始まるカテゴリーのリストを取得。どういうふうに使うんだろう?
    パラメータ
    (String) blog_id, (String) username, (String) password, (String) category, (String) max_results
    返り値
    struct short_category_infoarrayまたは fault

    wp.uploadFile

    機能
    メソッド metaWeblog.newMediaObject のエイリアス。第4引数の struct に「 overwrite 」キーを追加できるようだ。設定できる値は、上書きの可否を指定する boolean

    返り値の構造体の内容

    struct page_struct

    wp.getPage などで返ってくる、記事の内容の構造体。基本的には metaWeblog.getPost などで返ってくる構造体と同じ。よってここでは、WordPress で拡張された部分しか書かない。

    こういったブログシステムの XML-RPC API を扱ったことがある方には説明するまでもないことかもしれないが、逆にこの構造体を作って wp.newPage などにパラメータとして渡せば、その内容を持った記事を作成できる(Movable Type のマニュアルの metaWeblog.editPost の説明などには、パラメータとして送ることのできる構造体の内容を懇切丁寧に書いてあるが、少々乱暴だが、受け取ったものは送り返せる、と考えれば楽だ。受け取れない値は無視されるよう設計されているはずだ)。

    さらに、wp_newPage の説明でも少し書いたが、これら WordPress ページを作成するメソッドは、最終的には metaWeblog.newPost などを呼び出す。つまり MetaWeblog API がこの構造体を受け取れるように拡張されている。もっと簡単に言えば、例えば metaWeblog.newPost で投稿スラグなどを指定できる、ということだ(はじめからそう言え、と)。

    キー 値のタイプ 備考
    page_status String "post" または "page"。恐らく省略した場合は "post" となり、wp.newPage を使えば自動的に "page" が設定される。つまり、通常これを自分で設定する必要はない。
    excerpt String mt_excerpt 」と同じ。
    text_more String mt_text_more 」と同じ。
    wp_slug String
    wp_password String 記事のパスワード。
    wp_author String 記事を作成したユーザーの 表示名
    wp_page_parent_id String
    wp_page_parent_title String
    wp_page_order String
    wp_author_id String
    wp_author_display_name String wp_author 」と同じ。

    struct short_page_info

    キー 値のタイプ
    page_id String
    page_title String
    page_parent_id String
    dateCreated ISO.8601

    struct author_info

    キー 値のタイプ 備考
    user_email String
    meta_value String 謎のデータ。データベース内の位置?
    display_name String
    user_id String
    user_login String ログイン名。

    struct short_category_info

    ラベル
    category_id String
    category_name String