mytownの日記

2007-10-01

[]XML-RPC

SeeSaaXML-RPC IFを調べていたところ、以下のようなレスポンスヘッダからPerlSOAP::Liteモジュールに含まれるXMLRPC::Lite v0.68で実装されていることが判明。

HTTP/1.1 200 OK
Date: Mon, 01 Oct 2007 13:49:07 GMT
Server: Apache
SOAPServer: SOAP::Lite/Perl/0.68
Content-Length: 270
Content-Type: text/xml
Proxy-Connection: close
Connection: close

それと、Windows Live WriterでSeeSaaXML-RPCで接続しようとするとなぜかエラーが出る。それに対し、WordPressベースのWordPress.comではエラーが出ない。

Windows Live Writerの挙動を調べてみるとどうやら改行コードが入ったXMLを入出力している。WordPress.comも、同じく改行コードの入ったXMLを入出力している。

SeeSaaは改行コードが入らないXMLを入出力している。SOAP::Lite自体はXMLの入出力に改行コードが入っていてもいなくても正常に処理できるようだが、Windows Live Writerは扱えないらしい。

不思議なのは、Windows Live WriterでhttpでSeeSaaに接続した場合はエラーが出るのだが、httpsだとなぜか正常に接続できる。

ひょっとして、SeeSaaのhttpsでXML-RPCを受けるつけるSOAP::Liteが古いため、改行コードを含むXMLのみを入出力するため、Windows Live Writerでもエラーが出ないのだろうか?

ProxomitronSSLの通信内容を覗いてみようと試みたが、Windows Live Writerから通信路の信頼が得られないと表示されてあえなく断念。さすがはSSL

※訂正:

Windows Live Writerのアカウント設定を以下のように設定することで正常にSeeSaaに投稿できるようになった。

f:id:mytown:20071014002444j:image

使用するブログの種類は、「Movable Type」を選択。

URLはnon-sslでもsslでもOK。

ひとまずこれでアカウントを作成する。

f:id:mytown:20071014002514j:image

一番重要なポイントは、アカウント作成後、詳細設定で文字セットの設定を変更する。既定ではなぜかShift-JISになっているので、これをUTF-8に変更すればOK。問題はこれだけだったようだ。

[]Jcode.pm

PerlでXMLRPC::Liteを使用し、XML-RPCに対応したブログシステムに自動投稿することを考えている。

blogger.newPostメソッドを使用し、投稿できるところまでは確認できたのだが、日本語だと文字化けする。

日本語で投稿するためには、UTF8で投稿する必要があるため、Jcode.pmを導入して文字コードを変換してから投稿すれば良い。

My Memoz - Jcode.pm

#!/usr/local/bin/perl

use XMLRPC::Lite;
use Jcode;

$uri = 'XML-RPCを受け入れてくれるURL';
$blogid = "1";
$user = "ユーザ名";
$password = "パスワード";
$appkey = "";
$content = "テストエントリ";
$publish = true;

$content = Jcode->new($content, euc)->utf8;

 $res = XMLRPC::Lite
        ->proxy( $uri )
        ->call('blogger.newPost', $appkey, $blogid, $user, $password, $content, $publish)
        ->result;

 print "res = $res \n";
 exit;

[]エンディアン

CPUによって、バイトデータの格納順が異なることは知っていたが、改めて調べてみた。

エンディアンについては、以下が詳しい。

エンディアン - Wikipedia

手元にあるHD-HGLAN(CPUPowerPC)でサンプルプログラムを作って確認したところ以下のようになった。

PowerPC

x86ウィキペディアより)

#include <stdio.h>

main() {
  char *str = "\x01\x23\x45\x67\x89\xab\xcd\xef";
  unsigned *u = (unsigned *)(str + 1);

  printf ( "%08x\n", *u );
}

HD-HGLAN上での実行結果は以下の通り。

23456789

参考:ARM gcc バッドノウハウ集: アラインメントによると、

x86上で実行すると、

89674523

ARM上で実行すると以下のようになるらしい。

01674523

さらに、参考:ARM gcc バッドノウハウ集: アラインメントによると、

アラインメント条件を満たさないメモリアクセスが発生した場合,ARM では例外が発生します.が,ARM Linux 上ではこの例外をカーネルで捕捉し,「うまく処理する」ようになっています.

ARM Linux では /proc/cpu/alignment で,この例外の捕捉状況を表示したり,処理の変更を指示することができます.

    $ cat /proc/cpu/alignment
    User:           0
    System:         0
    Skipped:        0
    Half:           0
    Word:           0
    Multi:          0
    User faults:    0 (ignored)

/proc/cpu/alignment に書き込む値とハンドラの動作は以下の通りになります.また,各値の bit OR で,複数の動作を指示することもできます.例えば `3' を書き込むと warn と fixup の両方の処理を行います.

  • 0

ignore.例外を単に無視する

  • 1

warn.例外発生を dmesg に出力

  • 2

fixup.例外発生の命令を解釈し,メモリアクセスのつじつまを合わせる

  • 3

warnとfixupの両方の処理を行う

  • 4

signal.バスエラーを発生させる.ユーザプログラムは core を吐いて終了

/proc/cpu/alignmentに"2"を書き込むと、実行結果は以下のようになり、例外ハンドラで「x86 と同様のメモリアクセス」をエミュレートされるようだ。

89674523

ARMは癖が強いと巷ではよく耳にするが、玄箱Proを導入する際は何かと苦労するかもしれない。

f:id:mytown:20071014002514j:image

Connection: close