-基礎にして初歩にあらず

今日は朝から出社です。TapestryのIEngineService実装一本と書類仕事。渋谷はがらーんとした感じに静かです。5連休の真ん中ともなれば休みの店も多い。ちょっと普段より遅めに出たので、途中本屋によってきました。各所で話題になってた「JUnitによるテストファースト開発入門」を購入。JUnitは使ってるのに本も読んだことないから、まず一冊読みなおしてみようかなと。
読む前に題名だけから思ったことを書くと「入門」って相変わらずですね。出版社の人に言わせると「入門」が付くと付かずでは売れ方違うらしいんですが。。。JUnitでどうこうという時点でたとえ内容が平易であっても、もう入門ではないように思います。昔、吉田弘一郎翁が書いた「極めるJava」という本は、「基礎にして初歩にあらず」という副題がついてました。「基礎にして入門にあらず」と言いたいところ、吉田翁も出版社に止められたんでしょうか?そういう意味ではとうとう日本語訳が出たか、怪作「Head First Java」。オライリーの非動物シリーズです。この本恐ろしいことに中身が絵本(!)なので、こういう本なら堂々と入門を語れるのではないでしょうか。立ち読みオススメ本です。渋谷ブックファーストのコンピューター洋書売り場で原著を見つけたとき、欲しくてしょうがなかったのですが、輸入洋書は高く、7,500円超えていたのでさすがに躊躇したものです。邦書だと5,000円しないんですね。この本は他に類似が無いという一点で価値の有る本だと思います。目次だけでも読むと笑うよ。

-チュートリアルタイポ

Seasar.orgリニューアルに向けて、チュートリアルをタイポしました。はてなから剥して貼り直し。やっとこさS09まで終了。すなわちDI基礎編が完です。S10からのAOP編はAOP Alliance対応した2.0.6でサンプルコード書き直しなので、明日の隙間時間で。
羽生さん書いてる?こっちは原稿がすでにあるから手さえつけられれば速いのだ。

-ファイルダウンロードのTips

ファイルダウンロードのサービスをTapestryで書いたのですが、できあがってから悩んだのが、ダウンロードするファイル名です。ServiceLinkのparametersサービスパラメータでオブジェクトをシリアライズしたものをリンクで飛ばして、サービス側でそのオブジェクトをチェックして後に動的に作成したCSVをダウンロードさせるものだったので、URLは以下のような感じになるのです。

http://localhost:8080/app?service=csv&sp=l1083576642915&sp=JaOih6p6IaK76l4U(後略)

このURLでアクセスしてファイルをダウンロードすると、保存を行うクライアント側のダイアログでファイル名がきちんと出ないのです。でも、以下のようにするのは作り上できないのです。

http://localhost:8080/anonymous.csv

ということで、いろいろ調べているうちにJGrueでみつけました。えらいぞjGrue!ポイントは以下のコードの赤い部分。ヘッダに「Content-Disposition: attachment; filename=...」ですか。なるほど。

public void service(IEngineServiceView serviceView, IRequestCycle cycle,
  ResponseOutputStream out) throws ServletException, IOException {
  try {
    Object[] params = getParameters(cycle);
    long oneshotKey = ((Long)params[0]).longValue();
    Job job = (Job)params[1];
    cycle.getRequestContext().getResponse().setHeader(
      "Content-Disposition", "attachment; filename=\"" + job.getJobID() + ".csv\"");
    PrintWriter writer = new PrintWriter(out);
    operation.dumpCSV(writer, oneshotKey, job);
  } catch (Exception e) {
    log(ERROR_CSV_SERVICE, e);
    throw new ServletException(e);
  }
}

IEngineServiceについては、[tapestry-article]でそのうちまとめます。