モーグルとカバとパウダーの日記 このページをアンテナに追加 RSSフィード Twitter

モーグルやカバ(EXカービングスキー)、山スキー(BC)の山行記録などがメインの日記です。
いろんな条件のいろんなところを、その時々の条件にあった滑り方で楽しむ、フリースキーをして遊んでいます。

検索で来られた方は、上の検索窓から再度検索していただくか、右サイドバーのカテゴリーやトピックスの項目で絞り込んでみてください。
仕事柄、コンピュータ系のネタも多いので、スキー関連ネタだけ読みたい方は[ski]、コンピュータ関連ネタは[pc]、スパム関連ネタは[spam]で絞り込んでください。

2015-05-20 (Wed)

[]GIMPで拡大縮小がうまくできなくなる問題 GIMPで拡大縮小がうまくできなくなる問題を含むブックマーク GIMPで拡大縮小がうまくできなくなる問題のブックマークコメント

嫁がGIMPを使って幼稚園のアルバム作成をしてるのですが、GIMPで拡大縮小の動作がなんかおかしくなるという問題が起きました。


探しても同じ問題にあたっている人がなかなかなかったのですが、この件とたぶん同じと思われます。

自分もこのスレッドと同様、別レイヤーに一旦コピーしてそこから拡大して対応しました。


レイヤーの拡大縮小ができません - GIMP質問掲示板

http://0bbs.jp/gimproject/4502/


実は、A4で印刷可能な領域などを半透明で設定してあるファイルを作ってあり、それを読み込んでから画像を別レイヤーで読み込んで拡大しようとしていました。

が、この元となるファイルで点くらいの大きさで領域選択がされていました

その上に画像を別レイヤーで読み込むと、読み込んだ画像全体が選択されたり新たな領域選択がされず、その小さな領域が拡大、となってしまっていました。

そのため、拡大しようとするとその何ドットかが拡大されるみたいになって、うまく動かない… となっていたのです。


そこで一旦矩形領域選択で別のところを選択して、その小さな領域選択が表示されなくなってから読み込むと普通に動くようになりました。

「選択」メニュー内の「選択を解除」を行ってもいいような気がします。


とりあえず、読み込んだファイルにすでに領域選択がされている状況で、別の画像を「レイヤーとして開く」をすると、領域選択の動きがおかしくなるのではないか、と思われます。

2015-05-08 (Fri)

[]JavaのSimpleDateFormatで多桁のミリ秒読み込みの謎 JavaのSimpleDateFormatで多桁のミリ秒読み込みの謎を含むブックマーク JavaのSimpleDateFormatで多桁のミリ秒読み込みの謎のブックマークコメント

CSVで渡されてくるデータの中に、日時データにミリ秒以下のものが付いているものがあり、そのパースをするとなんか読み込んだ時刻が微妙にずれてしまう、という問題が起こりました。


日付が「2015-05-08 00:00:00.123456789」のような形式でわたされるため、

String dateStr = "2015-05-08 00:00:00.123456789";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSSSSSSS");
Date date = dateFormat.parse(dateStr);

のようにしてパースさせたのですが、9時間ズレるとかではなく中途半端に時間がずれてしまうのです。


なんでこうなるんだろう?と思ってちょっとテストコードを書いてみました。

out.println(testCalendar("2015-05-08 00:00:00",          "yyyy-MM-dd HH:mm:ss"));
out.println(testCalendar("2015-05-08 00:00:00.123",      "yyyy-MM-dd HH:mm:ss.SSS"));
out.println(testCalendar("2015-05-08 00:00:00.1234",     "yyyy-MM-dd HH:mm:ss.SSSS"));
out.println(testCalendar("2015-05-08 00:00:00.12345",    "yyyy-MM-dd HH:mm:ss.SSSSS"));
out.println(testCalendar("2015-05-08 00:00:00.123456",   "yyyy-MM-dd HH:mm:ss.SSSSSS"));
out.println(testCalendar("2015-05-08 00:00:00.1234567",  "yyyy-MM-dd HH:mm:ss.SSSSSSS"));
out.println(testCalendar("2015-05-08 00:00:00.12345678", "yyyy-MM-dd HH:mm:ss.SSSSSSSS"));
out.println(testCalendar("2015-05-08 00:00:00.123456789","yyyy-MM-dd HH:mm:ss.SSSSSSSSS"));

public String testCalendar(String dateStr, String formatStr) throws ParseException {
    String out = "";
    SimpleDateFormat dateFormat = new SimpleDateFormat(formatStr);
    Date date = dateFormat.parse(dateStr);
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    date = cal.getTime();
    out += "parsed date: " + dateFormat.format(date);
    return out;
}

結果

parsed date: 2015-05-08 00:00:00
parsed date: 2015-05-08 00:00:00.123
parsed date: 2015-05-08 00:00:01.0234
parsed date: 2015-05-08 00:00:12.00345
parsed date: 2015-05-08 00:02:03.000456
parsed date: 2015-05-08 00:20:34.0000567
parsed date: 2015-05-08 03:25:45.00000678
parsed date: 2015-05-09 10:17:36.000000789

ということで、3桁までならば正常にパースされているようです。


ぐぐってみると、下記ページを見てなるほど、となりました。

[Seasar-user:8699] Re: Timestamp型の秒以下の桁を取得するには

TimestampConverter は SimpleDateFormat を使っており,

SimpleDateFormat のパターン文字 S は「ミリ秒」なので

4 桁以上指定しても意味はありません.

ミリ秒だから本来なら3桁までのはずなので、それよりでかい桁については律儀にミリ秒を秒や分、日付に計算しなおしてくれてたのですね。


ここで渡されてくる9桁の「ミリ秒」はそういう意図のデータではないし、まあミリ秒以下のデータは不要であったため、前処理でカットしてパースするようにしました。

自分のように、DBから渡されたデータを、そのまま多桁の「S」を使ったフォーマットで読み込むと、この問題にあたりますので気をつけて。

トラックバック - http://d.hatena.ne.jp/stealthinu/20150508

2015-04-28 (Tue)

[]jquery.validationEngine.jsとautoConfirm.jsの併用 jquery.validationEngine.jsとautoConfirm.jsの併用を含むブックマーク jquery.validationEngine.jsとautoConfirm.jsの併用のブックマークコメント

javascriptである程度凝ったバリデーションをしようとすると、やはり既存ライブラリを使ったほうが良いと考え、jquery.validationEngine.jsを導入してみました。

posabsolute/jQuery-Validation-Engine

https://github.com/posabsolute/jQuery-Validation-Engine

見た目もよく、IE6以降対応で、バリデーションの種類も柔軟に設定出来ることなどからこちらにしてみました。


あと、確認画面を出すためにautoConfirm.jsというjqueryプラグインを使っていました。

autoConfirm.js - フォームの確認画面を自動生成

http://blog.material-being.com/portfolio/auto_confirm/

これは確認画面をわざわざ作らなくても、入力フォームを使って確認画面を表示してくれるものです。


で、この2つを一般的な設定で併用して使おうとすると、どちらもsubmitイベントで同時に平行して動いてしまうためうまく動きませんでした。


バリデーションが通ったら確認画面を表示する、という動作にする必要がありました。

元々は、submitするためのボタンにonclickで自前のバリデーションを実行し、trueだったときにautoConfirm.jsに回るようになっていました。

そこでjquery.validationEngine.jsも同様に動かすようにしてみました。


公式ページの使い方や、validationEngineを紹介しているエントリーではだいたい

$(document).ready(function(){
    $("#formID").validationEngine();
});

と、フォームにvalidationEngineをattachしてsubmitで自動的にvalidateが掛かるように設定していますが、「validate」というメソッドを呼ぶことでvalidateを掛けることができます。

$("#formID").validationEngine('validate');

そこで下記のように確認ボタンが押されるとvalidationEngineのvalidateを呼んで、それが通った時だけautoConfirmで確認画面に遷移する、という動作に出来ました。

<form name="editForm" class="autoConfirm">
  <input name="name" type="text" class="validate[required]">

  <button type="submit" onclick="return validate(document.editForm)">確認</button>
  <button type="button" class="autoConfirmBack" style="display:none;">戻る</button>
</form>

<script type="text/javascript" src="/js/jquery.validationEngine.js"></script>
<script type="text/javascript" src="/js/jquery.validationEngine-ja.js"></script>
<script type="text/javascript" src="/js/jquery.ba-hashchange.min.js"></script>
<script type="text/javascript" src="/js/autoConfirm.js"></script>
<script type="text/javascript">
 function validate(form) {
   if (! $(form).validationEngine('validate')) {
     return false;
   }
   return true;
 }
</script>
トラックバック - http://d.hatena.ne.jp/stealthinu/20150428

2015-04-21 (Tue)

[]MySQL WorkbenchがWin7/8でSSH経由で接続してる時selectが止まる問題 MySQL WorkbenchがWin7/8でSSH経由で接続してる時selectが止まる問題を含むブックマーク MySQL WorkbenchがWin7/8でSSH経由で接続してる時selectが止まる問題のブックマークコメント

他の人のWin7環境にMySQL Workbenchを入れてテーブルを見ようとしたところ、テーブルを見ようとselectしただけで止まってしまう(ハングしてる感じ)問題が起きました。

これ、全てのテーブルがダメなわけではなく、一部のテーブルを見ようとしただけでこの状況が起き、見れるテーブルは全く問題なく見れるのです。

止まってしまうテーブルは、limitの設定を小さくしてもやはり止まってしまいました。

また、自分のWin8.1で同じバージョン、設定で見ても問題なく見れました。ただ、一度同じような問題が発生したことがありました。(その後再現せず)


それで同じ問題にはまってる人がいないかぐぐってみたのですが、日本語の情報はなかなか無く、でも英語だともろそのものな感じの情報が見つかりました。

MySQL Bugs: #73343: Workbench Freezes on Remote SSH Server Query

MySQL Workbench hang on fetching more than some size of data - Stack Overflow


どうも

という条件でのみこの問題が発生するようで、自分の例のように同条件でも発生したりしなかったりするようです。


MySQLのmax_allowed_packet設定を大きくすることで改善したという報告もありましたが、確実ではないようです。

MySQL Workbench 6.0.9にダウングレードすると確実に改善するようです。

MySQL :: Download MySQL Workbench(6.0.9)のダウンロードページ


結局、6.0.9にダウングレードすることで対処しました。

なぜこんな謎現象が発生するのか不思議です…


(追記)

6.3.xなら治ってるかな…?と思って探してみたのですが、まだダメらしいです。

http://bugs.mysql.com/bug.php?id=74557

トラックバック - http://d.hatena.ne.jp/stealthinu/20150421

2015-04-02 (Thu)

[]javascript重複チェックとソート javascriptで重複チェックとソートを含むブックマーク javascriptで重複チェックとソートのブックマークコメント

「grape,apple,orange」のように、カンマ区切りで入力された内容を重複チェックするために、ハッシュにいれることで行いました。

例えばこんな感じです。

  input = "grape,apple,orange,apple";

  var results = {};
  var inputs = input.split(",");
  for (var i = 0; i < inputs.length; i++) {
    results[inputs[i]] = true;
  }

  for (var result in results) {
    console.log(result);
  }
grape
apple
orange

この結果をソートしたいという要望が出たため、ハッシュ results をソートしようとして results.sort() としたのですが、出来ないのですね。

あれ?出来なかったっけ?と思ったんですが、javascriptだと出来ない感じ… perlなら出来るのに。


というわけで、一度配列に突っ込み直してソートしました。

  input = "grape,apple,orange,apple";

  var results = {};
  var inputs = input.split(",");
  for (var i = 0; i < inputs.length; i++) {
    results[inputs[i]] = true;
  }

  var resultsArray = [];
  for (var result in results) {
    resultsArray.push(result);
  }
  resultsArray.sort();

  for (var i = 0; i < resultsArray.length; i++) {
    console.log(resultsArray[i]);
  }
apple
grape
orange

なんかひと手間感ありますね。


これってもっと良い方法あるのかな?

こうするといいよってのありましたら教えてください。


(追記)

@kotyさんから

input.split(',').reduce(function(prev,curr){if(prev.indexOf(curr)===-1)prev.push(curr); return prev;}, []).sort();

通りすがりさんから、ES6ならば

[...new Set(input.split(','))].sort();

といただきました。

関数型の威力をみせつけられましたねえ…

kkotyykkotyy 2015/04/02 16:42 input.split(',').reduce(function(prev,curr){if(prev.indexOf(curr)===-1)prev.push(curr); return prev;}, []).sort();

でいけました。IE8以前だと動きませんが。

stealthinustealthinu 2015/04/02 18:16 おお、すばらしい。なるほどreduceこういう感じに使うといいのか。
これ見て思ったんですが、sortしてからシュリンクすればもっと単純になりそうですね。

stealthinustealthinu 2015/04/02 18:21 …と思ったんだけどあんまりうまくいかないや。
全部と検索するんじゃなくて一つ前のと比べるだけだから単純になると思ったんだけど、別にpushする先がないとだめなのか。

kkotyykkotyy 2015/04/03 08:35 ちなみにTypeScriptだと
input.split(',').reduce((prev,curr) => {if(prev.indexOf(curr)===-1)prev.push(curr); return prev;}, []).sort();
と書けてプチハッピーです。filter/map/reduceはラムダ式と相性が良いです。

通りすがり通りすがり 2015/04/03 16:38 reduceとかを使う必要はありません。ES6なら
[...new Set(input)].sort()
だけで可能です。

stealthinustealthinu 2015/04/06 09:56 うおお、ほんとだ。なにこれすごい!
「...」になに埋めたらいいんだろ?と思ったら、これそのままで動くのですね。SetやMapはいわゆるSetやMapだろうということでわかるのですが、「...」の文法がよくわからんうえにググりにくい…
勉強してきます。

stealthinustealthinu 2015/04/06 10:20 Rest Parameters
http://odetocode.com/blogs/scott/archive/2014/08/18/features-of-es6-part-4-rest-parameters.aspx
というものでいいのでしょうか。
可変長引数をちゃんと渡せるようになる仕組み、という感じなのかな?
この手のことはnode界隈の人がよく扱ってる感じ。nodeだとブラウザのバージョンとか考えずに使えるもんね。うう、いいなあ。

通りすがり通りすがり 2015/04/08 07:15 「...」はRest/Spreadの関係で幾つかの構文が用意されています。
今回のは引数の方ではなく配列の要素として機能する方です。
また、Restは受け取り側なので、
var [a,b, ...c] = hoge;
とする時はRestですが、今回はSpreadです。
ですので「スプレッド要素」とでも呼ぶといいと思います。
全てをまとめて呼ぶときは「スプレッド構文」になると思います。
正式な名前が付いているわけではありません。

stealthinustealthinu 2015/04/08 10:48 ありがとうございます。
なるほど、newしたコレクションを「...」の場所にSpreadしてくれるのですね。
可変長引数のほうだけでイメージしてたのでわかりにくかったのですが、Spreadって言われるとわかりやすいですわ。
大変勉強になりました。ありがとうございます。

kkotyykkotyy 2015/06/29 18:04 今更コメントに気づいたんですが、ES6はすごいですね。
しかしブラウザの実装が追いついてないので、Babelってのを使うことになるんでしょうか。
http://codezine.jp/article/detail/8717

stealthinustealthinu 2015/06/30 09:51 FBとかみたいに通知飛ばないですからね… コメントでtwitterアカウント入ってたら通知飛ぶようになったらいいのに。
しかし、Babelってまた厨二心をくすぐられるネーミングですなw
ES6で書いたのをこれでコンパイルすれば良いのか。Typescriptとか使っている場合だとどうせコンパイルするんだから、それでぜんぜん構わんわけですよね。

kkotyykkotyy 2015/06/30 10:17 どこかで見かけましたが、近頃のJSは「コンパイルするもの」だそうです。なのでgulpやwebpackとかが流行っているのだろうと。

stealthinustealthinu 2015/06/30 14:21 そうなんですねえ。全然世の中の流れについていけてなくて悲しいです…

トラックバック - http://d.hatena.ne.jp/stealthinu/20150402

2015-03-17 (Tue)

[]Gmailで「ソーシャル」タブ等に自動分類されたものを排除して検索 Gmailで「ソーシャル」タブ等に自動分類されたものを排除して検索を含むブックマーク Gmailで「ソーシャル」タブ等に自動分類されたものを排除して検索のブックマークコメント

Gmailの受信トレイに、どうしても未読が5件残ってしまっていて気持ち悪い…という状況になっていました。


こういうときは検索で「in:inbox is:unread」と条件を指定すると、受信トレイにある未読を検索してくれます。

が「ソーシャル」タブに分類されているもの、例えばtwitterの反応とかの未読が大量にソーシャルタブにたまっているため、それを除いた真の未読を探そうとしても見つけきれませんでした。


twitterで嘆いていたところ「category:social」でソーシャルタブを指定出来ることを教えていただきました。

in:inbox is:unread -category:social -category:promotions


よく見ると、Gmailの上の検索のところで「検索オプションを指定」から「ソーシャル」を選ぶとこの条件指定がわかります。

トラックバック - http://d.hatena.ne.jp/stealthinu/20150317

2015-03-10 (Tue)

[]Javaサーブレットでユーザのセッション数を取得する Javaサーブレットでユーザのセッション数を取得するを含むブックマーク Javaサーブレットでユーザのセッション数を取得するのブックマークコメント

Tomcatで動いているWebアプリケーションで、ユーザアカウント毎のセッション数制限を実装する必要が出ました。


調査したところ、3通りの方法が考えられました。


1. サーブレットにプローブを挿しといてそこから取得する

2. セッション生成削除のリスナーを設定してセッション情報コピーを作る

3. セッション情報をDBに持つように設定してDB経由で見る


このうち、1と2の方法を実際に作って試しました。


1の「サーブレットにプローブを挿しといてそこから取得する」という方法は、下記ページのやり方を真似しました。

DAY2907 セッション情報の一覧を取得する(Tomcat限定) - LHD Peugeot

ContainerServletのsetWrapperメソッドをオーバーライドしておいて、渡されてきた containerWrapper を保持しておき、セッション情報を見たいときにはそれ経由でセッションリストにアクセスするというものです。


取得した後の値のセッション情報の触り方などは、tomcatが標準で提供しているmanagerサーブレットのソースが参考になりました。

GC: ManagerServlet - org.apache.catalina.manager.ManagerServlet (.java) - GrepCode Class Source


ただ、この方法はtomcat依存になってしまう、という問題と、このサーブレット自体をJSPなどに埋め込むことはできない(オブジェクトとして持てない)ため、サーブレットに対してWebAPIなどを通じて情報を取得する必要がありました。



そこで2の「セッション生成削除のリスナーを設定してセッション情報コピーを作る」を試しました。


これは下記のページを参考にしました。

8. リスナー2 | TECHSCORE(テックスコア)

javax.servlet.http.HttpSessionListener は、web.xmlに<listener>で設定しておくと、サーブレットセッションが生成されたときと削除された時に呼び出されるように出来ます。


この時に得られるセッションオブジェクトは、単にその時のセッション状況コピーではなくて、サーブレット内のセッションオブジェクトそのものなので、そのまま保持しておくとセッション生成後に行われた変更も含めて全てのセッション情報を取得することが出来ます。

なので、セッション生成後にログイン処理がされてユーザ名のセットがされても、ちゃんと取得することが出来ます。

(最初その認識がなかったため、この手法は使えないと思っていた)


下記程度の簡単な内容でセッション情報を保持することが出来るようになり、JSPから普通にUserCounterオブジェクトを生成してユーザのセッション数などを得ることが出来ます。

public class UserCounter {
    private static final UserCounter INSTANCE = new UserCounter();
    private final Map<String, HttpSession> sessions = new HashMap<>();

    private UserCounter() {
    }
    
    public static UserCounter getInstance() {
        return INSTANCE;
    }
    
    synchronized public void addSession(HttpSession session) {
        sessions.put(session.getId(), session);
    }

    synchronized public void delSession(HttpSession session) {
        sessions.remove(session.getId());
    }
    
    synchronized public int countAllSessions() {
        return sessions.size();
    }
    
    synchronized public int countUserSessions(String username) {
        int userCounter = 0;
        for (HttpSession session: sessions.values()) {
            String sessionUsername = (String) session.getAttribute("username");
            if (sessionUsername != null && sessionUsername.equals(username)) {
                userCounter ++;
            }
        }
        return userCounter;
    }
}

public class UserCountListner implements HttpSessionListener {
    private final UserCounter counter = UserCounter.getInstance();

    @Override
    public void sessionCreated(HttpSessionEvent event) {
        HttpSession session = event.getSession();
        counter.addSession(session);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent event) {
        HttpSession session = event.getSession();
        counter.delSession(session);
    }
}

これはtomcat依存ではないため他のWebコンテナでも動くはずです。

ただ、1の方法のように全サーブレットセッション情報を取得するのではなく、listnerの設定をしたサーブレットセッションのみになります。

トラックバック - http://d.hatena.ne.jp/stealthinu/20150310

2015-03-09 (Mon)

[]ムービーメーカー2012で縦長になる問題 ムービーメーカー2012で縦長になる問題を含むブックマーク ムービーメーカー2012で縦長になる問題のブックマークコメント

Lenovo G560でムービーメーカーが起動できない問題 でちょっと書いてたのですが、幼稚園のアルバム作成で付けるDVDの作成のため、ムービーメーカー2012を使って作っていました。(嫁が)


で、使いにくい部分が多々ありつつまあなんとか出来たのですが、最後DVD焼くところで問題が。

普通にPC上で作成した動画を確認すると普通に見えるのに、DVDに焼いたものを確認すると画像や動画がなぜか縦長になるのです。

ムービーメーカー 2012 縦長」あたりでぐぐると、マイクロソフトコミュニティサイトとかでも結構話題に上がっているのですが、そこで提示されている回答(ワイドスクリーン16:9を選択する)を試しても解決しませんでした。


非常に困ったのですが、下記サイトの方法で解決しました。

Windows ムービーメーカー 2012 で DVD を作成するとアスペクト比が 4:3 固定になる件 - hd 4.0

1. ムービーメーカーから直接 DVD 書き込みではなく、 mp4 形式で「高解像度用ディスプレイ用」で動画ファイルとして保存する

2. Windows DVD メーカー以外の DVD オーサリングソフトで DVD 書き込みを行う


また、こうやって作成したほうが画質もよくなるようです。

この問題はムービーメーカー2012のバグらしく、上記ページやぐぐって出てくるサイトを見ると結構多くの方が困っていることがわかります。

なんでこんなすぐわかりそうなバグが何年も放置されてるんだろ?と不思議です。

まあ、ちゃんと動画編集するような人はムービーメーカーなんて使わないってことなんでしょうね。

2015-02-20 (Fri)

[]Tomcatが動いているJavaだけ古いバージョンになる問題 Tomcatが動いているJavaだけ古いバージョンになる問題を含むブックマーク Tomcatが動いているJavaだけ古いバージョンになる問題のブックマークコメント

慣れないJavaTomcat用にサーブレットを書いていたのですが、それが開発PC上のNetBeansでは動くものの、テストサーバの上に持って行くと動かない、という状況になりました。


開発PC環境はWindows8+NetBeans8+Java7+Tomcat8で、(本番環境と同じにした)テストサーバ環境はCentOS6+Java7+Tomcat6という構成でした。


サーブレットTomcatのクラスを利用するものだったため、Tomcat8とTomcat6の違いの問題と考え、開発環境側のTomcatを6にしたりテストサーバTomcatを8にしたりして試したのですがダメでした。


最初、明確にTomcatのバージョンが違ったのでそっちのせいだろう、と思ってたのですが、よくよくcatalina.outのエラーを確認してみると

java.lang.UnsupportedClassVersionError: …

と言われており、TomcatのバージョンではなくJavaのバージョンが違うっぽいのが原因、とわかりました。

でもさすがに最初にそこは確認してたはず、と思ってNetBeansの利用ライブラリのバージョンが「JDK 1.7」であることを確認し、テストサーバ上でも

% java -version
java version "1.7.0_75"

となることを確認しました。


しかし、TomcatのWeb Application Manager

http://【テストサーバIP】:8080/manager/status

で確認すると、JVM Versionが「1.6.0_30」になっていることが確認できました。

というわけで、/etc/init.d/tomcat6 から起動されるTomcatはJava6を利用してしまうっぽい、ということがわかったのですが、なぜ1.7ではなく1.6が使われてしまうのかわからないという状況になりました。


そしてその時のtweet@_hito_ さんと @satoh_fumiyasu さんのからのリプライ。

この後、お二人から色々とアドバイスいただきました。超感謝です!

そのやりとり詳細見たい方は僕の最初のtweetとかから参照してみてください。


そのアドバイスと、そこから調査した結論をまとめると

  • JAVA_HOMEは /etc/tomcat6/tomcat6.conf で指定しとくべき

(じゃないとなにかちょっとしたことでJavaのバージョンが変わってしまうから)

  • JAVA_HOMEが指定されてない時のtomcat6のJavaのバージョンはjavacのバージョンになる

(/usr/share/java-utils/java-functions の set_jvm() 中でjavacのバージョン見てる)

ということになりました。


そこで /etc/tomcat6/tomcat6.conf の最初にコメントアウトされたJAVA_HOMEのところを /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.75.x86_64 にすることで、無事にTomcatもJava7で動かすことが出来るようになりました。


ただ、疑問だったのがなぜこの状況になったのか、ということです。

実は /etc/alternatives/java* を確認していて、javaだけが1.7を指しており、javacなど他のものはみな1.6系を指していることがわかっていました。

そこでyumで入れたjava系のものを確認すると

% yum list installed | grep java
java-1.5.0-gcj.x86_64  1.5.0.0-29.1.el6 @base
java-1.6.0-openjdk.x86_64
java-1.6.0-openjdk-devel.x86_64
java-1.7.0-openjdk.x86_64

と、develが入っているのは1.6だけで1.7は入っていないことがわかりました。

yumJavaの1.7を入れるとき、公開サーバ用だからdevelは要らないよね?ということで「java-1.7.0-openjdk」のほうだけを入れていたのでした。

ただ、java-1.6.0-openjdk-develは入っていたので /var/log/yum.log を確認したところ、なにかで ant が必要だった時に yumant を入れた際に java-1.6.0-openjdk-devel が入っていたことがわかりました。

すると、javacのバージョンは1.6になるため、前述のとおりjava-functionsの中で javac のバージョンを見て Java6 が選択されてしまう、という流れになったようです。


ということで最終的な結論。

CentOS6 で tomcat6 使っててjavaのバージョンを変更したい場合、java-1.7.0-openjdk-develなど「devel」のほうを入れて、/etc/tomcat6/tomcat6.conf で JAVA_HOME も明示的に指定しておくのが良い、ということでした。

トラックバック - http://d.hatena.ne.jp/stealthinu/20150220

2015-02-18 (Wed)

[]WindowsNetBeans 8組み込みのTomcatでユーザとロールの設定場所 WindowsのNetBeans 8組み込みのTomcatでユーザとロールの設定場所を含むブックマーク WindowsのNetBeans 8組み込みのTomcatでユーザとロールの設定場所のブックマークコメント

NetBeansTomcat用のservletを作っていたのですが、Tomcat Webアプリケーションマネージャなどを使うためのユーザとロールの設定場所がわからずに困ったのでメモ。


まず最初に、Tomcatインストールされているディレクトリ以下の、conf/tomcat-users.xml ファイル

C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.1\conf\tomcat-users.xml

を修正してみたのですが反映されませんでした。


そこでNetBeansのサイトで、ここの設定について書いてるページを見ると

NetBeans IDEでのWebアプリケーションのセキュリティ保護

https://netbeans.org/kb/docs/web/security-webapps_ja.html


「サービス」→「Tomcat 8.x」→「プロパティ」→「ユーザ名/パスワード

あたりで変更できそうな感じになっているのですが、ここをやってもうまくいきませんでした。

というか、それ以前にユーザ名パスワードとも変更出来ない感じでした。


ここの「接続」タブの「Catalinaのベース」を確認すると

C:\Users\【ユーザ名】\AppData\Roaming\NetBeans\8.0.2\apache-tomcat-8.0.15.0_base

となっており、Windowsの場合だとこの下の設定が実際には効いているようです。


ここに conf/tomcat-users.xml ファイルが存在しているため、これにロールとユーザを追記します。

  <role rolename="manager-gui"/>
  <role rolename="manager-script"/>
  <role rolename="manager-jmx"/>
  <role rolename="manager-status"/>
  <user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

修正後は先程のNetBeansの右クリックメニューから「リフレッシュ」で完了です。

トラックバック - http://d.hatena.ne.jp/stealthinu/20150218