2010年12月08日

Android や iOS から BlognPlus へ投稿できるようにするモジュール

ケータイを is03 に変えました。Android、いいですね。いろいろ試してみるためにプログラムを作ってみました。でも、アプリではありません。

BlognPlus というブログシステムの機能拡張のモジュールです。Android から写真や記事投稿できるようにします。でもこれを作る過程でアプリの開発環境を構築して、ブログクライアントのデバッグもやったりしたので、いろいろ勉強になりました。

これをBlognPlusにインストールすると、Android から記事を投稿できるようになります。
たぶん、iPhone からも投稿できるはずです。iPad からできましたから。

どうやって Android から投稿するのかというと、もちろん XML-RPC API を通じてです。以前、BlognPlusにブログペットを配置できるようにするモジュールBlognPetを作りましたが、あれは実際、ブログペットで使う最低限のAPIを実装したものでした。これをAndorid にあるブログ投稿用のアプリで使えるようにAPIの数を増やしてみたわけです。今回は画面にパーツを配置する必要はないので、純粋にAPIを実装させただけのものになります。

BlognPlus 本体も、2.6.1あたりからXML-RPC API 対応になっています。これは外部ライブラリーを使わずに直接書かれているすごいものなんですが、iPad や Android にあるアプリからの利用はうまくいきませんでした。

そこで、以前作りかけていたコードを引っ張り出して作ってみました。BlognPlus 本体の方で対応できるまでのつなぎという感じです。これで、Android から BlognPlusへ 写真付きの投稿ができるようになります。

とりあえず、ここで公開しておきます。

ダウンロード
↓↓↓
blogapi_module_101.zip
追記:
wp.getPageStatusList、wp.getPostStatusList の解釈の間違いを修正。metaWeblog.deletePost の追加。

お約束ですが、自己責任でご利用ください。モジュールの性質上、記事データベースを操作しますので、必ず、記事のデータなどをバックアップしてから使ってください。


このアーカイブを展開し、xmlrpc.php を blognplus の index.php ファイルと同じフォルダに配置します。blogapiフォルダをまるごと、moduleフォルダ内に配置します。あとはブログクライアントで設定をすれば、使えるようになります。


■ 利用できる Android ブログクライアントの紹介

WordPress for Android

とても高機能な WordPress 用の公式ブログクライアントです。このモジュールはこのクライアントで利用できることを目標に作っています。記事の投稿、編集、カテゴリーの追加、写真の投稿、コメントへの返信などができます。また新着コメントの通知機能も利用できます。本来 WordPress 用のものですから、仕様が変われば今後も使い続けられるかどうかわかりませんが、今のところとても快適に使うことができます。

ただし以下の問題があります。
・BlognPlus には WordPress特有のページコンテンツがないので既存のページを見ることはできません。
・記事やコメントを全部削除してしまうと、最後に消したものがリストに残ってしまいます。新たな記事やコメントができると解決します。
・公開していない記事のプレビューを見ると文字化けします。


アカウント登録画面で各自がサーバーに配置したWordPress で利用するための設定を利用します。三番目のボタンです。(is03ではこのボタンが数ミリしか見えていないので、がんばって押します。)

BlogURL欄に配置した BlognPlus のURL、Username欄とPassword欄に、BlognPlusに登録してあるユーザー名とパスワードを入力します。そして保存ボタンを押せば登録完了です。

あとはいろいろ試してください。


WordPress for Android だけでなく、「PostBot」や、「Drupal Editor」といったシンプルなクライアントからでも利用できます。ただし「PostBot」には記事の再編集機能がありません。「Drupal Editor」に画像投稿機能がありません。また新規投稿でカテゴリーの指定ができないアプリの側の問題があります。「Drupal Power」は残念ながら、エラーが出て使えません。



iPhone や iPadからも使えるんですが、使えたアプリの紹介は次回にします。ただ 予め書いておきますが、WordPress for iOS は利用できません。


なお、このモジュールでは、BSDライセンスの XML-RPC for PHP を利用しています。
http://phpxmlrpc.sourceforge.net/


最後に、この記事に書きましたブログペットは今月15日にサービス終了するので、BlognPetモジュールをご利用の方はすみやかに削除してください。


posted by takayan at 03:10 | Comment(0) | TrackBack(0) | BlognPlus | このブログの読者になる | 更新情報をチェックする

2010年12月10日

続 Android や iOS から BlognPlus へ投稿できるようにするモジュール

そういうわけで、BlognPlus に WordPress 互換の XMLRPC API を追加するモジュールですが、前回紹介した Android だけでなく、iPhone や iPad といった iOS 向けのブログクライアントからも投稿できます。

いまのところ問題なく使えているのは、有料アプリですが「BlogPress」です。

BlogPress にブログを登録するときは、予め用意されているブログサービスプロバイダから選んで登録します。汎用のブログを登録することがきないのですが、リストにある WordPress か Drupal を選べば登録できます。ユーザー名、パスワード、ブログURL を入力すれば BlognPlus で作ったブログを利用できるようになります。

BlogPress は他のWebサービスとの連動機能が優れています。Twitter、Facebook との連動や、画像の投稿先を Picasa、動画の投稿を Youtube にといったことができます。
注意点として画像を投稿したときなど、 HTMLタグが埋め込まれて表示されることがありますが、前もって BlognPlus の管理ページの初期設定タブを開いて、有効にするHTMLタグに追加しておくと、うまく動作します。


他に動作が確認できたクライアントは、「BlogWriter」、「BlogBooster」です。

BlogWriter も有料アプリです。なお広告付きの無料版の BlogWriter Lite もあります。
このアプリにも、いくつかのブログサービスの設定が用意されていますが、このモジュールを使うには自分で設置したWordPressに対して使う「Self-host WordPress Blog」か汎用の設定「Others」を使います。ちゃんと画像の投稿機能も使えます。

BlogBooster も有料版と無料版があります。アカウントの登録は黒いアイコンの方の WordPress を使います。無料版だと一つのブログしか登録できません。カテゴリーの指定はできませんでした。画像の投稿はできました。改行タグが空白のない「
」の形で挿入されるため、投稿後に記事の修正が必要になることがあります。


WordPress for iOS から投稿できるようにならないか、がんばってみましたが、できませんでした。アプリが落ちてしまいます。
そのため間違って繋がないように、このクライアントからの接続ができないようにしてあります。

前回はフリーズしてしまっていたのですが、今回何カ所かを修正したので記事を投稿するまではできるようになっています。それでも再編集しようとするとアプリの側が落ちてしまいます。XML-RPC のやりとりを見る限り問題はないように見えるのですが、確実に落ちます。iOS のデバッグ環境を作って調べてみないとこれ以上はわかりません。


とりあえず、PHP のプログラミングはここまでにして、Android に集中することにします。もちろん音声合成関連をいろいろ調べようと思います。


posted by takayan at 03:15 | Comment(0) | TrackBack(0) | BlognPlus | このブログの読者になる | 更新情報をチェックする

2010年12月21日

Android で日本語読ませる実験中

Android 楽しいです。
手軽にアプリが作れるってところがいいですね。Java はあまり使ってなかったのですが、勉強しててよかったです。ほんとそう思います。

今は、とりあえず、Aquestalk2 で漢字を含んだ文章を読ませる実験をしています。辞書はSDカードに直接書き込んでいるので、これが自動化できたら誰でも使えるようになるので、そうなったら公開できると思います。

speak_cap.jpg

今回は GoSen を Android 向けに改造したものを使って日本語を解析しています。MeCab を元に Java で書き直した Sen。その Sen を補強した GoSen です。それを Android で動くように少し書き換えました。Android で GoSen を動かそうとしたら、どういうわけか XML で書かれた設定ファイルを読み込むところで止まってしまいました。そこでXML関連の部分を書き直してみました。別なシンプルな方法があったかもしれませんが、とりあえずこれでいいはずです。

具体的には下記のように、Configuration loadConfiguration(String configurationFilename) を次の二つのメソッドで置き換えました。そしてそれに伴い必要なimport文を追加しました。


  /**
* get a XML Text field
*
* @param XmlPullParser
* @param The Tag name String
* @return The Text String
*/
private static String getXMLText(XmlPullParser parser,String name) {
try {
if ( parser.next() == XmlPullParser.TEXT) {
String text = parser.getText();
if ( parser.next() == XmlPullParser.END_TAG && name.equals(parser.getName()) ) {
return text;
}
}
}catch(Exception e) {
}
throw new IllegalArgumentException( "element '" + name + "' is invalid");
}


/**
* Loads a tokenizer configuration file for Android
*
* @param configurationFilename The filename of the configuration to load
* @return The loaded configuration
*/
private static Configuration loadConfiguration(String configurationFilename) {

String dictionaryVersion = "";
Configuration configuration = new Configuration();

try {

File configurationFile = new File(configurationFilename);
String parentDirectory = configurationFile.getParent();
if (parentDirectory == null) {
parentDirectory = ".";
}
String separator = System.getProperty("file.separator");

configuration.connectionCostFilename = parentDirectory + separator + CONNECTION_COST_DATA_FILENAME;
configuration.partOfSpeechDataFilename = parentDirectory + separator + PART_OF_SPEECH_DATA_FILENAME;
configuration.tokenFilename = parentDirectory + separator + TOKEN_DATA_FILENAME;
configuration.trieFilename = parentDirectory + separator + TRIE_DATA_FILENAME;

XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
parser.setInput(new FileInputStream(configurationFilename),"UTF-8");
int eventType;
while ((eventType = parser.next()) != XmlPullParser.END_DOCUMENT){
if (eventType == XmlPullParser.START_TAG && parser.getDepth() == 1 ) {
if ( "configuration".equals(parser.getName()) ) {
while (true) {
eventType = parser.next();
if ( eventType == XmlPullParser.END_TAG ) {
if ( "configuration".equals(parser.getName() )) {
break;
} else {
throw new IllegalArgumentException( "invalid end tag");
}
}
if ( eventType == XmlPullParser.TEXT ) {
continue;
}
if ( eventType != XmlPullParser.START_TAG ) {
throw new IllegalArgumentException( "invalid event");
}
String name = parser.getName();
if (name.equals("dictionary-version")) {
dictionaryVersion = getXMLText(parser,name);
} else if (name.equals("tokenizer")) {
configuration.tokenizerClassName = getXMLText(parser,name);
} else if (name.equals("unknown-pos")) {
configuration.unknownPartOfSpeechDescription = getXMLText(parser,name);
} else {
throw new IllegalArgumentException( "unknown tag");
}
}
}
}
}
} catch (Exception e) {
throw new IllegalArgumentException(e);
}
if (!dictionaryVersion.equals("1.0")) {
throw new IllegalArgumentException("Invalid dictionary version \"" + dictionaryVersion + "\"");
}
return configuration;
}



JARファイル
gosen-android-1.01.jar
このファイルのライセンスは LGPL です。
2011.01.06 更新
2.6.2以降のipadicにも対応させました。


関連ページ:
日本語形態素解析システムのJava実装SenをAndroid上で動かす
Sen Project
GoSen


GoSen を使うときに気をつけることは GoSen は LGPLライセンスだということです。GPL/LGPLライセンスのソフトは利用する分にはありがたいのですが、その反面、ソフトを書く側になると使いにくいのも事実です。ちゃんと理解しているか自信はありませんが、今回は LGPL のファイルからなる jar ファイルを利用するので、それを利用する側の本体のプログラムのソースを公開する義務は生じないと思います。間違っていたら指摘ください。

余計なことで悩まないように、誰かが現時点のトリプルライセンスになっている MeCab を元に、新しく Java で書き直して同じトリプルライセンスで公開してくれるとありがたいですね。そのときは是非 Man という名前で。


MeCab そのものを Android で使うというのもありだと思って、MeCab を JNI で動かせないかと模索もしています。既に ARM 向けにクロスコンパイルができることは確認できました。あとは、NDK の使い方を覚えたら何とかなるかもしれません。当然、それがうまくいけば次の段階として、内部で MeCab を使っている Open JTalk を Android でも使えるようにしたいと思っています。

最終的な目標は、Andorid で動く日本語のスクリーンリーダーです。Linux では Gnome Orca の続きをやらないといけないのに、NVDA もお手伝いしたいって気持ちはあるんですが、ちょっと今は、しばらくアンドロイドでいろいろプログラムを作ってみようと思います。



posted by takayan at 02:53 | Comment(0) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする
×

この広告は90日以上新しい記事の投稿がないブログに表示されております。