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");
}
}


次はTomcatとかWebServerでも動けるようにWebSocketServletを作成!!


2009年12月11日金曜日

【メモ】sendmailが送信できない

今回新しくセットアップしたサーバからsendmailからメールが送信できなく

stat=Service unavailable

エラーになってしまった。

/var/log/maillog」を調べてみたら友人のhiro_nemu様が

tcpwrappers (xxx.xxx.xx.jp, 127.0.0.1) rejection

「このへんがあやしいよ」って言って
/etc/hosts.allow」に

sendmail : all

を追加したら、メールが送信できるようになった。
これで解決。
allでいいのかどうかはわからないけど。。。

2009年12月1日火曜日

[メモ] TomcatインストルからApacheの連携まで

CentoOSにTomcatをインストしてApacheと連携する。


1. jdkのインストル


[root@srv ~]# wget -O jdk-6u17-linux-i586.bin http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/jdk-6u17-linux-i586.bin?BundledLineItemUUID=Bp9IBe.pnKQAAAEl_DsdbUiv&OrderID=sxRIBe.pyHUAAAEl7TsdbUiv&ProductID=lBFIBe.oSOMAAAEkGehn5G0y&FileName=/jdk-6u17-linux-i586.bin
......

100%[======================================================================================================================================>] 81,792,634 538.62K/s ETA 00:00

14:40:36 (761.59 KB/s) - `jdk-6u17-linux-i586.bin' を保存しました [81792634/81792634]
....

[root@srv ~]# chmod 755 jdk-6u17-linux-i586.bin
[root@srv ~]# ./jdk-6u17-linux-i586.bin
....
Press Enter to continue.....


Done.

[root@srv ~]# mv jdk1.6.0_17/ /usr/lib/
[root@srv etc]# vi /etc/bashrc
export JAVA_HOME=/usr/lib/jdk1.6.0_17 <- 最後の行に追加




2. Tomcatのインストル


[root@srv ~]# wget http://www.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.zip
......

100%[======================================================================================================================================>] 6,379,115 400.23K/s ETA 00:00

14:56:15 (332.39 KB/s) - `apache-tomcat-6.0.20.zip' を保存しました [6379115/6379115]

[root@srv ~]# unzip -d /usr/local/ apache-tomcat-6.0.20.zip
[root@srv bin]# chmod +x /usr/local/apache-tomcat-6.0.20/bin/*.sh
[root@srv local]# ln -s /usr/local/apache-tomcat-6.0.20/ /usr/local/tomcat

[root@srv ~]# vi /etc/init.d/tomcat
#!/bin/sh
#
# Startup script for Apache Tomcat 6
#
# chkconfig: 2345 85 15
# description: Apache Tomcat Java Servlets and JSP server
# processname: tomcat
# pidfile: /var/run/tomcat.pid
# config: /usr/local/tomcat/conf/server.xml

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

CATALINA_HOME=/usr/local/tomcat
TOMCAT_SCRIPT=$CATALINA_HOME/bin/catalina.sh
TOMCAT_USER=root

[ -f $TOMCAT_SCRIPT ] || exit 0

# See how we were called.
case "$1" in
start)
# Start daemons.
if [ -f /var/lock/subsys/tomcat ] ; then
echo "Tomcat already started!"
exit 1
fi
echo -n "Starting Tomcat: "
su -s /bin/bash - $TOMCAT_USER -c "$TOMCAT_SCRIPT start"
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/tomcat
;;
stop)
# Stop daemons.
if [ ! -f /var/lock/subsys/tomcat ] ; then
echo "Tomcat already stopped!"
exit 1
fi
echo -n "Shutting down Tomcat: "
$TOMCAT_SCRIPT stop
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/tomcat
;;
status)
status tomcat
exit $?
;;
restart)
$0 stop
$0 start
;;
*)
echo "Usage: $TOMCAT_PROG {start|stop|status|restart}"
exit 1
esac

exit 0


[root@srv ~]# chmod +x /etc/init.d/tomcat



3. Apache Tomcat Connector の設定

[root@srv modules]# cd /etc/httpd/modules/
[root@srv modules]# wget http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.28/i586/mod_jk-1.2.28-httpd-2.0.X.so
.....

100%[======================================================================================================================================>] 690,348 735.73K/s

15:06:02 (733.98 KB/s) - `mod_jk-1.2.28-httpd-2.0.X.so' を保存しました [690348/690348]

[root@srv modules]# chmod +x /etc/httpd/modules/mod_jk-1.2.28-httpd-2.0.X.so


- 「workers.properties」作成
[root@srv conf]# vi /etc/httpd/conf/workers.properties
# Define 1 real worker using ajp13
worker.list=babukumaWorker
# Set properties for worker1 (ajp13)
worker.
babukumaWorker.type=ajp13
worker.
babukumaWorker.host=localhost
worker.
babukumaWorker.port=8009

- 「httpd.conf」編集
[root@srv conf]# vi httpd.conf

LoadModule jk_module modules/mod_jk-1.2.28-httpd-2.0.X.so

# AJP
JkWorkersFile /etc/httpd/conf/workers.properties
# Where to put jk shared memory
# Update this path to match your local state directory or logs directory
JkShmFile /etc/httpd/logs/mod_jk.shm
# Where to put jk logs
# Update this path to match your logs directory location (put mod_jk.log next to access_log)
JkLogFile /etc/httpd/logs/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the timestamp log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
# Send everything for context /examples to worker named worker1 (ajp13)
JkMount /examples* babukumaWorker

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年11月13日金曜日

UbuntuでGOを試してみた。

今回発表された新しい言語「GO」を試してみた。

参照URLは
Go Home Page

http://golang.org/doc/install.html


1. システム変数

$GOROOTと$GOBINが要るらしいから追加

export GOROOT=$HOME/dev/go
export GOBIN=$HOME/dev/bin



2. Mercurialから「GO」のソースを落とす。

$ hg clone -r release https://go.googlecode.com/hg/ $GOROOT


3. GOをインストール

$ cd $GOROOT/src
$ ./all.bash
$GOARCH is set to <>, must be amd64, 386, or arm


$GOARCH変数が必要らしからGOARCHを作ってインストール再挑戦。

$ export GOARCH=386

$ ./all.bash
$GOOS is set to <>, must be darwin, linux, or nacl


$GOOSも必要らしい。。(-(エ)-)追加して再挑戦。

$ export GOOS=linux

$ ./all.bash
installed quietgcc as /home/babukuma/dev/bin/quietgcc but 'which quietgcc' fails
double-check that /home/babukuma/dev/bin is in your $PATH


(-(エ)-)PATHの追加も要るらしい。

$ export PATH=$PATH:$GOBIN

$ ./all.bash
bison -y -d cc.y
make: bison: コマンドが見つかりませんでした
make: *** [y.tab.h] エラー 127


( -(エ)-;) ふう。。。英語ができなから。こんなのが難しいな。。
読んでもよくわからないし。。どうやらbisonというのが必要らしい。インストール。。

$ sudo apt-get install bison

$ ./all.bash
--- cd ../test
0 known bugs; 0 unexpected bugs


成功!!

4. Hello GO!を作ってみる。

ソース作成
ファイルの拡張子は「.go」らしい

$ vi hello.go
package main

import "fmt"

func main() {
fmt.Printf("Hello GO!\n")
}


コンパイル
コンパイラーはx386なので「8g」を利用する。

$ 8g hello.go
$ ll
合計 12
-rw-r--r-- 1 babukuma babukuma 5160 2009-11-13 11:31 hello.8
-rw-r--r-- 1 babukuma babukuma 71 2009-11-13 11:30 hello.go

「hello.8」ファイルが生成された。

リンク
リンクをして実行可能なファイルを作る。

$ 8l hello.8
$ ll
合計 584
-rwxr-xr-x 1 babukuma babukuma 581719 2009-11-13 11:32 8.out
-rw-r--r-- 1 babukuma babukuma 5160 2009-11-13 11:31 hello.8
-rw-r--r-- 1 babukuma babukuma 71 2009-11-13 11:30 hello.go

「8.out」が出てきた。8.outは気に入らないから、出力ファイル名を指定してみた。

$ 8l -o hello.out hello.8
$ ll
合計 1156
-rwxr-xr-x 1 babukuma babukuma 581719 2009-11-13 11:32 8.out
-rw-r--r-- 1 babukuma babukuma 5160 2009-11-13 11:31 hello.8
-rw-r--r-- 1 babukuma babukuma 71 2009-11-13 11:30 hello.go
-rwxr-xr-x 1 babukuma babukuma 581719 2009-11-13 12:27 hello.out


実行

$ ./hello.out
Hello GO!


5. システム変数まとめ。
面倒だから「.bashrc」に追加した。

export GOROOT=$HOME/dev/go
export GOBIN=$HOME/dev/bin
export GOARCH=386
export GOOS=linux
export PATH=$PATH:$GOBIN



以外に簡単にできた。
お疲れ。俺

Ubuntu+EclipseでMercurialをインストール

Ubuntu+EclipseでMercurialを使ってみた


1。Mercurialのインストール
$ sudo apt-get install mercurial


2。EclipseのPluginインストール
Eclipse用Merurialプラグインである「mercurialeclipse」インストールするために

Name: Vectrace (Mercurial Eclipse plugin)
URL: http://www.vectrace.com/eclipse-update/



Name: MercurialEclipse development site
URL: http://home.zingo.org/eclipse-betaupdate/

を試してみたけど、インストール失敗。
原因は「1.4.1280」バージョンのプラグインが見つからないらしい。

それで普通にjarファイルを落としてpluginフォルダに入れることにした。
URLは「http://bitbucket.org/mercurialeclipse/main/downloads/」で
落としたファイルは「com.vectrace.MercurialEclipse_1.3.1125.jar」
これをEclipseのpluginフォルダに保存してEclipse再起動。

再起動後PreferencesをみるとMercurialEclipseが確認できる。



まあ。。。なんとか無事インストール完了。
でも実際に使ってみたら、コマンドより面倒臭いな。。

2009年11月11日水曜日

Ubuntu9.10 イー・モバイル(D11LC)接続

Ubuntu9.10をイー・モバイル(D11LC)接続しようとしたら、何故かGnomePPPで接続できなかった。
Ubuntu9.10はデフォルトでGnomePPPも入ってないし、接続失敗原因を調べるのも面倒臭いからGnomePPPはやめてコマンドでPPP接続するようにした。

参照したページはこれ

Ubuntu + Emobile「D11LC」を認識させる。


変わったのは
usb_modeswitchがバージョンアップして「1.0.5」になって
GnomePPPじゃないだけ。

usb_modeswitchの設定が終わったら、

/etc/ppp/peers/emobile ファイルを作成する。

user "em@em"
connect "/usr/sbin/chat -v -f /etc/chatscripts/pap -T *99***1#"
/dev/ttyUSB0
115200

noipdefault
usepeerdns
defaultroute
persist
noauth



接続は

$ sudo pon emobile


切るのは

$ sudo poff emobile

2009年11月9日月曜日

UbuntuでHT-03Aデバックしてみた。

今回全PCをUbuntu9.10にしてみたので(チクショー。バグが多いな。。)
Androidの開発もUbuntu上でやるしかない。

最初ちょっとはまったけど、なんとか解決した。


まず、/etc/udev/rules.d/51-android.rulesファイル作成。


$ sudo vi /etc/udev/rules.d/51-android.rules


内容は

SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"
SUBSYSTEM=="usb",ATTR{idVendor}=="0bb4",ATTR{idProduct}=="0c02",SYMLINK+="android_adb"
SUBSYSTEM=="usb",ATTR{idVendor}=="0bb4",ATTR{idProduct}=="0c02",SYMLINK+="android_fastboot"


これでDDMSで確認するとOK!

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)+$");
}

Ubuntu 配布サーバ切り替え

Ubuntu9.10をインストールして必要なアプリを入れようとすると

'jp.archive.ubuntu.com' を解決できませんでした

というエラーが発生した。

解決方法を探してみるとパッケージ配布サーバを切り替えればできるらしい。

https://wiki.ubuntulinux.jp/UbuntuTips/Others/SwitchArchiveMirror

簡単にいうと[システム] - [システム管理] - [ソフトウェア・ソース] から配布サーバを指定すればできる。

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;
}

Map params = 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月19日月曜日

Unauthorized sender

App Engineのメール送信機能を使ってみた。

送信者がアプリケーション開発者に登録されていないといけないことをしらならず、
ただ、グーグルのアカウントならいけると思ってずっと「Unauthorized sender」エラーが発生した。

登録してあるデベロッパーメールアドレスで送信すると問題なく動く。

当然だけど、悪戯メールとかはダメだな。。

次は受信処理も試してみよう!

2009年10月15日木曜日

Google App Engine 1.2.6の起動時エラー

EclipseのApp Engine Pluginを1.2.6にアップしたら
既存プロジェクトの起動がエラーになってしまった。こんな。。

java.lang.RuntimeException: Unable to locate the App Engine agent. Please use dev_appserver, KickStart,  or set the jvm flag: "-javaagent:<sdk_root>/lib/agent/appengine-agent.jar"
....
Caused by: java.lang.ClassNotFoundException: com.google.appengine.tools.development.agent.AppEngineDevAgent
....

エラー内容に書いてあるとおりに
vmオプションに"-javaagent:<sdk_root>/lib/agent/appengine-agent.jar"を付けってやると動くようになった。


これはプラグインのバグなのか?( ´д`)

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年10月6日火曜日

Web WorkerとCanvasを試してみた。

HTML5の勉強でWeb WorkerとCanvasを利用して
簡単なアニメーションを作ってみて。( ´(エ)ヒソ(´(エ)`)ヒソ(エ)` )
Canvasを人が歩き続くアニメー。。。。
タイトルは。。勝手につけた。Babukuma canvas walker。。
walkerがworkerと発音が似てて、人が歩くから。。(ノ∀`)'`,、'`,、'`,、'`,、'`,、

一応FireFoxとGoogle Chromeは動く。
IEとOperaはダメだった。

Babukuma canvas walker demoはこちら

HTML5面白いね。(^(エ)^)

2009年10月2日金曜日

Web Workersを試してみた。

今回、Web Workersを試してみた。
JavaScriptで簡単にスレッドが使えるのが便利だったけど、
まだ、スレッドに引数はどうやれば渡せるのかがわからなくて、ちょっと不便なところもあった。


### test.html ###

<!DOCTYPE HTML>
<html>
<head>
<title>babukuma web workers event test</title>
</head>
<body>
<table border=1>
<tr>
<th>thread 1</th>
<th>thread 2</th>
</tr>
<tr>
<td><ul id="result1"></ul></td>
<td><ul id="result2"></ul></td>
</tr>
</table>
<script>
var worker1 = new Worker('worker.js');
worker1.onmessage = function (event) {
var liTag = document.createElement("li");
var textNode = document.createTextNode(event.data);
liTag.appendChild(textNode);
document.getElementById('result1').appendChild(liTag);
};

worker1.onerror = function (event) {
var liTag = document.createElement("li");
var textNode = document.createTextNode("message : " + event.message);
liTag.appendChild(textNode);
document.getElementById('result1').appendChild(liTag);
};

var worker2 = new Worker('worker.js');
worker2.onmessage = function (event) {
var liTag = document.createElement("li");
var textNode = document.createTextNode(event.data);
liTag.appendChild(textNode);
document.getElementById('result2').appendChild(liTag);

if(event.data == 6) {
worker2.terminate();

var liTag = document.createElement("li");
var textNode = document.createTextNode("terminate");
liTag.appendChild(textNode);
document.getElementById('result2').appendChild(liTag);
}
};

worker2.onerror = function (event) {
var liTag = document.createElement("li");
var textNode = document.createTextNode("message : " + event.message);
liTag.appendChild(textNode);
document.getElementById('result2').appendChild(liTag);
};
</script>
</body>
</html>


### worker.js ###

var index = 0;

var babukumaThread = function() {
if(index == 8) {
throw 'babukuma error!!!';
}
postMessage(index);
index++;
setTimeout(babukumaThread, 1000);
}

babukumaThread();


IEとOperaではまだWebWorkersが使えないみたいで、試せなかった。
FireFoxとGoogle Chromeでテストしてみたけど、
なぜかちょっと結果が違う。
Chromeではonerrorイベントが発生してないみたい。。
俺が何か間違ったのかな?


後でShared Workersも試してみよう。

いつも忘れてしまうOracle起動方法

oracleユーザで入って、


$ cd $ORACLE_HOME/bin
$ sqlplus /nolog
SQL> connect / as sysdba
SQL> startup
ORACLE instance started.

Total System Global Area 536870912 bytes
Fixed Size 1220460 bytes
Variable Size 155189396 bytes
Database Buffers 373293056 bytes
Redo Buffers 7168000 bytes
?????????????????
?????????????????
SQL> select status from v$instance;

STATUS
------------
OPEN

SQL> exit

$ ./lsnrctl start
$ ./lsnrctl status <確認

2009年9月28日月曜日

やるたびに忘れてしまうlog4jの設定


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
<log4j:configuration debug="false">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="threshold" value="TRACE" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%-5p:%d{HH:mm:ss,SSS}](%F:%L) - %m%n" />
</layout>
</appender>
<!--
<appender name="BABUKUMA_FILE_OUT" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="TRACE" />
<param name="MaxFileSize" value="5MB" />
<param name="MaxBackupIndex" value="5" />
<param name="File" value="/var/data/logs/babukuma.log" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%t][%-5p:%d{HH:mm:ss,SSS}](%F:%L) - %m%n" />
</layout>
</appender>
-->
<appender name="BABUKUMA_FILE_OUT" class="org.apache.log4j.DailyRollingFileAppender">
<param name="Threshold" value="TRACE" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="File" value="/var/data/logs/babukuma.log" />
<param name="Append" value="true" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="[%t][%-5p:%d{HH:mm:ss,SSS}](%F:%L) - %m%n" />
</layout>
</appender>
<category name="com.babukuma">
<priority value="INFO" />
<appender-ref ref="BABUKUMA_FILE_OUT" />
<appender-ref ref="STDOUT" />
</category>
<category name="org.seasar">
<priority value="INFO" />
<appender-ref ref="BABUKUMA_FILE_OUT" />
<appender-ref ref="STDOUT" />
</category>
<!--
<root>
<priority value="WARN" />
<appender-ref ref="STDOUT" />
</root>
-->
</log4j:configuration>

2009年9月25日金曜日

Android Network State チェック方法

AndroidでNetworkが利用可能かどうかをチェックする方法

簡単なUtilクラスを作ってみた。「Utils.java」
package com.babukuma.android.util;

import static android.content.Context.CONNECTIVITY_SERVICE;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public final class Utils {
public static boolean isConnected(final Context context) {
ConnectivityManager connManager = (ConnectivityManager) context
.getSystemService(CONNECTIVITY_SERVICE);

final NetworkInfo networkInfo = connManager.getActiveNetworkInfo();

return (networkInfo != null && networkInfo.isConnected());
}
}

これをテストしてみると、
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.babukuma.android/com.babukuma.android.TestActivity}: java.lang.SecurityException: ConnectivityService: Neither user 10026 nor current process has android.permission.ACCESS_NETWORK_STATE.

こんなエラーが発生する。
なので、「AndroidManifest.xml」に

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

を追加すれば期待する値が取れる。(^(エ)^)

2009年9月7日月曜日

Ubuntuに「ll」コマンド追加

他のLinuxで慣れてしまったコマンド「ll」
Ubuntuにはデフォルトで入ってないので追加してみた。

エイリアスコマンドを利用して追加する。

alias ll='ls -la --color=auto'

これで慣れたコマンドが使える。

2009年9月2日水曜日

【Android】 ゴロゴロしたい。v0.2

「ゴロゴロしたい」をバージョンアップした。
(´∀`) アハハハハハ

ロゴロゴしたい0.1」から変わったのが、画像!!!
それとクマが本当にゴロゴロするよになった。









じゃ。。次はゴロゴロする動作をもうちょっと自然にすること。
ランキングシステムを追加。
画像をもうちょっときれいに。。。
(^(エ)^)

2009年8月26日水曜日

crontabからのログとメールが文字化け!

crontabから実行するJavaアプリケーションで発行する
UTF-8のログやメールなどが文字化けになってしまう。

crontabの先頭に

LC_ALL=ja_JP.UTF-8

を追加する。
参照したサイトは http://h50146.www5.hp.com/products/software/oe/tru64unix/manual/v51a_ref/HTML/MAN/MAN1/0257____.HTM



Google Calendar APIを使ってみた。

RESTfulでJSON形式を利用してみた。
これはAndroidで使える。

alt=jsonを付けないとXML形式(デフォールト)になる。

gsessionidを取得するのは最初一回やる必要がある。登録、変更処理で必要。


1.認証
[URL]
POST https://www.google.com/accounts/ClientLogin

[Parameters]
Email=BABUKUMATEST@gmail.com
Passwd=XXXXXXXXX
source=BABUKUMAAPP
service=cl

[Http Request]
POST /accounts/ClientLogin HTTP/1.1
Content-Type: application/x-www-form-urlencoded
User-Agent: http4e/1.5.4
Host: www.google.com
Content-Length: 73

Email=BABUKUMATEST@gmail.com&Passwd=XXXXXXXXX&source=BABUKUMAAPP&service=cl&

[Http Response]
HTTP/1.1 200 OK
Content-Type: text/plain
Cache-control: no-cache, no-store
Pragma: no-cache
Expires: Mon, 01-Jan-1990 00:00:00 GMT
Date: Wed, 26 Aug 2009 04:48:07 GMT
X-Content-Type-Options: nosniff
Content-Length: 563
Server: GFE/2.0

SID=BABUKUMABABUKUMABABUKUMABABUKUMABABUKUMABABUKUMA
LSID=BABUKUMABABUKUMABABUKUMABABUKUMABABUKUMABABUKUMA
Auth=「ごごにGoogleLogin auth Tokenが」


2. カレンダーリスト取得
[URL]
GET http://www.google.com/calendar/feeds/default/allcalendars/full
[Headers]
Content-Type=application/x-www-form-urlencoded
Authorization: GoogleLogin auth=「GoogleLogin auth Token」

[Parameters]
alt=json

[Http Request]
GET /calendar/feeds/default/allcalendars/full?alt=json& HTTP/1.1
Authorization: GoogleLogin auth=「GoogleLogin auth Token」
Content-Type: application/x-www-form-urlencoded
User-Agent: http4e/1.5.4
Host: www.google.com

GET /calendar/feeds/default/allcalendars/full?alt=json&&gsessionid=BABUKUMABAB HTTP/1.1
Authorization: GoogleLogin auth=「GoogleLogin auth Token」
Content-Type: application/x-www-form-urlencoded
User-Agent: http4e/1.5.4
Host: www.google.com
Cookie: $Version=0; S=calendar=BABUKUMABABUKUMA

[Http Response]
HTTP/1.1 200 OK
Expires: Wed, 26 Aug 2009 05:20:27 GMT
Date: Wed, 26 Aug 2009 05:20:27 GMT
Content-Type: application/json; charset=UTF-8
Cache-Control: private, max-age=0, must-revalidate, no-transform
Vary: Accept, X-GData-Authorization, GData-Version
GData-Version: 1.0
Last-Modified: Wed, 26 Aug 2009 05:20:27 GMT
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
Server: GFE/2.0

{"version":"1.0","encoding":"UTF-8","feed":{"xmlns":"http://www.w3.org/2005/Atom","xmlns$openSearch":"http://a9.com/-/spec/opensearchrss/1.0/","xmlns$gCal":"http://schemas.google.com/gCal/2005","xmlns$gd":"http://schemas.google.com/g/2005","id":{"$t":"http://www.google.com/calendar/feeds/default/allcalendars/full"},"updated":{"$t":"2009-08-26T05:20:27.500Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/gCal/2005#calendarmeta"}],".....................................................................}


3. gsessionid取得

一回登録処理をするとレスポンスのLocation部分にgsessionidが入ってる。これを保存する。


4. 予定登録
[URL]
POST http://www.google.com/calendar/feeds/「User_ID」/private/full?alt=json&gsessionid=「取得したgsessionid」

[Headers]
Content-Type=application/atom+xml
Authorization: GoogleLogin auth=「GoogleLogin auth Token」

[Body]
<entry xmlns='http://www.w3.org/2005/Atom'
xmlns:gd='http://schemas.google.com/g/2005'>
<category scheme='http://schemas.google.com/g/2005#kind'
term='http://schemas.google.com/g/2005#event'></category>
<title type='text'>Babukuma Test 2</title>
<content type='text'>日本語 Test Test</content>
<gd:transparency
value='http://schemas.google.com/g/2005#event.opaque'>
</gd:transparency>
<gd:eventStatus
value='http://schemas.google.com/g/2005#event.confirmed'>
</gd:eventStatus>
<gd:where valueString='神田'></gd:where>
<gd:when startTime='2009-08-26T15:00:00.000Z'
endTime='2009-08-26T23:00:00.000Z'></gd:when>
</entry>

[Http Request]
HTTP/1.1 201 Created
Expires: Wed, 26 Aug 2009 05:37:13 GMT
Date: Wed, 26 Aug 2009 05:37:13 GMT
Content-Type: application/json; charset=UTF-8
Cache-Control: private, max-age=0, must-revalidate, no-transform
Vary: Accept, X-GData-Authorization, GData-Version
GData-Version: 1.0
Location: http://www.google.com/calendar/feeds/「User_ID」/private/full/babukumababukuma/63386948233
Content-Location: http://www.google.com/calendar/feeds/「User_ID」/private/full/babukumababukuma/63386948233
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
Server: GFE/2.0

{"version":"1.0","encoding":"UTF-8","entry":{"xmlns":"http://www.w3.org/2005/Atom","xmlns$gml":"http://www.opengis.net/gml","xmlns$georss":"http://www.georss.org/georss","xmlns$batch":"http://schemas.google.com/gdata/batch","xmlns$gCal":"http://schemas.google.com/gCal/2005","xmlns$gd":"http://schemas.google.com/g/2005","id":.....................................................................}



5. 予定取得
[URL]
GET http://www.google.com/calendar/feeds/「User_ID」/private/full?alt=json

[Headers]
Content-Type=application/x-www-form-urlencoded
Authorization: GoogleLogin auth=「GoogleLogin auth Token」

[Parameters]
alt=json
max-results=15
singleevents=true
sortorder=ascending
futureevents=true

[Http Request]
GET /calendar/feeds/「User_ID」/private/full?alt=json&max-results=15&singleevents=true&sortorder=ascending&futureevents=true& HTTP/1.1
Authorization: GoogleLogin auth=「GoogleLogin auth Token」
Content-Type: application/x-www-form-urlencoded
User-Agent: http4e/1.5.4
Host: www.google.com

GET /calendar/feeds/「User_ID」/private/full?alt=json&max-results=15&singleevents=true&sortorder=ascending&futureevents=true&&gsessionid=「取得したgsessionid」 HTTP/1.1
Authorization: GoogleLogin auth=「GoogleLogin auth Token」
Content-Type: application/x-www-form-urlencoded
User-Agent: http4e/1.5.4
Host: www.google.com
Cookie: $Version=0; S=calendar=babukumababukuma


[Http Response]
HTTP/1.1 200 OK
Expires: Wed, 26 Aug 2009 05:34:39 GMT
Date: Wed, 26 Aug 2009 05:34:39 GMT
Content-Type: application/json; charset=UTF-8
Cache-Control: private, max-age=0, must-revalidate, no-transform
Vary: Accept, X-GData-Authorization, GData-Version
GData-Version: 1.0
Last-Modified: Wed, 26 Aug 2009 05:30:27 GMT
Transfer-Encoding: chunked
X-Content-Type-Options: nosniff
Server: GFE/2.0

{"version":"1.0","encoding":"UTF-8","feed":{"xmlns":"http://www.w3.org/2005/Atom","xmlns$openSearch":"http://a9.com/-/spec/opensearchrss/1.0/","xmlns$gml":"http://www.opengis.net/gml","xmlns$georss":"http://www.georss.org/georss","xmlns$batch":"http://schemas.google.com/gdata/batch","xmlns$gC.....................................................................}


2009年8月25日火曜日

Ubuntu + Emobile「D11LC」を認識させる。

新しいイー・モバイル(Emobile「D11LC」)を彼女からもらったので、Ubuntuに認識させてみた。

参照したサイトはこちら
 http://www.randynetwork.com/blog/279
http://www.draisberghof.de/usb_modeswitch/#download

1。 usb_modeswitch-1.0.4.tar.bz2 をダウンロード

2。解除

3。> make install

4。/etc/usb_modeswitch.conf 編集
  OT-X020をコメント外す。
  以外は全部コメント。。にした。


5。> sudo modprobe usbserial vendor=0x1c9e product=0x6061
USBドライバ設定。。
 これを参照サイトに書いてるとおりに「/etc/rc.local」に書いておく


6。再起動
  
7。D11LCをさして
  「> sudo usb_modeswitch」実行すると「/dev/ttyUSB0」が出てきた。

8。GNOME PPPからイー・モバイル接続。


2009年8月14日金曜日

Chromeにテーマが適用

気づくのが遅かったけど、いつの間にかChromeにテーマが適用された。



不思議な感じがする。(´∀`)

2009年8月13日木曜日

「bad interpreter」エラーでシェルが動かない現象。

ウィンドウから編集してアップしたシェルファイルが

: bad interpreter: そのようなファイルやディレクトリはありません
このようなエラーで動かない。

これは改行の問題らしい。

解決方法は

cp shellfile.sh shellfile.sh.org perl -pe 's/¥r¥n/¥n/' shellfile.sh.org > shellfile.sh rm shellfile.sh.org 

これらしい。

ちょっとはまったな。。( ´д`)


2009年8月12日水曜日

【Android】 ゴロゴロしたい。

簡単に作ってみたAndroidゲーム。( ゜∀゜)ヤッター

ずっとタッチするとクマがロゴロゴして何時間ゴロゴロしたかがわかる。。。
それだけ。。(;^_^A





やっぱり画像を作るのが一番難しい。。。
ネットで自分の時間を保存できるようにしようかな。。
ランキングも。。(´∀`) 
( ゚∀゚)ァハハ八八ノヽノヽノヽノ \ノ \ / \ / \



2009年8月11日火曜日

「maven-assembly-plugin」を利用して配信用ZIPファイル作成

「maven-assembly-plugin」を利用して配信用ZIPファイル作成する方法


「pom.xml」に「maven-assembly-plugin」を追加する。


<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptors>
            <descriptor>src/main/assembly/assembly.xml</descriptor>
        </descriptors>
    </configuration>
</plugin>


「descriptor(assembly.xml)」を作成。


<assembly>
    <id>distribution</id>
    <formats>
        <format>zip</format>
    </formats>
    <moduleSets>
        <moduleSet>
            <binaries>
            </binaries>
        </moduleSet>
    </moduleSets>
    <fileSets>
        <fileSet>
            <directory>target</directory>
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>**/*.jar</include>
            </includes>
        </fileSet>
        <fileSet>
            <directory>src/main/sh</directory>
            <outputDirectory>/sh</outputDirectory>
            <includes>
                <include>**/*.sh</include>
            </includes>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <unpack>false</unpack>
            <scope>runtime</scope>
            <outputDirectory>/lib</outputDirectory>
        </dependencySet>
    </dependencySets>
</assembly>


- <fileSet>の設定で必要なファイルの追加ができる。

- <dependencySet>の設定で依存するライブラリの追加ができる。

- <dependencySet>の「scope」を「runtime」にすれば必須依存ライブラリのみを含む事ができる。


面白いね。。(ё(エ)ё)

maven-jar-pluginを利用してMANIFEST作成

maven-jar-pluginを利用してMANIFEST作成方法

実行可能なJARを作成するとき便利。


<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <configuration>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>com.babukuma.test.Main</mainClass>
            </manifest>
        </archive>
    </configuration>
</plugin>


作ったMANIFESTは


Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: BABUKUMA
Build-Jdk: 1.6.0_14
Main-Class: com.babukuma.test.Main
Class-Path: lib/postgresql-8.3-603.jdbc4.jar lib/WisCommon-0.9.16.jar
lib/jsonic-1.1.0.jar lib/log4j-1.2.8.jar lib/s2-framework-2.4.39.jar
lib/aopalliance-1.0.jar lib/javassist-3.4.ga.jar lib/ognl-2.6.9-patch
-20090427.jar lib/commons-logging-1.1.jar lib/s2-extension-2.4.39.jar
lib/poi-3.0-FINAL.jar lib/s2-tiger-2.4.39.jar lib/easymock-2.2.jar l
ib/s2-dao-1.0.50.jar lib/s2-dao-tiger-1.0.50.jar lib/commons-lang-2.4
.jar lib/geronimo-jta_1.1_spec-1.1.1.jar lib/geronimo-jpa_3.0_spec-1.
1.1.jar lib/commons-email-1.1.jar lib/mail-1.4.jar lib/activation-1.1
.jar lib/commons-cli-1.2.jar

2009年8月5日水曜日

IEでAJAXファイルアップロードするとき「multipart/form-data」がきかなかった。

本当にはまった。

AJAXでファイルアップロードするときに

なぜか、

$(form).attr("enctype", "multipart/form-data");

これだけでは、IEではコンテントタイプが「multipart/form-data」にならなかった。


http://www.bennadel.com/blog/1273-Setting-Form-EncType-Dynamically-To-Multipart-Form-Data-In-IE-Internet-Explorer-.htm

このサイトに書いてある方法で解決。

$(form)
.attr( "enctype", "multipart/form-data" )
.attr( "encoding", "multipart/form-data" )


はまる。。。絶対。。( ´д`)

2009年7月23日木曜日

Internet Explorer Developer Toolbar

IE用の開発ツールバー

FireFoxのFirebugみたいなものだね。。


便利!!! (^(エ)^)