35歳、改めて、もがいてみようと思います

今日 id:moririring さんと呑みながら色々仕事や業界に関する話をして、久しぶりにほろ酔い気分で書いてます。

さて、先日、僕はいわゆるプログラマ定年説である35歳になったのですが、くしくもそのタイミングに合わせるかのように、仕事の内容がこれまでのサービス開発、運用から、技術者向けのマーケティング、エバンジェリスト的なものに変わることになりました。( 転職ではなく、役割が変わるという事です、念のため。。。)

元々「自分の手でプロダクトを作りたい」という思いからサンを退職し、未踏ソフトウェアにチャレンジしたり、CTO としてチョイスタジオの起業に参画したり、といった過去からしても、僕は「自分の手で作る」という事に人一倍想い入れがある方だと思います。事実、今後 (少なくともしばらくは) プロダクションコードを書かないという事に対して、後ろ髪をひかれる想いがまったくないの?と問われたら、正直答えはノーです。

ただ、「自分の手で作りたい」という想いと同じかそれよりも強く「自分が関わるプロダクトを広く使ってもらい、その結果としてビジネスが成立する、という成功体験を得たい」という想いが、ここ数年とてもとても根強く僕の中にあります。それは、二宮尊徳の言葉を借りれば「経済なき道徳は寝言である」という事で、「どれだけ作ることが好きで理想があっても、ビジネスとして成立しなければ、続けられない。継続できなければ、結局価値は生み出せない」という事を身を以て経験したことに依ってると思います。

その観点にたった時、今のチームで自分が出来る事、最大限貢献出来る事を考えると、新しい仕事内容は、とても前向きにチャレンジしていきたいものです。

勿論この背景には、「ものを作る」といった技術力に加え、サービスを運用をする事に対してマインドをしっかりもった同僚、後輩に恵まれたという事もあります。特にこの一年間は、新しくチームに参加する優秀なメンバーが増え、自分の役割どころが少しずつ変わっていることも感じていたということもあります。

そんなこんなで、これまで経験ないことに35歳で改めてチャレンジする事になりました。勿論、仕事として結果を出していきたいと思ってますが、もう一つこのチャレンジに対して、「心はプログラマ、仕事はマーケティング」といったロールモデルもエンジニアとしてありなんじゃないか、それを模索してみたいところもあります。

ともあれ、何をすればよいのかも分からない事だらけなので、勉強しないといけないことも沢山あるでしょうし、失敗もするだろうし、しばらくはもがき続けないといいけないだろうなー、と思ってます。また道に迷ったときに、お世話になってる皆様に、話を聞かせてもらったり、ディスカッションさせてもらえたら嬉しいなと思い、ご報告と決意表明もかねて、このエントリを書きました。

改めて、今後ともよろしくお願いします。なんて。

関Javaカンファレンス2011で発表しました

war は「ウォー」なのか「ワー」なのか、心を決めきれない Java エンジニアのソメダです。おはようございます。このあたり でも告知した通り、関ジャバカンファレンス 2011 で発表させていただきました。

私の発表は、関ジャバということもあり、AWS SDK for Java の事をお話させて頂きました。AWS SDK は、AWS のインフラそのものをコントロールする使い方と、アプリを通してデータのやり取りをする使い方の大きく二つに分けられると思うのですが、個人的には前者のインフラをコントロールする使い方が、色々と発想が広がって面白いのじゃないかと思ってマス。

そこで「AWS ではじめる Programmable Cloud」というタイトルにあうようなデモは何だろうと考えた末に「エディタで AWS を操作する」という、クラウドエディタなるものを作ってみました。少しでも AWS SDK を通して「インフラをプログラムからコントロールする面白さ」が伝わっていたら嬉しいな、と思っています。

以下にソースも公開していますので、ご興味ある方は是非どうぞ。

また、エディタとともに、こちらも試してみたかった CloudWatch のカスタムメトリクスのデモとして、関ジャバカンファレンスのスピーカの各人のツイート数を Watch する TweetWatch を作ったのですが、その 1 時間毎の合計の推移を以下にペタリ。

きしだ (@) さんが一人スケールが違うのは予想どおりではありましたが、常人の100倍くらいツイートしてるのでは?!という予想ほどではありませんでした。やはり「推測するな!計測せよ!」は大事な教訓ですね!

反省点は、今回は JAWS-UG とは違いある程度 AWS そのものについての説明も入れて話したほうがいいだろうなぁ、と思って準備していったのですが、その説明自体に時間をとってしまい、矢継ぎ早に話す感じになってしまったことでしょうか。時間もオーバーしてしまいましたし、もうちょっとポイントしぼっていけば良かったですね。。。

後、上記の資料で、発表中 S3 の「耐久性」の記述が「可用性」になっていたので修正しました。ツッコミ頂いた えはら(@) さんありがとうございました。

所感

AWS については、ほぼ参加者の全て方がご存知でしたが、実際に利用された事がある方は半分を下回るくらいでした。開発者の方で、インフラ周りはちょっと弱い、、、けれども AWS 触ってみたい、、、とお悩みの方は、Eclipse Plugin と連携して動かせる Elastic Beanstalk は取っ付きやすいのかな、とは思います。

他のセッションについては、受付をやっていたこともあり、比較的ゆっくり聞く事が出来たのが さくらば(@) さんの JavaFX 2.0 と てらだ(@) さんの J2EE 6.0 のお話の二つ。

まず、僕らくらいの年代の Java エンジニアなら絶対一度はお世話になったことのある Java in the Box のさくらばさんですが、生でお話を聞くのはこれが初めて。何よりそのプレゼンテーションが素晴らしく、「JavaFX 使ったことある人〜」というお馴染みの質問への反応が数名しかいない、というアウェイ(?!)な状況でもガンガン笑いをおこしていくという、見事なものでした。勿論、笑いだけでなく、UI 系のライブラリとして生まれ変わった JavaFX 2.0 を Swing や Flex の機能と比較しながらお話されていたので、内容も分かり易いものでした。僕自身はもっぱら Web の開発が多いので、使いどころがあるとすれば Applet で何かしたいときかなー、と思いながら聞いていたのですが、ランタイムを入れないと動かないのはベータとれるまでに解消して欲しいところですね。他、印象に残ったのは Shape というグラフィック要素が通常の Control と並列に扱えるようになっているところと、Webkit 同梱あたりでしょうか。

てらださんのセッションは J2EE 6 と Glassfish の二つがメインディッシュでした。J2EE 6 については、2005 年前後のフレームワーク祭りの時代をピークに、Java で Web アプリケーションを作るための道具立てについては、今はもう皆、自分自身で何がしかの落としどころを見つけた状態かなぁ、と感じています。少なくとも僕自身は「標準である」事以外にメリットが無いのであれば、おそらく近々で「乗り換える」と言う事はないのかな、と思いました、正直なところ。

で、てらださん的にも力が入っており、またインパクトがあったのは Glassfish でした。うっかり「Tomcat で、もういいですよ」的なポジションをとったらフルボッコでしたw 。

  • Tomcat はもう J2EE の参照実装ではなく、Glassfish が参照実装なんだよ
  • Glassfish はノードにインストールしなくても勝手に自分自身をコピーする自己増殖クラスタが出来るよ
  • WebSocket などの新しい技術も積極的に取り込んでいるよ
  • GlassfishOSS 化したあたりから、J2EE のスペックリード級が設計や実装に口出しするようになって、クオリティがガラっと変わったよ (こちらは懇親会で聞いたお話)

といったあたりのお話があり、特に最後の内部的なクオリティがガラっと変わったというお話は印象深いものでした。

実運用のサービスでは、なかなかミドルウェアの機能そのものだけではなく、その周りにそのミドルウェアである事を前提とした運用 (監視や、作業手順) が沢山積み重なっているので、ミドルウェアだけの機能メリットでは正直移行し切らないところもありますし、そもそもある「心理的距離感」みたいなのを埋めるには結構パワーがいりますよね、という話はてらださんとも直接したものの、「評価してみたいな」と思うに十分な発表をされていました。

で、一日おいて Glassfish 関連をサラっと見直していたのですが

あたりはやっぱりいいですねぇ。。。(洗脳済) うらがみ (@) さんが勉強会するっていってたので、評価&参加してみようかしら、と。

最後ですが、何よりご参加頂いた皆様、また遠方より駆けつけて頂いたスピーカの皆様、本当にありがとうございました。色々と勉強させていただきました!

また、以下に参加頂いた方の感想、togetter ありますので、よろしければあわせてどうぞ!

dotcloud の jetty で BASIC 認証する方法

JavaJavascript の違いについてうまく説明出来ない Java エンジニアのソメダです、こんにちは。

さて、同僚の id:dragon3 さんも「dotcloud 手軽でよかばい」と言っているので、今週の関ジャバカンファレンス2011のデモ環境を、dotcloud 上でコツコツと作ってます。

こういった環境はプレゼン終わるまでは見られたくないですし、今回はネタが AWS なだけに、課金に関わる機能もあるので開けっ放しにはしづらいモノ。とはいえ、デモ用のアプリに認証の仕組みを組むのもなぁ、という気持ちもある訳です。で、そんな時は BASIC 認証が「手軽でよかばい」なのですが、Java の場合コンテナ側の設定が必要なので、そもそも dotcloud 環境の jetty で出来るの?と思って調べたのが発端です。

結論でいうと、今の所(2011年7月時点) dotcloud 環境の jetty で BASIC 認証かけれます。今回の環境は前のエントリでの環境を前提にします。準備するものは三つ。

  • dotcloud 上に jetty の設定ファイルを作成
  • 認証情報を保存するファイルの作成
  • web.xml に security-constraints 追加

以下で一つずつみていきます。

dotcloud 上に jetty の設定ファイルを作成

まず、ssh で指定の環境にログインして、

dotcloud ssh kanjava.www

ホーム (/home/dotcloud) 直下にある contexts ディレクトリに以下のようなファイルを作ります。名前は何でも良いですが、context.xml としておきます。

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
  <Set name="contextPath">/</Set>
  <Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/ROOT.war</Set>
  <Get name="securityHandler">
    <Set name="userRealm">
      <New class="org.mortbay.jetty.security.HashUserRealm">
            <Set name="name">User Auth</Set>
            <Set name="config"><SystemProperty name="jetty.home" default="."/>/webapps/realm.properties</Set>
      </New>
    </Set>
  </Get>
</Configure>

やっていることは、指定の Context (上記では ROOT.war) に、webapps/realm.properties を使った Realms を追加しますよ、ということ。詳細は以下あたりを参考に。

認証情報を保存するファイルの作成

context.xml で指定した realm.properties を作ります。こちらは、dotcloud 上で作ってもよいのですが、都度変更とかしたいのでローカルで作成しておいて、dotcloud push する際に war ファイルと一緒にあげることとします。以下では kanjava ユーザをパスワードは「password」、ロールを「admin」にしてます。

kanjava: password,admin

こちら、MD5 などでも保存できますが、詳細は以下で。

web.xml に security-constraints 追加

いつものやつです。web.xml の最後の方にソロリと追加します。

        <security-constraint>
                <web-resource-collection>
                        <web-resource-name>User Auth</web-resource-name>
                        <url-pattern>/*</url-pattern>
                </web-resource-collection>
                <auth-constraint>
                        <role-name>admin</role-name>
                </auth-constraint>
        </security-constraint>
        <login-config>
                <auth-method>BASIC</auth-method>
                <realm-name>User Auth</realm-name>
        </login-config>
        <security-role>
                <role-name>admin</role-name>
        </security-role>

配備

ここまで準備出来たら、後は realm.properties も一緒に dotcloud push するだけです。

mvn clean package
mkdir -p target/dist
cp -pr target/ROOT.war target/dist
cp -pr dotcloud.yml target/dist
cp -pr realm.properties target/dist
dotcloud push kanjava target/dist

レッツ BASIC 認証〜。

関ジャバカンファレンス2011がやってきます。

先のエントリでもチラホラ雰囲気を醸し出していましたが、関西のJavaエンジニアコミュニティ「関ジャバ」による初めてのJavaカンファレンスが開催されます。略して「関コン」。概要は以下の感じ。

開催日時
2011年7月16日(土) 10:00〜18:00(9:30受付開始)
懇親会
19:00〜21:00頃(調整中)
開催場所
日本オラクル株式会社 関西支社(大阪府大阪市北区堂島2-4-27 新藤田ビル 9F)

タイムテーブルは以下のような感じです。

10:00 〜 10:10 オープニング
10:10 〜 11:00 Java SE 7 で切り開く新しい Java の世界について 寺田 佳央 ( @yoshioterada )
11:10 〜 12:00 祝Preview卒業!Google App Engine for Java 小川 信一 ( @shin1ogawa )
12:00 〜 13:00 (お昼休憩)
13:00 〜 13:50 NetBeansJava SE7を勉強しよう きしだ なおき ( @kis )
14:00 〜 14:50 JavaFX 2.0 – リッチクライアントのためのUI基盤 櫻庭 祐一 ( @skrb )
15:00 〜 15:50 AWS ではじめる Programmable Cloud 染田 貴志 ( @tksmd )
16:00 〜 16:50 もう Java EE 6 でいいんじゃない 寺田 佳央 ( @yoshioterada )
17:00 〜 17:50 Lightning Talks 発表者募集!
17:50 〜 18:00 クロージング
18:00 〜 19:00 (片づけ、移動)

見て頂ければ分かる通り、なかなか Java という括りで昨今ここまでの面子が関西に集う事はないのではなかろうか、という豪華な顔ぶれです。その中に混じってそろーりと、AWS の話を私もさせていただきます。

参加、申し込みは以下です。

もう既に定員達してますが、キャンセル登録しておくと神が降臨してどうにかなるかも?!ならないかも?!

10分で dotcloud に Java アプリケーションを配備する方法

JSP の syntax をすっかり忘れてしまった Java エンジニアのソメダです、おはようございます。

さて、先日ベータがとれて正式ローンチされた PaaS サービスの dotcloud 。同僚の id:dragon3 も「dotcloud 手軽でよかばい」と絶賛中ですが、「dotcloud Java」でググってみると、現時点では

がトップヒットな感じで、ちょっと Java エンジニアとしては寂しい気持ちになってしまうのが正直なところです。

そこで、「10 分で出来る Java の war を dotcloud に配備する方法」をまとめてみよう、というのが本エントリの主題です。環境は MacOS X 10.6 を前提としてます。

dotcloud CLI をインストール

ここ の手順そのままです。

sudo easy_install pip && sudo pip install dotcloud

して /usr/local/bin/dotcloud に CLI が入り、/Library/Python/2.6/site-packages/dotcloud/ に本体がいます。このエントリ記載時のバージョンは 0.4.0 です。続いて API key をセットアップします

dotcloud

とタイプすると、対話式に聞いてきます。ちなみに上記の installtion.html のページをログイン後に見ると API key が表示されてます。僕はここで最後の「.」を誤ってコピペして何度も悩みました。ちなみに、API key の設定は ~/.dotcloud/dotcloud.conf に、そのものが保存されてるので、こっちを直接触っても大丈夫かと。

Java アプリを準備

アプリの雛形を mvn 使ってつくります。

mvn archetype:generate -B -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.0 -DgroupId=com.kanjava.aws -DartifactId=aws-sdk-webapp -Dversion=1.0 -Dpackage=com.kanjava.aws

バッチモードで書いてますが、対話式で作ってもよいでしょう。groupId や artifactId などはお好みにあわせて書き換えてください。コレ以降の作業は作成したプロジェクト (aws-sdk-webapp) 以下で行うこととします。

pom.xml の build 要素内に以下を追記。必須では無いですが、配備した後に / 直下でアプリにアクセスしたいので。

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
           <warName>ROOT</warName>
        </configuration>
      </plugin>
    </plugins>

まずはこれで war をパッケージング

mvn clean package

で、target 以下に ROOT.war が出来ます。

dotcloud 側への配備

まず、アプリケーションを登録します。

dotcloud create kanjava

最後の「kanjava」の所がアプリケーション名です。任意のものをつけてください。

次に配備用の dotcloud.yml を作成。場所はどこでもよいですがプロジェクトのトップがわかりやすいかと。

www:
  type: java

「www」はサービス名で、任意のもので良いです。

これら二つの作業は最初の一回で ok です。

必要なものだけアップロードするために、コピーします。

mkdir -p target/dist
cp -pr target/ROOT.war target/dist
cp -pr dotcloud.yml target/dist

ちなみに、target/dist を指定しないで後述の dotcloud push コマンドを実行すると、現在のディレクトリ以下の内容が全て rsync されてしまうので、pom.xml やら src やらまであがってしまいます。なので、mvn プロジェクトの場合は、別の配備用のディレクトリを作るのがよいでしょう。そのうち、そういうアーキタイププラグインでそうですよね。

配備します。

dotcloud push kanjava target/dist
:
sent 137 bytes received 37 bytes 31.64 bytes/sec
total size is 2.25K speedup is 12.95
Deployment for "kanjava" triggered. Will be available in a few seconds.
2011-07-01 01:11:29 [api] Waiting for the build. (It may take a few minutes)
2011-07-01 01:11:29 [www.0] Deploying...
2011-07-01 01:14:32 [www.0] Service booted..
2011-07-01 01:14:32 [www.0] The build started
2011-07-01 01:14:33 [www.0] Fetched code revision rsync-1309482688.98
2011-07-01 01:14:35 [www.0] * Stopping Jetty servlet engine (was reachable on http://kanjava-default-www-0:8080/). jetty
2011-07-01 01:14:38 [www.0] * Jetty servlet engine stopped. jetty
2011-07-01 01:14:38 [www.0] ...done.
2011-07-01 01:14:38 [www.0] * Starting Jetty servlet engine. jetty
2011-07-01 01:14:38 [www.0] * Jetty servlet engine started, reachable on http://kanjava-default-www-0:8080/. jetty
2011-07-01 01:14:43 [www.0] ...done.
2011-07-01 01:14:43 [www.0] The build finished successfully
2011-07-01 01:14:43 [api] Deploy finished
:

最初に rsync で target/dist 以下のファイルを全てアップロードし、その後 Jetty start してます。無事配備出来たらこのコマンドの最後にアクセスする URL が表示されます。後から確認したい場合は

dotcloud url kanjava

とすれば OK です。

10分で配備出来たでしょうか?!

余談1

dotcloud コマンドの内容、手順が既にベータのときと少し変わっているようで、ウェブで見つかる情報でも、既に古くなってるものがあります。私が確認した限り、

  • deploy サブコマンドはなくなった
  • dotcloud.yml ファイルは手動で作成する必要がある
  • URL はランダムなものが生成されるようになる

といった所です。

日本語エントリ書いておいてなんですが、まだこの辺り変更される可能性がありそうなので、何かおかしいな、と思ったら本家のドキュメント (http://docs.dotcloud.com) を見るのが堅そうです。

余談2

System#getProperties の内容と org.mortbay.jetty.Server#getVersion した画像をペタリしておきます。Java6 で Jetty も少し古めの 6.1.22 ですねー。

WEB+DB PRESS Vol.62 の AWS 特集を執筆しました

JAWS-UG 京都支部勉強会第一回は爆笑で始まり、天一で終わった訳ですが、皆様いかがお過ごしでしょうか、ソメダです。

WEB+DB PRESS Vol.62

WEB+DB PRESS Vol.62

  • 作者: cho45(さとう),染田貴志,浜本階生,おにたま,中島聡,角田直行,はまちや2,山本竜三,尾藤正人,石橋利真,ミック,みやけん,個々一番,広木大地,原悠,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2011/04/23
  • メディア: 大型本
  • 購入: 16人 クリック: 1,370回
  • この商品を含むブログ (23件) を見る

今週末 4/23 に技術評論社より発売される、WEB+DB PRESS Vol.62 の AWS 特集を id:dragon3 さんと執筆させて頂きました。

クラウドサービスの定番ともいえるAmazon Web Services(以下,AWS)のデータセンターがいよいよ日本でも開設されました。そこで,本特集では機能拡張を続けるAWSの現在の全体像をいまいちど振り返り,サービスを新しく開始するうえで考えておくこと,AWSの特徴を活かしたサービス設計や運用方法,既存のサービスをAWSに移行する際の注意点などの視点から,AWSを利用するためのノウハウを余すところなく解説していきます。

http://gihyo.jp/magazine/wdpress/archive/2011/vol62

とあるように、今回の特集では、id:dragon3 さんと一緒に AWS でのサービス運用を実際に行って得たノウハウを出し惜しみせず、全力 (?!) をだしきった記事となっております。

先日の JAWS-UG 京都の勉強会でも感じたのですが、この三月の東京リージョン開設を受けて、いよいよ AWS を使ってみよう、と考えられている方が多いのではないのでしょうか。そのような方に、

  • まずは全体を振り返り、
  • 始めるためには何が必要なのか、
  • はたまたサービスを移行するにはどんなポイントがある ?!

などといった本特集の内容が、お役に立てれば、と思っています。

記事を執筆するにあたって、毎日猫の手も借りたいほど子育てが大変にもかかわらず、執筆に時間を割く事を快諾してくれた嫁さんには頭があがりません。

いわば、この記事の私担当の部分の半分は嫁が書いたようなものです。という訳で、この記事の執筆料は嫁(ry

蛇足ですが、年末から企画の構成を練り、実際に執筆をはじめてから Elastic Beanstalk は出るわ、SES は出るわ、締め切り直前にCloudFormation は出るわ、と c9katayamaさんの苦労がよくわかりました。