SQLiteをJavaで使う時、
「REAL」タイプをjava側のBigDecimalにマッピングするのはできないらしい。
「not implemented by SQLite JDBC driver」というエラーが発生する。
調べてみると、ResultSetの「getBigDecimal()」と「getBLOB()」も使えないようだ。
2010年5月18日火曜日
2010年4月10日土曜日
SQLiteとH2の性能比較
H2とSQLite3の性能比較が知りたくて調べてみたが
古い記事しかなかったので簡単に性能比較してみた。
SQLiteバージョン : 3.6.23
H2バージョン : 1.2.132
テスト言語はJava(プロジェクトがJavaベースなので)
SQLiteのJDBCドライバは「SQLiteJDBC」を使用した。
SQLiteJDBC : http://www.zentus.com/sqlitejdbc/
- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
簡単なテストだが全板的にSQLiteの勝ち。
特に瀬能が低いマシンではもっとH2よりパフォーマンスがいいらしい。
でもH2は今まで「In-memory」方式が「組込み」より早いと思ったのが大間違いだったのがショックだ。
下はテストで使用したソース
古い記事しかなかったので簡単に性能比較してみた。
SQLiteバージョン : 3.6.23
H2バージョン : 1.2.132
テスト言語はJava(プロジェクトがJavaベースなので)
SQLiteのJDBCドライバは「SQLiteJDBC」を使用した。
SQLiteJDBC : http://www.zentus.com/sqlitejdbc/
テスト環境1
- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
区分 | SQLite | H2 Embedded | H2 In-memory |
---|---|---|---|
Insert (100万件) | 0.5 秒 | 0.9 秒 | 0.9 秒 |
Select (100万件) | 0.002 秒 | 0.015 秒 | 0.07 秒 |
File size | 2,048 bytes | 14,336 bytes | - |
テスト環境2
- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
区分 | SQLite | H2 Embedded | H2 In-memory |
---|---|---|---|
Insert (100万件) | 0.5 秒 | 1.3 秒 | 1.5 秒 |
Select (100万件) | 0.004 秒 | 0.09 秒 | 0.095 秒 |
File size | 2,048 bytes | 14,336 bytes | - |
簡単なテストだが全板的にSQLiteの勝ち。
特に瀬能が低いマシンではもっとH2よりパフォーマンスがいいらしい。
でもH2は今まで「In-memory」方式が「組込み」より早いと思ったのが大間違いだったのがショックだ。
下はテストで使用したソース
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class SqlitePerformance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;
/**
* SQLite3 Embedded
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("SQLite TEST [" + ROW_COUNT + "件]");
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager
.getConnection("jdbc:sqlite:babukuma.sqllite.db");
Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id integer primary key, value integer);");
conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();
PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");
for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();
if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}
conn.commit();
long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
conn.close();
}
}
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.h2.jdbcx.JdbcConnectionPool;
public class H2Performance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;
/**
* H2 Embedded
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("H2 TEST [" + ROW_COUNT + "件]");
JdbcConnectionPool cp = JdbcConnectionPool.create(
"jdbc:h2:babukuma.h2", "", "");
Connection conn = cp.getConnection();
Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id int primary key, value int);");
conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();
PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");
for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();
if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}
conn.commit();
long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
conn.close();
}
}
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.h2.jdbcx.JdbcConnectionPool;
public class H2InMemoryPerformance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;
/**
* H2 In memory
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("H2 In Memory TEST [" + ROW_COUNT + "件]");
JdbcConnectionPool cp = JdbcConnectionPool
.create("jdbc:h2:mem:", "", "");
Connection conn = cp.getConnection();
Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id int primary key, value int);");
conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();
PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");
for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();
if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}
conn.commit();
long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
conn.close();
}
}
時刻:
土曜日, 4月 10, 2010


2010年4月9日金曜日
SQLite과 H2의 성능비교
궁금해서 임베디드 DB인 H2와 SQLite3를 비교해보았다.
SQLite 버젼 : 3.6.23
H2 버젼 : 1.2.132
둘다 사용할 프로젝트가 Java인 관계로 언어는 Java로.
SQLite는 JDBC드라이버인 SQLiteJDBC를 사용하였다.
SQLiteJDBC : http://www.zentus.com/sqlitejdbc/
- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
비록 간단한 테스트이지만 대략적으로 SQLite가 우세한 듯 보인다.
특히 성능이 낮은 머신에서 H2와의 성능차이가 뚜렷하다.
그리고 H2는 여지껏 「In-memory」방식이 「임베디드」방식보다 성능이 더 좋을 줄 알았는데,
전혀 생각과 틀려 충격이었다.
테스트용 소스는 아래와 같다.
SQLite 버젼 : 3.6.23
H2 버젼 : 1.2.132
둘다 사용할 프로젝트가 Java인 관계로 언어는 Java로.
SQLite는 JDBC드라이버인 SQLiteJDBC를 사용하였다.
SQLiteJDBC : http://www.zentus.com/sqlitejdbc/
테스트 환경 1
- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
구분 | SQLite | H2 Embedded | H2 In-memory |
---|---|---|---|
Insert (100만건) | 0.5 초 | 0.9 초 | 0.9 초 |
Select (100만건) | 0.002 초 | 0.015 초 | 0.07 초 |
File size | 2,048 bytes | 14,336 bytes | - |
테스트 환경 2
- CPU : 2.53 GHz Intel Core 2 Duo
- Memory : 4GB
- OS : Mac OS X 10.6.3
구분 | SQLite | H2 Embedded | H2 In-memory |
---|---|---|---|
Insert (100만건) | 0.5 초 | 1.3 초 | 1.5 초 |
Select (100만건) | 0.004 초 | 0.09 초 | 0.095 초 |
File size | 2,048 bytes | 14,336 bytes | - |
비록 간단한 테스트이지만 대략적으로 SQLite가 우세한 듯 보인다.
특히 성능이 낮은 머신에서 H2와의 성능차이가 뚜렷하다.
그리고 H2는 여지껏 「In-memory」방식이 「임베디드」방식보다 성능이 더 좋을 줄 알았는데,
전혀 생각과 틀려 충격이었다.
테스트용 소스는 아래와 같다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
public class SqlitePerformance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;
/**
* SQLite3 Embedded
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("SQLite TEST [" + ROW_COUNT + "件]");
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager
.getConnection("jdbc:sqlite:babukuma.sqllite.db");
Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id integer primary key, value integer);");
conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();
PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");
for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();
if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}
conn.commit();
long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
conn.close();
}
}
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.h2.jdbcx.JdbcConnectionPool;
public class H2Performance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;
/**
* H2 Embedded
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("H2 TEST [" + ROW_COUNT + "件]");
JdbcConnectionPool cp = JdbcConnectionPool.create(
"jdbc:h2:babukuma.h2", "", "");
Connection conn = cp.getConnection();
Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id int primary key, value int);");
conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();
PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");
for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();
if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}
conn.commit();
long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
conn.close();
}
}
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.h2.jdbcx.JdbcConnectionPool;
public class H2InMemoryPerformance {
private static final int ROW_COUNT = 1000000;
private static final int MAX = 100;
/**
* H2 In memory
*
* @author babukuma
* @since 2010/04/09
* @param args
*/
public static void main(String[] args) throws Exception {
System.out.println("H2 In Memory TEST [" + ROW_COUNT + "件]");
JdbcConnectionPool cp = JdbcConnectionPool
.create("jdbc:h2:mem:", "", "");
Connection conn = cp.getConnection();
Statement stat = conn.createStatement();
stat.executeUpdate("drop table if exists babukuma;");
stat
.executeUpdate("create table babukuma (id int primary key, value int);");
conn.setAutoCommit(false);
System.out.print("Insert Test : ");
long startTime = System.currentTimeMillis();
PreparedStatement prep = conn
.prepareStatement("insert into babukuma values (?, ?);");
for (int i = 0; i < ROW_COUNT; i++) {
prep.setInt(1, i);
prep.setInt(2, i);
prep.addBatch();
if (i > 0 && (i % MAX) == 0 && i == ROW_COUNT - 1) {
prep.executeBatch();
prep.clearBatch();
}
}
conn.commit();
long endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
System.out.print("Select Test : ");
startTime = System.currentTimeMillis();
ResultSet rs = stat.executeQuery("select * from babukuma;");
while (rs.next()) {
rs.getInt("id");
rs.getInt("value");
// System.out.println("id = " + rs.getInt("id"));
// System.out.println("value = " + rs.getString("value"));
}
rs.close();
endTime = System.currentTimeMillis();
System.out.println(((endTime - startTime) / 1000.) + "秒");
conn.close();
}
}
時刻:
金曜日, 4月 09, 2010


2010年3月15日月曜日
[SWT] SWT on 64bit Mac OS X
Mac OS X 10.6.2 Snow Leopardで
SWTアプリケーションがちゃんと動かない現象があって色々調べてみたら
どうやらオプションが必要のようだ。
「-d64」オプションと「-XstartOnFirstThread」オプション
「-d64」オプションは明確に64bit VMを指定するために使う。
「-XstartOnFirstThread」オプションはMacでSWTアプリケーションが正常に動けるため必要のようだ。SWTに限ったオプションではないらしい。
二つのオプションを付けると。。
java -d64 -XstartOnFirstThread -jar babukuma_swt_test.jar
実際テストしてみると問題なく動作した。
参照してサイト
http://www.eclipse.org/swt/macosx
http://www.eclipse.org/swt/faq.php
SWTアプリケーションがちゃんと動かない現象があって色々調べてみたら
どうやらオプションが必要のようだ。
「-d64」オプションと「-XstartOnFirstThread」オプション
「-d64」オプションは明確に64bit VMを指定するために使う。
「-XstartOnFirstThread」オプションはMacでSWTアプリケーションが正常に動けるため必要のようだ。SWTに限ったオプションではないらしい。
二つのオプションを付けると。。
java -d64 -XstartOnFirstThread -jar babukuma_swt_test.jar
実際テストしてみると問題なく動作した。
参照してサイト
http://www.eclipse.org/swt/macosx
http://www.eclipse.org/swt/faq.php
時刻:
月曜日, 3月 15, 2010


[SWT] SWT on 64bit Mac OS X
Mac OS X 10.6.2 Snow Leopard위에
SWT어플리케이션을 실행시키면 뭔가 제대로 실행이 안되는 현상이 있다.
그래서 이것저것 찾아보니 몇가지 옵션이 필요한 듯 하다.
「-d64」옵션과 「-XstartOnFirstThread」옵션
「-d64」옵션 : 명확하게 64bit VM에서 동작하도록 지정해준다.
「-XstartOnFirstThread」옵션 : Mac에서 SWT어플리케이션이 정상적으로 동작하는데 필요한 옵션인 듯 하다. SWT에 한정된 옵션은 아닌 듯.
두 옵션을 실제 사용해 보면
java -d64 -XstartOnFirstThread -jar babukuma_swt_test.jar
실제 테스트에서 문제없이 작동하였다.
참고한 사이트.
http://www.eclipse.org/swt/macosx
http://www.eclipse.org/swt/faq.php
SWT어플리케이션을 실행시키면 뭔가 제대로 실행이 안되는 현상이 있다.
그래서 이것저것 찾아보니 몇가지 옵션이 필요한 듯 하다.
「-d64」옵션과 「-XstartOnFirstThread」옵션
「-d64」옵션 : 명확하게 64bit VM에서 동작하도록 지정해준다.
「-XstartOnFirstThread」옵션 : Mac에서 SWT어플리케이션이 정상적으로 동작하는데 필요한 옵션인 듯 하다. SWT에 한정된 옵션은 아닌 듯.
두 옵션을 실제 사용해 보면
java -d64 -XstartOnFirstThread -jar babukuma_swt_test.jar
실제 테스트에서 문제없이 작동하였다.
참고한 사이트.
http://www.eclipse.org/swt/macosx
http://www.eclipse.org/swt/faq.php
時刻:
月曜日, 3月 15, 2010


2009年12月25日金曜日
[HTML5] 簡単なWebSocketサーバを作ってみた。
HTML5のWebSocketサーバを作ってみた。
作ったのは これ。
作ったサーバでシンプルなEchoサーバとクライアントも作ってみたのがこちら。。
まだWebSocketを対応してるのがChromeしかないので、当然Chromeしか動作しない。
EchoServer.java
package websocket.echoserver;
import java.io.IOException;
import com.babukuma.commons.websocket.WebSocketServer;
public class EchoServer {
public static void main(String[] args) throws IOException {
new WebSocketServer(8888, "/EchoServer", new EchoHandlerFactory()).start();
}
}
EchoHandlerFactory.java
package websocket.echoserver;
import com.babukuma.commons.websocket.WebSocketHandler;
import com.babukuma.commons.websocket.WebSocketHandlerFactory;
public class EchoHandlerFactory implements WebSocketHandlerFactory {
@Override
public WebSocketHandler createHandler(String urlPath) {
return new EchoHandler();
}
@Override
public void removeHandler(String urlPath, WebSocketHandler handler) {
// TODO Auto-generated method stub
}
}
EchoHandler.java
package websocket.echoserver;
import com.babukuma.commons.websocket.SimpleWebSocketHandler;
public class EchoHandler extends SimpleWebSocketHandler {
@Override
public void onMessage(String message) {
send(message);
}
@Override
public void onClose() {
System.out.println("close");
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onOpen() {
System.out.println("open");
}
}
EchoClient.html
省略。。。
<script>
var ws = new WebSocket("ws://localhost:8888/EchoServer/echo");
ws.onclose = function(event) {
alert("websocket " + event + " is closed");
};
ws.onopen = function(event) {
alert("websocket " + event + " is opened");
};
ws.onmessage = function(event) {
var chatarea = document.getElementById("chatarea");
chatarea.value = chatarea.value + "\n" + event.data;
};
function send() {
var msg = document.getElementById("msg");
ws.send(msg.value);
msg.value = '';
return false;
}
</script>
省略。。。
次はTomcatとかWebServerでも動けるようにWebSocketServletを作成!!
2009年11月25日水曜日
[メモ] Commons-Emailの文字化け解決方法
Commons-Email利用する時の日本語文字化け
ドキュメントのサンプルとおりやると化けってしまう。
エンコーディングを指定すれば、問題ない。
いつも使って、いつも忘れて、いつも探してるコード
ドキュメントのサンプルとおりやると化けってしまう。
SimpleEmail email = new SimpleEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("日本語タイトル");
email.setMsg("日本語メッセージ");
email.send();
エンコーディングを指定すれば、問題ない。
SimpleEmail email = new SimpleEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org", "John Doe");
email.setFrom("me@apache.org", "Me");
email.setSubject("日本語タイトル");
email.setContent("日本語メッセージ","text/plain; charset=ISO-2022-JP");
email.setCharset("ISO-2022-JP");
email.send();
いつも使って、いつも忘れて、いつも探してるコード
2009年10月30日金曜日
正規表現で全角、半角、半角カナチェック
今回必要だったから作った。
簡単にテストしてみたけど、とりあえず使えそう。
簡単にテストしてみたけど、とりあえず使えそう。
/**
* 全角チェック
*
* @param String
* str チェック元文字列
* @return boolean true:全角
*/
public static boolean checkZenkaku(String str) {
if (str == null) {
return false;
}
return str.matches("^[^ -~。-゚]+$");
}
/**
* 全角と空白文字チェック
*
* @param String
* str チェック元文字列
* @return boolean true:全角と空白文字
*/
public static boolean checkZenkakuWithSpace(String str) {
if (str == null) {
return false;
}
return str.matches("^([^ -~。-゚]|\\s)+$");
}
/**
* 半角チェック
*
* @param String
* str チェック元文字列
* @return boolean true:半角
*/
public static boolean checkHankaku(String str) {
if (str == null) {
return false;
}
return str.matches("^[ -~。-゚]+$");
}
/**
* 半角と空白文字チェック
*
* @param String
* str チェック元文字列
* @return boolean true:半角と空白文字
*/
public static boolean checkHankakuWithSpace(String str) {
if (str == null) {
return false;
}
return str.matches("^([ -~。-゚]|\\s)+$");
}
/**
* 半角カナチェック
*
* @param String
* str チェック元文字列
* @return boolean true:半角カナのみ
*/
public static boolean checkHankakuKana(String str) {
if (str == null) {
return false;
}
return str.matches("^[ア-ン゙゚]+$");
}
/**
* 半角カナと空白文字チェック
*
* @param String
* str チェック元文字列
* @return boolean true:半角カナと空白文字
*/
public static boolean checkHankakuKanaWithSpace(String str) {
if (str == null) {
return false;
}
return str.matches("^([ア-ン゙゚]|\\s)+$");
}
2009年10月20日火曜日
JasperReportでパスワード付きPDF生成
JasperReportでパスワード付きPDF生成してみた。
テストしたコードはこれだ。
try {
File jasperFile = new File("/test/test.jasper");
if (!jasperFile.exists()) {
System.out.println("not found file");
return;
}
Mapparams = new HashMap ();
params.put("p1", "aaa");
params.put("p2", "bbb");
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperFile.getPath(), params);
// Exporterの生成
JRPdfExporter exporter = new JRPdfExporter();
// 出力オブジェクトの設定
exporter.setParameter(JRPdfExporterParameter.JASPER_PRINT, jasperPrint);
// 出力先の設定
exporter.setParameter(JRPdfExporterParameter.OUTPUT_FILE_NAME, "/test/test.pdf");
// パスワード保護を有効にする
exporter.setParameter(JRPdfExporterParameter.IS_ENCRYPTED, Boolean.TRUE);
// パスワードの設定
exporter.setParameter(JRPdfExporterParameter.USER_PASSWORD, "1234");
exporter.setParameter(JRPdfExporterParameter.OWNER_PASSWORD, "4321");
// 出力の実行
exporter.exportReport();
} catch (JRException e) {
e.printStackTrace();
}
実行してみたら、
java.lang.NoClassDefFoundError: org/bouncycastle/asn1/ASN1OctetString
エラーが発生した。( ´д`)
足りないライブラリを探してみたら、どうやら「www.bouncycastle.org」で提供するライブラリらしい。
現時点の最新バージョン(1.44)を落とした。
http://www.bouncycastle.org/latest_releases.html
クラスパスに追加してテストしてみると、成功!(´∀`)

2009年10月13日火曜日
MD5 for java
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author BABUKUMA
*/
public final class Digest {
public static byte[] md5(final String data) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] dat = data.getBytes();
md.update(dat);
return md.digest();
}
// MD5 ハッシュ関数
private static String hashByte2MD5(byte[] hash) {
StringBuilder hexString = new StringBuilder();
for (byte b : hash) {
if ((0xff & b) < 0x10) {
hexString.append("0" + Integer.toHexString((0xFF & b)));
} else {
hexString.append(Integer.toHexString(0xFF & b));
}
}
return hexString.toString();
}
public static String md5String(final String data)
throws NoSuchAlgorithmException {
return hashByte2MD5(md5(data));
}
}
2009年7月7日火曜日
JasperReportsを利用するPDF出力
久々にJasper使ってみた。(^(エ)^)
1. ダウンロードURL
JasperReports : http://jasperforge.org/
iTextAsian.jar : http://itextpdf.sourceforge.net/
2. 使ったライブラリ
jasperreports-3.5.2.jar
iText-2.1.0.jar
iTextAsian.jar
commons-beanutils-1.8.0.jar
commons-collections-2.1.jar
commons-digester-1.7.jar
3. 日本語対応
fontタグのオプションを修正
<font pdfFontName="HeiseiKakuGo-W5" pdfEncoding="UniJIS-UCS2-H" isPdfEmbedded="true"/>
4. テストコード
import java.io.File;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;
public class JasperTest {
/**
* @param args
*/
public static void main(String[] args) {
String strPathMain = "jasper/report1.jasper";
File reportFile = new File(strPathMain);
try {
int length = 10;
TestBean[] beans = new TestBean[length];
for (int i = 0; i <>
beans[i] = new TestBean("f_" + i, "日本語_" + i);
}
JasperPrint jasperPrint = JasperFillManager.fillReport(reportFile
.getPath(), null, new JRBeanArrayDataSource(beans));
JasperExportManager.exportReportToPdfFile(jasperPrint,
"jasper/report1.pdf");
} catch (JRException e) {
e.printStackTrace();
}
}
}
5. iReport(今回は3.5.2)でデザインするときに日本語はオプションで設定する必要がある。
時刻:
火曜日, 7月 07, 2009


2009年6月30日火曜日
GAE/JのJPA
GAE/JでBigTableをJPAで利用してみた。
① META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<persistence-unit name="transactions-optional">
<provider>org.datanucleus.store.appengine.jpa.DatastorePersistenceProvider</provider>
<properties>
<property name="datanucleus.NontransactionalRead" value="true" />
<property name="datanucleus.NontransactionalWrite" value="true" />
<property name="datanucleus.ConnectionURL" value="appengine" />
</properties>
</persistence-unit>
</persistence>
② EMF
package com.babukuma.gae.test.jpa;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class EMF {
private static final EntityManagerFactory emfInstance = Persistence
.createEntityManagerFactory("transactions-optional");
private EMF() {
}
public static EntityManagerFactory get() {
return emfInstance;
}
}
③ エンティティ
package com.babukuma.gae.test.entity;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import com.google.appengine.api.users.User;
@Entity
public class SimpleBoard {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(nullable = false)
private Long id;
@Column
private User author;
@Column
private String content;
@Column(nullable = false)
private Date date;
public SimpleBoard(User author, String content, Date date) {
this.author = author;
this.content = content;
this.date = date;
}
public Long getId() {
return id;
}
public User getAuthor() {
return author;
}
public String getContent() {
return content;
}
public Date getDate() {
return date;
}
public void setAuthor(User author) {
this.author = author;
}
public void setContent(String content) {
this.content = content;
}
public void setDate(Date date) {
this.date = date;
}
}
④ テストコード
package com.babukuma.gae.test;
import java.io.IOException;
import java.util.Date;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.babukuma.gae.test.entity.SimpleBoard;
import com.babukuma.gae.test.jpa.EMF;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
@SuppressWarnings("serial")
public class DataStoreTestServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
String content = req.getParameter("content");
System.out.println("content=" + content);
Date date = new Date();
SimpleBoard board = new SimpleBoard(user, content, date);
EntityManager manager = EMF.get().createEntityManager();
try {
System.out.println("before insert");
manager.persist(board);
System.out.println("after insert");
} catch (Exception e) {
e.printStackTrace();
} finally {
manager.close();
}
resp.setContentType("text/plain");
resp.getWriter().println("Hello, world");
}
}
これ以外に簡単にできるんだな。。(^(エ)^)
2009年6月24日水曜日
Cache削除方法
いつも忘れてしまう、Cacheの削除方法
JSPとかServletの場合。
response.setDateHeader("Expires", -1);
response.setHeader("pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
Htmlの場合。
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Jan 2000 00:00:00 GMT">
忘れないように (^(エ)^)
時刻:
水曜日, 6月 24, 2009


2009年6月16日火曜日
GSONを使ってみる。
GSON JavaオブジェクトとJSONの変換ライブラリ
① Mavenリポジトリの設定
<!-- リポジトリ -->
<repositories>
<!-- GSONのリポジトリ追加 -->
<repository>
<id>gson</id>
<url>http://google-gson.googlecode.com/svn/mavenrepo</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<dependencies>
<!-- Gson: Java to Json conversion -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>1.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
② 使い方
== Bean.java ==
public class Bean {
private String a;
private Integer b;
private BBB[] bbbs;
public BBB[] getBbbs() {
return bbbs;
}
public void setBbbs(BBB[] bbbs) {
this.bbbs = bbbs;
}
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public Integer getB() {
return b;
}
public void setB(Integer b) {
this.b = b;
}
}
== BBB.java ==
public class BBB {
private String c;
private String d;
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
public String getD() {
return d;
}
public void setD(String d) {
this.d = d;
}
}
== GsonTest.java ==
import com.google.gson.Gson;
import junit.framework.TestCase;
public class GsonTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testGson() throws Exception {
Bean bean = new Bean();
bean.setA("aa");
bean.setB(9);
BBB b1 = new BBB();
b1.setC("333");
b1.setD("3d3d");
BBB b2 = new BBB();
b2.setC("444");
b2.setD("4d4d");
BBB[] bbbs = { b1, b2 };
bean.setBbbs(bbbs);
Gson gson = new Gson();
String json = gson.toJson(bean);
assertNotNull(json);
// System.out.println(json);
Bean bean2 = gson.fromJson(json, Bean.class);
assertNotNull(bean2);
assertEquals(bean.getA(), bean2.getA());
assertEquals(bean.getB(), bean2.getB());
assertNotNull(bean2.getBbbs());
assertEquals(bean.getBbbs().length, bean2.getBbbs().length);
for (int i = 0; i < bean2.getBbbs().length; i++) {
assertEquals(bean.getBbbs()[i].getC(), bean2.getBbbs()[i].getC());
assertEquals(bean.getBbbs()[i].getD(), bean2.getBbbs()[i].getD());
}
}
}
楽だね(^(エ)^)
① Mavenリポジトリの設定
<!-- リポジトリ -->
<repositories>
<!-- GSONのリポジトリ追加 -->
<repository>
<id>gson</id>
<url>http://google-gson.googlecode.com/svn/mavenrepo</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<dependencies>
<!-- Gson: Java to Json conversion -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>1.3</version>
<scope>compile</scope>
</dependency>
</dependencies>
② 使い方
== Bean.java ==
public class Bean {
private String a;
private Integer b;
private BBB[] bbbs;
public BBB[] getBbbs() {
return bbbs;
}
public void setBbbs(BBB[] bbbs) {
this.bbbs = bbbs;
}
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public Integer getB() {
return b;
}
public void setB(Integer b) {
this.b = b;
}
}
== BBB.java ==
public class BBB {
private String c;
private String d;
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
public String getD() {
return d;
}
public void setD(String d) {
this.d = d;
}
}
== GsonTest.java ==
import com.google.gson.Gson;
import junit.framework.TestCase;
public class GsonTest extends TestCase {
protected void setUp() throws Exception {
super.setUp();
}
protected void tearDown() throws Exception {
super.tearDown();
}
public void testGson() throws Exception {
Bean bean = new Bean();
bean.setA("aa");
bean.setB(9);
BBB b1 = new BBB();
b1.setC("333");
b1.setD("3d3d");
BBB b2 = new BBB();
b2.setC("444");
b2.setD("4d4d");
BBB[] bbbs = { b1, b2 };
bean.setBbbs(bbbs);
Gson gson = new Gson();
String json = gson.toJson(bean);
assertNotNull(json);
// System.out.println(json);
Bean bean2 = gson.fromJson(json, Bean.class);
assertNotNull(bean2);
assertEquals(bean.getA(), bean2.getA());
assertEquals(bean.getB(), bean2.getB());
assertNotNull(bean2.getBbbs());
assertEquals(bean.getBbbs().length, bean2.getBbbs().length);
for (int i = 0; i < bean2.getBbbs().length; i++) {
assertEquals(bean.getBbbs()[i].getC(), bean2.getBbbs()[i].getC());
assertEquals(bean.getBbbs()[i].getD(), bean2.getBbbs()[i].getD());
}
}
}
楽だね(^(エ)^)
2008年7月4日金曜日
[JAVA] transient field
transient Field
シリアライズする時保存されなくなる。
직렬화후에 보존되지 않는 필드가 됨.
// TEST SAMPLE
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class TransientTest implements Serializable {
private static final long serialVersionUID = 1L;
private transient String a;
private String b;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
TransientTest test = new TransientTest();
test.setA("aaa");
test.setB("bbb");
System.out.println("A=" + test.getA());
System.out.println("B=" + test.getB());
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
"test.tmp"));
out.writeObject(test);
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
"test.tmp"));
TransientTest clone = (TransientTest) in.readObject();
System.out.println("A=" + clone.getA());
System.out.println("B=" + clone.getB());
}
}
// RESULT
A=aaa
B=bbb
A=null
B=bbb
シリアライズする時保存されなくなる。
직렬화후에 보존되지 않는 필드가 됨.
// TEST SAMPLE
package test;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class TransientTest implements Serializable {
private static final long serialVersionUID = 1L;
private transient String a;
private String b;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
/**
* @param args
*/
public static void main(String[] args) throws Exception {
TransientTest test = new TransientTest();
test.setA("aaa");
test.setB("bbb");
System.out.println("A=" + test.getA());
System.out.println("B=" + test.getB());
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(
"test.tmp"));
out.writeObject(test);
ObjectInputStream in = new ObjectInputStream(new FileInputStream(
"test.tmp"));
TransientTest clone = (TransientTest) in.readObject();
System.out.println("A=" + clone.getA());
System.out.println("B=" + clone.getB());
}
}
// RESULT
A=aaa
B=bbb
A=null
B=bbb
時刻:
金曜日, 7月 04, 2008


登録:
投稿 (Atom)