Play2のJava版でアクションの前後に処理をはさむ。
Play2のJava版で、Actionの開始、終了に処理をはさみこみたい。とりあえずロギングを仕込んでみる。
play.GlobalSettingsに以下のメソッドがあるので、これを利用すれば良さそう。
public Action onRequest(Http.Request request,
java.lang.reflect.Method actionMethod)
ただし、これはActionを返すわけでResultを返すわけではないので、
logging.info("Start...");
super.onRequest(request, actionMethod);
logging.info("End...");
みたいなわけには行かない。とりあえず以下のようにしてみる。
@Override
public Action onRequest(Http.Request request, final Method actionMethod) {
final Action baseAction = super.onRequest(request, actionMethod);
return new Action() {
@Override
public Result call(Http.Context ctx) throws Throwable {
logger.info("Start " + actionMethod);
try {
Result result = baseAction.call(ctx);
logger.info("End " + actionMethod + " result = " + result);
return result;
}
catch (Throwable t) {
logger.error("End " + actionMethod + " with error", t);
throw t;
}
}
};
}
しかしなんかNPEが出る。
[error] Global - End public play.mvc.Result controllers.Application.requestToken() with error
java.lang.NullPointerException: null
at play.GlobalSettings$1.call(GlobalSettings.java:63) ~[play_2.10.jar:2.1.1]
at Global$1.call(Global.java:39) ~[na:na]
at play.core.j.JavaAction$$anon$2.apply(JavaAction.scala:74) [play_2.10.jar:2.1.1]
at play.core.j.JavaAction$$anon$2.apply(JavaAction.scala:73) [play_2.10.jar:2.1.1]
at play.libs.F$Promise$PromiseActor.onReceive(F.java:420) [play_2.10.jar:2.1.1]
at akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:159) [akka-actor_2.10.jar:na]
該当箇所を見ると、
@SuppressWarnings("rawtypes")
public Action onRequest(Request request, Method actionMethod) {
return new Action.Simple() {
public Result call(Context ctx) throws Throwable {
return delegate.call(ctx); // ここ
}
};
}
どうもdelegateって変数がnullらしく、super.onRequest()を呼んだ時点では設定されないみたいで、実際にアクションが実行される時に設定されるようだ。つまり継承によって静的に解決しているのではなく、delegateに親のアクションを指定することで動的に継承を行っていると。そこで親アクションをdelegateチェーンの中に挟み込んでやる。
@Override
public Action onRequest(Http.Request request, final Method actionMethod) {
final Action baseAction = super.onRequest(request, actionMethod);
return new Action() {
@Override
public Result call(Http.Context ctx) throws Throwable {
logger.info("Start " + actionMethod);
try {
baseAction.delegate = this.delegate;
delegate = baseAction;
Result result = delegate.call(ctx);
logger.info("End " + actionMethod + " result = " + result);
return result;
}
catch (Throwable t) {
logger.error("End " + actionMethod + " with error", t);
throw t;
}
}
};
}
今度は動いた。
AndroidのEmulatorからホストPCに接続できない。
AndroidのEmulatorから、ホスト側のPCにアクセスする場合、以前はホストのIPアドレスで接続できたと記憶している。ところが今日試したら接続できない。adb shellで入ってpingを打っても返ってこない。ネットワークが全く使えないわけではなく、普通にインターネットにはアクセスできている。
今のEmulatorは、仮想ルータ、ファイヤウォールを使っているらしい。で、ホストにアクセスするには10.0.2.2でアクセスできるようだ。
Software in 30 Daysを献本いただきました。
Software in 30 Days スクラムによるアジャイルな組織変革“成功"ガイド
スクラムの作者である、Ken Schwaber、Jeff Sutherlandによる、マネジメント層向けのガイド。
これまでアジャイル関係の本は、開発者向けのくだけた本が多かったけど、そろそろ、こうした経営層向けの本の需要が上がっていくのかもしれない。内容的には、まじめなスクラムの解説。特に豊富なケーススタディ、それも失敗例もあるので色々と参考になった。ただ正直、ROIをグラフ化するとかピンと来ない(そんなもん簡単に算出できるもんだろうか)。アジャイルのイテレーションって1-2週という例が多いと思うけど、この本では30日というのが一般的だった。その点も新たな発見。正直1週間周期はかなり忙しくて、何か月も続けていく自信がない。
半田吸い取り器が故障。
学生の頃は電動の半田吸い取り器というのは、何しろ40k円くらいするので高値の花だった。会社に入ったころに給料で買った半田吸い取り器がHAKKO 484。最近吸いが悪いなとは思っていたのだけど、久し振りに使ったら、全く吸わないどころか逆に空気が出てくる始末。
昔ほどは使わなくなったとはいえ、無いと困るのでgootのTP-100を購入。市価で20k円を切っているけれど、吸引力は問題無し。ただ1秒以上連続で吸わないことと、1回ごとに10秒間をあけるようにとのことで、あまりヘビーな使い方は無理な感じ。まぁ1秒以上吸うことはまずないのだけど(そんなにコテ先を当てていたら部品が熱で壊れてしまう)、ICを抜く時とかは1ピンごとに10秒あけるのは結構退屈な作業になりそう。
Hakko 484の方は捨てる前にちょっと分解して中を見てみたら、中は思ったより単純な造りでネジを外していけばポンプを完全にバラバラにできる。シリンダを分解してみると、中の弁が完全に溶解していた。
ちょっと検索してみたら、どうやらまだ保守部品を売っているようだ。ちゃんと弁も売ってるし。20年前に買った工具の保守部品がまだ手に入るというのはすごいね。というか、この製品ってまだ現役で売っているのか。これだけ長くサポートしてくれるなら、少々高くても安心料だと思えば高くないかも。
シリンダ2つのうち片方は完全に弁が溶けているようで外れないので、あきらめかけたけれどダメもとでシリンダ全体をコンロであぶってみたら、融解して外れた。あとは塗料剥離剤に漬けておいたらきれいになったので部品を取り寄せてみることに。ホームセンタで取り寄せできますよとのことだったので、近所の島忠(なんか最近シマホという名前になったらしい)で取り寄せ。手に入るうちに、弁の他にもダイヤフラムなど痛みやすそうな保守部品を幾つか手に入れておいた。
弁を交換したら、また元気に吸ってくれるようになった。保守部品のストックもあるので、モータ自体がいかれたりしなければ、もう自分が生きている間は修理できそうだ。
電動半田吸い取り器が無い間、久しぶりに手動のを使ったけれど、手動の半田吸い取り器だと、やはりgootのGS-20が今迄使ってみた中では一番いい感じ。小型で疲れないし先端はテフロン製。ピストンを押し込む時に自動でノズルクリーニングされて扱いやすい。もちろん手動だから吸引力はそれなりだけど、電動は温めるのに時間がかかるので、手早く芋半田やブリッジを取りたい時なんかはこれで十分。
Play 2.1でGuiceを使う。
Play 2.1のJava版(?)の方でGuiceを使用する方法をメモ。Play用Guice pluginのページでは、2.1からはplay.GlobalSetting#getControllerInstanceを使ってねとある。良く分からずに試してみる。
Build.scalaを変更
val appDependencies = Seq(
// Add your project dependencies here,
"com.google.inject" % "guice" % "3.0", // 追加
javaCore,
javaJdbc,
javaEbean
)
Playのコンソールで、reloadとupdateを実行して準備ok。
とりあえずトークン生成器を作ってみる。
package helpers;
public interface TokenGenerator {
long nextToken();
}
package helpers;
import java.security.SecureRandom;
import java.nio.ByteBuffer;
public class TokenGeneratorImpl implements TokenGenerator {
static final SecureRandom source = new SecureRandom();
public long nextToken() {
return ByteBuffer.wrap(nextRandom(new byte[8])).asLongBuffer().get();
}
byte[] nextRandom(byte[] outBuf) {
source.nextBytes(outBuf);
return outBuf;
}
}
ThreadLocalしたい人は、ご自由に。これをコントローラにInjectする。
import com.google.inject.Inject;
public class Application extends Controller {
final TokenGenerator tokenGenerator;
@Inject
public Application(TokenGenerator tokenGenerator) {
this.tokenGenerator = tokenGenerator;
}
public Result index() {
// tokenGeneratorを使うコード
}
...
}
routesでは、コントローラ名に@を付ける。
POST /api @controllers.Application.index()
Guiceを生成するクラスを用意。Globalってクラスを作るらしい。良く分からずとりあえず無名パッケージで作成してみる。
import play.GlobalSettings;
import com.google.inject.Guice;
import com.google.inject.AbstractModule;
import com.google.inject.Injector;
public class Global extends GlobalSettings {
private static final Injector INJECTOR = createInjector();
@Override
public <A> A getControllerInstance(Class<A> controllerClass) throws Exception {
return INJECTOR.getInstance(controllerClass);
}
private static Injector createInjector() {
return Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(helpers.TokenGenerator.class).to(helpers.TokenGeneratorImpl.class);
}
});
}
}
動いたので、これでいいみたい。
ITXはビデオカードがネック。
ITXはメモリスロットが2つしかないけど、今なら8GBx2で16GB搭載できるので、問題ないだろうということで。デスクトップのITX化に挑戦してみたけど、結局失敗したという話。
ケースはこちら。Amazonだと今は5k円切っているみたい。300W電源が載っているのはいいのだけど、ファンが爆音。電源ファンとケースファンの両方を交換。あとマザー上のUSB3コネクタにつなぐケーブルが付属しないので別途購入が必要。こういうやつ。ただ今回のマザーだと干渉して若干ヤスリで削る必要があった。しかしこのコネクタは、やたらとピンが細い上に精度も悪くすぐにピンが曲がってしまう。差した後の安定感も無いし正直設計ミスな気がする。
CPUはi7 3770K。純正ファンは今ひとつ騒音が気になるので、こちらに交換。
マザーはインテル製のこちら。安いしNICもインテル製で、BIOSの動作が安定しているので、最近インテルのマザーボードばかり買ってる。
このマザーはDisplay portとDVIが付いているので、もしかしたらビデオカードも不要かなと思ったけど、残念ながら2560x1600を2面表示することはできなかった。それならばということで、このあたりの安いファンレスのビデオカードを購入。しかしマザーとビデオカードとの同時出力がうまくいかず頓挫。あきらめてちょっと高いけど、こちらに変更。
正直ゲームとかやらないんで、このPCI Express x1のカードで十分かと思ったのだけど、残念ながら2Dでもかなり遅い。特にFirefoxの描画がかなり遅くてちょっと我慢できないレベルだった。ビデオカードをファン付きにすれば、もう少し性能の高いものも手に入るけど、また騒音で悩まされそうなので今回はITX化はあきらめることにした。今回のマシンはIvory専用マシンにして、古いIvory専用マシンは、丁度甥っ子に昔あげたマシン(Pentium4マシン!)が壊れたのでそのまま押し出し。
大きさはMicro ATXに格上げして、結局ケースはSiverstoneのこちらに変更。マザーは、やはりインテルのこちら。メモリもせっかくなんで32GB搭載。ぎりぎり円安になる前だったので32GBでも9k円台で買えた。このケースは底面にマザーを収納するタイプでコンパクトでなかなかいいんだけど、ケーブルの処理で困るので電源はプラグインタイプにした方が良いかも。あと最近は何でもかんでも青色LEDなのがなんかね。電源は緑、HDDは赤がやっぱり慣れていていいな。あとUSBコネクタが前面パネルを開けたところにあるんだけど、この前面パネルを開けた状態だとLEDがまぶしいのが難点。
今回の入れ替えでATXタワーを3つほど廃棄。だいぶスッキリした。




























