MavenでGWTプロジェクトを作成/管理する

[bash]
$ mvn archetype:generate

Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 314: gwt-maven-plugin
Choose archetype:
1: remote -> org.codehaus.mojo:gwt-maven-plugin (Maven plugin for the Google Web Toolkit.)
Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): : 1
Choose org.codehaus.mojo:gwt-maven-plugin version:
1: 1.1
2: 1.2
3: 2.1.0
4: 2.1.0-1
5: 2.4.0
6: 2.5.0-rc1
7: 2.5.0-rc2
8: 2.5.0
9: 2.5.1-rc1
10: 2.5.1
Choose a number: 10: 10
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/gwt-maven-plugin/2.5.1/gwt-maven-plugin-2.5.1.jar
Downloaded: http://repo1.maven.org/maven2/org/codehaus/mojo/gwt-maven-plugin/2.5.1/gwt-maven-plugin-2.5.1.jar (181 KB at 78.2 KB/sec)
Downloading: http://repo1.maven.org/maven2/org/codehaus/mojo/gwt-maven-plugin/2.5.1/gwt-maven-plugin-2.5.1.pom
Downloaded: http://repo1.maven.org/maven2/org/codehaus/mojo/gwt-maven-plugin/2.5.1/gwt-maven-plugin-2.5.1.pom (21 KB at 44.4 KB/sec)
Define value for property ‘groupId’: : com.example
Define value for property ‘artifactId’: : HelloGWT2.5.1
Define value for property ‘version’: 1.0-SNAPSHOT: :
Define value for property ‘package’: com.example: :
Define value for property ‘module’: : helloworld
Confirm properties configuration:
groupId: com.example
artifactId: HelloGWT2.5.1
version: 1.0-SNAPSHOT
package: com.example
module: helloworld
Y: : y
[INFO] —————————————————————————-
[INFO] Using following parameters for creating project from Archetype: gwt-maven-plugin:2.5.1
[INFO] —————————————————————————-
[INFO] Parameter: groupId, Value: com.example
[INFO] Parameter: artifactId, Value: HelloGWT2.5.1
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: package, Value: com.example
[INFO] Parameter: packageInPathFormat, Value: com/example
[INFO] Parameter: package, Value: com.example
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] Parameter: module, Value: helloworld
[INFO] Parameter: groupId, Value: com.example
[INFO] Parameter: artifactId, Value: HelloGWT2.5.1
[INFO] project created from Archetype in dir: /Users/hrendoh/workspace/HelloGWT2.5.1
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 1:29.365s
[INFO] Finished at: Fri Nov 01 16:48:36 JST 2013
[INFO] Final Memory: 7M/81M
[INFO] ————————————————————————
[/bash]

[bash]
$ cd HelloGWT2.5.1
$ mvn gwt:run
[/bash]
ant devmodeした場合と同じく、”GWT Development Mode”が起動します。

参考:
Compile GWT application into JavaScript

MavenでWebアプリケーションプロジェクト HelloWorld jettyプラグインで実行

Mavenは、Rubyで言うところのrakeにあたる、Javaのプロジェクト管理ツールです。
おそらくデファクトスタンダードなはずですが、antから乗り換える動機が無いためあまりちゃんと勉強したことが無かったので改めてまとめてみました。

で、一番良く使うシンプルなWebアプリプロジェクトを作成してみます。

Mavenのインストール

Macだとhomebrewとかmacportsでお手軽にインストールできます。

Mavenプロジェクトの生成

[bash]
$ mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp

[INFO] Generating project in Interactive mode
Define value for property ‘groupId’: : com.example
Define value for property ‘artifactId’: : HelloMavenWebApp
Define value for property ‘version’: 1.0-SNAPSHOT: :
Define value for property ‘package’: com.example: :
Confirm properties configuration:
groupId: com.example
artifactId: HelloMavenWebApp
version: 1.0-SNAPSHOT
package: com.example
Y: : y
….
[INFO] ————————————————————————
[INFO] BUILD SUCCESS
[INFO] ————————————————————————
[INFO] Total time: 45.392s
[INFO] Finished at: Fri Nov 01 14:27:49 JST 2013
[INFO] Final Memory: 7M/81M
[INFO] ————————————————————————
[/bash]

Maven プロジェクトを生成するコマンドは mvn archetype:generate です。
パラメータ archetypeArtifactId に archetype(Mavenプロジェクトのテンプレート)を指定します。
archetypeを指定しない場合は、コマンドライン上で選択できますが、数が膨大なので目的のテンプレートを探すのは困難です。
今回利用した maven-archetype-webapp はMavenの公式archetype(groupIdがorg.apache.maven.archetypes)です。
Introduction to Archetypes で確認できます。

必要なプロパティは、すべてプロプントで聞かれるので簡単にプロジェクトを生成できます。

  • groupId は、Javaでいつも使っているパッケージを指定します(例:com.co-meeting)。groupId は archetype を検索する際に条件にも利用できます。
  • artifactId は、プロジェクトの名前を指定します。
  • version は、今回はデフォルトのまま、Enter。
  • package は、通常groupIdと同じになるので、Enter。

プロジェクトをビルドして実行

[bash]
$ cd HelloMavenWebApp/
$ mvn compile war:war
[/bash]
http://maven.apache.org/plugins/maven-war-plugin/usage.html

pom.xmlのbuildの下にpluginsを追加します。
[xml]
<build>
<finalName>HelloMavenWebApp</finalName>
  <plugins>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
[/xml]

注意: 似た名前の maven-jetty-plugin は古いので Jetty7以上を使う場合は jetty-maven-plugin をしていすること

jettyプラグインを実行
[bash]
$ mvn jetty:run
[/bash]

http://localhost:8080/ にアクセスして “Hello World!” と表示されれば成功です。

Jetty9 を利用する場合は、org.eclipse.jettyのjetty-maven-pluginを利用する必要があります。

ただし、org.eclipse.jettyのプラグインはデフォルトのリポジトリには含まれていないため Maven の settings.xml に追加する必要があります。
settings.xmlについての説明は Settings Reference を参照してください。

.m2/settings.xml を以下のように記述します。
[xml]
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<usePluginRegistry/>
<offline/>
<pluginGroups>
<pluginGroup>org.eclipse.jetty</pluginGroup>
</pluginGroups>
<servers/>
<mirrors/>
<proxies/>
<profiles/>
<activeProfiles/>
</settings>
[/xml]

pom.xmlのpluginsを以下の用に書き換えます。
[xml]
<build>
<finalName>HelloMavenWebApp</finalName>
  <plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
[/xml]
実行方法は同じです。
[bash]
$ mvn jetty:run
[/bash]

GWT (Google Web Toolkit) 2.5.0 Hello World

1. ダウンロードサイトからgwtを入手する
https://code.google.com/p/google-web-toolkit/downloads/detail?name=gwt-2.5.0.zip
2. 解凍
[bash]
$ unzip gwt-2.5.1.zip
[/bash]
3. webAppCreatorを使ってプロジェクトを生成
[bash]
$ ./webAppCreator -out ../HelloWorldGWT com.example.HelloWorldGWT
[/bash]
以下のパラメータが必須

  • -out: 出力先ディレクトリ
  • プロジェクト名 “fully-qualified” java的なパッケージ名を指定する必要があります。

4. 開発モードで動作確認
GWTはJavaでコードを記述してJavascriptにコンパイルする開発ツールですが、毎回コンパイルしながら開発しなくても良いように開発用ツールが用意されています。まずは開発ツールを利用して動作を確認します。
[bash]
$ cd ../HelloWorldGWT/
$ ant devmode
[/bash]
開発ツール”GWT Development Mode”が開くので Development Mode タブで [Launch Default Browser]をクリックするか、[Copy Clip Board]をクリックしてURLをコピーしてブラウザのアドレスバーにペーストしてテストサーバーにアクセスできます。

この内容は本家サイトで確認できます。
http://www.gwtproject.org/gettingstarted.html

5. コンパイル
次にJavascriptにコンパイルして動作させてみます。
[bash]
$ ant war
[/bash]
生成された、HelloWorldGWT.warをTomcatやJettyにデプロイします。

PHPのインスタンス メソッド・フィールドを動的に呼び出す

rubyのsendのようにPHPでインスタンスのメソッドやフィールドを呼び出す方法についてまとめてみました。

フィールド(メンバー)

インスタンス->{フィールド名}

で呼び出します。

[PHP]
class Hoge
{
public $foo = “foo”;
}
$hoge = new Hoge();
$field_name = “foo”;
echo $hoge->{$field_name};
[/PHP]

少しトピックと異なりますが、PHPクラスのプロパティについて参考になります:
Dynamic Properties in PHP and StdClass

メソッド

メソッドの場合は以下の関数が用意されています。

それぞれの第一引数はコールバックですが、以下のような配列を渡すことができます。

array( インスタンス, メソッド名 )

[PHP]

iperfコマンドを利用してサーバー間のネットワーク速度を測る

One both machines run:
[bash]
sudo apt-get install iperf
[/bash]

Then on Computer A:
[bash]
iperf -s
[/bash]

And on Computer B:
[bash]
iperf -c <address of Computer A>
[/bash]
On the client machine, you’ll see something like this:
[bash]
oli@bert:~$ iperf -c tim
————————————————————
Client connecting to tim, TCP port 5001
TCP window size: 16.0 KByte (default)
————————————————————
[ 3] local 192.168.0.4 port 37248 connected with 192.168.0.5 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 1.04 GBytes 893 Mbits/sec
[/bash]

参考: How do you test the network speed betwen two boxes?

MongoDB インストール on Ubuntu 12.04 メモ

MongoDBのインストールは、公式ドキュメント Install MongoDB にくわしい説明があります。
Ubuntuへのインストールも Install MongoDB on Ubuntu に載っています。

実行したコマンドをメモっておきます。

10genのリポジトリを追加
[bash]
$ sudo apt-key adv –keyserver hkp://keyserver.ubuntu.com:80 –recv 7F0CEB10
$ echo ‘deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen’ | sudo tee /etc/apt/sources.list.d/mongodb.list
$ sudo apt-get update
[/bash]

mongodb-10gen を指定してインストール
[bash]
$ sudo apt-get install mongodb-10gen
[/bash]
=に続けてインストールバージョンを指定することもできます。
[bash]
$ sudo apt-get install mongodb-10gen=2.4.3
[/bash]

データベースを作成するディレクトリを作成
データベースを保存するディレクトリは /etc/mongodb.confdbpath で指定します。
[text]
dbpath=/var/lib/mongodb
[/text]

データベース用のディレクトリの作成して設定を変更
[bash]
$ sudo mkdir -p /data/mongodb
$ sudo chown mongodb:mongodb /data/mongodb/
$ sudo vi /etc/mongodb.conf
dbpath=/data/mongodb
$ sudo service mongodb restart
[/bash]

上記の手順は、Cloudnで確認しました。
Cloudnで追加ディスクを利用する場合は以下の手順で用意します。
[bash]
$ sudo mkfs -t ext3 /dev/vdb
$ sudo mount /dev/vdb /data/mongodb/
$ df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/mapper/localhost-root 13123096 4622208 7834264 38% /
udev 242104 4 242100 1% /dev
tmpfs 100648 272 100376 1% /run
none 5120 0 5120 0% /run/lock
none 251616 0 251616 0% /run/shm
none 102400 0 102400 0% /run/user
/dev/vda1 233191 29081 191669 14% /boot
<strong>/dev/vdb 103212320 192248 97777192 1% /data/mongodb</strong>
$ sudo vi /etc/fstab

/dev/vdb /data/mongodb ext3 defaults 0 2
[/bash]

動作の確認
[bash]
$ mongo
MongoDB shell version: 2.4.3
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
> db.test.save( { a: 1 } )
> db.test.find()
{ "_id" : ObjectId("5250e2491a1f3c8880326237"), "a" : 1 }
[/bash]

UbuntuでJavaアプリケーションをstart-stop-daemonを利用してデーモンにするには

Javaアプリをstart-stop-daemonを利用してデーモン化する際のメモです。

Ubuntuの起動スクリプトの書き方は Linux Standard Base Core Specification 4.1 の VIII. System Initialization に則って記述されます。

[bash]
#!/bin/sh

# path is `/etc/init.d/java-app’

### BEGIN INIT INFO
# Provides: java-app
# Default-Start: 2 3 4 5
# Default-Stop: 1
# Short-Description: Start java-app daemon
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

appdir=/home/hrendoh/
java=/usr
prog=java-app
pidfile=/var/run/${prog}.pid
logfile=/var/log/${prog}.log

daemon="${java}/bin/java"
args="-jar java-app.jar"

. /lib/lsb/init-functions

RETVAL=0

# System configuration
unset TMPDIR

start() {
echo -n "Starting ${prog} services: "
# cheking already run?
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile
then
pid=`cat ${pidfile}`
log_warning_msg "daemon is already running? (pid=${pid})"
exit 1
fi
start-stop-daemon –start –background –quiet –oknodo –pidfile $pidfile –make-pidfile –chdir ${appdir} –startas ${daemon} — ${args} >> ${logfile}
status=$?
log_end_msg $status
}
stop() {
log_daemon_msg -n $"Stopping ${prog} service: "
# cheking already run?
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile ; then
start-stop-daemon –stop –pidfile $pidfile
status=$?
rm -f $pidfile
log_end_msg $status
else
log_warning_msg "daemon not running? (check ${pidfile})."
fi
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage: ${prog} {start|stop|restart}: "
RETVAL=2
esac

exit $RETVAL
[/bash]

コメント

スクリプトの頭のコメントは、Ubuntuの場合は以下項目を記述します。

[bash]
# Provides: java-app
[/bash]

デーモンの名前を記述します。デーモンを「service java-app start」とやって起動するときに指定する名前を記述します。

[bash]
# Default-Start: 2 3 4 5
# Default-Stop: 1
[/bash]

システム起動時のランレベルを記述します。

[bash]
# Short-Description: Start java-app daemon
[/bash]

スクリプトの説明を記述します。

他の項目については以下のドキュメントを参照ください。
https://wiki.debian.org/LSBInitScripts

start

既に起動しているかチェック

[bash]
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile
[/bash]

–signal はkillのシグナルを指定します。
0を指定する場合はプロセスチェックのみを行うので、それをプロセスが既に起動しているかどうかのチェックに利用しています。
–quiet はコマンド実行メッセージを非表示にします。オプションなしの場合ここでは「No process in pidfile ‘/var/run/java-app.pid running; none killed.」というメッセージが表示されます。

起動

[bash]
start-stop-daemon –start –background –quiet –oknodo –pidfile $pidfile –make-pidfile –chdir ${appdir} –startas ${daemon} — ${args} >> ${logfile}
[/bash]

–background は、フォアグラウンドでしか起動できないプログラムに指定すると、バックグラウンドプロセスとして起動することができます。
–oknodo は、処理が何も行われなかった場合に、返り値に1ではなく0を返すようにするオプションです。
–pidfile 起動したプロセスのIDを保存します。
–make-pidfile –pidfileで指定したパスにまだファイルが無かった場合に新しく作成します。
–chdir に指定してディレクトリに移動してdaemonに指定したスクリプトを実行します。
–startas には実行するjavaを指定し、に続けてJavaの実行引数を指定しています。
標準出力は、logfileに指定したパスのファイルに出力します。

stop

停止を実行する必要があるかどうか、startの場合と同様のコマンドでチェック、返り値が0出ない場合は何もしない。

[bash]
if start-stop-daemon –stop –quiet –signal 0 –pidfile $pidfile

else
log_warning_msg "daemon not running? (check ${pidfile})."
fi
[/bash]

停止

[bash]
start-stop-daemon –stop –pidfile $pidfile
rm -f $pidfile
[/bash]

pidfileで指定されるプロセスを停止します。
start-stop-daemonコマンドはpidfileは停止後消さないので、正常終了した場合はpidfileを消します。

参考リンク

start-stop-daemon Manpage

起動スクリプトいろいろ
How to make a jar file run on startup & and when you log out?
One Java init script to rule them all
Running Java applications as daemon on Debian Linux
start-stop-daemon の簡単な使い方

http://upstart.ubuntu.com/cookbook/#run-a-java-application

monitで簡単サーバー監視

Monitは、プロセス監視やログ監視をしてくれる軽量なツールです。

リソースはNewRelic使ってるから、Zabbixとかは入れるほどでも無いしという場合などに便利です。

Ubuntu 10.10にMonitをインストール

[bash]
$ sudo apt-get install monit
$ sudo dpkg -l | grep monit
ii monit 1:5.0.3-3 A utility for monitoring and managing daemon
$ sudo service monit start
Starting daemon monitor: monit won’t be started/stopped
unless it it’s configured
please configure monit and then edit /etc/default/monit
and set the &quot;startup&quot; variable to 1 in order to allow
monit to start
[/bash]

起動するには、指示の通り/etc/default/monitのstartupに1を設定

[text]
startup=1
[/text]

起動

[bash]
$ sudo service monit start
Starting daemon monitor: empty config, please edit /etc/monit/monitrc.
[/bash]

まずはミニマムな設定をしてみます。
/etc/monit/monitrcの以下の箇所のコメントを外して、適当な値を設定します。
[text]
set daemon 120
set logfile syslog facility log_daemon
set mailserver smtp.gmail.com port 587 username &quot;xxxxx@co-meeting.com&quot; password &quot;mypassword&quot; using tlsv1
set alert sysadm@foo.bar
set httpd port 2812 and
allow localhost
allow admin:monit
include /etc/monit/conf.d/*
[/text]
set daemon 120は120秒間隔でチェックが実行されるということです。
set mailserver …の設定はGmailのSMTPサーバーの例です。
また、各種監視設定はmonitrcにも続けて記述できますが、include /etc/monit/conf.d/*を指定して、conf.dに監視対象ごとにファイルを分けて設定します。
set httpd port 2828 and …は管理用のWeb画面を使わなくてもmonitコマンドからもアクセスされるため設定は必須です。

設定が終わったら再起動します。
[bash]
$ sudo service monit restart
[/bash]
起動を確認するためにWebインターフェースを表示してみます。
http://xxx.xxx.xxx.xxx:2812/にアクセスし、基本認証にadmin/monitを入れると以下の画面が表示されます。
monit-web-interface

幾つか監視設定を追加してみます。
監視設定のサンプルは公式サイトのConfiguration Examplesに充実しているので参考にしてください。

Nginx

/etc/monit.d/conf.d/nginx.conf
を作成し以下を記述
[text]
# Nginx
check process nginx with pidfile /var/run/nginx.pid
start program = &quot;/etc/init.d/nginx start&quot;
stop program = &quot;/etc/init.d/nginx stop&quot;
[/text]

MongoDB

おおよそのデーモンのpidは/var/runにありますが、MongoDBはpidfilepathを指定していない場合は/mondod.lockになります。
dbpath=/data/mondodb/の場合、/etc/monit.d/conf.d/mongodb.confを以下のように記述します
[text]
# MongoDB
check process mongodb
with pidfile &quot;/data/mongodb/mongod.lock&quot;
start program = &quot;/sbin/start mongodb&quot;
stop program = &quot;/sbin/stop mongodb&quot;
if failed port 28017 protocol http
and request &quot;/&quot; with timeout 10 seconds then restart
if 5 restarts within 5 cycles then timeout
[/text]

Redis
[text]
check process redis-server with pidfile &quot;/var/run/redis.pid&quot;
start program = &quot;/etc/init.d/redis-server start&quot;
stop program = &quot;/etc/init.d/redis-server stop&quot;
if failed host 127.0.0.1 port 6379 then restart
if 5 restarts within 5 cycles then timeout
[/text]

以下の内容を

参考になるリンク:
Installing Monit in Ubuntu 12.04 Servers
Linux resource monitoring and some tuning tips
monitrcの設定項目
被制御デーモンの登録 (monitrc)
monit と少し仲良くなったお話 – monitでApache2, MySQLを監視