LaTeXでソースコードを掲載するためのlistingsパッケージ。

allttだと整形はされてもエスケープしないといけないし、verbatimだとタブが表示されないので無いかなぁと思ったら、listingsというパッケージがあることが 分かった 。参照元だと、日本語表示にはjlistingパッケージを使う必要があるとあったが、Debian GNU/Linux Sid/Squeezeの環境では特にそれは必要無かったので、usepackageの記述は変える必要があり。 1

\usepackage{listings}
(snip)
\begin{lstlisting}[label=src:json, caption=.couchapprcの設定]
{
    "title": "タイトル",
    "date": "2011-01-05"
}
\end{lstlisting}

といった感じで、ブレースや日本語も記述しても問題無し。ただし、このままだとフォントがserifになるので、あんまし見た目が良くないので、参照元で更に 参照している先 を参考に、begin{document}の前に次のを挿入したら、見た目もカスタマイズできてうれしい。

\lstset{%
 language={Java},
 backgroundcolor={\color[gray]{.85}},%
 basicstyle={\footnotesize},%
 identifierstyle={\footnotesize},%
 commentstyle={\footnotesize\itshape},%
 keywordstyle={\footnotesize\bfseries},%
 ndkeywordstyle={\footnotesize},%
 stringstyle={\footnotesize\ttfamily},
 frame={tb},
 breaklines=true,
 columns=[l]{fullflexible},%
 numbers=left,%
 xrightmargin=0zw,%
 xleftmargin=1zw,%
 numberstyle={\scriptsize},%
 stepnumber=1,
 numbersep=0.5zw,%
 lineskip=-0.5ex%
}

JavaScriptは対応してないようなのだが、CかJavaにしておけばまぁいいかなぁと。

あと、一行が長すぎて、breakline=trueで2行に巻き返しされると、2行目の背景色は指定した色にならなかったので、これはどうすれば良いか分からなかったので、とりあえずフォントサイズをfootnotesizeにして逃げた。w

部分的に変更したい場合。

LaTeXのソース全体ではlanguage={C}にしていて、一部をHTMLのコードにしたい場合は次のようにすればOK.

\begin{lstlisting}[language={HTML}]
1

jlistingを指定してもファイルがないというwarningが出る。

Froyoをすっ飛ばしてGingerbreadに。

いつまで待っても一向にFroyoの公式ファームウェアがやってこないmilestoneさん。最近固まる事が増えてきてしまい、CouchDBを使うのも遅くて困ってたので、買ってしまったよ、Nexus S。

到着までの長い長い日々。

1shopmobileで12/23の夕方に注文し、発送されたのが現地時間12/24。到着が本日1/4。長かった。まず長かったのが引き受けを受けた場所からシカゴの国際交換支店までに3日。どうも 大雪で交通機関が麻痺していた そうな。そこから成田までが2日。29日に到着して、通関手続きが始まったのが12/30。そこから音沙汰無しで成田から発送されたのが1/3。年末年始挟んでしまったので税関でエラい時間が掛かってしまった。

費用

1shopmobileで送料込みでUS$729。日本円で60,140~60,500円くらいだろう。うちEMSの料金が$41.30だった 1 ので、本体はUS$687.7で大体56,700~57,100円ならまぁ悪くないかなと。関税は通関料200円含めて1,700円。

写真

重さはPalm preやヨメのIS03と大体同じくらい。大きさはmilestoneよりも大きい。

../../../_images/20110104231537.jpg

並べてみた。

../../../_images/20110104232151.jpg

左上→左下→左から2列目の上→…の順に、(唯一残している)treo90, GDD Phone, palm pre, Milestone, Nexus S, (ヨメの)IS03, iPad。この1年でずいぶん増えたなぁー。大学~社会人2、3年目頃にPalmハンドヘルドを買いまくってた時のようだ…。

肝心のCouchDB on Androidは?

インストーラのインストールはできるのだが、インストーラを起動すると例外が発生して落ちてしまうため、インストールできない状況。しゃあないのでフィードバックの報告をしておいたが、よく見たらこれCouchIOの開発者に報告が行くんじゃなくて、Googleにレポートされるのか。バグレポート投げとこ。

追記。

注文先、メールで問い合わせとなっていたので、問い合わせたところ、クレジットカードと身分証明証のコピーをメールしてと言われたので、暗号化する手段ないかやりとりしていたのだけど、公開鍵暗号方式は敷居が高すぎる 2 し、共通鍵を安全に交換する手段もないので、Google Checkoutに対応したら再度検討するよと伝えて断念した。のだけど、個別でGoogle Checkoutでの対応をしてくれたので、注文先で購入することにしたのだった。対応良いですな。まぁできれば最初からそうしてくれれば良い気もする、というのは言っちゃダメだ。w

1

梱包に張ってあった。

2

直接会って本人確認できない

Mustache & CouchDB入門。

CouchDBのデザインドキュメントにMustacheのテンプレートエンジンを適用する方法についてのお話。これは英語のブログではそこそこ情報があるのだが、日本語ではid:yssk22さんのブログに 部分的に情報があるだけ なのでまとめてみた。

前フリ

CouchDBのデザインドキュメントでHTMLの画面を作る場合、もっともプリミティブな方法としては、JavaScriptで

function(head, req) {
   provides("html",function() {
      send("<!doctype html>");
(snip)
      send("</body>");
      return "</html>";
   });
}

とか、

function(doc, req) {
   provides("html", function() {
   return "<!doctype html>" +
(snip)
   "</body>" +
   "</html>";
   });
}

とするが、これは非常にコードが見づらい。CouchDBへのアプリのデプロイにCouchAppを使っていれば、これに mustacheJavaScript用のテンプレート がバンドルされているので、これを使おう。

前提環境

今回の環境は以下のとおり。

  • CouchDB 0.11 1

  • CouchApp 0.7.2 2

mutacheは前述のとおり、CouchAppに含まれているものを使う。

$ couchapp generate hoge

とすると、hoge/vendor/couchapp/lib/mustache.jsとして作られる。テンプレートは、hogeディレクトリの直下にtemplatesディレクトリを作り、そこにヒゲテンプレートを作るので、まず、ディレクトリを作っておこう。

$ mkdir hoge/templates

シンプルなテンプレートでHTMLを生成する。

まずはmustacheだけに慣れるために、ドキュメントを必要としないHTMLを生成してみよう。CouchDBのDB名をsampledbとして、”http://127.0.0.1:5984/sampledb/_design/hoge/_show/moge”でアクセスするとテンプレートで生成されたHTMLが返されるようにしてみる。用意するファイルは次の2つ。

  • hoge/shows/moge.js

  • hoge/templates/moge.html

内容はそれぞれ以下の通り。

moge.js

function(head, req) {
    start({
        "headers" : {
            "Content-type": "text/html"
        }
    });

    var mustache = require("vendor/couchapp/lib/mustache");
    var data = {
        "title": "タイトル",
        "hello": "こんにちは",
        "world": "世界"
    }

    return mustache.to_html(this.templates.moge, data);
}

moge.html

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>{{title}}</title>
  </head>
  <body>
    <h1>{{title}}</h1>
    <p>{{hello}}{{world}}</p>
  </body>
</html>

テンプレートのhoge/templates/mgoe.htmlが、moge.jsのto_html()の第一引数でthis.template.mogeにマッピングされ、第二引数にテンプレートに渡す変数をJSONで渡しているのが肝。デモは こちら

ループ処理を加えたテンプレートでHTMLを生成する。

先ほどのto_html()に渡すJSONを次のfuga.jsのように変更し、{{#list}} {{/list}}の間でループ処理させることができる。

  • hoge/shows/fuga.js

  • hoge/templates/fuga.html

内容はそれぞれ以下の通り。

fuga.js

function(head, req) {

    start({
        "headers" : {
            "Content-type": "text/html"
        }
    });

    var mustache = require("vendor/couchapp/lib/mustache");
    var data = {
     "title": "タイトル2",
     "datalist": [
         {
             "hello": "やあ",
             "world": "ヒゲさん。"
         },
         {
             "hello": "こんにちは",
             "world": "ボーズ。"
         }
     ]
    };

    return mustache.to_html(this.templates.fuga, data);

}

デモは こっち

fuga.html

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>{{title}}</title>
  </head>
  <body>
    <h1>{{title}}</h1>
    {{#datalist}}
    <p>{{hello}}{{world}}</p>
    {{/datalist}}
  </body>
</html>

ドキュメントをテンプレートで表示する。

今まではテンプレートで埋め込むデータをJavaScriptに直接埋め込んでいたが、これをドキュメントから取得するようにしてみよう。次のファイルだけを用意し、テンプレートは最初のmoge.htmlを利用する。

hoge/shows/foo.js

function(doc, req) {

    start({
        "headers" : {
            "Content-type": "text/html"
        }
    });

    var mustache = require("vendor/couchapp/lib/mustache");
    var data = {
     "title": doc.title,
     "hello": doc.hello,
     "world": doc.world
    };

    return mustache.to_html(this.templates.moge, data);

}

ドキュメント自体は 次のようなのもの用意 する。

{"_id":"4efbb2aec6ca7318c341885aa700368b","_rev":"1-13a1fc74866dfc068bb06d7095169034","title":"\u30bf\u30a4\u30c8\u30eb\uff13","hello":"\u3084\u3042","world":"\u3053\u307e\u3061\u3083\u3093"}

先ほどと違い、1行目のfunction()の第一引数がheadではなくdocになっているが、docにすることで、URLとしては デモ のURIのようにdoc._idを渡すことができる。

ドキュメントの各フィールドの値は、上記を見て分かる通り、”doc.fieldname”で取得できる。

ドキュメントのリストをテンプレートで表示する。

リストで表示するには、viewとlistを作る必要がある。テンプレートはfuga.htmlを使ってみる。

  • hoge/views/greetings/map.js

  • hoge/lists/bar.js

map.js

function(doc) {
    emit(doc._id, doc);
}

これは単純にdoc._idをキーに、ドキュメントを返す。 こんなドキュメントを用意 した。

{"total_rows":2,"offset":0,"rows":[
{"id":"4efbb2aec6ca7318c341885aa700368b","key":"4efbb2aec6ca7318c341885aa700368b","value":{"_id":"4efbb2aec6ca7318c341885aa700368b","_rev":"1-13a1fc74866dfc068bb06d7095169034","title":"\u30bf\u30a4\u30c8\u30eb\uff13","hello":"\u3084\u3042","world":"\u3053\u307e\u3061\u3083\u3093"}},
{"id":"4efbb2aec6ca7318c341885aa7005ba7","key":"4efbb2aec6ca7318c341885aa7005ba7","value":{"_id":"4efbb2aec6ca7318c341885aa7005ba7","_rev":"1-712121ac547e77bb58ab256928e07f53","hello":"\u304a\u3063\u3059","world":"\u304a\u3089xxx"}}
]}

bar.js

function(head, req) {

    start({
        "headers" : {
            "Content-type": "text/html"
        }
    });

    var mustache = require("vendor/couchapp/lib/mustache");
    var datalist = [];

    while(row = getRow()) {
     datalist.push({
         "hello": row.value.hello,
         "world": row.value.world
     });
    }

    var data = {
     "title": "タイトル4",
     "datalist": datalist
    };

    return mustache.to_html(this.templates.fuga, data);

}

getRow()でviewで返される”rows”を取得できるので、これをwhileで処理し、push()で各ドキュメントの値をJSONに格納するのがミソ。デモは こんな感じ に。

{{#hoge}}{{/hoge}}による処理

これはループを回すだけではなく、if文の代わりにも使える。hogeの値がtrueの時のみ、この中が処理されるので表示させたくないときはfalseに設定した変数を使えば、例えば同じ日付のうち最初の1回のみ表示させ、2回目以降は表示しない、ということもできる。こんな感じ。

../../../_images/20110103234427.png

まとめ

ということで、とりあえずヒゲテンプレートのmustacheを使うとかなり便利。このサンプルコードは GitHub で公開。

1

Debian GNU/Linux Squeeze/Sid

2

githubのmasterブランチの0.7.2のtagをチェックアウトしてdebパッケージをビルド。

iOS4.2で無線LANが切れる問題。

iOSをアップデートしたらやたら無線LANが切れるようになり、一度切れると無線LANをON/OFFせなあかんので、不便&ヨメにもめっちゃ不評だったので、しばらく何もしてなかった無線LANルータ側を対応してみることにした。

バッファローの WZR-HP-G300NH のファームウェアが、1.65で、最新の1.78にしたところ、どうやらiPadの無線LANがブツブツ切れる問題は解決したようなのだが、今度はAndroid 2.1-update1 1 だけが無線LANルータを全く認識しなくなってしまった。これは困る。

ということで、一つ前のバージョン1.74で無線LAN子機が切れる問題を修正と変更履歴にあったので、デグレードしてみた。すると、今度はMacBookなど、一切が無線LANルータを認識出来なくなった。が、これは何のことはなく、設定が初期化されてしまっただけの様子。設定のバックアップからリストアしたら、iPadもAndroidも問題なく使えるようになった。

とりあえずこれでしばらく様子見。

1

いつも使っている例のアレ

あけましておめでとうございます。

一年の振り返りをしないまま、年が明けました。まぁ昨年も個人的にはいろいろありましたが、それは胸のうちに秘めて、その反省も踏まえて今年はいろんな意味で「動」の年にしたいなと思います。

さて、昨年同様今年の年賀状の絵柄はやっぱりこまちゃんです。

../../../_images/20110101120748.png

でも、こんなに可愛いこまちゃんも、実はこんなに目付き悪かったのは内緒の話。

../../../_images/20101205111726.jpg

今年もよろしくお願いします。