13F

備忘録

DbUnitとApache POI

2007-08-20 19:55:38 | Weblog
DbUnit 2.2 で XlsDataSet を使おうとしたら、どこもおかしいところが無いのに NoSuchColumnException が出て困った。

調べてみたら、XlsDataSet が内部で使っている Apache POI 2.5.1-final に 「セルから読み取った値の最後に空白が入ることがある」というバグ があり、このためにどこかカラム名の一致をとっているところで失敗しているらしいことがわかった。試しに POI を 3.0.1-FINAL に更新してみたら一応直ったみたい。時間が無くてどこでどう直ったのが見れてないからちょっと気持ち悪いんだけど。

ちなみに Maven2 だと DbUnit の transitive dependency(推移的依存性?)のために固定で 2.5.1-final が使われてしまう。これを回避するには、以下のように明示的に DbUnit の dependency を除外してから、自分で POI 3.0.1-FINAL の dependency を書けばいいようだ。
<dependency>
  <groupId>org.dbunit</groupId>
  <artifactId>dbunit</artifactId>
  <version>2.2</version>
  <scope>test</scope>
  <exclusions>
    <exclusion>
      <groupId>poi</groupId>
      <artifactId>poi</artifactId>
    </exclusion>
  </exclusions>
</dependency>

それにしても、DbUnit 関連で検索すると全く情報が無かったんだけど誰も困っていないんだろうか……。普通は POI の 3.0 系を使うから無問題で、Maven2 で依存関係の自動解決をしていることが逆にアダになったのかな?

東方妖々夢プレイ中(2)

2007-08-19 00:56:18 | Weblog
相変わらず魔理沙・魔符メインでプレイ。

4面が難しすぎなので、やけくそで今まで使わなかったコンティニューを使って5面まで進めてみたら、練習モードができるようになった。コンティニュー使ってクリアしても練習モードは有効らしい。

しばらく練習モードで修行を積んでみたら、4面の道中は一部を除いて大体突破のパターンが見えてきた。

* とにかくザコが3面までとは桁違いに弾をばらまくので先手必勝。出現位置をできるだけ覚えて早めに潰す。
* 妖精みたいのが左右に次々出てくるパターンでは、どっちかに寄って片方だけ潰してれば避けられるだけのスペースは大体確保できる。
* 妖精みたいのが真ん中付近に次々出てくるパターンでは、低速モードの狙い撃ちで全員速攻で潰す。
* 中ボスはビビらずに真ん中あたりで細かく左右に避けてると結構どうにかなる。

それでも、ボスはボムを使いまくらないとどうしようもない……。

石屋製菓、「白い恋人」の消費期限改竄

2007-08-17 00:27:31 | Weblog
つい先日まで、日経産業新聞で社長のこれまでの苦労話みたいなのが連載されていたのを思い出した。トップページの「お詫びとお知らせ」がテキストではなく縦書き画像なのは、検索エンジン対策なのか、厳粛な感じを出したいだけで他意はないのか、どっちでしょうね。

でもGoogleあたりが、そのうち画像内テキストも検索対象にするんだろうなあ(わたしが知らないだけで、もうされてたりして)。

JavaとRuby on Rails

2007-08-17 00:02:45 | Weblog
矛盾を抱えつつ進化する“Java”――黒船となったRuby on Rails

Railsは Agile Web Development With Rails(しみったれなので本より安いPDF版)を読んでる途中程度だけど、ディレクトリ構成の標準化・標準コードの自動生成・Webアプリフレームワーク・テストツール・ORM・メール・ロギング・その他もろもろの機能拡張……などが全部最初からまとめて提供されているようだ。こういう「普通に使うものはきちんとデフォルトで統一的に提供する」という考え方が何よりも魅力的に思える。

Javaで同じことをしようとすると、何かのIDE+Struts+Spring+Hibernate+JavaMail+Maven+JUnit+Cactus+Log4J+Jakarta Commons等々を準備して、それらを組み合わせる設定をして……と複雑怪奇な世界になってしまう。そういう点で「フルスタック」とやらのIBMのプロジェクトに期待したいんだけど……。どうなんだろう。

東方妖々夢プレイ中

2007-08-16 23:09:41 | Weblog
製品版が届いたので妖々夢をプレイ。なんか体験版より多少難易度が上がってるような気もするが、とりあえずアリスを粉砕し意気揚々と4面へ。

…………4面から難易度が桁違いに上がってるんですが。

魔理沙・魔符では残機3+ボム2つで行っても中ボスまで行かずにゲームオーバー。いちばん簡単そうな咲夜・幻符で残機とボムを使いまくるとなんとかボスまでは辿りつくものの、三姉妹の最初で瞬殺。

こりゃとてもクリアできる気がしない。やっぱりそろそろ勘でプレイするだけじゃなくパターンを覚える必要があるんだろうか。はたまた、いよいよ小学生までしか許されないという禁断のEasyモードを使うときが来たのか……。

お盆と電車

2007-08-15 21:11:00 | Weblog
今日は運転が下手な電車ばかりに乗り合わせた。急ブレーキとか、スムーズじゃない加減速とか。

お盆だからJRの運転手も1軍は休んでいて、2軍が駆り出されたりしているんだろうか。

まだまだ東方体験版プレイ中

2007-08-14 23:17:37 | Weblog
ゲームの正式版より先にゲームパッドコンバーターのほうが届いたので、プレステ2のコントローラーを挿してプレイしてみた。

…………ダメだこれは……。

キーボードに慣れすぎてプレステのコントローラーではうまく操作できなかった。キーボードの場合、左薬指=Shift、左中指=Z、左人差し指=X、右人差し指=カーソル左、右中指=カーソル上下、右薬指=カーソル右、という風にほぼ指と行動要素が1対1で結びつくので「タイミングにあわせて力を入れるだけ」で操作できるのに対して、プレステコントローラーだと左右の親指だけでほとんどの操作を行うので「タイミング+指移動」という余計な動きが必要になる感じでどうもやりづらい。

ということで、パッド化計画はあっさり放棄してキーボード道を究めることにした。

ゲームのほうは明日あたりには正式版が届きそう。

Apache LuceneのNGramTokenizer

2007-08-14 22:53:54 | Weblog
Apache Lucene で全文検索するようなアプリケーションを作成中。とりあえず CJKAnalyzer かと思っていたら こちら で NGramTokenizer という便利そうなものが紹介されていたので使おうとしてみた。

まず Analyzer が必要なので以下のようなものを作成。
public class NGramAnalyzer extends Analyzer {
  protected int minGram;
  protected int maxGram;

  public NGramAnalyzer(int minGram, int maxGram) {
    this.minGram = minGram;
    this.maxGram = maxGram;
  }

  public TokenStream tokenStream(String fieldName, Reader reader) {
    return new NGramTokenizer(reader, minGram, maxGram);
  }
}

インデックスの作成はこれでうまくいく。
Analyzer analyzer = new NGramAnalyzer(1, 3);
IndexWriter writer = new IndexWriter(new RAMDirectory(), analyzer);
// ドキュメントの追加...

ところが、検索のほうは minGram と maxGram が異なるケースではうまくいかない。
Analyzer analyzer = new NGramAnalyzer(1, 3);
QueryParser parser = new QueryParser(queryString, analyzer);
// queryString が 1文字の場合以外はマッチしない

ほんの少しソースを見ただけだけど、どうも QueryParserが、TokenStream が返す Token の位置情報を使わずに PhraseQuery を構築してしまっているのが原因っぽい気がする。

QueryParserをいじればいいんだけど、標準配布物をいじるのはどうも気が進まないので、家に帰ってからこんなのを捏造してみた(動作未確認)。
public class NGramAnalyzerForQuery extends NGramAnalyzer {

  public NGramAnalyzerForQuery(int minGram, int maxGram) {
    super(minGram, maxGram);
  }

  public TokenStream tokenStream(String fieldName, Reader reader) {

    int read = 0;

    try {
      char[] buf = new char[maxGram];

      // 検索語の文字数を確認する
      while (read < maxGram) {
        int c = reader.read();
        if (c == -1) {
          break;
        }
        buf[read] = (char)c;
        read++;
      }

      if (read > 0) {
        // 読んでしまった分を戻す
        PushbackReader pbReader = new PushbackReader(reader, read);
        pbReader.unread(buf, 0, read);
        reader = pbReader;
      }
    }
    catch (IOException e) {
      throw new RuntimeException(e);
    }

    if (read < maxGram) {
      return new NGramTokenizer(reader, read, read);
    }
    else {
      return new NGramTokenizer(reader, maxGram, maxGram);
    }
  }
}

基本は maxGram で分割し、検索語の長さが maxGram 未満の場合だけ、検索語の文字数で分割する(といっても1つのトークンになるだけ)。検索のときだけこっちを使うようにしたらうまくいけばいいなあということで明日試す。
Analyzer analyzer = new NGramAnalyzerForQuery(1, 3);
QueryParser parser = new QueryParser(queryString, analyzer);

東方体験版プレイ中

2007-08-14 00:31:43 | Weblog
相変わらず少しずつプレイ中。例のFlashから入ったのでなんとなく妖々夢から。でキャラは魔理沙が最多。

最初はコンティニュー全部使っても3面ボスまでたどり着けない状態だったけど、とりあえずNormalでは全キャラクタで3面までコンティニューなしで安定して制覇できるようになった。

* 弾幕を見ただけで避ける気をなくし、ああもう当たってもいいや的な心理状態で集中力を欠くプレイになり被弾
⇒ くじけないで弾幕を良く見る。ずっと低速だけではなくて、ボス戦でも時には高速移動で大きな回避をする。

* 魔理沙は攻撃範囲が狭いので、ボスを正面に捉えようと相手ばかり注目して弾に当たる
⇒ 基本は自機の周りに集中しつつ、下に出てくるボスX座標マーカーみたいのを視界の端で追って対応(「集中し、かつ心をひとつところにとどめぬこと」というどこかの漫画のような心構えで……)

* RPG的なアイテムホルダー癖が抜けず、ボム満タンのまま死亡
⇒ 危ないと思ったらすぐに使う。橙全般・仏蘭西人形・倫敦人形あたりは苦手なのであるだけ使う。苦手な攻撃でも、ボム満タンで絶対に死ねない!という状態より、ボムが切れてから気楽な気持ちで避けたほうがうまく避けられる気もする。

今のところの傾向と対策はこんなところか。シューティングは脳が活性化する気がする。

東方妖々夢とPC環境

2007-08-13 00:19:55 | Weblog
東方妖々夢の体験版での問題。

わたしの環境では、Stage1でボス音楽に切り替わるときにCPU使用率が異常に高くなってフリーズしてしまっていた。どうもオーディオドライバの不具合か何かだったらしく、マニュアルのFAQにある通りドライバを最新版に更新したらあっさり直った。

ちなみに、Windowsのオーディオデバイスの詳細で出てくる「SoundMAX」で検索してもドライバは全く出てこず。マザーボードのメーカーのサイト(ASUS)に行くのが正しかった。

このハードウェア音痴はどうにかしたいんだけど、こういうPC自作的な知識はどこで身につければいいのやら。