Chart.js can't acquire context from the given item

www.chartjs.orgChart.js を使用しようとしたら、
Failed to create chart: can't acquire context from the given item 
描画の為の の後で、スクリプトを書かないとならない。

<script src="Chart.bundle.js"></script>
</head>
<body>
<canvas id="myChart"></canvas>
<script type="text/javascript">
     // ここで、canvas id="myChart" に対する Chart.js の処理を書く。
var ctx = document.getElementById("myChart").getContext('2d');
var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
   :
   :
</script>

必要な Chart.bundle.js は、https://github.com/chartjs から、Chart.js を辿って、
https://github.com/chartjs/Chart.js/releases から入手する。

GitHub ドキュメントのリンクの書き方メモ

GitHub ドキュメントのリンクの書き方

https://help.github.com/articles/basic-writing-and-formatting-syntax/#links

[ ] でリンク文字列を書いて続けて ( ) でURLパスを書く。
GitHub上のドキュメントなら、相対パスで書く

[GitHub help](https://help.github.com/)

[detail](/doc/description.md)

Wicket scheduleRequestHandlerAfterCurrent の実行を簡潔に

Wicket の RequestCycle の scheduleRequestHandlerAfterCurrent で IRequestHandler を指定して
応答としてファイル出力する方法は標準として昔から存在した。

以下のように WebPage で書いていたものだ。

@Inject Logic logic;

getRequestCycle().scheduleRequestHandlerAfterCurrent(new IRequestHandler(){
   @Override
      public void respond(IRequestCycle cycle){
         try(OutputStream out = cycle.getResponse().getOutputStream()){
            logic.printFile(out);
            out.flush();
         }catch(Exception e){
            throw new RuntimeException(e);
         }
      }
   }
);

すでに Wicket 8 では、IRequestHandler も @FunctionalInterface が付いており、1つのメソッドと
default メソッド1つしかないので、、

getRequestCycle().scheduleRequestHandlerAfterCurrent(cycle->{
   try(OutputStream out = cycle.getResponse().getOutputStream()){
      logic.printFile(out);
      out.flush();
   }catch(Exception e){
      throw new RuntimeException(e);
   }
});

で書ける。

応答としてファイル出力するメソッドが内部で例外捕捉するようにすれば、
例えば、メソッド名=printFileNoexception と適当に銘打って、、

getRequestCycle().scheduleRequestHandlerAfterCurrent(
  c->logic.printFileNoexception(c.getResponse().getOutputStream())
);

完全ではないがほぼ、普遍的なコード1行で書けるようになる。

Jasperreprts でサブレポートを使用する時のコレクションのテンプレート設定

Jasperreports でサブレポートを出力するときの jrxml を準備するのに、いつもデータを渡すコレクションのラップを
テンプレートで設定を書き込む方法を忘れて、後からどうやるんだっけと悩んでしまうので、手順メモです。
Jaspersoft Studio 上でテンプレート jrxml の先頭を Outline タブで選択します。
f:id:posturan:20180113202758j:plain
選択したら、プロパティで、import のところを入力します。
f:id:posturan:20180113202909j:plain

すると以下のようにテンプレート jrxml が Javaとしてインポートするクラス、パッケージ指定を設定するものが
出てきます。
f:id:posturan:20180113203045j:plain
[Add Class] をクリックして、コレクション渡しの目的の net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
を選択します。
f:id:posturan:20180113203230j:plain
設定します。
f:id:posturan:20180113203304j:plain
この設定をしておくことで、sabreport の設定は、以下のように、JRBeanCollectionDataSource を 簡潔に new 演算子指定できます。
f:id:posturan:20180113203648j:plain

この import 設定をしなければ、new JRBeanCollectionDataSource( ) の記述はコンパイルエラーになり、
 import 設定をしなければ、 new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource( ) と
書かなければなりません。

Javaのコードは気持ち悪いダサいコードですが、、

public class FareDatasource implements Serializable{
   public Collection<FareItem> farereports;

   public FareDatasource(Collection<FareItem> farereports){
      this.farereports = farereports;
   }
   public Collection<FareItem> getFarereports(){
      return farereports;
   }
}

Collection<FareDatasource> farereports = new ArrayList<>();
FareDatasource datasource = new FareDatasource(list);
farereports.add(datasource);

JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(farereports);

JasperPrint jasperPrint = JasperFillManager.fillReport(inputStream, parameters, dataSource);
inputStream.close();

こんな風になります。

Jasperreports NumberFormat は、cannot be resolved to a type

Jasperreports で、java.text.format.NumberFormat で、金額 format 出力しようと

<textFieldExpression>
<![CDATA[java.text.format.NumberFormat.getCurrencyInstance().format($P{total_money})]]>
</textFieldExpression>

と書いたら、JRException 発生
java.text.format.NumberFormat cannot be resolved to a type
になってしまう。

DecimalFormatを使わざる得ない、

<textFieldExpression>
<![CDATA[new DecimalFormat("\\###,###,###").format($P{total_money})]]>
</textFieldExpression>

Jasperreports でLocalDate をフォーマット出力

1年近く前、Jasperreports 5.6.0 で、Java8 LocalDate を出力するのに、Eclipseコンパイラを使う方法を書いたが、
  Jasperreports 5.6.0 で Java8 LocalDate を出力するには - Oboe吹きプログラマの黙示録
もう、Jasperreports 6.5.1 では、Jaspersoft Studio も Java8 対応でその必要はなく
以下のように TextField 出力の expression は、jrxml で以下のように書く。

<textFieldExpression>
<![CDATA[$F{access_date}.format(java.time.format.DateTimeFormatter.ofPattern("yyyy年 M月d日"))]]>
</textFieldExpression>

祝日休日、土曜日曜を除く平日のリストあるいは Stream を求める

自分が開発した Java祝日計算、
Java祝日計算 プロジェクト日本語トップページ - OSDN
より、任意の月の祝日休日、土曜日曜を除く平日の Stream を求める。

準備として、この Java祝日計算 では、以下のように祝日休日のリストを求めるのには、以下が存在する。

int year = 2018;
int month = 2;

LocalDate[] days = Holiday.listHoliDayDates(year, month);
List<Holiday.HolidayBundle> blist = Holiday.listHolidayBundle(year, month);

ここから、月の日付と突き合わせるようにMapを作るのだが、key=LocalDate 、valueをどうするか?

int year = 2018;
int month = 2;
Map<LocalDate, LocalDate> map = Arrays.stream(Holiday.listHoliDayDates(year, month))
.collect(()->new HashMap<LocalDate, LocalDate>(), (r, t)->r.put(t, t), (r, u)->r.putAll(u));

これでも良いが、後から value として休日の名称が必要なMapを用意するならば、

int year = 2018;
int month = 2;
Map<LocalDate, String> map = Holiday.listHolidayBundle(year, month).stream()
.collect(()->new HashMap<LocalDate, String>(), (r, t)->{
   r.put(t.getDate(), t.getDescription());
   Optional.ofNullable(t.getChangeDate()).ifPresent(d->r.put(d, "振替休日"));
}, (r, u)->r.putAll(u));

月初日から Stream.iterate を使用して用意したMap とつき合わせて結果 Stream を求める。
List にしたければ、更に、collect(Collectors.toList()) で求める。

int year = 2018;
int month = 2;
Map<LocalDate, LocalDate> map = Arrays.stream(Holiday.listHoliDayDates(year, month))
.collect(()->new HashMap<LocalDate, LocalDate>(), (r, t)->r.put(t, t), (r, u)->r.putAll(u));

Stream<LocalDate> daystream = Stream.iterate(LocalDate.of(year, month, 1), t->t.plusDays(1))
.limit(LocalDate.of(year, month, 1).lengthOfMonth())
.filter(e->!e.getDayOfWeek().equals(DayOfWeek.SATURDAY) && !e.getDayOfWeek().equals(DayOfWeek.SUNDAY) && !map.containsKey(e));

List<LocalDate> list = daystream.collect(Collectors.toList());

DayOfWeek.SATURDAY と DayOfWeek.SUNDAY を !equal で判定することに抵抗があるなら、

int year = 2018;
int month = 2;
Map<LocalDate, LocalDate> map = Arrays.stream(Holiday.listHoliDayDates(year, month))
.collect(()->new HashMap<LocalDate, LocalDate>(), (r, t)->r.put(t, t), (r, u)->r.putAll(u));

Stream<LocalDate> daystream = Stream.iterate(LocalDate.of(year, month, 1), t->t.plusDays(1))
.limit(LocalDate.of(year, month, 1).lengthOfMonth())
.filter(e->1 <= e.getDayOfWeek().getValue() && e.getDayOfWeek().getValue() <= 5 && !map.containsKey(e));

List<LocalDate> list = daystream.collect(Collectors.toList());

という具合だ。