Archive for 6 月, 2009

NetBeans IDE 6.7 がリリース!

火曜日, 6 月 30th, 2009

NetBeans IDE 6.7 がリリースされました。

今回も日本語版が世界同時リリースです。

開発スタッフの皆さんに心から感謝します。

6.7 と言う中途半端なナンバーですけど新機能満載です。

Maven , Hudson が正式に採用されてます。

Hudson は川口耕介さんがお遊びで作りだした継続的インテグレーションツールが人気をよんで現在に至っているようです。

一時期は Hudson おじさんがプロジェクトの状況によって表情を変えたりする機能もあったそうです。

私は Hudson 使ったことが一度もないのですが NetBeans に標準搭載されたことですから日本語で利用方法のチュートリアルでも出たら是非試してみたいと思ってます。

あと、オンデマンド機能(エルゴノミクス)もいいですね。

以前、こんな機能いらないとブログに書きましたが訂正です。

NetBeans を [ すべて ] を選んでダウンロードし、インストールして使いたい機能だけ有効化すればいいだけだし、それによって確実にパフォーマンスアップします。

こういった機能はこれからは必須となるのでしょうね。

Windows 7 でも起動スピードを上げるために必要なサービスだけ有効にするような事をしているようです。(詳しいことはわかりませんが)

あと個人的に嬉しいのは出力ウィンドウの文字の大きさを変えることができるようになったことです。

フォントも変更できるようですがまだ試していません。

これは本当に待ち望んでいた機能なので感謝感激です!

それと Windows 7 RC 版にインストールしてみたのですけど JDK6 u14 でやっと動くようになりました。

今までなんでだろう?って悩んでいたのですが Windows 7 のサポートは JDK6 u14 からのようでした。

Java っていうと何処でも(どんなOSでも)動くって思い込んでました。(^^;

これで快適になるだろう新 Windows にアップグレードする障壁はなくなった。

そう、NetBeans が動くことが最大のポイントなんですよ!

a

Hatena タグ:

少しだけ良くなった > 腰

月曜日, 6 月 29th, 2009

腰痛のため病院へ通院治療中なのだが腰を引っ張ったり、ウォーターベッドでのマッサージの効果が少しだけでてる。

まだ完治とはいかないが痛みがピークの時と比べるとかなり良くなってきた。

でも、依然として痛みはなくならない。

当分の間、若くて優しくて綺麗なナースのお世話にならないといけないようだ。

ちなみに私がお世話になっている病院のナースはみんな若くて綺麗だ。

採用試験の基準が気になってしかたない。

JSTL こういうこともできるのか

日曜日, 6 月 28th, 2009

<%@page contentType=”text/html”%>
<%@page pageEncoding=”UTF-8″%>

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
    “http://www.w3.org/TR/html4/loose.dtd”>
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>
<html>
    <head>
        <title>偶数? 奇数?</title>
    </head>
    <body>
        <h2>偶数? 奇数?</h2>
        <hr/>
        <c:set var=”miniValue” value=”2″/>
        <c:set var=”maxValue” value=”12″/>
        <c:forEach var=”i” begin=”2″ end=”${maxValue}”>
            <c:choose>
                <c:when test=”${i%2 == 0}”>
                    <c:out value=”${i} は偶数です。”/><br/>
                </c:when>
                <c:otherwise>
                    <c:out value=”${i} は奇数です。”/><br/>
                </c:otherwise>
            </c:choose>
        </c:forEach>
    </body>
    <hr/>
    <i>ビット演算は使えない\${i&1 == 0}</i>
</html>

2

ビット演算は使えないようです。

1

読むことのできない英語の本を買ってしまった。

パラパラとめくっていたらこんなことができるようなので早速試してみたしだいです。

Hatena タグ:

Singleton Session Beans の並行処理 その3

日曜日, 6 月 28th, 2009

この前のサンプルはちょっとあれでしたので Sun のチュートリアルとほぼ同じコードを載せておきます。

package counter.web;

import counter.ejb.CounterBean;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class Count {

    @EJB
    private CounterBean counterBean;
    private int hitCount;

    public Count() {
        this.hitCount = 0;
    }

    public int getHitCount() {
        hitCount = counterBean.getHits();
        return hitCount;
    }

    public void setHitCount(int newHits) {
        this.hitCount = newHits;
    }
}

——————————————————————————————————————————————

package counter.ejb;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.AccessTimeout;
import javax.ejb.ConcurrencyManagement;
import javax.ejb.ConcurrencyManagementType;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;

@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) // デフォルトで適用されるので無くてもOK
@Singleton
@AccessTimeout(value = 20000)
public class CounterBean {

    private int hits = 1;

    @Lock(LockType.WRITE) // デフォルトで適用されるので無くてもOK
    public int getHits() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(CounterBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return hits++;
    }
}

—————————————————————————————————————————————

<?xml version=’1.0′ encoding=’UTF-8′ ?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
    “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”
      xmlns:h=”http://java.sun.com/jsf/html”>
    <body>
        <h:outputText value=”This page has been accessed #{count.hitCount} time(s).”/>
    </body>
</html>

以上です。

CounterBean をこのように変更することも可能です。

@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
@Singleton
@AccessTimeout(value = 20000)
public class CounterBean {

    private int hits = 1;

    public synchronized int getHits() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(CounterBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return hits++;
    }
}

このような便利な機能を使わない場合は

@ConcurrencyManagement(ConcurrencyManagementType.CONCURRENCY_NOT_ALLOWED) とすればいいみたい。

う~ん・・・ いまいちこの機能のありがたさが解らない。

JEE6 が正式リリースされたら誰かが解りやすいサンプルと解説をしてくれるだろうからそれまで気長に待つとしよう(^^;

Hatena タグ:

Singleton Session Beans の並行処理 その2

金曜日, 6 月 26th, 2009

この前調べたのをもとにサンプルを組んで動かしてみました。

アノテーションの表記が若干上手くいかないところがあったがなんとか動きました。

何故かは調べてないのですが動いたから良しとします。(^^;

サンプルコードは下記のとおりです。

素人が組んだコードですので間違い等ございますでしょうがおおらかな心でご覧ください。

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.AccessTimeout;
import javax.ejb.ConcurrencyManagement;
import javax.ejb.ConcurrencyManagementType;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;

/**
*
* @author Yucchi
*/
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
@Singleton
@AccessTimeout(value = 20000)
public class Question {

    @AccessTimeout(value = 5000)
    @Lock(LockType.READ)
    public String getshoulderMessage() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Question.class.getName()).log(Level.SEVERE, null, ex);
        }
        return “肩が痛くてたまらん(><)”;
    }

    @AccessTimeout(value = 19000)
    @Lock(LockType.WRITE)
    public String getWaistMessage() {
        try {
            Thread.sleep(15000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Question.class.getName()).log(Level.SEVERE, null, ex);
        }
        return “腰が痛くてたまらん(><)”;
    }
}

———————————————————————————————————————————————-

import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
*
* @author Yucchi
*/
@WebServlet(urlPatterns = “/Shoulder”)
public class Shoulder extends HttpServlet {

    @EJB
    private Question question;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType(“text/html;charset=UTF-8″);
        PrintWriter out = response.getWriter();
        try {
            out.println(“<html>”);
            out.println(“<head>”);
            out.println(“<title>Servlet Shoulder</title>”);
            out.println(“</head>”);
            out.println(“<body>”);
            out.println(“Servlet Shoulder at ” + request.getContextPath());
            out.println(“<br>”);
            out.println(question.getshoulderMessage());
            out.println(“</body>”);
            out.println(“</html>”);

        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return “肩の調子はどうだい?”;
    }// </editor-fold>
}

————————————————————————————————————————————————-

import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
*
* @author Yucchi
*/
@WebServlet(urlPatterns = “/Waist”)
public class Waist extends HttpServlet {

    @EJB
    private Question question;

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType(“text/html;charset=UTF-8″);
        PrintWriter out = response.getWriter();
        try {
            out.println(“<html>”);
            out.println(“<head>”);
            out.println(“<title>Servlet Waist</title>”);
            out.println(“</head>”);
            out.println(“<body>”);
            out.println(“Servlet Waist at ” + request.getContextPath());
            out.println(“<br>”);
            out.println(question.getWaistMessage());
            out.println(“</body>”);
            out.println(“</html>”);
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return “腰の調子はどうだい?”;
    }// </editor-fold>
}

———————————————————————————————————————————————

<%@page contentType=”text/html”%>
<%@page pageEncoding=”UTF-8″%>

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”
    “http://www.w3.org/TR/html4/loose.dtd”>
<html>
    <head>
        <meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″>
        <title>JSP Page</title>
    </head>
    <body>
        <h1>JSP Page</h1>

        <a href=”/ConcurrencyManagementTest/Shoulder” target=”_blank”>肩の調子はどう?</a>
        <br>
        <br>
        <a href=”/ConcurrencyManagementTest/Waist” target=”_blank”>腰の調子はどう?</a>

    </body>
</html>

——————————————————————————————————————————————

以上お粗末なサンプルです。

実行結果はこのようになります。

JSP のリンクを「腰の調子はどう?」、「肩の調子はどう?」の順番で開きます。

getWaistMessage() が実行されてる間はロックされ getshoulderMessage() メソッドが実行待ちになります。

しかしタイムアウト設定が働き getshoulderMessage() メソッドは実行されずに終了してしまいます。

getWaistMessage() の処理が終わり Waist サーブレットの処理が完了します。

1

もし、興味があるようでしたら @Lock アノテーションの属性を変えてみたり、処理時間とタイムアウト設定を変更してグリグリしてみると楽しい結果がまっているでしょう。(たぶん)

私の場合、想像していた動作じゃなくてちょっと焦りました。(勉強不足です。)

やはり、実際に動かして確かめないと解らないことってありますね。

 

[ 追記 ]  ちょっとあまりにも不親切な内容だったので(^^; 

ちなみに @Lock(LockType.WRITE) アノテーションのついてるメソッドへのアクセスはただ一つだけ許されます。

よって「腰の調子はどう?」のリンクを複数開いた場合順番に一つずつ処理されていきます。

対して @Lock(LockType.READ) アノテーションのついたメソッドは同時に複数のアクセスを許します。

よって「肩の調子はどう?」のリンクを複数開いた場合順番待ちにならず同時に処理されます。

Hatena タグ:

Java One 2009 Return of the Puzzlers 間違った(><)

木曜日, 6 月 25th, 2009

こちらのサイトに Java One 2009 Puzzlers が紹介されていたので考えてみました。

問題はこちら

1

解答はなかったので念の為に(どっからくるんだその自信)プログラムを実行して確認してみました。

おお!なんと間違ってました。orz

やはり、私は未熟者です!

Hatena タグ:

腰痛が治らない(><)

土曜日, 6 月 20th, 2009

腰が痛くなって一週間になるがいっこうに良くならない。

今日は電気屋さんがエアコンを取り付けに来てくれた。

その電気屋さんも椎間板ヘルニアになったそうです。

都会の有名なお医者さんで手術をしてもらったそうです。

今、痛み止め、湿布薬、コルセットの3点セットで様子見状態なのですが・・・

これで良くならなければどうなるんだろう?

よく引っ張ったり、電気針治療とか耳にするけど手術だけはしたくない。

神様を信じない私ですけど今はその信じてない(存在を)神様にすがりたい気分です。

JDK 7 ならこう?

金曜日, 6 月 19th, 2009

ちょっと勉強になるブログを発見した。

http://d.hatena.ne.jp/bleis-tift/20090616/1245134308

http://d.hatena.ne.jp/shin/20090618/p2

ついでに以前試した JDK 7 の walkFileTree を使ったチュートリアルをもとにゴニョゴニョしてみた。

特定ディレクトリ以下の列挙 ということなので見栄えは良くないが JDK 7 ならこんなのもありかな?

import java.io.IOException;
import java.nio.file.FileRef;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;

public class Find {

    public static class Finder implements FileVisitor {

        private final PathMatcher matcher;

        Finder(String pattern) {
            matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);
        }

        void find(Path file) {
            if (matcher.matches(file.getName())) {
                System.out.format("%s%n", file);
            }
        }

        @Override
        public FileVisitResult preVisitDirectory(FileRef dir) {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult preVisitDirectoryFailed(FileRef dir, IOException exc) {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFile(FileRef file, BasicFileAttributes attrs) {
            find((Path) file);
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(FileRef file, IOException exc) {
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult postVisitDirectory(FileRef dir, IOException exc) {
            return FileVisitResult.CONTINUE;
        }
    }

    public static void main(String[] args) {
        Path searchDir = Paths.get("C:\\ターゲットディレクトリ");
        String pattern = "*";
        EnumSet<FileVisitOption> opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
        Finder finder = new Finder(pattern);
        Files.walkFileTree(searchDir, opts, Integer.MAX_VALUE, finder);

    }
}

基本的に間違っていたらごめんさない。

素人のやることだから笑ってゆるしてね(^^;

追記 List<String> result に格納するのがポイントだったのかな?

Hatena タグ:

オプション設定のインポート機能を使ってみる

金曜日, 6 月 19th, 2009

NetBeans 6.7 RC3 をインストールした。

今回初めてオプション設定のインポート機能を使ってみた。

まず RC2 のオプション設定をエクスポートする。

1

エクスポートしたい項目を選択します。

とりあえず「すべて」を選んでみました。

2

ちゃんと zip ファイルで保存されました。(jar ファイルじゃないんですね)

3

これで RC2 にはお暇をやって綺麗さっぱりアンインストールします。

RC3 をインストールしてオプション設定をインポートします。

4 

インポートする項目も選べるんですね。便利!便利!

5

[ 了解 ] ボタンを押してインポートします。

確認ダイアログ画面が出ますので問題なければ [ はい ] ボタンを押したら OK です。

この確認画面の表示がちょっとおかしいですけど画面を大きくリサイズしたらちゃんと読めます。

もう一度小さくリサイズしたら表示が良いときと悪いときがあるようです。

オプション設定のインポートには問題ないようなので気にしない。

追記 この不具合はルックアンドフィールを Nimbus か CDE/Motif に変更した場合に出るようです。

6

 

CDE/Motif

7

このオプション設定のインポート機能って便利ですね。

エクスポートした設定ファイル一つあればすべての環境の NetBeans に同一の設定を簡単にできるってことですね。

Hatena タグ:

JNDI ポータブル名

火曜日, 6 月 16th, 2009

ちょっと気になってたこと

java:global[/<app-name>]/<module-name>/<bean-name>[!<fully-qualified-interface-name>]

と言うように記述することにより GlassFish や JBoss でも問題ないようになるらしい。

Hatena タグ: