2015年4月25日土曜日

JUnit3を利用するDBUnitで、ExcelのXLSX形式に対応する。

諸般の事情で、JUnit4系にできないので、
主なライブラリ構成は以下の通りになりました。
  • JUnit3.8.2
  • DBUnit2.4.9
  • POI3.7

下記に記載がある通り、対応します。
JUnit - ふなWiki - xlsx をデータとして利用する

DBUnitでXLSXを扱うように変更する場合、POIの公式に記載してある通りに対応すればOKです。
Apache POI - Upgrading to POI 3.5, including converting existing HSSF Usermodel code to SS Usermodel (for XSSF and HSSF)

自前で対応した後、DBUnitが正式に対応したので、以下をパッチすれば良いと思います。
試してはいないですが、パッと見た感じだと私が対応した内容と同じ感じでした。
dbUnit / Git / Commit [c6a6ba] Apache POI liblary version up from "3.2-FINAL" to "3.11".


ついでに、読み込んだExcelの日時がズレてしまう問題に対応します。

以下のブログに言及がありますが、独自でXLSX対応しちゃうついでに、こちらもコードを直しちゃいます。
山下寛人オフィシャルブログ - DBUnit Excelロード時の時刻データ

対応する箇所は、以下の通りです。
org.dbunit.dataset.excel.XlsTable

    protected Object getDateValue(Cell cell) 
    {
        logger.debug("getDateValue(cell={}) - start", cell);
        
        double numericValue = cell.getNumericCellValue();
        Date date = DateUtil.getJavaDate(numericValue);
        // Add the timezone offset again because it was subtracted automatically by Apache-POI (we need UTC)
        long tzOffset = TimeZone.getDefault().getOffset(date.getTime());// この行をコメントアウトする。
        date = new Date(date.getTime() + tzOffset);                     // この行をコメントアウトする。
        return new Long(date.getTime());
        
        //TODO use a calendar for XLS Date objects when it is supported better by POI
//        HSSFCellStyle style = cell.getCellStyle();
//        HSSFDataFormatter formatter = new HSSFDataFormatter();
//        Format f = formatter.createFormat(cell);
//      String formatted = fomatter.formatCellValue(cell);
//System.out.println("###"+formatted);
//        Date dateValue = cell.getDateCellValue();
    }

とりあえず、これで問題なくテストできています。

2015年3月22日日曜日

2015年4月(春)開始アニメ新番組私的録画メモ

新しく始まるアニメの個人的な録画予約のメモ。
チェックしている放送局は在京キー局とBS、AT-X、TOKYO MX、チバテレビ。


曜日 タイトル 初回放送日時 放送局
SHOW BY ROCK!! 4月5日(日) 22:00 TOKYO MX
山田くんと7人の魔女 4月12日(日) 23:30 TOKYO MX
グリザイアの迷宮 4月12日(日) 26:35 TOKYO MX
ハロー!!きんいろモザイク 4月6日(月) 24:00 TOKYO MX
高宮なすのです! 4月6日(月) 25:08 TOKYO MX
てーきゅう 4期 4月6日(月) 25:35 TOKYO MX
響け!ユーフォニアム 4月7日(火) 24:30 TOKYO MX
えとたま 4月9日(木) 23:00 TOKYO MX
放課後のプレアデス 4月9日(木) 24:00 TOKYO MX
やはり俺の青春ラブコメはまちがっている。続 4月2日(木) 25:46 TBS
レーカン! 4月2日(木) 26:16 TBS
ニセコイ: 4月10日(金) 23:30 TOKYO MX
長門有希ちゃんの消失 4月3日(金) 25:40 TOKYO MX
Fate/stay night [Unlimited Blade Works] 2ndシーズン 4月4日(土) 24:00 TOKYO MX

Fate/stay night 2期、響け!ユーフォニアムに期待しています。

最後に、情報源は以下のサイトです。ありがとうごとうございます。

GIGZAZINE 2015年春季開始の新作アニメ一覧

楽描喜堂

2014年12月22日月曜日

2015年1月(冬)開始アニメ新番組私的録画メモ

新しく始まるアニメの個人的な録画予約のメモ。
チェックしている放送局は在京キー局とBS、AT-X、TOKYO MX、チバテレビ。


曜日 タイトル 初回放送日時 放送局
Go!プリンセスプリキュア 2月1日(日) 8:30 テレビ朝日
純潔のマリア 1月11日(日) 22:30 TOKYO MX
ユリ熊嵐 1月5日 24:30 TOKYO MX
神様はじめました◎ 1月5日(月) 26:05 テレビ東京
憑物語 12月31日(水) 22:00 TOKYO MX
艦隊これくしょん -艦これ- 1月7日(水) 25:05 TOKYO MX
冴えない彼女(ヒロイン)の育てかた 1月8日(木) 24:50 フジテレビ
幸腹グラフィティ 1月8日(木) 25:46 TBS
アイドルマスターシンデレラガールズ 1月9日(金) 24:00 TOKYO MX
ジョジョの奇妙な冒険 スターダストクルセイダース エジプト編 1月9日(金) 24:30 TOKYO MX

時間がカッコ付きの物は、カッコの方が通常の放送時間。

とりあえず、憑物語とアイマス。
幾原邦彦監督のユリ熊嵐も気になるところ。
艦これのアニメが果たしてどうかという感じ。

最後に、情報源は以下のサイトです。ありがとうごとうございます。

GIGZAZINE 2015年冬季開始の新作アニメ一覧

楽描喜堂

2014年9月27日土曜日

2014年10月(秋)開始アニメ新番組私的録画メモ

新しく始まるアニメの個人的な録画予約のメモ。
チェックしている放送局は在京キー局とBS、AT-X、TOKYO MX、チバテレビ。


曜日 タイトル 初回放送日時 放送局
天体のメソッド 10月5日(日) 22:30 TOKYO MX
グリザイアの果実 10月5日(日) 24:30 TOKYO MX
繰繰れ!コックリさん 10月5日(日) 25:05 テレビ東京
ガールフレンド(仮) 10月5日(日) 25:35 テレビ東京
愛・天地無用! 10月6日(月)~(金) 21:55 TOKYO MX
弱虫ペダル GRANDE ROAD 10月6日(月) 25:35 テレビ東京
異能バトルは日常系のなかで 10月6日(月) 26:05 テレビ東京
大図書館の羊飼い 10月8日(水) 24:30 TOKYO MX
デンキ街の本屋さん 10月2日(木) 22:30 TOKYO MX
SHIROBAKO 10月9日(木) 23:30 TOKYO MX
甘城ブリリアントパーク 10月2日(木) 26:04(26:16) TBS
selector spread WIXOSS 10月3日(金) 25:05 TOKYO MX
ガンダム Gのレコンギスタ 10月3日(金) 25:55 TBS
結城友奈は勇者である 10月17日(金) 26:40(26:25) TBS
Fate/stay night [Unlimited Blade Works] 10月4日(土) 24:00 TOKYO MX
蟲師 続章 後半エピソード 10月18日(土) 24:30 TOKYO MX
失われた未来を求めて À la recherche du futur perdu 10月4日(土) 25:00 TOKYO MX

時間がカッコ付きの物は、カッコの方が通常の放送時間。

ufotable制作のFate/stay night、水島努監督×P.A.WORKSのSHIROBAKOに期待しています。
他には蟲師やselector、天地無用の新作がどうかという感じ。

最後に、情報源は以下のサイトです。ありがとうごとうございます。

GIGZAZINE 2014年春季開始の新作アニメ一覧

楽描喜堂

2014年9月21日日曜日

Eclipseの起動引数にdataを指定して起動しない

Windowsでワークスペースを指定する為、以下のように指定したら起動しなかった。
C:\eclipse\eclipse.exe -data "C:\workspace\"
C:\eclipse\eclipse.exe -data "C:\workspace"

data引数の最後の\を取ったら、ちゃんと起動した。

2014年6月21日土曜日

2014年7月(夏)開始アニメ新番組私的録画メモ

新しく始まるアニメの個人的な録画予約のメモ。
チェックしている放送局は在京キー局とBS、AT-X、TOKYO MX、チバテレビ。

曜日 タイトル 初回放送日時 放送局
人生相談テレビアニメーション「人生」 7月6日(日) 22:00 TOKYO MX
さばげぶっ! 7月6日(日) 22:30 TOKYO MX
スペース☆ダンディ シーズン2 7月6日(日) 23:00 TOKYO MX
ハナヤマタ 7月7日(月) 25:35 テレビ東京
ヤマノススメ セカンドシーズン 7月9日(水) 22:00 TOKYO MX
まじもじるるも 7月9日(水) 24:00 TOKYO MX
Fate/kaleid liner プリズマ☆イリヤ 2wei(ツヴァイ)! 7月9日(水) 25:35 TOKYO MX
グラスリップ 7月3日(木) 22:30 TOKYO MX
RAIL WARS! 7月3日(木) 25:46 TBS
普通の女子校生が【ろこどる】やってみた。 7月3日(木) 26:16 TBS
六畳間の侵略者!? 7月11日(金) 25:05 TOKYO MX
ばらかもん 7月5日(土) 26:20 日本テレビ

P.A.WORKSの新作グラスリップに期待しています。
true tearsの西村純二監督という事もあり楽しみです。
それ以外は、適当に視聴できるときに見るという感じ。

最後に、情報源は以下のサイトです。ありがとうごとうございます。

GIGZAZINE 2014年春季開始の新作アニメ一覧

楽描喜堂

JavaでjQueryで扱うIDをエスケープする

Webアプリケーションフレームワークの都合上、動的に生成されるIDをjQueryで処理する必要があり、
そのIDを予めjQueryでも扱えるようエスケープした状態のIDを作成する必要がありました。
そこで、以下のようなユーティリティークラスを作成しました。

jQueryのエスケープに関しては、下記にあります。
jQuery API Documentation Category: Selectors

package util;

/**
 * jQueryユーティリティー
 * @author @michigawi
 */
public final class JQueryUtil {

 /** エスケープ対象文字 */
 private static final char[] META_CHARACTERS = new char[]{' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '.', '/', ':', ';', '<', '=', '>', '?', '@', '[', '\\', ']', '^', '`', '{', '|', '}', '~'};

 /** jQueryのエスケープ文字 */
 private static final String ESCAPE_META = "\\\\";

 /**
  * エスケープします。

  * http://api.jquery.com/category/selectors/
  * @param target ターゲットの文字
  * @return エスケープ後の文字列
  */
 public static final String escape(String target) {
  if (target == null) {
   return null;
  }

  StringBuilder escaped = new StringBuilder(target.length() * 2);

  for (char character : target.toCharArray()) {
   if (findEscapeTarget(character)) {
    escaped.append(ESCAPE_META);
   }

   escaped.append(character);
  }

  return escaped.toString();
 }

 /**
  * 文字列がエスケープ対象か判別します。
  * @param target ターゲットの文字
  * @return エスケープ対象の場合、true
  */
 private static boolean findEscapeTarget(char target) {
  for (char meta : META_CHARACTERS) {
   if (target == meta) {
    return true;
   }
  }

  return false;
 }
}

テストコード
package util;

import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import org.junit.Test;

/**
 * {@link util.JQueryUtilTest}のテスト
 * @author @michigawi
 */
public class JQueryUtilTest {

 @Test
 public void 半角スペースをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery selector"), is("jQuery\\\\ selector"));
 }

 @Test
 public void 半角エクスクラメーションマークをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery!selector"), is("jQuery\\\\!selector"));
 }

 @Test
 public void ダブルクウォートをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery\"selector"), is("jQuery\\\\\"selector"));
 }

 @Test
 public void シャープをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery#selector"), is("jQuery\\\\#selector"));
 }

 @Test
 public void ダラーをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery$selector"), is("jQuery\\\\$selector"));
 }

 @Test
 public void パーセントをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery%selector"), is("jQuery\\\\%selector"));
 }

 @Test
 public void アンドをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery&selector"), is("jQuery\\\\&selector"));
 }

 @Test
 public void シングルクォートをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery'selector"), is("jQuery\\\\'selector"));
 }

 @Test
 public void 左丸カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery(selector"), is("jQuery\\\\(selector"));
 }

 @Test
 public void 右丸カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery)selector"), is("jQuery\\\\)selector"));
 }

 @Test
 public void アスタリスクをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery*selector"), is("jQuery\\\\*selector"));
 }

 @Test
 public void プラスをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery+selector"), is("jQuery\\\\+selector"));
 }

 @Test
 public void カンマをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery,selector"), is("jQuery\\\\,selector"));
 }

 @Test
 public void ピリオドをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery.selector"), is("jQuery\\\\.selector"));
 }

 @Test
 public void スラッシュをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery/selector"), is("jQuery\\\\/selector"));
 }

 @Test
 public void コロンをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery:selector"), is("jQuery\\\\:selector"));
 }

 @Test
 public void セミコロンをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery;selector"), is("jQuery\\\\;selector"));
 }

 @Test
 public void 小なり記号をエスケープする() {
  assertThat(JQueryUtil.escape("jQueryselector"), is("jQuery\\\\>;selector"));
 }

 @Test
 public void クエッションをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery?selector"), is("jQuery\\\\?selector"));
 }

 @Test
 public void アットマークをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery@selector"), is("jQuery\\\\@selector"));
 }

 @Test
 public void 左大カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery[selector"), is("jQuery\\\\[selector"));
 }

 @Test
 public void バックスラッシュをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery\\selector"), is("jQuery\\\\\\selector"));
 }

 @Test
 public void 右大カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery]selector"), is("jQuery\\\\]selector"));
 }

 @Test
 public void キャレットをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery^selector"), is("jQuery\\\\^selector"));
 }

 @Test
 public void グレイヴアクセントをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery`selector"), is("jQuery\\\\`selector"));
 }

 @Test
 public void 左中カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery{selector"), is("jQuery\\\\{selector"));
 }

 @Test
 public void 縦線をエスケープする() {
  assertThat(JQueryUtil.escape("jQuery|selector"), is("jQuery\\\\|selector"));
 }

 @Test
 public void 右中カッコをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery}selector"), is("jQuery\\\\}selector"));
 }

 @Test
 public void チルダをエスケープする() {
  assertThat(JQueryUtil.escape("jQuery~selector"), is("jQuery\\\\~selector"));
 }
}