2014年10月9日木曜日

[html] name属性を定義していないinputタグのformデータは送信されない

当たり前のことだけどこれの不理解に起因するバグがあって時間とられたのが悔しいのでメモ。
まぁ、テンプレートエンジン使ってると見落としがちなのかもしれないが…。

[JavaScript] wait~リトライを行う処理

クライアントサイドJavaScriptでwait処理に相当するものが必要になったので調べてみた。

そもそもJavaScriptにはwait / sleep に相当する関数が無いみたいだが、
遅延処理を実現する setInterval() / clearInterval() の2つのメソッドにて同様の関数を実装できると判明。

今回は純粋なwait処理だけでなく、非同期に行われる処理との同期をとるためのチェックも行える必要があったのでこんな関数を書いた。

/* 
 * 条件を満たすか、指定回数だけリトライするまで待つ
 * ループ処理としても使える
 * [引数]    test        :終了条件を満たすかどうか判断する関数
 *             callback    :終了条件を満たした後に呼び出す関数
 *             time        :ポーリングタイム(ms)
 *             retry        :リトライ回数
 */
function wait(test,callback,time,retry) {
    // リトライ指定が無い場合はデフォルト回数を設定
    if(retry === undefined) { retry = 3; }
    
    var count = 0;
    
    // wait条件を満たすまで繰り返す処理
    var process = function() {
                        count++;
                        if(test() || (count > max)) {
                            clearInterval(timer);
                            callback();
                        }
                    };
    var timer = setInterval(process(),time);
}


参考にしたサイトでも指摘されていたが、時刻の取得→比較を繰り返すのはブラウザが固まってしまうアンチパターンなのでNG。

普段はJavaばかり書いてるので、JavaScriptでクロージャを意識したコードを書くの楽しい。

【参考】
【JavaScript】処理の実行タイミングを遅らせる方法 | Web制作会社スタイル
遅延実行 | JavaScript プログラミング解説
javascript で wait処理 - 新みのる日記

2014年9月19日金曜日

[カメラ] 逆光を利用して写真を撮る

友達の記事:井山の写真の解説 | 写真をちょっといい感じにする方法集を読んで感化されたので谷中近辺を散策しつつ、実践してみた。

とりあえず一枚…
それらしき感じのが撮れて良かったが、この花の名前がわからないので誰かに同定してほしい次第。





Bloggerでデザインを変更したらHTMLテンプレートが初期化された

タイトルそのままだが、Bloggerでデザインを変更したらHTMLテンプレートが初期化された。

デザイン変更直後にSyntaxHighlighterが効かなくなってるな~と思っていたら、jsファイルを読み込んで無かったのでもしやと思い確認したところ、やっぱり初期化されていた。

↓をHTMLに追記して、OK。


<link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
<link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPhp.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushXml.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js' type='text/javascript'/>
<script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushBash.js' type='text/javascript'/>
<script language='javascript'>
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = &#39;http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf&#39;;
SyntaxHighlighter.all();
</script>

2014年9月6日土曜日

[Java] JDKコマンドを使う時は対象のVMとバージョンを合わせる

でないと VMVersionMismatchException という非常に明確なExceptionが飛ぶ。

$ jstack -F 5268
Attaching to process ID 5268, please wait...
Exception in thread "main" java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at sun.tools.jstack.JStack.runJStackTool(JStack.java:136)
        at sun.tools.jstack.JStack.main(JStack.java:102)
Caused by: sun.jvm.hotspot.runtime.VMVersionMismatchException: Supported versions are 23.5-b02. Target VM is 23.1-b03
        at sun.jvm.hotspot.runtime.VM.checkVMVersion(VM.java:234)
        at sun.jvm.hotspot.runtime.VM.(VM.java:297)
        at sun.jvm.hotspot.runtime.VM.initialize(VM.java:367)
        at sun.jvm.hotspot.bugspot.BugSpotAgent.setupVM(BugSpotAgent.java:598)
        at sun.jvm.hotspot.bugspot.BugSpotAgent.go(BugSpotAgent.java:493)
        at sun.jvm.hotspot.bugspot.BugSpotAgent.attach(BugSpotAgent.java:331)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:163)
        at sun.jvm.hotspot.tools.JStack.main(JStack.java:86)
        ... 6 more


表示されるバージョンはJVM(上の例だとHotSpot)のバージョン。
JavaSEとかに比べるとあまり馴染みが無い。
Supported versions are 23.5-b02. Target VM is 23.1-b03

【参考】

7杯目のおかわりコーヒーはイルカの夢を見るか? - Programming Studio -

2014年9月5日金曜日

[SAStruts] SAStrutsのActionではgetから始まるメソッド名を付けてはいけない

ActionクラスにgetHogeという名前のメソッドを追加したところ、変更箇所以外の挙動がおかしくなった。

SAStrutsの落とし穴 - じゃばらの手記 -によると…
SAStrutsJSPレンダリングするとき、ActionFormとActionのプロパティとpublicフィールドの値をMapに詰め込みます。こうすることでpublicフィールドをJavaBeansのプロパティのような感覚で扱うことが出来るわけです。
ハマった。。

【環境】

sa-struts-1.0.4-sp9

2014年9月4日木曜日

[Java] jpsコマンドでTomcatのプロセスが表示されない


jps ツールは、ターゲットシステム上で計測された HotSpot Java 仮想マシン (JVM) を一覧表示します。このツールで表示できるレポート情報は、アクセス権を持った JVM に関するものに限定されます。(jps - Java 仮想マシンプロセスステータスツール -
というから、
起動中のTomcatのPIDを知りたくてjpsコマンドを実行したら。
$ jps
8960 Jps
jpsコマンドのプロセスしか結果に表示されない。 ググったところ、jpsコマンドでTomcatのプロセスが表示されない場合の対処方法がすぐ見つかった。

jpsコマンドはjavaアプリケーションが出力するtempファイルからプロセス情報を拾っているとのこと。

Windowsだと下記ディレクトリにPIDがファイル名のファイルが生成されていた。

C:\Users\[ログオンユーザ名]\AppData\Local\Temp\hsperfdata_[ログオンユーザ名]


で、Tomcatはと言うと、システムプロパティ:java.io.tmpdirで指定したディレクトリにPIDファイルを出力する。デフォルトだと $CATALINA_HOME\temp になる気がする…、未確認。

JVMの起動オプションで出力先をjpsの確認先にしてやり、Tomcatを再起動すると…
-Djava.io.tmpdir=C:\Users\[ログオンユーザ名]\AppData\Local\Temp\hsperfdata_[ログオンユーザ名]

jpsコマンドでTomcatのPIDが表示されることを確認。

$ jps
13212 Bootstrap
8960 Jps

Tomcat以外にも独自のファイルを作成するjavaアプリケーションはありそう。

【環境】

JDK 6.0.45
Tomcat 6.0系(マイナーバージョン未確認)