JavaOne 2011 in San Francisco!


突然ですが、来る10/2〜6にかけて、アメリカはサンフランシスコで開催されるJavaOneに参加することになりました。

まずは、旅費とか諸々の費用を出していただいた、いまの会社(&社長)に感謝したいと思います。この時ほど「会社員でよかった!」と思ったことはないかもw
なにしろアメリカに行くのは初めての事なので、いろいろ分からないことも多いのですが、現地で見たこと聞いたことを、岡山の皆さんにも還元できるよう、様々なことを吸収してきたいと思います。

また帰ってからは、できるだけ早いタイミングで、現在進行中の岡山Javaユーザ会のスタートイベントとして、岡山でJavaOne報告会とか企画したいと思います。

お呼びがあれば、その他近辺でも報告会をやりますので、やって欲しいという酔狂な方はTwitterで@zephiransasまで声をかけていただければ、喜んで参りますw

瀬戸デ部ミーティング&オープンコーラ岡山に参加してきた

先日の8/6に瀬戸デ部のミーティング(を口実にした?w)オープンコーラ作成というイベントに参加してきました。

集合するまで

会場は日本アンドロイドの会岡山支部長の英吉さんの、お母様がやってらっしゃる、TEA ROOM UP FIELDってところです。イオン倉敷の裏あたりにあるのですが、実にアットホームで実家に帰ったかのような雰囲気が味わえる、素敵なカフェです。お昼に頂いたパスタもうまかったし!イオン倉敷近くにお越しの際は、ぜひお立ち寄りください(宣伝w

当日は11時くらいに集まる予定だったので、余裕を持って11時チョイ過ぎ(?)に現場着。玄関前で、ちょうど来たid:razonさんと合流。中ではコーラ部長こと英吉さんと、愛媛から駆けつけた@patorashさんが既に待機中でした。patorashさんにはTwitter上ではちょくちょく絡ませて頂いてたのですが、実際にお会いするのは初めてでした。英吉さんにも、ようやく名前と顔を覚えていただけたので、よかったw

そうこうしてるうちに参加者が集結。参加人数は17人ぐらいだったかな?

材料の買い出しとか

そして実際にコーラの作成に入るのですが、香料とかは既に用意してあったんですが、一部の材料がまだ揃っていなかったので、買い出しに。自分はA班として、ドライアイスの調達。一応、普通の炭酸もあったほうがいいんじゃね?ってことで、普通の炭酸も合わせて購入。
B班はスポイトやカラメルなどを購入に出たようです。

B班を待っている間、そういえばここにはAndroid端末がいっぱいあるよね?ってことで、みんなで素麺スライダーをやってみることに。
それにしても端末が出るわ出るわww 一人1台ってレヴェルじゃねーぞww
この素麺スライダーですが、先日広島で行われたシャープハッカソンで英吉さんが参加したチームで開発したものです。マーケットからダウンロードできるのでAndroid端末を持ってる方には是非試していただきたい。特につなげて遊ぶって発想が面白い!しかし、これを2日間で完成させるって、どういうことなの・・・?




コーラ作るよ!


で、実際に揃えた材料がコレ。なんといっても目をひくのが砂糖の量!圧倒的じゃなイカいや、こりゃコーラが体に良くないってのも頷けるわァ・・・
香料はなかなか手に入らないレアものらしいです。しかし注意書きのラベルを見ると。アロマセラピー用につかってね(はぁと って書いてるしw 最初はこれ口に入れても大丈夫なのか心配しましたが、今元気でこれを書いてるってことは平気ってことでww
最初は香料を混ぜあわせてコーラの元を作成。これがコーラの風味の元になります。匂いとかは、まんま濃縮したコーラって感じ。
これを水に溶かした大量の砂糖に少量いれて、かるく煮こむ(?)だけで、コーラの濃縮液の出来上がり!
このあたりから、想像以上のコーラっぷりに会場のテンションが、だだあがりですw
この濃縮液を5倍の炭酸水で薄めて、めでたくコーラの完成です!今回は炭酸水は、味とかがついてない市販のウィルキンソンの炭酸水を使いました。
そして、コーラ部長の試飲・・・飲んだあと、しばらくレスポンスがなかったため「ANR(Application Not Responding)発生や!」とAndroidアプリ開発者らしいツッコミが周囲から入ってましたが、味は上々。すばらしい!
こうして、オープンコーラRC1が見事完成しました。

Rubyクラスタの胎動


そして、このRC1の作成結果をもとに、会場のRubyクラスタの面々が独自に調整版オープンコーラの作成を開始。ちょうど着色料も買ってきていたので、Ruby色のコーラを作ろうということになって、完成したのが、左のコーラ。
プロデューサーさん、コーラですよ!コーラ!
見た目はRubyをイメージしたカラーになっております。名付けてRubyコーク
どうです、この毒々しさwww
そして、これを飲んだ会場のみんなのコメントが「余裕
ええ、余裕です。見た目の毒々したとは反して、結構飲み易い。RC1の研究成果と、Rubyクラスタの面々のRubyへの愛情が産み出したコーラといってもいいでしょう。






ちなみに、今回作成したコーラに貼ったラベルは id:tech-kazuhisa さんが前日に自作したものです。よく見るとライセンス条項がGPLだったり、時事ネタがあったりで、ネタの実装がパネェ!













まとめ

当日のつぶやきをid:razonさんがまとめてくれました。あわせて読みたい

終了後は、懇親会&かけなび杯ボーリング大会と一日盛りだくさんの内容でした。
普通にあつまって勉強会するだけじゃなくて、こういったちょっと面白いイベントもいいですね。何かと参考になった&充実した一日でした。
主催の英吉さん、そして当日参加された皆さんに感謝します!

Java7の複数例外catchを調べてみた

もうリリース間近なJava7。Java7ではProject Coinと呼ばれる、様々な言語仕様についての改善が含まれています。
そのなかでも特に気になった複数例外のマルチキャッチについて、OpenJDKを使って、ちょっと調べてみました。

複数例外catchとは?

Java7では複数例外catchを簡単に記述することが出来ます。今までだと

try {
    ...
} catch(IOException e) {
    //IOException時の処理
} catch(ClassNotFoundException e) {
    //ClassNotFoundException時の処理
}

としていたのを

try {
    ...
} catch(IOException | ClassNotFoundException e) {
    //IOException or ClassNotFoundException時の処理
}

という形式で、一度に記述することが出来ます。
catch内でIOExceptionかClassNotFoundExceptionかを判別したい場合は、instanceofを使って

try {
    ...
} catch(IOException | ClassNotFoundException e) {
    if(e instanceof IOException) { //IOException時の処理 }
    if(e instanceof ClassNotFoundException) { //ClassNotFoundException時の処理 }
}

としてやることで判別可能です。*1また、キャストすることで、元のクラスのメソッドを呼び出すことも可能です。

注意点

注意点が1点だけ。

  • あるExceptionと、そのサブクラスを、複数例外catchでは記述できない

ということです。例えば以下のパターン

try {
    ...
} catch(IOException | FileNotFoundException e) {
    ...
}

この場合、FileNotFoundExceptionはIOExceptionのサブクラスなので、上記のように書くと、コンパイルエラーとなります。

*1:それならcatchを分けろって声が聞こえそうですが

オープンラボ備後でGlassfishのセッションやってきました

先日7/17に行われたオープンラボ備後で、Glassfishの自己増殖クラスタの話をやってきました。

初セッションだったので、緊張するかと思いきや、あまり緊張しなかったという事実に我ながら驚きましたが。
スライドはこちら。

先日のエントリの内容を実機でのデモを交えながら、紹介していきました。これでGlassfishに興味持ってくれる人が増えてくれたら、万々歳\(^o^)/

togetterのまとめはこちら
って、青と黒の人しか呟いてねぇ!
しかもハッシュタグレイープとかwwwマジワロエナイwww

振り返り

以下、KPTで振り返ってみる。

Keep
  • 大きな声でハッキリ発表できたような?
  • 中間地点で原メソッドを使って時間確認したおかげで、60分の持ち時間をきっちり使い切った
  • 動画を使用したデモはよかった。思わぬトラブルに強い
Problem
  • もうちょっと質問にしっかり答えたかった。調査不足
  • 動画デモは、フォントサイズが少し小さかったかも
  • スライドはもうちょっとネタ少なめでもよかったかも
Try
  • 常に見える場所に、残り時間を表示できるようにしておきたい
  • 予測可能な質問(ありがちな質問)は、予め調査しておくように
  • 動画デモのフォントサイズを、もうちょっと大きくして録画する
  • スライドのクオリティをうpしたい

最後に

  • 今回、発表の場を与えてくださった、オープンラボ備後の id:lopes_nb さんと、 @soudai1025 さん
  • サポート&激励頂きました、Oracleの寺田さん
  • 当日、聞いてくださった皆様

以上の方々に深く感謝いたします。ありがとうございます!

追記

こちらは同日Scalaの話をしてくれたid:razonさんの報告エントリ。あわせて読みたい
オープンラボ備後で発表してKITA

Glassfish 3.1の自己増殖クラスタを試す

先日のオープンラボ備後で、Oracleの寺田さんにご紹介いただいたGlassfishクラスタ環境が面白そうだったので、自分でも試してみました。

前準備

今回も例によってUbuntu環境。Ubuntu 10.04をインストールしたマシンを2台用意します。自分は仮想マシンで用意しました。
また、お互いホスト名で名前解決できるように/etc/hosts辺りを設定しておきます。
合わせてJavaも両マシンにインストール。デフォルトではsshdが入ってないようなのでこれもapt-get*1して導入しておきます。

自分は以下のような構成で実験しました。

  • ホスト名:misaka - Glassfish DASサーバ
  • ホスト名:sister1 - Glassfish Nodeサーバ

DAS(Domain Administration Server)サーバはクラスタ全体をコントロールする管理サーバ。これにsister1というNodeを作成してクラスタ環境を構築していきます。

DASサーバのインストール

DASサーバといっても普通にGlassfishをインストールするのと、差はありません。Glassfishのバイナリをとってきてunzipするだけ。
この辺りからダウンロードできます。ここで注意ですが、Glassfish 3.1には2つのプロファイルがあります。

  • Full Platform - 全ての機能を網羅した完全版
  • Web profile - Web開発に特化したバージョン

通常はWeb Profileで十分なので、今回はこれを使用します。

cd /usr/local/src
wget http://download.java.net/glassfish/3.1/release/glassfish-3.1-web-ml.zip
unzip glassfish-3.1-web-ml.zip
mv glassfish3 /usr/local

インストール自体はこれで終了。あとは

cd /usr/local/glassfish3/glassfish/bin
./asadmin start-domain

とするだけでGlassfishが起動します。超簡単。試しに管理画面を見てみましょう。ブラウザから

  • http://[misakaサーバのIP]:4848

にアクセスします。start-domain実行時のログにも出ていますが、通常は管理用Web画面にアクセスする場合のポートは4848番です。以下のように管理ツールが起動しているのが確認できます。

クラスタの作成

まずはクラスタを作成。misakaサーバで以下のコマンドを実行します。

./asadmin create-cluster cluster1

管理用Web画面でも、クラスタに新しくcluster1が作成されていることが確認できると思います。*2

SSH接続の設定

次にmisakaサーバからsister1サーバへパスワードなしでSSH接続できるように設定をおこないます。

echo "AS_ADMIN_SSHPASSWORD=hogehoge" > /tmp/password

上記のhogehogeの部分はsister1サーバのrootのパスワードに置き換えてください。
その後、以下のコマンドを発行。

./asadmin --passwordfile=/tmp/password --interactive=false setup-ssh --sshuser root --generatekey=true sister1

これでパスなしでsister1にSSH接続できるようになっているはずなので、以下のような感じで接続できるか、試してみます。

ssh sister1 java -version

パスワードを聞かれることなくsister1でjava -versionを実行した場合と同じ内容が返ってくれば、問題ありません。また、/tmp/passowrdは念のため消しておきます

ここでハマったこと。
自分の場合(openssh-server)は、SSHで接続した場合ユーザの環境変数を適用できていないらしく、javaへのPATHが通っていないという現象に陥りました。
その場合は、sister1のサーバに以下の設定を行います。

  • sshd_configの修正

sister1サーバ上の/etc/ssh/sshd_configを修正します。以下の記述を追加。

PermitUserEnvironment yes

本来はこの設定のみで、ユーザの環境変数を使用できるはずなんですが、自分が使用したopenssh-serverでは動かず、さらに以下の設定を行いました。

  • environmentの作成

sister1サーバ上で/root/.ssh/environmentを作成します。javaコマンドにPATHが通るように

echo "PATH=$PATH:/usr/local/java/bin" > ~/.ssh/environment

等とかでjavaへのPATHを通します。

上記2点の設定を行い、sshdを再起動*3します。再度、misakaサーバから

ssh sister1 java -version

とやって結果を確認します。

sister1サーバへGlassfishのインストール

sister1にGlassfishをインストールします。Glassfishには自分自身をZIPにまとめて、SSH経由で他のサーバにこれを展開し、自動でインストールする機能があります。だから自己増殖です。*4

misakaサーバ上で以下のコマンドを実行します。

./asadmin install-node --installdir /usr/local/glassfish3 --sshuser root --sshkeyfile ~/.ssh/id_rsa sister1

実行すると、こんな感じで出力されます。

Created installation zip /usr/local/glassfish3/glassfish/bin/glassfish2277027524628389477.zip
Successfully connected to root@sister1 using keyfile /root/.ssh/id_rsa
Copying /usr/local/glassfish3/glassfish/bin/glassfish2277027524628389477.zip (58978127 bytes) to sister1:/usr/local/glassfish3
Installing glassfish2277027524628389477.zip into sister1:/usr/local/glassfish3
Removing sister1:/usr/local/glassfish3/glassfish2277027524628389477.zip
Fixing file permissions of all files under sister1:/usr/local/glassfish3/bin

misakaサーバでGlassfish自身のZIPを作成し、これをsister1に送って展開している様子がよくわかります。

ノードとインスタンスの作成

次にsister1サーバをDASサーバの管理下に置けるようにノードとして登録します。misakaサーバで以下を実行。

./asadmin create-node-ssh --nodehost sister1 --sshuser root --sshkeyfile ~/.ssh/id_rsa --installdir /usr/local/glassfish3 sister1

管理用Web画面のノードに、sister1が追加されていることがわかります。

次にここで追加したsister1ノードをcluster1がインスタンスとして使用できるようにします。misakaサーバで以下を実行。

./asadmin create-instance --node sister1 --cluster cluster1 instance1

管理用Web画面のクラスタからに、cluster1にinstance1が追加されていることがわかります。

クラスタを起動してみる

早速、ここまで構成したクラスタを起動してみましょう。misakaサーバで以下を実行します。

./asadmin start-cluster cluster1

するとcluster1に配備されている全てのノードのインスタンスが一度に起動し、クラスタ環境が実行されます。
管理用Web画面からwarファイルをデプロイするなどして、クラスタ環境を実際に試してみてください。

さらにNodeを増やすには

今回は1台のみの構成でしたが、クラスタ環境なので、当然これを増やしていくこともできます。手順としては

  1. ssh-setupで、対象マシンにDASサーバからパスワードなしでSSH接続できるよう設定する
  2. install-nodeで対象マシンにGlassfishのバイナリをコピーする
  3. create-node-sshでDASサーバの管理下に置く
  4. create-instanceでクラスタインスタンスを追加する

といった手順です。

このように、作業をクラスタ上の各マシンでおこなうことなく、DASサーバだけでほとんどの管理ができるのは、Glassfish 3.1の大きな特徴かと思います。

*1:apt-get install openssh-server

*2:ここではcluster1だけどmisaka-networkとかでも、ゲフンゲフン

*3:service ssh restart

*4:多分ね・・・・

Redmineインストールメモ

RubyRailsも触ったことがない自分がやってみる、完全自分用、Redmine環境インストールメモ。
といっても、公式Wikiに書いてある内容を、そのまま実行しただけです。

作成環境

自分は邪悪なので、以降はsudoなんてせずに、suしてからrootで作業してます。
またデータベースもメジャーであろう(?)MySQLではなく、PostgreSQLで。

Ruby関連の準備

apt-get install ruby
ruby -v

apt-getでインストール後、Rubyのバージョンを確認。1.8.7らしい。次にgemのインストール。

apt-get install rubygems1.8

で、Railsのインストール。バージョンは2.3.11で。

gem install rails -v=2.3.11

次にRack。バージョンは1.1.1で。

gem install rack -v=1.1.1

あとはrake

apt-get install rake

恐らく国際化サポート?だと思われるi18nもgemで入れておく。

gem install i18n -v=0.4.2

PostgreSQLのインストール

今まで、死ぬほどやってきたので省略。・・・だとあんまりなので、ざっくりコマンドだけ。
さすがにPostgreSQL9系はまだ早いと思われたので、8.4.8を使用。

cd /usr/local/src
wget [postgresql-8.4.8.tar.gzのURI]
tar -zxvf postgresql-8.4.8.tar.gz
cd postgresql-8.4.8
apt-get install libreadline-dev
apt-get install zlib1g-dev
./configure
make & make install
adduser postgres
passwd postgres
chown -R postgres /usr/local/pgsql
su - postgres
/usr/local/pgsql/bin/initdb -E UTF-8 -D /usr/local/pgsql/data

postgres.confやpg_hba.confの設定やその他諸々はggrksで。その後、以下のSQLRedmine用のDBを作成。

CREATE ROLE redmine LOGIN ENCRYPTED PASSWORD '[redmineユーザのパス]' NOINHERIT VALID UNTIL 'infinity';
CREATE DATABASE redmine WITH ENCODING='UTF8' OWNER=redmine;

Redmineのインストール

Redmineのソースを公式から、/usr/local/srcあたりにでもダウンロードしてから

tar -zxvf redmine-1.2.0.tar.gz
mv redmine-1.2.0 /usr/local

次にRedmineのDBへの接続設定を行う。/usr/local/redmine-1.2.0/config/database.yml.example をコピーして、database.ymlにリネームし、これを編集。デフォルトではproductionにmysqlへの設定が入っているので、これを書き換え。

production:
  adapter: postgresql
  database: redmine
  host: localhost
  username: redmine
  password: [PostgreSQLのredmineロールのパス]
  encoding: utf8
  schema_search_path: public

schema_search_pathはpublicで良い。次に

rake generate_session_store

次にDBのmigrateを実行したいが、その前にPostgreSQLのadapterを導入する。
gemでインストールしていくが、この際、PostgreSQLのpg_configとかを見に行くらしいので、事前にPostgreSQLのbinへPATHを通しておくのがミソ。

export PATH=$PATH:/usr/local/pgsql/bin
gem install libdbd-pg-ruby1.8
gem install pg

Rakefileのある場所で、migrateを実行

cd /usr/local/redmine-1.2.0
RAILS_ENV=production rake db:migrate

するとPostgreSQLのデータベースにテーブル等が作成される。次に初期データの導入。

RAILS_ENV=production rake redmine:load_default_data

このとき作成する言語を選択できるので、日本語がお好みでしたら、jaとかを指定しておきます。

adduser redmine
chown -R redmine files log tmp public/plugin_assets
chmod -R 755 files log tmp public/plugin_assets

以上でインストールは終了。WEBrickでテストしてみます。

ruby script/server webrick -e production

起動を確認して、localhost:3000でRedmineの画面がでてくれば、おk。

ApacheのインストールとPassengerの組み込み

Apacheはソースから入れてもいいけど、面倒だったのでapt-getでインストール。

apt-get install apache2
gem install passenger
/var/lib/gems/1.8/bin/passenger-install-apache2-module

実行すると、インストールするに当たって足りないモジュールと、そのインストール方法が表示される。なんという親切設計。

apt-get install libcurl4-openssl-dev
apt-get install libssl-dev
apt-get install apache2-prefork-dev
apt-get install libapr1-dev
apt-get install libaprutil1-dev

その後、再度、passenger-install-apache2-moduleを実行。

/var/lib/gems/1.8/bin/passenger-install-apache2-module

コンパイル&インストールが終了すると、これまたご丁寧に、httpd.conf用の設定内容を表示してくれる。ありがたく、これをhttpd.confに設定します。

LoadModule passenger_module /var/lib/gems/1.8/gems/passenger-3.0.7/ext/apache2/mod_passenger.so
PassengerRoot /var/lib/gems/1.8/gems/passenger-3.0.7
PassengerRuby /usr/bin/ruby1.8


    ServerName www.yourhost.com
    DocumentRoot /usr/local/redmine-1.2.0/public
    
        AllowOverride all
        Options -MultiViews
    

以上で設定は終了。Apacheを再起動。

service apache2 restart

ブラウザからlocalhostを参照し、Redmineの画面が見えていれば、インストール全て終了です。

まとめ

  • はまったのはPostgreSQLのadapterの導入。メッセージ良く読めば、わかる内容だとは思うけど。
  • Redmine(・∀・)イイ!! Tracは結構昔からつかってたけど、正直Redmineには機能が及ばない。
  • ネイティブにサポートしてるSCMにGitがあるのも嬉しい。

TDDBC岡山開催についての構想(妄想?)メモ

TDDBC岡山開催に向けてのメモ(という名の妄想)です。

最初に

この手のIT系イベントなんて参加経験はあっても、やる側にまわったことがないので、わからないことだらけです。ただ、TDDBCやってみてぇ!という情熱(?)だけです。
まぁドシロートの意見なので、あまり気にしないでくだしあw

他地域のTDDBC参加者が居ればスムーズなのかもしれないですが、恐らく難しいのでは?という前提で、まずプレイベント的にコンパクトに(TDDBC岡山0.5?)行ったほうがいいのではと思っています。

開催日時

  • まったくの未定?
  • いまのところ、他地域の開催予定としては、7/9@東京と11/8@横浜(?)が予定されている。
  • 他のスタッフとの擦り合わせが必要。

定員

  • コンパクトにやるなら15名程度?
  • 1チーム4〜5名程度として、3〜4チーム程度?
  • それだけの人数集まるだろうか?
  • TDDBCはネームバリューのあるイベントだと(個人的には)思ってるけど、岡山周辺で、どこまで浸透してるか未知数。

参加費

  • 基本赤字にはしない
  • 講師等を呼ぶ場合は、参加費で交通費+αを賄えるように
  • 修了時にグリーンバンドを支給する?(であれば\500程度、参加費にプラス)
  • 現在、id:shuji_w6e さんがグリーンバンド共同購入計画を推進中。タイミングが合えば、乗っかれそう。

場所

  • ネットワーク環境を確保できる所がいいのではないか?なんとなく
  • 以前、OITECをやった、岡山国際交流センターでは無線LANルータ持ち込みで、ネット環境が使用できた。
  • http://www.opief.or.jp/oicenter/rental.html

プログラム

[午前]

  • サポートスタッフ自己紹介
  • 参加者自己紹介
  • 基調講演(TDDについて基礎、TDDBCの目的)

[午後]
メインはペアプロでTDD体験。午後全て使って、みっちりやりたい。

  • お題をどうするか?
  • id:shuji_w6e さんがTDDBC札幌0.5で使用したハンズオン資料は最初に一歩としてよさげ
  • http://www.slideshare.net/shuji_w6e/tdd-handson
  • その他には、テスト駆動開発入門の勉強会&写経はどうだろう?
  • みんなで、ワイワイ、コードレビューやりたい。(エディタ技自慢、変態自慢等)
  • ふりかえり?(イメージが掴めないかも)

サポート言語

  • スタッフの数&スキルによる。要確認?
  • 自分だと、Java,C# SCMはsvnとGit


まだまだ、考えるべきことはいくらでもあるとおもうけど、とりあえず自分の脳内をざっくりと纏めてみました。