2014年3月22日土曜日

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

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


曜日 タイトル 初回放送日時 放送局
極黒のブリュンヒルデ 4月6日(日) 22:00 TOKYO MX
ラブライブ! School idol project 2期 4月6日(日) 22:30 TOKYO MX
彼女がフラグをおられたら 4月6日(日) 24:30 TOKYO MX
マンガ家さんとアシスタントさんと 4月7日(月) 25:05 TOKYO MX
ソウルイーターノット! 4月8日(火) 26:00(25:40) テレビ東京
棺姫のチャイカ 4月9日(水) 25:05 TOKYO MX
エスカ&ロジーのアトリエ~黄昏の空の錬金術士~ 4月10日(木) 22:00 TOKYO MX
ご注文はうさぎですか? 4月10日(木) 22:30 TOKYO MX
ピンポン THE ANIMATION 4月10日(木) 24:50(24:20) フジテレビ
龍ヶ嬢七々々の埋蔵金 4月10日(木) 25:30(25:20) フジテレビ
僕らはみんな河合荘 4月3日(木) 26:16 TBS
監督不行届 4月(金) 22:25 AT-X
蟲師 続章 4月4日(金) 24:00 TOKYO MX
ジョジョの奇妙な冒険 スターダストクルセイダース 4月4日(金) 24:30 TOKYO MX
selector infected WIXOSS 4月4日(金) 25:05 TOKYO MX
デート・ア・ライブⅡ 4月11日(金) 25:35 TOKYO MX
レディ ジュエルペット 4月5日(土) 9:30 テレビ東京
魔法科高校の劣等生 4月5日(土) 24:30 TOKYO MX

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

とりあえず、蟲師。
それ以外は、適当に視聴できるときに見るという感じ。

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

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

MOON PHASE 雑記 2014年春アニメ新番チェック

楽描喜堂

2014年3月15日土曜日

Copy Paste Detector(CPD)の解析結果をHTMLにする。

CPDで解析した結果はそのままでは見難いので、
antのタスクで解析からHTML出力まで行います。
HTMLにする際、XSLTテンプレートがPMDに含まれているので、
それを利用します。
ディレクトリ構成は以下の通りです。

/
  /pmd-bin-5.1.0/
  /commons-net-3.3-src/
  /apache-ant-1.8.4/
  build.xml
  cpdExec.bat

以下は、antのbuild.xmlファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<project name="CPD" default="analysis" basedir=".">
  <path id="cpd.lib">
    <fileset dir="./pmd-bin-5.1.0/lib">
      <include name="*.jar"/>
    </fileset>
  </path>
  <taskdef name="cpd" classpathref="cpd.lib" classname="net.sourceforge.pmd.cpd.CPDTask"/>
  <target name="analysis">
    <antcall target="cpd" />
    <antcall target="xslt" />
  </target>
  <target name="cpd">
    <cpd encoding="UTF-8" minimumTokenCount="100" format="xml" language="java" outputFile="cpd.xml">
         <fileset dir="./commons-net-3.3-src/src/main/java">
             <include name="**/*.java"/>
         </fileset>
     </cpd>
  </target>
  <target name="xslt">
    <xslt in="cpd.xml" style="./pmd-bin-5.1.0/etc/xslt/cpdhtml.xslt" out="cpd.html" />
  </target>
</project>

batファイルは、以下のように記述します。

setlocal
set JAVA_HOME=%ProgramFiles%\Java\jdk1.7.0_51
set ANT_HOME=./apache-ant-1.8.4
"%ANT_HOME%\bin\ant.bat"
pause

HTMLは以下のような感じになります。

Copy Paste Detector(CPD)

Copy Paste Detector(CPD)でソースコードの重複(コピペ)を発見する。

様々なプログラミング言語を解析するPMDにあるCPDを利用します。
以下は、ディレクトリ構成です。
/
  /pmd-bin-5.1.0/
  /commons-net-3.3-src/
  cpdExec.bat

今回は、Apache CommonsのNetコンポーネントを解析に利用しました。
以下のようにbatファイルを記述します。
setlocal
set JAVA_HOME=%ProgramFiles%\Java\jdk1.7.0_51
set CLASSPATH=./pmd-bin-5.1.0/lib/ant-1.8.1.jar;./pmd-bin-5.1.0/lib/ant-launcher-1.8.1.jar;./pmd-bin-5.1.0/lib/ant-testutil-1.7.1.jar;./pmd-bin-5.1.0/lib/asm-5.0_BETA.jar;./pmd-bin-5.1.0/lib/commons-io-2.2.jar;./pmd-bin-5.1.0/lib/commons-lang3-3.1.jar;./pmd-bin-5.1.0/lib/dom4j-1.6.1.jar;./pmd-bin-5.1.0/lib/javacc-5.0.jar;./pmd-bin-5.1.0/lib/jaxen-1.1.1.jar;./pmd-bin-5.1.0/lib/jcommander-1.27.jar;./pmd-bin-5.1.0/lib/jdom-1.0.jar;./pmd-bin-5.1.0/lib/junit-4.4.jar;./pmd-bin-5.1.0/lib/pmd-5.1.0.jar;./pmd-bin-5.1.0/lib/rhino-1.7R3.jar;./pmd-bin-5.1.0/lib/saxon-9.1.0.8-dom.jar;./pmd-bin-5.1.0/lib/saxon-9.1.0.8.jar;./pmd-bin-5.1.0/lib/xercesImpl-2.9.1.jar;./pmd-bin-5.1.0/lib/xml-apis-1.3.02.jar;./pmd-bin-5.1.0/lib/xmlParserAPIs-2.6.2.jar;./pmd-bin-5.1.0/lib/xom-1.0.jar
"%JAVA_HOME%\bin\java.exe" -Xmx512m net.sourceforge.pmd.cpd.CPD --minimum-tokens 100 --files ./commons-net-3.3-src/src/main/java --encoding utf-8 --format xml
pause

実行する際、解析結果をファイルに保存する為、標準出力をリダイレクトします。
cpdExec.bat > cpd.xml

2014年1月3日金曜日

CodeIQ MAGAZINE「現在時刻が関わるテストから、テスト容易性設計を学ぶ」を解いてみた

CodeIQ MAGAZINE これであなたもテスト駆動開発マスター!?和田卓人さんがテスト駆動開発問題を解答コード使いながら解説します~現在時刻が関わるテストから、テスト容易性設計を学ぶ #tdd

読んでみたら、参加言語とアプローチの内訳に、Javaで「現在時刻を引数で渡す」アプローチがなかったので、書いてみました。

以下は実装です。
package tdd;

import java.util.Calendar;
import java.util.Date;

/**
 * 挨拶をするクラスです。
 * @author michigawi
 */
public class Greeter {

 /**
  * 挨拶します。
  * @param date 日時
  * @return 挨拶
  */
 public String greet(Date date) {
  Calendar cal = Calendar.getInstance();
  cal.setTime(date);

  int hour = cal.get(Calendar.HOUR_OF_DAY);
  int minute = cal.get(Calendar.MINUTE);
  int second = cal.get(Calendar.SECOND);

  for (Greeting greeting : Greeting.values()) {
   if (greeting.valid(hour, minute, second)) {
    return greeting.getGreeting();
   }
  }

  return null;
 }

 /**
  * 挨拶です。
  * @author michigawi
  */
 private enum Greeting {
  /** 朝 */
  MORNING("おはようございます") {
   @Override
   public boolean valid(int hour, int minute, int second) {
    if (hour >= 5 && (hour <= 11 && minute <= 59 && second <= 59)) {
     return true;
    }

    return false;
   }
  }
  /** 日中 */
  , AFTERNOON("こんにちは") {
   @Override
   public boolean valid(int hour, int minute, int second) {
    if (hour >= 12 && (hour <= 17 && minute <= 59 && second <= 59)) {
     return true;
    }

    return false;
   }
  }
  /** 夜 */
  , NIGHT("こんばんは") {
   @Override
   public boolean valid(int hour, int minute, int second) {
    if (hour >= 18 && (hour <= 23 && minute <= 59 && second <= 59)) {
     return true;
    }

    if (hour >= 0 && (hour <= 4 && minute <= 59 && second <= 59)) {
     return true;
    }

    return false;
   }
  };

  /** 挨拶するか */
  public abstract boolean valid(int hour, int minute, int second);

  /** 挨拶 */
  private String greeting;

  /**
   * コンストラクタです。
   * @param greeting
   */
  Greeting(String greeting) {
   this.greeting = greeting;
  }

  /**
   * 挨拶を返します。
   * @return 挨拶
   */
  public String getGreeting() {
   return greeting;
  }
 }
}
最後にテストです。
package tdd;

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

import java.util.Calendar;

import org.junit.Before;
import org.junit.Test;

/**
 * {@link tdd.Greeter}のテストです。
 * @author michigawi
 */
public class GreeterTest {

 /** テスト対象のクラス */
 private Greeter greeter;

 /** カレンダー */
 private Calendar calendar;

 /**
  * setup.
  */
 @Before
 public void setUp() {
  greeter = new Greeter();
  calendar = Calendar.getInstance();
  calendar.clear();
  calendar.set(2014, Calendar.JANUARY, 3);
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 午前0時ジャストはこんばんは() {
  calendar.set(Calendar.HOUR_OF_DAY, 0);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  assertThat("", greeter.greet(calendar.getTime()), is("こんばんは"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 午前5時より前はこんばんは() {
  calendar.set(Calendar.HOUR_OF_DAY, 4);
  calendar.set(Calendar.MINUTE, 59);
  calendar.set(Calendar.SECOND, 59);
  assertThat("", greeter.greet(calendar.getTime()), is("こんばんは"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 午前5時ジャストはおはようございます() {
  calendar.set(Calendar.HOUR_OF_DAY, 5);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  assertThat("", greeter.greet(calendar.getTime()), is("おはようございます"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 正午の前はおはようございます() {
  calendar.set(Calendar.HOUR_OF_DAY, 11);
  calendar.set(Calendar.MINUTE, 59);
  calendar.set(Calendar.SECOND, 59);
  assertThat("", greeter.greet(calendar.getTime()), is("おはようございます"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 正午はこんにちは() {
  calendar.set(Calendar.HOUR_OF_DAY, 12);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  assertThat("", greeter.greet(calendar.getTime()), is("こんにちは"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 午後6時より前はこんにちは() {
  calendar.set(Calendar.HOUR_OF_DAY, 17);
  calendar.set(Calendar.MINUTE, 59);
  calendar.set(Calendar.SECOND, 59);
  assertThat("", greeter.greet(calendar.getTime()), is("こんにちは"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void 午後6時ジャストはこんばんは() {
  calendar.set(Calendar.HOUR_OF_DAY, 18);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  assertThat("", greeter.greet(calendar.getTime()), is("こんばんは"));
 }

 /**
  * Test method for {@link tdd.Greeter#greet(java.util.Date)}.
  */
 @Test
 public void _24時はこんばんは() {
  calendar.set(Calendar.HOUR_OF_DAY, 24);
  calendar.set(Calendar.MINUTE, 0);
  calendar.set(Calendar.SECOND, 0);
  assertThat("", greeter.greet(calendar.getTime()), is("こんばんは"));
 }
}

様々なアプローチがあるんだなぁと思いました。

2013年12月15日日曜日

HandBrakeのNightly Builds設定

メモです。
DVDがリッピングできない。
コピープロテクトには対応しなくなっているので、
コピープロテクトを外さなければならない。
そこで、DVDFab HD Decrypterなどのコピープロテクトを外せるソフトで
一旦、ファイルをローカルHDDへコピーなどしておく。
そして、これらのディレクトリまたはファイルを指定してエンコードする。
指定したディレクトリまたはファイルの読み込みに失敗する。
日本語などの2バイト文字があると失敗する。
例えば、2バイト文字が既に存在するディレクトリにエンコード対象のファイルがある場合、
Windowsなら、MKLINK /Jでリンクを作成する。
シンボリックリンクではなく、ジャンクションなのがポイント。
エンコードした映像に縞模様が入る。
メニューにあるOptionsから以下の箇所にチェックを入れる。
Options -> Advanced -> Beta Features -> Use LibHB for Encoding (uses hb.dll instead of HandBrakeCLI.exe)

HandBrake: Open Source Video Transcoder

2013年12月14日土曜日

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

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

曜日 タイトル 初回放送日時 放送局
ウィッチクラフトワークス 1月5日(日) 22:30 TOKYO MX
スペース☆ダンディ 1月5日(日) 23:00 TOKYO MX
ノラガミ 1月5日(日) 23:30 TOKYO MX
ウィザード・バリスターズ~弁魔士セシル 1月12日(日) 24:30 TOKYO MX
咲-Saki- 全国編 1月5日(日) 26:05(25:35) テレビ東京
となりの関くん 1月5日(日) 26:05 テレビ東京
ハピネスチャージプリキュア! 2月2日(日) 8:30 テレビ朝日
とある飛空士への恋歌 1月5日(日) 22:00 TOKYO MX
のうりん 1月13日(月) 24:30 BS11
ディーふらぐ! 1月6日(月) 26:05 テレビ東京
そにアニ -SUPER SONICO THE ANIMATION- 1月6日(月) 27:30 BS11
うーさーのその日暮らし 覚醒編 1月7日(火) 25:35 テレビ東京
中二病でも恋がしたい! 第1期テレビ未放送エクストラエピソード 12月25日(水) 24:30 TOKYO MX
中二病でも恋がしたい! 第2期 1月8日(水) 24:30 TOKYO MX
いなり、こんこん、恋いろは 1月15日(水) 25:00 TOKYO MX
マケン姫っ!通 1月15日(水) 25:30 TOKYO MX
未確認で進行形 1月9日(木) 22:00 TOKYO MX
桜Trick 1月9日(木) 25:58 TBS
銀の匙 Silver Spoon 第2期 1月9日(木) 24:50 フジテレビ
Wake Up,Girls! 1月10日(金) 25:23 テレビ東京
最近、妹のようすがちょっとおかしいんだが。 1月4日(土) 22:30 TOKYO MX
蟲師 特別篇「日蝕む翳」 1月4日(土) 23:30 TOKYO MX
ニセコイ 1月11日(土) 23:30 TOKYO MX
世界征服~謀略のズヴィズダー~ 1月11日(土) 24:00 TOKYO MX
生徒会役員共* 1月4日(土) 25:30 TOKYO MX

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

蟲師と咲以外、全体的にこれといったのがない感じ。
適当に視聴できるときに見るという感じになりそう。

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

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

MOON PHASE 雑記 2014年冬アニメ新番チェック

楽描喜堂

2013年10月30日水曜日

EclipseのWTP Server Toolsで複数のWebコンテンツディレクトリを指定する

Dynamic Web Projectでプロジェクトを作成すると、プロジェクトのプロパティにある
Deployment Assembly > Web Deployment Assembly で指定できます。
しかし、Eclipseのバージョンが古い場合、この項目自体がないので、
以下のファイルを直接編集することで実現できます。

yourWorkspace/yourProject/.settings/
org.eclipse.wst.common.component

<?xml version="1.0" encoding="UTF-8"?><project-modules id="moduleCoreId" project-version="1.5.0">
    <wb-module deploy-name="hoge">
        <wb-resource deploy-path="/" source-path="/WebContent" tag="defaultRootSource"/>
        <wb-resource deploy-path="/WEB-INF/classes" source-path="/src"/>
        <property name="context-root" value="hoge"/>
        <property name="java-output-path" value="/hoge/build/classes"/>
    </wb-module>
</project-modules>
wb-resourceタグのdeploy-path属性にはデプロイ先、
source-path属性には出力したいプロジェクトにあるソースのパスを指定します。
例えば、デプロイしたいコンテンツが同じディレクトリ以下にないような場合でも、
wb-resourceタグを追加する事により、別のディレクトリもデプロイ対象に含める事が可能です。