wicket-guice 使用の見直し

だいぶ昔、6年も前、Wicket のバージョンが、1.5 に、wicket-guice の GuiceComponentInjector を
JSR330 対応させる為に、自分で書き直したりしていた。
Wicket1.5.3 の guice - IOC で、Behaviorも対象に - Oboe吹きプログラマの黙示録

そのまま同じコードが、本来の Wicket に採用されてたのを知ってはいたけど、書き直したものを
いつまでも使ってると、間接参照の問題になり、Java9 の時代のコンパイルの時代に、非常によろしくない。
見直すことなくそのまま書き直したものを使ってたというのは、反省して
WebApplication の init() で書く、getComponentInstantiationListeners() で取得したリスナにセットする
インジェクションふるまい定義として使用は、
   getComponentInstantiationListeners().add(new GuiceComponentInjector(this, new AbstractModule(){ ...
で使用するように気をつけよう。

Java9 Eclipse 必要な .class ファイルから間接的に参照されています のエラー

Java9 、Eclipse Oxygen Maven使用で、Wicket8 を使ったプロジェクトでコンパイルエラー以下が出る。
型 org.slf4j.Logger を解決できません。必要な .class ファイルから間接的に参照されています

wicket-core 8.0.0-M8 は、まだ sl4j-api 1.7.25 という
まだモジュール宣言対応していない=module-info.java からのモジュール定義を含んでないものを
使用している。
wicket-core が、sl4j-api 1.7.25 を使用する依存をもっている。
このような場合、Maven依存による 上のエラーになる。

2017-12-16 現時点最新の sl4j-api 1.8.0-beta0 は、module-info.java によるモジュール定義が
あるので、これを参照するように、pom.xmldependencyManagement 追記、依存関係-参照を
強制的に sl4j-api 1.8.0-beta0 にする。

<dependencies>
  -省略-
</dependencies>

<dependencyManagement>
   <dependencies>
      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-api</artifactId>
         <version>1.8.0-beta0</version>
      </dependency>
   </dependencies>
</dependencyManagement>

<build>
  -省略-
</build>

そして、module-info.java で、
requires org.slf4j;
追記すれば、解決する。

それにしても、module-info.java を書いた時に、Eclipse

package パッケージ名 does not exist or is empty

のエラーが出るのは、なんとかして欲しいけど、まだ Pleades Eclipse は、この現時点 JDT 4.7.1a で
4.7.2 以降でないとダメみたい。
https://bugs.eclipse.org/bugs/show_bug.cgi?id=525603

整数0埋め文字列

2桁以下の整数を0埋め文字列にするのに、if文 10 < number で判定して生成する
コードを書きたくない時

Java

int num = 7;
String s = String.format("%02d", num);

JavaScript

var num = 7;
var s = ("00" + num).slice(-2);

Python format を使う

num = 7
s = '{0:02d}'.format(num)

Python演算子を使う

num = 7
v = '%02d' % num

時計のUIによるTime picker

時計のようなUIによる Time picker を探してたら github にありました。
https://github.com/weareoutman/clockpicker
f:id:posturan:20171212173730j:plain

github サイトから入手した CSS と JS を使います。

<link rel="stylesheet" type="text/css" href="dist/jquery-clockpicker.min.css">
<script type="text/javascript" src="dist/jquery-clockpicker.min.js"></script>

まずは、標準的なもの。

<style type="text/css">
.clockpicker input{  width: 40px; }
</style>
<div class="clockpicker">
	Time1:<input id="time1" type="text" value="09:30">
</div>

適用ボタンテキストは、donetext オプションで指定します。

$('#time1').clockpicker({
    donetext: "Done",
});

適用ボタンを無くして、分をクリックした時に自動的にセットして閉じるのは、
autoclose というオプションですが、これはタグに書く方法と、option として書く方法の2とおりあります。
f:id:posturan:20171212174813j:plain

<div class="clockpicker">
	Time2:<input id="time2" type="text" data-autoclose="true">
</div>

data-autoclose="true" で指定する場合、

$('#time2').clockpicker();

オプションで指定する場合、

$('#time2').clockpicker({
      autoclose: true,
});

また、デフォルトを現在時刻にする場合、

$('#time2').clockpicker({
      autoclose: true,
     'default': 'now',
});

AM/PM を付ける場合、twelvehour というオプションを true にすれば良いのですが、
注意が必要です。
f:id:posturan:20171212180030j:plain
現在時刻、あるいは既に入力してある時刻による AM/PM を指定させるには、
afterShow オプションで描画後に、AM or PM ボタンを押下と同じ処理をしないと
AM/PM の表示になりません。
次は、現在時刻に対する picker の記述です。

$('#time2').clockpicker({
     twelvehour: true,
     'default': 'now',
     autoclose: true,
     afterShow: function(){
          var d = new Date();
          if (d.getHours() > 12){
               $("button.pm-button").trigger("click");
          }else{
                $("button.am-button").trigger("click");
          }
      },
});

button.pm-button をクリックさせてやります。

システムでは24時間制を使うことが多いせいか、AM/PM の扱いはいまいちでした。

jQuery ui Datepicker に 祝日ならToolTip も表示させる

先日投稿の
oboe2uran.hatenablog.com
に続けて、 祝日ならToolTip も表示させる方法、
Datepicker のオプション beforeShowDay 返却値配列の3番目が、ToolTip のテキストになるので、
先日書いた JavaScript の Datepicker のオプションのbeforeShowDay をさらに書き直して
JavaScript版祝日計算の jholiday.jsを使用すれば、、

$.datepicker.setDefaults( $.datepicker.regional[ "ja" ] );
$("#datepicker").datepicker({
   prevText:"前月", nextText:"翌月",
   changeMonth: true,
   changeYear: true, yearRange: '-2:+6',
   beforeShowDay: function(d){
       if (JHoliday.isHolidayDate(d)){
          return [true, "ui-datepicker-holiday" 
                     , JHoliday.description(d.getFullYear(), (d.getMonth()+1), d.getDate())];
       }else{
          return [true, "", null];
       }
   },
});

これで、
f:id:posturan:20171208001406j:plain
となる。

Python 始めたばかり、import flask でエラー

環境インストールがどこか悪いと思うが、

import flask 

を実行したら、
ModuleNotFoundError: No module named 'markupsafe._compat'
と怒られた。
markupsafeをアンインストールして、入れ直さないとならない。

pip uninstall markupsafe

以下から、Python バージョン、CPU に沿って whl ファイルをダウンロード
https://www.lfd.uci.edu/~gohlke/pythonlibs/#markupsafe

MarkupSafe-1.0-cp36-cp36m-win32.whl
MarkupSafe-1.0-cp36-cp36m-win_amd64.whl

Python36-32 なので今回は、MarkupSafe-1.0-cp36-cp36m-win32.whl をインストール指定で

pip install whlのPATH

Flask をインポートした py を実行すると、無事

 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 325-162-572
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [07/Dec/2017 12:31:30] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [07/Dec/2017 12:31:30] "GET /favicon.ico HTTP/1.1" 404 -

Flask をイントールエラー

Flask をイントールしようとしたら、

pip install Flask

とすると、

Running setup.py install for MarkupSafe ... error

Flask → flask でやり直したら成功

pip install flask

pip list で確認

click (6.7)
Flask (0.12.2)
itsdangerous (0.24)
Jinja2 (2.10)
MarkupSafe (1.0)
pip (9.0.1)
setuptools (28.8.0)
Werkzeug (0.12.2)

これで良いのか。