Archive for 4月, 2011

AIR for Androidを使って、デバッグをどうやってやるか考えた。

1つはUSB接続でのデバッグなのだが、どうしても、いろいろ説明を読むのが面倒なのと、
それと、実際にUSB接続をしていないときでも、どのように動いているかをきちんと知りたいと思った。

要は、ログの出力機能もアプリの仕様のうちとしてしまいたい。
なんか、おかしいんですけど・・・って言われたときに、
じゃ、端末貸してと言って、そこで、デバッグを出せるようにしたいということ。
(まだそんなシーンは想定できないが・・・)

さらに、画面(スクリーン)に出すのもいやだ。
(小さい画面に、変な情報がわんさかでてくるのは見苦しい。)

だったら、やっぱり私的にはSyslogなのです。

ただし、どうやらAndroid上でのAIRではUDPが使えないようだ。
(実際には、知らないだけかもしれないが、どうして使えないのか調べるのが面倒なので・・・)
代わりに、TCPを使ってSyslogにログを送信する。

必要なもの

1) Syslogサーバ
私はrsyslogを使いました。CentOSなどではこちらが容易に使えます。syslog-ngでもいいかとも思います(私は個人的にはこちらのほうが好きです。)

2) TCPSyslogTarget クラス
 airxlib_log よりダウンロードしてください。
 UDPができて、それで闇に葬ろうと思っていたクラスが、私的には再び表に出てしまいました。。。

3) WiFi接続環境。
 必須ではありませんが、それなりにそれ以外のネットワークの知識も必要になると思います。

準備

rsyslogでは

$ModLoad imtcp.so
$InputTCPServerRun 514
$AllowedSender TCP, 127.0.0.1, 192.168.1.0/24

:
local1.*                                                /var/log/air.log

のようにして、TCPでsyslogを受け付けるようにしてください。
私は192.168.1のネットワーク環境を構築しているので、このような設定です。
また、私はlocal1のログはすべて、/var/log/air.logに出力するようにしました。
つまり、AIR側での出力でも、local1のfacilityを選択する必要があるという事です。

次に、ログの記述方法ですが、こちらはflexのlogging機能を使うだけです。

import com.coltware.airxlib.log.TCPSyslogTarget;

//  私のsyslogサーバは192.168.1.5です。
var syslog:TCPSyslogTarget = new TCPSyslogTarget("192.168.1.5");
syslog.program = "AdobeAIR";
syslog.filters = ["*"];
syslog.level = LogEventLevel.DEBUG;
syslog.facility = TCPSyslogTarget.LOG_LOCAL1;
syslog.includeCategory = true;
Log.addTarget(syslog);

あとは、いつも通り、

import mx.logging.ILogger;
import mx.logging.Log;

private static var log:ILogger = Log.getLogger("foofoo");
log.debug("mmmmmm....");

みたいに書けばいいだけです。

airxmailでhotmailのサーバーからメールを送信するにはどうすればいいの?
という質問を受けて、試してみた。

hotmailのサイトからは確かに、メールを送信するための情報は見つからなかった。
が、もらった質問からやってみて、うまくいった設定を記録しておきます。

1 ) サーバ&ポート番号
smtp.live.com ( 587 )
2 ) STARTTLSとas3cryptoを使う。

//  STARTTLS Handler
sender.addEventListener(SMTPEvent.SMTP_START_TLS,startTlsHandler);

public function startTlsHandler(event:SMTPEvent):void{
	var sock:Socket = event.socket as Socket;
	var tls:TLSSocket = new TLSSocket();
	sender.setParameter(SMTPSender.SOCKET_OBJECT,tls);
	tls.startTLS(sock,"smtp.live.com");
}

とこんな感じで、メールを送ります。
でも、最初にメールを送ると、以下のようなエラーが発生します。

550 5.3.4 Requested action not taken; To continue sending messages, please sign in to your account.

最初、意味がわからなかったのですが、hotmailのWeb Mailを見てみると、

—-
引き続きメッセージを送信するには、Windows Live Hotmail のアカウント (http://mail.live.com) にサインインしてください。サインインすると、画像が表示されますので、表示されている文字と数字を入力してください。

この認証チェックは、自動プログラムによる迷惑メールの送信を防止するために実施しています。
—-

のようにメールが来ていましたので、その通りに、サインインして、指示の通りにしてから、
再度、処理を実行すると今度はうまく動きました。

airxmailのasdocを作ってみました。
といっても、コメント部分はそれをきちんと考えられて記述されているわけではないので、
結構いい加減だったなと。
今後、もうちょっと、整えていくつもりです。

airxmail asdoc

google code内に何とかおいて見えるようにしたいと思っていましたが、
やり方がわからず、とりあえず、こちらにおきました。

AntでOS毎に自動でコマンドを分けたい。

やりたい事は、windowsでは、asdoc.exe だが、Linuxでは、asdocコマンドなので、
実行する際に、OSを判断してそれらのコマンド勝手に使い分けてほしい。ということである。
それは以下のようにしてできる。

<condition property="asdoc_bin" value="asdoc.exe">
    <os family="windows" />
</condition>
<condition property="asdoc_bin" value="asdoc">
    <os family="unix" />
</condition>
<exec executable="${FLEX_BIN}/${asdoc_bin}">
   : 
</exec>

このように、conditionタスクを使えば、os毎に変数の値を変えられるので、
それを利用し実際の処理の部分をその値にすれば、返られるというわけ。

Version 0.6 からだいぶ時間がかかってしまいましたが、
その間にテスト的(かなり不十分で、バグもありましたが・・・)に
IMAP4を実装したものをswcファイルとしてgoogle codeにあげておきましたが、
だいぶ使えるようになってきたなとおもってきたので、ここで、Version 0.7 とすることにしました。

以下から、ダウンロードしてください。
google code download

これで一応は、
SMTP/ POP3 / IMAP4 が1つのライブラリでPure ActionScript3として使えるようになりました。

今回は、Flex 3.4でBuildしています。
特に、Flex4.xとFlex3.4で分けることをしませんでした。
確か、Module周りで混ぜるとなにやら影響があったようなことを記憶していますが、忘れてしまいました。
その場合には、branches/v0_7から取得してください。

とりあえず、これからは当面、復習も含め、ドキュメント周りの拡充にしようとおもいます。

先日、久々にo’reilly のアプリ(電子書籍)を購入したのですが、
これが、IS03をAndorid 2.2にしてからインストールができなくなりました。

何度、インストールを試みても、「microSDカードにインストールできません」
(この文言は定かではありませんが、それらしきこと)のように、
言われインストールできないのです。

あー、もしかして、アプリのインストール先をmicroSDカードにしたせいかな?
と思って、その設定を「本体」に変えてみても、状況は変わりません。

んー、おかしい。おかしい。
とおもって、microSDカードをアンマウントしてから、インストールしてみたらできました。

アプリが原因なのか?本体が原因なのか?はたまた、マーケットのシステムが原因なのかはわかりませんが、
とにかく、インストーラ関連でおかしいのだとおもうのです。

後は、ホームのページスクロール(というのでしょうか?)でも、よく固まり、「ホームが応答しません」みたいにでてくるようになりました。

ちょっと、2.2にアップして最近、不具合が目立つようになってきたなーという印象があります。
過去の状態からの引き継ぎで、多少おかしくなったりするのは、やむを得ないということもわかりますので、
できれば、AUショップで工場出荷レベルに戻すという感じでのバージョンアップってサポートしてほしいなということもおもったりしました。

結局は、PCだってOSを購入して、個別に入れるのは一般的なコンシューマレベルでは通常ではないのだから、
携帯だって、いずれそうなって、それでまずは、使えるレベルに広まったということなのでしょう。

ただ、まだまだ、Androidのバージョン番号があーだ、こーだがマーケティングにも使われているうちは、
しょうがないのかもしれませんが・・・

でも、アプリの作り手としては、それらの問題を通して中身やら、仕組み、制限がわかったりもするので、
経験としてもっているのは、それはそれで別の意味ではよいのかもしれませんが・・・・

私のairxmailにコメントをくれた方のサイトからちょっと紹介。

sparkのDataGridコンポーネントを使って、ツリー表示を実装しています。
Playing with Spark DataGrid part 3 : Hierarchy

現在、DBのデータを使ってそのまま、CollectionViewを作るプログラムを作っていたが、
やはり、メールなどでスレッドっぽく表示するには、ツリー構造のデータを作るにはどうすればいいのかな?
と思いつつも、まったく手つかずだったのだが、思いがけないところから情報を得ることができました。

まだソースはよく見れていませんが、サンプルを見るとまさしく私がやりたかったことだったので、
非常に助かりました。

データ構造だけを後でちょっと、自作してDBから直接ツリー表示の為のCollectionViewを作ろうと思います。

IS03をAndroid 2.2にバージョンアップしてみました。
感想はといえば・・・・

うーーん。です。
Adobe AIRを使えるように入れて、適当にサンプルアプリも見てみましたが、
問題なく使えました。
そう思ってみれば多少早くなったと言えるのかわかりませんが、
まあ、遅くなったとは思いませんので、早くはなったのでしょう。

しかし、これといって、通常の利用ではそれほどバージョンアップをしたからと言ってよくなったとも思えません。

そして、ちょっと不具合がありました。
これの原因はまったくわかりませんが、初めていわゆるフリーズが起きました。
まったく、何を押しても、そして、電源ボタンをおしても反応しなくなったので、
しょうがないので、電池を抜きました。

そして、電源を再度入れてみたところ、
SDカードの認識に非常に時間がかかるようになりました。
SDカードのアプリを入れたからかもしれません。

まあ、電話ですからつかわなくなったら電源を落とすという使い方をするわけでもありませんので、
それほど通常は問題がないのかもしれませんが、
多少SDカードに入れたアプリの認識には時間がかかります。
(それでもClass10のSDカードを使ってはいるのですが・・・・)

という意味では、よく使うアプリはやはりSDカードではなく、
本体のメモリに入れた方がよいのかもしれません。

まあ、当たり前なのかもしれませんが、バージョンアップとか、
その後の、不具合の予測や関連性の把握の困難など・・・
ますますPCに近づいたような気がします。
(いい意味ではない方向に・・・)

airxmailのプロジェクトもまだまだ小さいものの、
私個人の趣味のプロジェクトとはいえないようになってきたと思うし、そうしたいと思ってきた。
そこでほかの人の力も借りようとおもうようになり、
また、協力したいという方も現れたことは大変ありがたいことだと思っている。

今までも、使ってもらい、あそこがおかしい、
ここがおかしいとバグを見つけては報告してもらった方々の力も借りていたのですが・・・・

そこで、ちょっと、このプロジェクトの方向性をドラフトながらまとめておきたいと思い、
ここに書いてみることにしました。

バージョンとその方向性

0.x : 基本的なメールプロトコル( SMTP/POP3/IMAP) のサポート

1.0 : Sender API と Folder API の実装

SMTPは、Sender APIとして基本的な使い方として送信したいならSMTPを知らなくてもいいよ。という意味で、
Sender API を作ることができたが、
しかしながら、Folder API としてPOP3/IMAP4の共通部分だけ取り出してFolder APIの実装が全然できていない。
1.0ではここをやりたいなと。
Java Mailをまねればいいやと思っていたが、以外にも非同期処理がそれを狂わしています。

1.5 : Mobile AIR上での動作
まずは、私が持っているIS03の上で確認するしかないのですが、それでできれば・・・・
実は何もする必要がないのか、それともあれもこれもとなるのは実はまだ何もわかっていません。
ただ、もしかしたら、1.0と逆転するかもしれませんが・・・今のところ・・・はここ。

2.0: オリジナルプロトコルの挑戦
ここまでたどり着けるか・・・・・はわかりませんが、私がやりたいのはここなのです。
是非とも、Java-Brigeを作ってその通信としてメールの送受信をしたいなーと。
だって、AIR(Flex)ってすべてで画面更新を頭のすみにおいて考えなければならず、つくりずらいよー。
だったら、やっぱり、処理はバックグラウンドに持って行けるようにしたいなーと。
Java-Brigeの方も進めていたのですが、最近ちょっと止まっています。
JBoss nettyでこれでできるできる・・・とまでは確認ができているのですが、
実際にメール関連の接続はまだまだです。


これに伴い、徐々にですが、ドキュメントもブログでまとまってきたものから、
googlecodeの方に移していきたいと思っています。

でも、googlecodeのwikiの使い方がまだなれません。
(pukiwikiしか使っていませんし。)


さらに更新ごとにリビジョンが上がってしまい、困ります。
どこか別の場所で書いて、それをgooglecode上でみたように、確認する方法はないものでしょうか?

前回、airxmailで受信したメールをファイルに保存する方法を紹介しましたが、
今回は、その保存したファイルを再度、MimeMessage形式にパースする方法です。

そして、前提も同様に、ここで書かれていることをすべて実行するには、またSubversionのr91まで取得する必要があります。
(そろそろ、バージョン0.7のリリースをしたいなとおもっています。まあ、IMAPもいろいろと使ってくれているようで、思ったよりも問題もなさそうなので・・・)

話はもどって、保存したファイルからパースする方法です。

//
// dirはメールのファイルが保存してあるディレクトリのFileインスタンスです。
//
var list:Array = dir.getDirectoryListing();
var length:int = list.length;
for(var i:int = 0; i<length; i++){
	var file:File = list[i];
        if(!file.isDirectory){
	        var fs:FileStream = new FileStream();
	        fs.openAsync(file,FileMode.READ);
	        fs.open(file,FileMode.READ);

                //  ここからが本題
	        var parser:MailParser = new MailParser();
	        var msg:MimeMessage = parser.parseStream(fs);
	        var text:String = msg.bodyText;

	        log.debug("subject : [" + msg.subjectUTF8 + "]");
	        log.debug(text);

	       fs.close();
	}
}

とこのような感じになります。
簡単にパースができるように、MailParserというクラスにparseStream(IDataInput)という関数を追加しました。
ただし、このサンプルを見てもわかるように、データの読込が同期型しか対応ができません。

実はこの関数の中身を見れば、非同期型もできるとは思うのですが、
そこまでは対応できていません。
(いずれしたいとおもいますが、それは0.7のリリース後にやりたいと思います。)

ソフトウェア&ライブラリ



ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
カレンダー
2011年4月
« 3月   5月 »
 123
45678910
11121314151617
18192021222324
252627282930  

カスタム検索
RSS
Add to Google
カテゴリ
にほんブログ村 IT技術ブログへ