2012年9月21日金曜日

WebObjects + Heroku:その3・WOのWARを作る

■ProjectWOnderのセットアップ■

ここを参考にして進めます→「Project Wonder Installation

Step1-4までありますが、3まででOKです。「Step 4:  Import Project Wonder into your Eclipse workspace」はちょっと説明が必要なのでこの後の節で。

■WOnderのセットアップ■

大まかな手順は
  1. WOnderソースコードのダウンロード
  2. Java環境変数の確認と設定
  3. ビルド&インストール
です。前提として、以下の作業はhomeディレクトリ直下で行いますが、home下であればどこでも結構です。

まずはソースをダウンロードします。「Getting the Wonder Source Code」を参考にしました。

・Homeディレクトリへ移動
    $ cd

・WOnderソースコードのダウンロード
    $ git clone git://github.com/projectwonder/wonder.git WonderSource
    $ cd WonderSource

・最新版の確認とダウンロード
     $ git checkout integration


次に、javacの環境設定の確認です。ターミナルで
    $ setenv | grep JAVA_TOOL_OPTIONS
    JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
    $

のようにエンコーディングが指定されていればいいのですが、ない場合には適当なエディタで.csrcを開き、 setenv JAVA_TOOL_OPTIONS -Dfile.encoding=UTF-8 と追加します。追加したらシェルを再起動します。ターミナルごと再起動するか新しいウィンドウを開いてもOKです。上記のsetenv...を使って、設定が反映されていることを確認してください。

では、ビルドとインストールです。ターミナルから
    $ ant frameworks; sudo ant frameworks.install

を実行します。数分かかりますが、エラーやワーニングが出ていないか注意してください。buildが終わったところで一旦動きが止まり、sudoのパスワードを求められます。最後に
    BUILD SUCCESSFUL
    Total time: 25 seconds

が表示されれば終わりです。こう書くとあっという間なんですが…いろいろ試行錯誤があって数日ツブれました…いや、愚痴ですけどね。

■WOアプリを作る■

ではいよいよWOのアプリを作ります。

Eclipseで File>New>Wonder Application を選びます。Wonder Applicationが選択肢として出てこない場合には、PerspectiveをWOLipsに切り替えてからもう一度。プロジェクト名は WOHeroku にしてFinishボタンをクリックします。

プロジェクトを開き、Sources>your.app>Application.javaを右クリックし、Run As>WO Applicationを選びます。


コンソールに起動ログが真っ赤な字で表示されますが、お気になさらず。そのまま数秒後ブラウザ上に Hello World が表示されます。これでWOアプリが動くことは確認できました。


■ServletとしてDeployし、Herokuへ■

プロジェクト名を右クリックし、Properties>WOLips Deploymentを選びます。ここで「Servlet Deployment」と「Autogenerate web.xml」をチェックし、OKをクリックします。この時点でHerokuで動かせないことに気づきました。SDDオプションがありません。SDDでないとWOFが組み込まれないので…。

プロジェクトメニューを右クリックし、WOLips Ant Tools>Installを選びます。ビルドが行われますが、通常のビルドよりも時間がかかります。問題がなければ数分後、BUILD SUCCESSFULの表示が出てApplicationディレクトリにWOHerokuとWOHeroku.woaディレクトリ, WOHeroku.warが出来ているはずです。


が、私の環境もそうでしたが、/Library/WebObjects/Applicationディレクトリのパーミッションがユーザに対して許可されていないとBUILD FAILEDになります。対処方法は二つ、開発マシン上なら1、運用マシン上でビルドも行うのであれば2でしょうか。

1.パーミッションを変更する


標準的なインストール環境であれば、ターミナルで
    $ cd /Library/WebObjects/Versions/WebObjects543/Library/WebObjects
    $ sudo chmod 775 Applications/
    Password:
    $ sudo chgrp staff Applications/

などと設定します。ともかく、自分がApplicationに書き込みできるような権限を付与します。775とは古いねしかしorz

2.インストール先を変更する


プロジェクトWOHerokuディレクトリの直下にある build.properties に dist.dir=dest という一行を追加します。こうすると、ビルドした結果がWOHerokuディレクトリ直下のdestディレクトリに変更されます。

これでWOHeroku.warができました! ここまでホントに長かった…。

■HerokuへDeployment、できません■

ターミナルで、WOHeroku.warのあるディレクトリへ移動し、デプロイします。

    $ heroku deploy:war --war WOHeroku.war
     !    No app specified.
     !    Run this command from an app folder or specify which app to use with --app <app name>
    $
    $ heroku deploy:war --war WOHeroku.war -app WOHeroku
     !    No app specified.
     !    Run this command from an app folder or specify which app to use with --app <app name>
    $

と、いうことでapplicationとして認識してもらえません。mavenさんでWOFも送り込むようなpom.xmlを書いたりすれば技術的には可能だと思いますが、これからmavenさんを勉強するスキルがありません。

ごめんなさい。

ただ、今後もWOを趣味程度にいじっていこうと思ってます。最近会社にもMacが入ってXcode三昧だったりするので、家と会社では違うことをやらないとね。

2012年9月20日木曜日

WebObjects + Heroku:その2・WARを直接Herokuへ

■前回の続き■

前回はHerokuのアカウント取得、RubyサンプルのHerokuへのデプロイ、Tomcatのインストール、TomcatサンプルのHerokuへのデプロイ…まで済ませました。今回は下記の通り、ローカルでビルドしたWARを直接Herokuへデプロイして動かすところまで。

  • Eclipse+Tomcat
  • TomcatプロジェクトからWARを作成
  • HerokuへDeployment

■Eclipse+Tomcat■

EclipseでTomcatアプリ開発」を参考にしました。うーむデザインに時代を感じる…。

大まかな流れとしては、
  1. EclipseにTomcatプラグインを入れる
  2. EclipseからTomcatが起動・終了できることを確認する
  3. 新規にJava/Tomcatプロジェクトを作り、上記サンプルソースを貼ってEclipseのDebugまたはRunボタンをクリック→コンソールにエラーが出ないことを確認
  4. ブラウザでhttp://localhost:8080/アプリ名/servlet/helloを表示し、Hello, World!
最後のところでURLでちょっとハマりました。TomcatのManager画面にはアプリ名が表示されているのですが、そこをクリックしてもnot foundになってしまう。てっきりTomcatの設定の問題かとあちこちググったりしても思い当たらない。で、上記のページをよく見直したら、URLはアプリ名+web.xmlのurl-patternになっていました。素人はこういうところでハマるから困ったもんです。

ともかく、EclipseでTomcatアプリを作って動かすところまではOK。

■TomcatプロジェクトからWARを作成■

Tomcat JavaプロジェクトをWARにするのは:
  1. プロジェクトを右クリック>Properties
  2. Tomcat>WARエクスポート設定タブ

ここで「エクスポートするWARファイル」の出力先パスを指定します。私の環境ではなぜか「参照」ボタンからファイルダイアログを指定してもパスを選べなかったので、出力先をフルパスで入力し、OKをクリックします。

なお、「.javaファイルをエクスポート」してしまうとソースも一緒にエクスポートされてしまうのでご注意を。それにしても私の環境は日本語化していないのに、どうしてここだけ日本語なんでしょ?


続いて、プロジェクトを右クリック>Tomcat プロジェクト>


を選びます。さっき指定したところにWARができているはずです。


ということで、このwarを直接HerokuへPushします。

■WARをHerokuへDeployment■

参考にしたのはここです→「Getting started with WAR deployment on Heroku

記事にもありますが、Heroku toolbeltのインストールとHeroku Accountが必要です。またHerokuのバージョンは2.24.0以上が必要です。

まずツールをセットアップします。これはターミナルで以下の通りタイプするだけです。
    $ heroku plugins:install https://github.com/heroku/heroku-deploy

あとは、さっき作ったTestTomcat.warの置いてあるディレクトリに移動してから、HerokuにDeployするだけです。
    $ cd
    $ heroku deploy:war --war TestTomcat.war
    $ heroku open

…ここでブラウザが開きますが、エラーが出ます。


泣いてはいけません。ローカルで走らせた時と同様にブラウザ上のURL末尾に /servelet/hello/ を追加して再表示します。今度こそHello Worldが表示されます。って書くと2行だけど、実際は/servlet/hello/をすっかり忘れてて数時間グーグル先生と旅をしていまいたorz

ということで、次回いよいよWebObjectsのWARファイルを作って、Herokuへデプロイします。その前にPostgreSQLに対応したTomcatサンプルを作ってHerokuで動くことを確認したら?という声が聞こえますが、TomcatでのDB取り扱いを勉強しても将来おそらく使うことはないと思うので省略します。

その1でも書きましたが、WOはHerokuにはデプロイはできません。ただ、日本語のMac環境にWonder framework入れようとするとコケるので、その辺の情報提供としてその3を公開します。

2012年9月16日日曜日

WebObjects + Heroku:その1・準備編

■残念なお知らせ■

HerokuにWebObjectsを載せることはできませんでした。ということで、この記事はHeroku超入門+WOLips超入門です。夢を見せてくれてありがとう…Single Directory Deploymentがサポートされていないとは思わなかったよ…。

■何を今更WebObjects■

「Herokuに対して直接WARをデプロイできる」ということを知ったのがキッカケでした。

Rubyに馴染みがないのでHerokuには触っていなかったのですが、Javaなら何とかなるしEclipse使えば必要最小限の作業でWARを吐き出せますからね。で、どうせWARを作るのであれば好きなフレームワークで試そうと思った次第です。

会社の仕事ともぶつからないし。

でもいきなりHerokuでWOを動かそうとしても上手く行かなかった場合に原因の切り分けが難しくなるので、1)まずHerokuを試し、2)TomcatのWARを作ってHerokuにデプロイ、3)最後にWebObjectsでWARを作ってHerokuで動かす…という段階を踏みます。

■Herokuとは■

HerokuはPaaSです。Ruby, Scala, Node.jsなどで書かれたプロセスをクラウド上で走らせることができます。バックエンドサービスとしてPostgresSQL, Hadoopなども使えます。1プロセスの起動時間(CPU時間ではなく起動している時間)として750時間、PostgresSQLの容量5MBまで無料で使うことができます。

詳しくは「FAQ:Herokuってなに?メリットは?」をご参照ください。

■Herokuアカウント取得■


Heroku.com」ページの右下にある「Sign up」をクリックします。日本の美しい風景が描かれたSign upページからemailアドレスを入力すると、招待メールが届きます。

メール上のリンクをクリックしパスワードを登録するとめでたくheroku Dashboardが表示されます。

左側にある「Download Heroku Toolbelt for Mac OS」をダウンロードしておきます。herokuコマンドラインツール, gitその他がインストールされます。インストールが終わったら、画面右側にあるようにheroku loginとタイプし、emailとpasswordでログインします。その次にherokuとの通信のための秘密キーを何にするか尋ねてきますので、番号で指定します。もしssh public keyがないと言われたら、KeyChainを使って作成してからもう一度。作成した後で
    $ heroku keys:add
を実行してキーを登録します。

確認のために画面下にあるコマンドを試してみます。Rubyのサンプルをgithubからとってきて、Herokuに上げます。

なお、4のところでRSAのパスワードを求められますが、間違えると以下のようメッセージが出て先に進めなくなります。
    Permission denied (publickey).
    fatal: The remote end hung up unexpectedly

その場合は間違ったキーを削除します。まず、以下のコマンドでKey名を表示し
    $ heroku keys
ここで出てきたkeyを
    $ heroku keys:remove keyname@domain
で削除し、下記コマンドで別のキーを登録しなおして
    $ heroku keys:add
もう一度4を実行します。間違えると勉強になるわ(泣

ともあれ、これでHerokuを使う準備ができました。Heroku Dashboardをみると、アプリが動いていることがわかります。アプリケーション名のリンクをクリックして、アプリケーション情報のページからOpen Applicationをクリックします。別ページが開いてHello, Worldが表示されればOKです。Herokuを無料で使えるのはWeb Dyno1本=インスタンス1本ですので削除しておきます。Settingsページの一番下からRemove Appしておきましょう。まぁ起動時間単位の課金なので、そんなに神経質になることもないのですが。

■HerokuのためのTomcat環境とサンプルを準備■

ここを参考にしました→「HerokuにEmbedded TomcatヘJava Web Applicationを作る

ただし、ここに掲載されているpom.xmlは壊れていてソースファイル名などにも記述漏れがあるので、上記記事の原本「Create a Java Web Application using Embedded Tomcat」からpom.xml, Main.java, HelloServlet.java, index.jspを拾ってきました。

ついでにTomcatも新しいのをインストールしなおしました。この辺が参考になりました→「[Tomcat]MacでのTomcatの環境構築」。最新は7.0.30ですが、Eclipse Tomcat pluginが対応していないので6.0.35を入れてください。

コマンドラインからsh target/bin/webappを実行してからブラウザでhttp://localhost:8080/を開き「Hello, Heroku!」の力強い文字w表示されればサンプルアプリの準備はOKです。ターミナルでctrl+C、ローカルで動いているアプリを止めます。

これで一応、ローカルでTomcatが動くようになりました。

■サンプルアプリをHerokuへ■

引き続き上記のページを参考にしながら、アプリをHeroku上で動かします。上記英語ページの「Deploy your application to Heroku」あたりから。同日本語ページにも記述があるのですが、ちょっと読みにくいかな…ともかく、あとはProcfile, system.propertiesを作ってコマンドをいくつか打ち込むだけです。最後のheroku openを実行すると、ブラウザ上にさきほどと同じ「Hello, Heroku!」が現れるはずです。お疲れ様でした。

■次回は■

慣れた人なら2-3時間でここまで来られると思うのですが、いくつかハマってしまって丸1日かかってしまいました…。

ということで、次回Tomcatアプリを作り、WARファイルを直接HerokuにDeployします。

2012年9月15日土曜日

FlexでFacebookアプリを作ろうとして挫折

■発作的にとりあえずやってみた■

初めてのFlexおよびFacebookアプリケーションの作成 – パート1:ローカルでのビルドとテスト

以下パート4までありますが、執筆者の肉食系キメ顔にびびらないで続ければ
  • Facebookアプリを登録
  • Flex/AIRで作ったアプリから氏名、誕生日、ステータスなどを取得
  • 同 メッセージをポスト
  • 同 アプリをデプロイメント
  • AIRアプリをFlashに変更
  • Facebook上でFlashが動くように処理

というところまでさくさくたどり着けます。このチュートリアルはとてもよく出来ていて、APIなどの探し方まで示してくれてます。素晴らしい。

ここまでは順調でした。

■Graph APIで大ハマり■

さて、Facebookアプリというからには、独自のプロパティに書き込みができないといけません。これについて上記チュートリアルには記述がありませんので、自力でなんとか。

まず、例によってfacebook developerページからオープングラフ>Getting Startedを選び、ActionとObjectを登録し「スタート」ボタンをクリックします。

この辺は「FacebookのOpen Graphアプリを作り App Centerに登録するには」が参考になります。言語は違いますが、とりあえずfacebookへの登録方法やAPIの構成は同じですので。


そんなこんなで、上のようなOpen Graphを作りました。で、画面の左側をみるとGet Codeというのがあります。ここを参考にすれば良いのかと思ったのがハマりの最初。こんなコードを書いて見たものの、エラーで先に進めません。


var data:Object = new Object();
data['fb:app_id'] = "xxxxxxxxxxxxx";
data['og:type'] = "taretest:bp_high";
data['og:title'] = inputTitle.text;
data['og:description'] = inputDescription.text;
FacebookDesktop.api("/me/taretest:record",submitPostHandler, data, "POST");

結局、これは完全に勘違いでした。以下のコードでとりあえずエラーは出なくなり、数値データは書き込まれないもののactivityとしてFacebookのタイムライン上に表示されるようになりました。

data['bp_high'] = 'http://samples.ogp.me/yyyyyyyyyyyyyyyy';
FacebookDesktop.api("/me/taretest:record", submitPostHandler, data, "POST");

ちなみに以下はどうやってプロパティを指定すれば良いか試行錯誤した痕跡です。書き込む側が悪いのか、表示するための設定が悪いのか…その辺はまた明日。

data['bpHigh']           = '1';
data['bpLow']            = '2';
data['bp_High']          = '3';
data['bp_Low']           = '4';
data['taretest:bp_High'] = '5';
data['taretest:bp_Low']  = '6';
data['bp_high:bpHigh']   = '7';
data['bp_high:bpLow']    = '8';



■凡ミスで大ハマり■

しかし、朝、作業を再開しようとするとFacebookDesktop.initとloginが失敗するようになってしまいました。リポジトリから古いソースを引っ張り出してもダメ。Macを再起動してもダメ。

いろいろ調べたところ、「アカウントでアプリを削除すると、トークンが無効になってしまうので取り直さないとダメ」ということが判明。そういえば、ゆうべ寝る前にテストデータが山盛りになってしまったアプリを「一度消しておくか」と気軽に削除したのでした。これが原因。

さて、それから、登録されてしまったトークンを削除する方法を探したのですが、SDKのAPIにはそれらしいものは見つからず、おそらくSharedObjectとして保存されていると思うのですがファイル名が暗号化されているので見つからない。

新しいFacebookアプリを作ったら動きましたがそんなのは解決策じゃないし、とりあえず先に進んだとしても本気でアプリ作った時に同じコトでハマる可能性大なので、とりあえず対処方法が見つかるまで保留することにしました。

とほほ。まぁ、でも、「AIRでFacebookアプリ?できますよ!」とか請けちゃってからハマるよりかはマシ…とポジティブに考えておきます。ポジティブでもないか。

では、またいつか。

2012年9月10日月曜日

急に思い立ってFacebookデベロッパー方面

何がきっかけになったのか忘れたけど、自宅で勤務時間外に(←ここ重要)何かググっていたら「Facebook and Heroku: an even easier way to get started」てな記事が出てきて、そこから「初めてのFlexおよびFacebookアプリケーションの作成 – パート1:ローカルでのビルドとテスト」とかFacebook SDK for iOS Tutorialてな方向に飛んだら眠れなくなってしまったw

とりあえず、「Facebookアプリは比較的簡単に作れるけど、さてHTMLやらコンテンツをどこに置いたらいいのさ」ってあたりは今や選択肢が多すぎて困ったもんです。今お金を払っているサービスに乗っかるのが一番ラクなんですが、iCloudもWebホスティングやめちゃいましたしねぇ。あとはGoogleの倉橋屋ドメインのWebホスティングかしら。

それに関連してherokuも見ています。herokuはコンテンツ上げられない(できないわけじゃないけど、トラフィック課金を回避するためにもただのビットマップなどはCDNなどを使うのが無難)のがちょっと面倒ですが、それ以外というかheroku本来のPaaSは大変に魅力的だし、Facebookと戦略的提携をしているので何かとラク。

とりあえずFacebookアプリとしては、

  • Flex+Salesforceの業務系アプリ
  • 自転車トレーニング系アプリのiOS版とFlex版
このあたりを作ってみようと思ってます。