ラベル Java の投稿を表示しています。 すべての投稿を表示
ラベル Java の投稿を表示しています。 すべての投稿を表示

2011/11/16

Jenkins起動時エラー「このサーバーは、AWTが正しく設定されていません」対処法

昨日、jenkins徹底入門を購入したので、久しぶりにJenkinsを触ってみました。
せっかくなので、新しいサーバにJavaとTomcatを新規で入れて、いざJenkinsを起動させようとしたら
このサーバーは、AWTが正しく設定されていません。
というエラーが発生しました。


対応が瞬殺でできるので、書くまでもないかもしれませんがメモっておきます。

■環境
・sakuraのVPS(CentOS 5 x86 i386 (32bit版))
・JDK1.7.0_01(rpmインストール)
・Tomcat7.0.22
・Jenkins1.439
現時点では全部最新だと思います。


■対応

cd {TOMCAT_HOME}/bin
vi startup.sh 
して、CATALINA_OPTSをシェル実行の一行上に追記すればOKです。
exec "$PRGDIR"/"$EXECUTABLE" start "$@"

export CATALINA_OPTS="-Djava.awt.headless=true"
exec "$PRGDIR"/"$EXECUTABLE" start "$@"

このオプションは、サーブレットで画像を動的にしたいときに指定しないといけないらしい。前はいらなかった気がするけど。検索して一番最初にひっかかったアドビのページを参考にしました。

■参考ページ
グラフィックが有効になっていないサーバーを java.awt.headless で設定する方法
http://www.adobe.com/jp/support/flex/ts/documents/java_awt_headless.htm


2010/12/22

MacのターミナルでJavaScriptを実行するよ(Rhino)

TerminalでJSを実行します。

■必要なもの
・MacかLinuxのパソコン
・MozillaのRhino

JSで短いコードをテストしたいときに使ってる方法は、
1.Google ChromeのWeb Inspectorを使う
もしくは、
2.Terminalで直打ち
と言った方法が便利だと思います。
1だとGoogle Chromeをインストールすれば良いだけですが、2だとひと手間いるので
メモしときます。


■手順
1.Rhinoのバイナリを入手します。
以下から、最新のソースを入手します。
http://www.mozilla-japan.org/rhino/download.html
※以降の手順は「/Users/${user}/Develop/rhino/」に「rhino1_7R2.zip」をダウンロードした
と想定します。


2.Terminalを起動します。
/Applications/Utilities/Terminal
をダブルクリック


3.TerminalでRhinoのファイルがあるディレクトリに移動し、ファイルを解凍します。
cd /Users/${user}/Develop/rhino/unzip rhino1_7R2.zip

4.Terminalでホームディレクトリに移動して、aliasの設定をします。
cd ~vi .bash_profile
キーボードの「a」を押して、以下を追記します。
alias js="java -cp {解凍したrhinoフォルダのパス}/js.jar org.mozilla.javascript.tools.shell.Main"

具体例)
alias js="java -cp /Users/${user}/Develop/rhino/js.jar org.mozilla.javascript.tools.shell.Main"

※変更を保存するには、「:wq」と打つ。


5.一度Terminalを終了して、再度起動します。


6.Terminalでjsと打つと、Rhinoが使えるようになります。
※終了するときは、quit();と打てばおk。




これでブラウザを使わなくても、JSができます。
やったねたえちゃん!

2010/11/03

Macでのjavaのクラスパス指定方法

MacでJavacを使ってソースをコンパイルしたいとき、-classpathオプションで躓きました。

・階層構造
ore
-src
--OreServlet.java
-WEB-INF
-classes
--shinya
---sample

・コンパイル
javac -d WEB-INF/classes/ -classpath ".;/Users/${user}/Develop/apache-tomcat-6.0.28/lib/servlet-api.jar" src/shinya/sample/OreServlet.java

package javax.servlet does not existが出る・・・
Macで-classpathオプションを使うときの区切り文字はセミコロン”;”ではなく、コロン”:”を使う。
Windows系では区切り文字として;(セミコロン)を、UNIX系では区切り文字として:(コロン)を使用します。
これがゆとりか・・・Eclipseなしにはもうプログラミングできない!

で、正しくは
javac -d WEB-INF/classes/ -classpath ".:/Users/${user}/Develop/apache-tomcat-6.0.28/lib/servlet-api.jar" src/shinya/sample/OreServlet.java

少し話はそれるが、Macつながりでもう一つ。
Macでルートユーザーになりたい場合は
sudo passwd root
を使って、その後
$ su -Password:#
でrootになってあげる必要がある。

2010/06/22

デザインパターンの復習(Singleton)

ずっと前に勉強したデザインパターン。
仕事で使わないため、忘れないようメモメモ。

Singletonとは
GoFによるデザインパターンの一種Singletonパターンのことで、あるクラスのインスタンスを一つしか生成しないよう保証するための方法です。
(僕の中では)一番簡単なデザインパターンです。
それにしても、GoFってGang of Fourの略らしい・・・中二病なのかな。

Singletonの利点
プログラム中でインスタンスが必ず一つとなることが保証されていることです。
このおかげで、不必要なインスタンス生成を防ぐことができ、予期しないバグの発生防止や余計なメモリ使用防止に役立ちます。
Singletonを実装するクラスの”唯一のインスタンス”は、クラス初期化時にnewされます。



※なお、下のソースコードは、突っ込みどころ満載かもしれません。
・気付いた人は優しく教えてあげてください。
・例外は、現在の環境では使用可能でない場合にスローだったりするので、今回は何もしない。
・鍵の申請書は面倒なので今回はしない。



Singletonパターンを使ったクラス

package shinya.crypto;

import java.security.InvalidKeyException;
import javax.crypto.IllegalBlockSizeException;
import java.security.NoSuchAlgorithmException;
import java.io.UnsupportedEncodingException;
import javax.crypto.BadPaddingException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.Cipher;

/**
* 共通鍵暗号のBlowfishアルゴリズムで暗号/復号を行うクラス
*/
public class Blowfish {

/** 唯一のインスタンス */
private static final Blowfish blowfish = new Blowfish();

/** 暗号化アルゴリズム */
private static final String BLOWFISH = "Blowfish";

/**
* Constractor
*/
private Blowfish() {}

/**
* インスタンスを取得する
* @return 唯一のインスタンス
*/
public static Blowfish getInstance() {
return blowfish;
}

/**
* Blowfishで暗号文を生成する
* @param key 秘密鍵
* @param plainText 平文
*/
public byte[] encrypt(String key, String plainText) throws IllegalBlockSizeException, InvalidKeyException,
NoSuchAlgorithmException, UnsupportedEncodingException,
BadPaddingException, NoSuchPaddingException {
// Blowfish用秘密鍵を生成。
SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), BLOWFISH);

// 暗号文を生成。
Cipher cipher = Cipher.getInstance(BLOWFISH);
cipher.init(Cipher.ENCRYPT_MODE, sksSpec);
byte[] encryptedText = cipher.doFinal(plainText.getBytes());

return encryptedText;
}

/**
* Blowfishで複合する
* @param key 秘密鍵
* @param encrypted 暗号文
*/
public String decrypt(String key, byte[] encryptedText) throws IllegalBlockSizeException, InvalidKeyException,
NoSuchAlgorithmException, UnsupportedEncodingException,
BadPaddingException, NoSuchPaddingException {
// Blowfish用秘密鍵を生成。
SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), BLOWFISH);

// 暗号文を復号する。
Cipher cipher = Cipher.getInstance(BLOWFISH);
cipher.init(Cipher.DECRYPT_MODE, sksSpec);
byte[] decryptedText = cipher.doFinal(encryptedText);

return new String(decryptedText);
}
}





呼びだし側


import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

import shinya.crypto.Blowfish;

/**
* Main Class
*/
public class Main {

/**
* main method
* @throws NoSuchPaddingException
* @throws BadPaddingException
* @throws UnsupportedEncodingException
* @throws NoSuchAlgorithmException
* @throws IllegalBlockSizeException
* @throws InvalidKeyException
*/
public static void main(String[] args) throws InvalidKeyException, IllegalBlockSizeException,
NoSuchAlgorithmException, UnsupportedEncodingException,
BadPaddingException, NoSuchPaddingException {

String plainText = "ore ore";
byte[] encryptedText = Blowfish.getInstance().encrypt("key", plainText);
System.out.println("encrypt: " + encryptedText);


String decryptedText = Blowfish.getInstance().decrypt("key", encryptedText);
System.out.println("decrypt: " + decryptedText);
}
}

2010/04/15

JSPのファイルサイズ

JSPでサイズによるコンパイルエラーがおきます。


JSPはServletのメソッドに変換されコンパイルされますが、このときのJSPから変換されたメソッドが65536Byte以下でないと、JasperExceptionが発生します。

java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#88659

この65536Byteというのは、Java VMのメソッドサイズに起因するもので、Java VM仕様ではそのサイズがJavaメソッドの最大サイズとなっています。

jspは以下のようにJavaとしてコンパイルされます。

*.jsp --> *_jsp.java --> *_jsp.class

JSPはServletに変換されるので、その最大サイズはJavaメソッドの最大サイズ以上になるとコンパイルエラーとなるので、JasperExceptionが発生してしまいます。

2010/04/12

左定数について

Joel on Softwareを読んでいると、ちょっとした豆知識がでてきたのでメモ。

関係演算子(==)を使おうとして、うっかり代入演算子(=)を使うことってありますよね(ねーよ)。
SJC-Pの問題でもよく見かけた気がします。
たとえばこんな感じ。
// hoge変数がnullかどうかチェックしたいif (hoge = null) {// 処理}


本来ならnullチェックをするには以下のように書くべきところを
上記のように代入演算子を使って書いてしまうとnullチェックするつもりが
nullを代入してしまうということになってしまいます。
hoge == null


これを不正でくれるのが左定数です。
if (null == hoge) {// 処理}

このように書いておけば、以下のような間違った記述をコンパイラが発見してくれるので嬉しいです。
if (null = hoge) {// 処理}


そんなのいらねーよという意見もあると思うので、一概に左定数が良いともいえないかもしれませんが。