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さんがまとめてくれました。あわせて読みたい。
- オープンコーラ岡山 http://t.co/pkuHm8g
終了後は、懇親会&かけなび杯ボーリング大会と一日盛りだくさんの内容でした。
普通にあつまって勉強会するだけじゃなくて、こういったちょっと面白いイベントもいいですね。何かと参考になった&充実した一日でした。
主催の英吉さん、そして当日参加された皆さんに感謝します!
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して導入しておきます。
自分は以下のような構成で実験しました。
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番です。以下のように管理ツールが起動しているのが確認できます。
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台のみの構成でしたが、クラスタ環境なので、当然これを増やしていくこともできます。手順としては
- ssh-setupで、対象マシンにDASサーバからパスワードなしでSSH接続できるよう設定する
- install-nodeで対象マシンにGlassfishのバイナリをコピーする
- create-node-sshでDASサーバの管理下に置く
- create-instanceでクラスタにインスタンスを追加する
といった手順です。
このように、作業をクラスタ上の各マシンでおこなうことなく、DASサーバだけでほとんどの管理ができるのは、Glassfish 3.1の大きな特徴かと思います。
Redmineインストールメモ
RubyもRailsも触ったことがない自分がやってみる、完全自分用、Redmine環境インストールメモ。
といっても、公式のWikiに書いてある内容を、そのまま実行しただけです。
作成環境
- Ubuntu 11.04
- redmine 1.2.0
- PostgreSQL 8.4.8
自分は邪悪なので、以降は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で。その後、以下のSQLでRedmine用の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
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.8ServerName www.yourhost.com DocumentRoot /usr/local/redmine-1.2.0/public AllowOverride all Options -MultiViews
以上で設定は終了。Apacheを再起動。
service apache2 restart
まとめ
- はまったのは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
- その他には、テスト駆動開発入門の勉強会&写経はどうだろう?
- みんなで、ワイワイ、コードレビューやりたい。(エディタ技自慢、変態自慢等)
- ふりかえり?(イメージが掴めないかも)