unknownplace.org

# 2009-07-02

さっきのパッチ取り込んでもらった

なんと jesse のプロジェクトだったらしい。パッケージ名でなんか見たことあるなーって思ってたんだけど、気がつかなかったなぁ。世間せまい!

コミット権もらったのでこれからもなんかあったら貢献しよう。

k9mailを日本語環境でただしく使えるようにした

GDP1 で android のメールアプリが Connection error と言うエラーで新しいメールをまったく受信してくれない状態になってしまった。GDDフォンだとこの問題はいまのところ出たことはない。

昔、 brad のブログで k9mail というのを見たのを思い出したのでそれを入れてみたのだが、ヘッダーのエンコード処理がされておらず日本語の件名などをつかうと化け化けになってしまう。

機能的には k9mail のほうが優れていて、このエンコード問題さえ解決できれば使えそうだなーと思ったのでいっちょパッチを書いてみた。

diff --git a/src/com/android/email/mail/internet/MimeHeader.java b/src/com/android/email/mail/internet/MimeHeader.java
index 24aad4d..a117e08 100644
--- a/src/com/android/email/mail/internet/MimeHeader.java
+++ b/src/com/android/email/mail/internet/MimeHeader.java
@@ -11,6 +11,7 @@ import java.util.List;
 import com.android.email.Email;
 import com.android.email.Utility;
 import com.android.email.mail.MessagingException;
+import org.apache.james.mime4j.codec.EncoderUtil;

 public class MimeHeader {
     /**
@@ -97,12 +98,35 @@ public class MimeHeader {
         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out), 1024);
         for (Field field : mFields) {
             if (!Utility.arrayContains(writeOmitFields, field.name)) {
-                writer.write(field.name + ": " + field.value + "\r\n");
+                String v = field.value;
+
+                if (hasToBeEncoded(v)) {
+                    v = EncoderUtil.encodeEncodedWord(
+                        field.value,
+                        EncoderUtil.Usage.WORD_ENTITY
+                    );
+                }
+
+                writer.write(field.name + ": " + v + "\r\n");
             }
         }
         writer.flush();
     }

+    // encode non printable characters except LF/CR codes.
+    public boolean hasToBeEncoded(String text) {
+        for (int i = 0; i < text.length(); i++) {
+            char c = text.charAt(i);
+            if (c < 0x20 || 0x7e < c) { // non printable
+                if (c != 0x0a && c != 0x0d) { // non LF/CR
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
     class Field {
         String name;

github にもあげた。

この実装がただしいかどうかはわからないけど、これで一応ちゃんとエンコードされるようになる。

ところで、おもしろいのがこのパッチは com.android. なパッケージを編集してしまっていると言うこと。 なんと k9mail は com.android.* のパッケージも含んでいるのである。android のメール機能を持ってきて再利用している。 これはアプリごとにVMが別れてるandroidだからできることなのかなぁとか思ったりした。

エンコードされないとかどう見てもバグなので issue 登録しておいた。パッチは採用されないと思うけどw android のメールではこの問題はおこらないということは com.android.* なところはいじらなくても実現可能ということなので。

# 2009-06-25

Text::MicroTemplate を拡張してみた

最近は Text::MicroTemplate (TMT) をよく利用するようになったのですが、使用するにつれ不満なところが出てきたのでそれを解決するために少し拡張してみました。

実際には拡張したのは Text::MicroTemplate ではなく、Text::MicroTemplate::File です。

http://github.com/typester/text-microtemplate-extended-perl/tree/master

現在二つの機能を追加してあるのでそれを以下にまとめておきます。

テンプレートの継承機能を追加

テンプレートを分割するような規模になってくると現状の TMT では

<?=r $self->render_file('header.mt') ?>

ここにコンテンツ

<?=r $self->render_file('footer.mt') ?>

などのように書くことになりますが、これは TT の wrapper 機能などに慣れていると少しめんどくさい。

追記: TMTでもwrapperはつかえるみたいです。> $mtf->wrapper_file

そこで、TMT でも wrapper 機能をつかえるように!! ・・・しようかと思ったのですがやめて、代わりに Django のテンプレートなどで採用されている継承という仕組みを実装してみました。

詳しい説明は Django のテンプレートのドキュメントがとても詳しいのでそちらを参照するといいと思います。

で、上記の Django ドキュメントにあるテンプレート継承の例をこの拡張版 TMT で書くとどうなるかというと、base.html (base.mt) が

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <link rel="stylesheet" href="style.css" />
    <title><? block title => sub { ?>My amazing site<? } ?></title>
</head>

<body>
    <div id="sidebar">
        <? block sidebar => sub { ?>
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
        <? } ?>
    </div>

    <div id="content">
        <? block content => sub {} ?>
    </div>
</body>
</html>

child.html (child.mt) は:

? extends 'base'

<? block title => sub { ?>My amazing blog<? } ?>

? block content => sub {
? for my $entry (@$blog_entries) {
    <h2><?= $entry->title ?></h2>
    <p><?= $entry->body ?></p>
? } # endfor
? } # endblock

のようになります。

TT のような wrapper という方式と、このような継承という仕組みはどちらも一長一短ありますが、柔軟にテンプレートを定義できるのは継承の方かなぁと感じてます。

ちなみに Django テンプレートに実装されている block.super 相当の機能はまだ実装できていません。

テンプレートに名前付き引数を渡せる機能を追加

もう一つ、テンプレートに名前付きで値を渡せる機能も追加しました。オブジェクトを作成するときに

Text::MicroTemplate::Extended->new( include_path => ['.'], template_args => { foo => 'bar' } );

などのように template_args パラメータにハッシュリファレンスを渡しておくと、テンプレート中でこのハッシュのキーを

<?= $foo ?> # => bar

と参照することができるようになるという機能です。

# 2009-06-22

SBankNotify for android

android アプリケーションの習作に、iPhone脱獄アプリSBankNotifyを android に移植してみました。

インストールするだけで自動的に機能が有効になります。必要がなくなったらアンインストールしてください。 機能の詳細などは上記の本家SBankNotifyのページを参照ください。

アプリは android マーケットにアップしてあるのでマーケットアプリで「SBankNotify」と検索するとこのアプリが見つかると思いますが、正直めんどくさいのでこのサイトのQRコードを「BarcodeScanner」で読み取ってマーケットのアプリページに飛ぶのが簡単です。

将来気が向いたら設定ダイアログも作ろうと思っています。通知のON/OFFとかその方法の選択とかですね。

というわけで僕的 Hello Android World! でしたが、目的が不明なものを作ってしまった。。。今度はもう少しまともなアプリに挑戦します。

ソースコードは github に置いています。

http://github.com/typester/android-sbanknotify

Page 1 of 215: 1 2 3 4 5 6 7 8 9 10


Fork me on GitHub