ブラウザのJavaを無効にする方法

1. 最新版のJavaに更新する
2. Javaコントロールパネルを開く
 (Win7の場合、コントロールパネル→プログラム→Java )
3. 「セキュリティ」タブを開き、「ブラウザでJavaコンテンツを有効にする」のチェックをはずす
4.以下にアクセスして、たしかに無効になっていることを確認
 http://java.com/ja/download/testjava.jsp


ブラウザごとに設定しなくても、Java7u10以降は、Javaコントロールパネルでオフにすれば、無効にできる。
IEの場合、ブラウザの設定でJavaをオフにしても(レジストリをいじったりしないと)ちゃんとオフにならならなくて、困ったもんだったのが、Javaコンパネ側で設定できるようになってよかった。


参考
Java 7 Update 10 からブラウザ上の Java の実行を簡単に無効にできるようになった
http://fnya.cocolog-nifty.com/blog/2012/12/java-7-update-1.html



米政府がJavaの無効を推奨とかで、
世間ではいらないJavaなんてOSからアンインストールしちゃえ、とか言われてるけど、やめてあげて・・・
Javaは悪くないの。ブラウザ上で動くJavaプラグイン(Javaアプレット)が危険なの。


Javaを作ってるOracleという会社が、定期アップデート以外ではめったに、緊急セキュリティーアップデートしなくて、定期アップデートの間隙をついて悪い人たちが、悪いウェブサイトにトラップを仕掛けるのが流行ってるの。


しかしJavaのアップデートって何か毎回、ダイアログがでてインストールとかおさないといけないし、何か重いつーか、自動的感がなくて評判悪いよなー。Flashの更新とは言わないまでも、Windowsの更新ぐらい軽い?感じにできないものだろうか・・・

MySQLの Abandoned connection cleanup thread

TomcatのWebアプリでMySQLに接続した後、Tomcatの終了やWebアプリのリロードなどをするとTomcatのログに以下のようなエラーが表示される。

9 18, 2012 12:29:13 午後 org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [/xxxxx] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.

デプロイの激しい運用に使うんでもなし無視してもいいかなーって気もしたけど、
SEVERE とまで言われると、ちょっとほっておくのもよくないかということで調べてみた。


利用したバージョンは以下
Tomcat 7.0.30
MySQL Connecter/J 5.1.22


バグレポート

レポートが上がってた

Bug #65909 referenceThread causes memory leak in Tomcat
http://bugs.mysql.com/bug.php?id=65909


目下議論中の模様
たぶんこんな感じ


NonRegisteringDriverでスレッド作りっぱなしなんだけど

referenceThread.setContextClassLoader(null) してくれたら、Tomcat側でエラーでないよ

いやいや、警告は出ないけど、スレッドが残っててメモリリークになるんじゃ (今ココ)


しばらくしたら、何がしかの解決にいたると思うけど、
仕様的にどこで対処すべき問題だとか、おらー何だかよくわからないので、
中の人がうまいこと決着してくれるのを待つことにします
以下補足メモ


JDBCクライアント側 NonRegisteringDriver

Tomcatに文句を言われているMySQLJDBCクライアントのコードは以下
com.mysql.jdbc.Driverの親クラスの
com.mysql.jdbc.NonRegisteringDriverのstaticイニシャライザ



static {
Thread referenceThread = new Thread("Abandoned connection cleanup thread") {
public void run() {
while (true) {
try {
Reference ref = refQueue.remove();
try {
((ConnectionPhantomReference) ref).cleanup();
} finally {
connectionPhantomRefs.remove(ref);
}
} catch (Exception ex) {
// no where to really log this if we're static
}
}
}
};

referenceThread.setDaemon(true);
referenceThread.start();
}


Class.forNameでロードしたときに呼ばれるコードなので、DBに接続しなくても再現可能
1年前のバージョンのConnector/J(5.1.16)のNonRegisteringDriverには、この処理はなかった


Tomcat側 clearReferencesThreads

Tomcatでエラーを出力してるコードは

org.apache.catalina.loader.WebappClassLoader クラスの
#clearReferences メソッドから呼ばれる
#clearReferencesThreads メソッドの中の以下の部分



@SuppressWarnings("deprecation") // thread.stop()
private void clearReferencesThreads() {
Thread[] threads = getThreads();

// Iterate over the set of threads
for (Thread thread : threads) {
if (thread != null) {
ClassLoader ccl = thread.getContextClassLoader();
if (ccl == this) {
// Don't warn about this thread
if (thread == Thread.currentThread()) {
continue;
}

// JVM controlled threads
ThreadGroup tg = thread.getThreadGroup();
if (tg != null &&
JVM_THREAD_GROUP_NAMES.contains(tg.getName())) {

// HttpClient keep-alive threads
if (clearReferencesHttpClientKeepAliveThread &&
thread.getName().equals("Keep-Alive-Timer")) {
thread.setContextClassLoader(parent);
log.debug(sm.getString(
"webappClassLoader.checkThreadsHttpClient"));
}

// Don't warn about remaining JVM controlled threads
continue;
}

// Skip threads that have already died
if (!thread.isAlive()) {
continue;
}

// TimerThread can be stopped safely so treat separately
// "java.util.TimerThread" in Sun/Oracle JDK
// "java.util.Timer$TimerImpl" in Apache Harmony and in IBM JDK
if (thread.getClass().getName().startsWith("java.util.Timer") &&
clearReferencesStopTimerThreads) {
clearReferencesStopTimerThread(thread);
continue;
}

if (isRequestThread(thread)) {
log.error(sm.getString("webappClassLoader.warnRequestThread",
contextName, thread.getName()));
} else {
log.error(sm.getString("webappClassLoader.warnThread",//※←(1)
contextName, thread.getName()));
}

// Don't try an stop the threads unless explicitly
// configured to do so
if (!clearReferencesStopThreads) {//※←(2)
continue;
}

// If the thread has been started via an executor, try
// shutting down the executor
try {

//...

※(1) 該当のエラーを出力している箇所

ぐぐったら日本語の解説あった。

技術者が知っておきたいTomcat 7の新機能20連発
http://www.atmarkit.co.jp/fjava/rensai4/tomcat7_03/02.html
の「実行中スレッドの停止」の「リクエスト処理スレッド以外のスレッドが実行中の場合」にあたる処理


※(2) context.xmlで  と指定すると
 この後のコードでスレッドをstopに行くが、メッセージの後なので、結局のところSEVEREな警告は出ると思われる

EclipseのデバッグでJNIエラー

Eclipseデバッグしてたら抜けるときに変なエラーが出る

ERROR: JDWP Unable to get JNI 1.2 environment, jvm->GetEnv() return code = -2
JDWP exit error AGENT_ERROR_NO_JNI_ENV(183):  [../../../src/share/back/util.c:838]


Java6でもJava7でも発生
超単純なHello Worldみたいなので発生
8割方発生するがたまーに出ない
Eclipse使わずにコマンドラインでjdbだと発生しない


ぐぐったらコンパイル環境と実行環境が違う場合に出るとか
とりあえずSystem.exit(0)にすれば出ないとか(そんなご無体な…)とか書いてたけど…


というかVirtualBox上のWindows7上で実行したんだけど、環境壊れて一からインストールしたらエラーが出はじめた
それで、ふと設定でCPUを1から2に増やしたら出なくなった
ホスト側PCでハイパースレッディングオフにして6コア6スレッドにしてるのも何か影響してるのだろうか
(あとメモリも増やした)

さっぱり謎だし忘れることにします
もし同じ事態になったら面倒なので一応メモ

Eclipse4.2でJD-Eclipseでデコンパイルできない

File Associationsで ".class without source" のエディターが初期設定だと "Class File Viewer"なんだけど、"Class File Editor"を追加してデフォルトにすると実行されるようだ。


3.7(.0)のときはそんな関連付けいじらなくても動いてた気がしたけど


参考
http://d.hatena.ne.jp/terazzo/20101230/1293707864
https://plus.google.com/104469447717794601049/posts/6gikMpgQLDH


[追記]
関連付け設定すればOKかと思ったけど、
ソース添付JARとそうでないJARがある場合、ソース添付してたらソースを開いて、でなければデコンパイルってのがうまく動かない。本家(Emmanuel Dupuy氏)をフォークした(Alex Kosinsky氏)のをフォークした(Mchr氏)バージョンがうまく動いてるようなので、こっちがよさそう。

Mchr3k - JDEclipse-Realign
http://mchr3k.github.com/jdeclipse-realign/
http://mchr3k-coding.blogspot.co.uk/2012/08/jd-eclipse-realign-source-lifetime.html

JD-Eclipseの更新サイト消えてる

久々にJD-Eclipseをインストールしようと思ったら更新サイトが落ちてる というか消えてる?
代替のサイトを探し中のようだけど、とりあえず、JD-Eclipse自体は1.0.3から変わってないから、お急ぎの方はInternetarchiveからZIPをローカルに落として、更新サイトでZIPを指定してインストールすればいいらしい


もともとの更新サイト(消えてる)
http://java.decompiler.free.fr/?q=jdeclipse
更新サイトのアーカイブ
http://web.archive.org/web/20110720221237/http://java.decompiler.free.fr/jd-eclipse/update/jdeclipse_update_site.zip


参考
https://twitter.com/EmmanuelDupuy/status/218575349531951105
http://stackoverflow.com/questions/11218792/cant-access-jd-eclipse-site-http-java-decompiler-free-fr-q-jdeclipse

Eclipse上でANTのjunitreportタスクを実行すると失敗する

こんなの出るんだけど、

[junitreport] : Error! staticでないJava関数'replace'の最初の引数は無効なオブジェクト参照です。
[junitreport] : Error! データ型'void'を'reference'に変換できません。
[junitreport] : Fatal Error! スタイルシートコンパイルできませんでした

ぐぐったら、バグだそうです


Bug 384757 - Ant build fails in junitreport using Java 6u32 or later
https://bugs.eclipse.org/bugs/show_bug.cgi?id=384757
Bug 51668 - broken on JDK 7 when a SecurityManager is set
https://issues.apache.org/bugzilla/show_bug.cgi?id=51668


とりあえず、スタンドアロンのAntでコマンドラインからだと普通に動いたし、深く考えないことにする。
あと、targetの外にjunitreportタスクを書いて実行したらなぜか動いた。