<?xml version="1.0" encoding="utf-8"?>

<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:cc="http://web.resource.org/cc/"
  xmlns="http://purl.org/rss/1.0/">

  <channel rdf:about="http://unknownplace.org/memo/">
    <title>unknownplace.org</title>
    <description>powered by CLON 0.2</description>
    <link>http://unknownplace.org/memo/</link>
    <dc:language>ja</dc:language>
    <dc:creator>typester</dc:creator>
    <dc:date>2009-07-02T15:29:00+09:00</dc:date>
    <admin:generatorAgent rdf:resource="http://unknownplace.org/apps/clon?v=0.2" />

    <items>
      <rdf:Seq>
   
	<rdf:li rdf:resource="http://unknownplace.org/memo/2009/07/02#e002" />
   
	<rdf:li rdf:resource="http://unknownplace.org/memo/2009/07/02#e001" />
   
	<rdf:li rdf:resource="http://unknownplace.org/memo/2009/06/25#e001" />
   
	<rdf:li rdf:resource="http://unknownplace.org/memo/2009/06/22#e001" />
         </rdf:Seq>
    </items>
  </channel>

  <item rdf:about="http://unknownplace.org/memo/2009/07/02#e002">
    <title>15:29  さっきのパッチ取り込んでもらった</title>
    <description />
    <link>http://unknownplace.org/memo/2009/07/02#e002</link>
    <content:encoded><![CDATA[<p>なんと <a href="http://www.fsck.com/">jesse</a> のプロジェクトだったらしい。パッケージ名でなんか見たことあるなーって思ってたんだけど、気がつかなかったなぁ。世間せまい！</p>

<p>コミット権もらったのでこれからもなんかあったら貢献しよう。</p>
]]></content:encoded>
    <dc:subject>android</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2009-07-02T15:29:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2009/07/02#e001">
    <title>11:37  k9mailを日本語環境でただしく使えるようにした</title>
    <description />
    <link>http://unknownplace.org/memo/2009/07/02#e001</link>
    <content:encoded><![CDATA[<p>GDP1 で android のメールアプリが <code>Connection error</code> と言うエラーで新しいメールをまったく受信してくれない状態になってしまった。GDDフォンだとこの問題はいまのところ出たことはない。</p>

<p>昔、 brad のブログで <a href="http://code.google.com/p/k9mail/">k9mail</a> というのを見たのを思い出したのでそれを入れてみたのだが、ヘッダーのエンコード処理がされておらず日本語の件名などをつかうと化け化けになってしまう。</p>

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

<pre><code>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 &lt; text.length(); i++) {
+            char c = text.charAt(i);
+            if (c &lt; 0x20 || 0x7e &lt; c) { // non printable
+                if (c != 0x0a &amp;&amp; c != 0x0d) { // non LF/CR
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
     class Field {
         String name;
</code></pre>

<p><a href="http://github.com/typester/android-k9mail/commit/9c37dbdf51ec8ef009b4c6564b0cddcf5f25cbc7">github</a> にもあげた。</p>

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

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

<p>エンコードされないとかどう見てもバグなので <a href="http://code.google.com/p/k9mail/issues/detail?id=534">issue</a> 登録しておいた。パッチは採用されないと思うけどｗ
android のメールではこの問題はおこらないということは com.android.* なところはいじらなくても実現可能ということなので。</p>
]]></content:encoded>
    <dc:subject>android</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2009-07-02T11:37:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2009/06/25#e001">
    <title>18:11  Text::MicroTemplate を拡張してみた</title>
    <description />
    <link>http://unknownplace.org/memo/2009/06/25#e001</link>
    <content:encoded><![CDATA[<p>最近は <a href="http://search.cpan.org/dist/Text-MicroTemplate/">Text::MicroTemplate (TMT)</a> をよく利用するようになったのですが、使用するにつれ不満なところが出てきたのでそれを解決するために少し拡張してみました。</p>

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

<blockquote>
  <p><a href="http://github.com/typester/text-microtemplate-extended-perl/tree/master">http://github.com/typester/text-microtemplate-extended-perl/tree/master</a></p>
</blockquote>

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

<h4>テンプレートの継承機能を追加</h4>

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

<pre><code>&lt;?=r $self-&gt;render_file('header.mt') ?&gt;

ここにコンテンツ

&lt;?=r $self-&gt;render_file('footer.mt') ?&gt;
</code></pre>

<p>などのように書くことになりますが、これは <a href="http://search.cpan.org/dist/Template-Toolkit/">TT</a> の wrapper 機能などに慣れていると少しめんどくさい。</p>

<p><ins>追記： TMTでもwrapperはつかえるみたいです。＞ $mtf->wrapper_file</ins></p>

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

<p>詳しい説明は <a href="http://djangoproject.jp/doc/ja/1.0/topics/templates.html#template-inheritance">Django のテンプレートのドキュメント</a>がとても詳しいのでそちらを参照するといいと思います。</p>

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

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

&lt;body&gt;
    &lt;div id="sidebar"&gt;
        &lt;? block sidebar =&gt; sub { ?&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;a href="/"&gt;Home&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href="/blog/"&gt;Blog&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
        &lt;? } ?&gt;
    &lt;/div&gt;

    &lt;div id="content"&gt;
        &lt;? block content =&gt; sub {} ?&gt;
    &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>child.html (child.mt) は：</p>

<pre><code>? extends 'base'

&lt;? block title =&gt; sub { ?&gt;My amazing blog&lt;? } ?&gt;

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

<p>のようになります。</p>

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

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

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

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

<pre><code>Text::MicroTemplate::Extended-&gt;new( include_path =&gt; ['.'], template_args =&gt; { foo =&gt; 'bar' } );
</code></pre>

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

<pre><code>&lt;?= $foo ?&gt; # =&gt; bar
</code></pre>

<p>と参照することができるようになるという機能です。</p>
]]></content:encoded>
    <dc:subject>perl</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2009-06-25T18:11:00+09:00</dc:date>
  </item>
  <item rdf:about="http://unknownplace.org/memo/2009/06/22#e001">
    <title>22:52  SBankNotify for android</title>
    <description />
    <link>http://unknownplace.org/memo/2009/06/22#e001</link>
    <content:encoded><![CDATA[<p>android アプリケーションの習作に、iPhone脱獄アプリ<a href="http://moyashi.air-nifty.com/hitori/2008/08/iphoneeiisoftba_1145.html">SBankNotify</a>を android に移植してみました。</p>

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

<p>アプリは android マーケットにアップしてあるのでマーケットアプリで「SBankNotify」と検索するとこのアプリが見つかると思いますが、正直めんどくさいので<a href="http://www.cyrket.com/package/org.unknownplace.sbanknotify">このサイト</a>のQRコードを「BarcodeScanner」で読み取ってマーケットのアプリページに飛ぶのが簡単です。</p>

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

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

<p>ソースコードは github に置いています。</p>

<blockquote>
  <p><a href="http://github.com/typester/android-sbanknotify">http://github.com/typester/android-sbanknotify</a></p>
</blockquote>
]]></content:encoded>
    <dc:subject>android</dc:subject>
    <dc:creator>typester</dc:creator>
    <dc:date>2009-06-22T22:52:00+09:00</dc:date>
  </item>
</rdf:RDF>
