2013年1月19日土曜日

iPhoneアプリ開発のお勉強

iPhoneアプリ開発について、ググれば大抵のことは出てきます。でも、古い人間なもんで、本を読まないと全体像が頭に入りません。

新しいプラットフォームを学ぶ場合、私(痛い目に合わないと学習しないタイプ)は:
  • (概念がわからない時は)まず雑誌や本を片っ端から斜め読みする
  • 入門書のチュートリアルに沿って実習
    • これは開発環境などの確認です。超初心者だと環境が悪いのか自分が悪いのかがわからないので、そのロスを防止します
  • とりあえず自分の好きなものを作ってみる
  • 当然ハマるのでググりつつ進む
  • 上級編の書籍を熟読するか、セミナーに出る
で。

なんだかんだでこれまで買った本は10冊ぐらいだと思います。とりあえず、その中で役に立ったものを何冊かピックアップします。

■まず入門編■

よくわかるiPhoneアプリ開発の教科書【iOS 5&Xcode 4.2対応版】
「何だかよくわからないんだけど、とりあえず作ってみよう」「『来週までに簡単なiPhoneアプリ1本作って』って言われたけど、どーすればw」そんな時にお役に立ちます。ある程度自信と経験のあるヒトは後述の「10日でおぼえるiPhoneアプリ開発入門教室」から始めても良いと思います。

■実践編■

10日でおぼえるiPhoneアプリ開発入門教室 (10日でおぼえるシリーズ)
有料セミナーで教科書として使われていた本。上の「教科書」は小さなサンプルが沢山乗っていてとにかく動くようにする、こっちは開発フローを意識してある程度ボリュームのあるサンプルを丁寧に教えていく感じです。入門書の割にコードもしっかり正しく書かれているので悪い癖がつきにくいと思います。まぁ10日で覚えるのはまず無理ですがw

■学習編■

詳解 Objective-C 2.0 第3版
ARCが導入されたからあんまり意識しなくていいんじゃねーの?という見解もあったりしますが、やっぱりこの変な言語についてはしっかり学んでおかないといけません。もう一冊入門 Objective-C 2.0 (Programmer’s SELECTION) の方もコード例が沢山乗っていてわかりやすいですが、言語の教科書としては「詳解」の方がしっかり学べるかなと思います。

■これが電子書籍だったら編■

iOSプログラミング逆引きリファレンス110 [iOS 5.1対応]
この本に書かれている内容を全文検索できるなら、もうアップルその他に問い合わせしなくても良いんじゃね?と思うくらい、びっしり情報のツマった本。もうお世話になりっぱなし。気力と記憶力のあるヒトは、精読しておくことをお勧めします。そうすれば具体的なAPIは覚えていなくても、誰かに相談された時に「できるか、できないか」の判断ができますから。

Titanium mobile、どうも困った…

記事に要約つけることにしました。
  • TitaniumアプリのAndroid版でフラグメントに遭遇
  • Titaniumあかんか…という気配
  • 次はNative+jQuery。いや、いっそNative+Airでw

■iPhoneでは問題ない…■

会社でTitaniumを使ってちょっとしたアプリを書いてます。iPhoneでテストしてひと通り動くようになったところでAndroidエミュレータでテスト、画面の差異などを吸収したりソース分けたりして社内テスターにリリース。

そこで問題発生、Android OSバージョン:
  • 2.3.3では問題なし
  • 2.3.4では動くヒトと動かないヒト
  • 2.3.5では起動すらしない
  • 4以降は今のところ問題なし
いろいろ追いかけてみたところ、スマートフォンなのにisTabletがtrueで返ってきてしまってあちこち矛盾するのが原因らしいと判明。2.3.5のエミュレータなんて無いからテストできないですよorz

今回Titaniumを使うことになったのは、クロスプラットフォーム性を最重視、であればPhoneGap+jQueryより少しはサクサク動くTitaniumの方が良いか…という判断でした。Androidのフラグメントについては皆さん了解済だったんですが、0.0.1の違いでバラついてしまい、同じバージョンでも差異が出てしまうというのはさすがにアウトだなぁという空気になりまして。まぁそりゃそうですわな。

それなりにwork aroundもあるとは思うんですが、Titanium SDK 3.0.0も出たばかりでそのバグフィックスリストを見ると、ちょっとこれはシンドいかなという気分に。「JavaScriptからブラウザを経由しないでネイティブのAPIを叩くからjQueryより少し軽い」というのはメリットなんですが…ランタイム上のネイティブなオブジェクトを参照する辺りの処理がイマイチ書き切れてない感じです。以前もviewのframeサイズを拾ってこようとしたら何やっても0しか返って来ないってこともあったっけ。ごく基本的なAPIがreferenceに書いてある通りに動かないのはイカンよなぁ…。

今回Titaniumの評価も兼ねたプロジェクトだったわけですが…とりあえずACS(Appcelerator Cloud Service)はそのまま使うけど、Titaniumについてはしばらくペンディング…ということになりそうです。

個人的にはUIエディタのないツールでプロトタイプを作るのはイヤなので、ちょっと助かったとです。リキッドレイアウトが協力ならまだ良いんだけどねぇ。

ホントならここでSenchaへ行きたいところなんですが、ツールを買い揃える予算がないのでMonaca方面で試行錯誤中。

しかし…jQuery mobileについて勉強してた当時はある程度ソラで書けるようになっていたのに、また「えーと、画面と画面を区切るのはなんだっけ…(ググり中)そうそう <div data-role="page" id="foo"></div> だった」なんてところまで退化していて困ったもんだ。

個人的には「そんなにクロスプラットフォームが良いなら、iPhone版はNativeで書くとしてもAndroid版を含めて残り全部Adobe Airで良いんじゃね?」と鬼のようなことを考えていたりもするのですがw

2012年11月23日金曜日

今日はムービーアプリ

■例によってハマり方面■

お友達からの依頼で、ムービー再生系のiPhoneアプリを作ってます。ムービーアプリなんてSymantec C++以来かもしれない。あまりにも久しぶりなんで、どのFrameworkが最新だかわからないレベルです。MediaPlayer.frameworkですが。

簡単なアプリですがハマったのは以下2点。まぁね…ハマる以前だけどね。

画面真っ黒になるだけで何もでない
▶MPMoviePlayerViewControllerではなくMPMoviePlayerControllerを使っていた。

参考にしたサンプル・コードにはMPMoviePlayerViewControllerって書いてあったのですが、Xcodeの入力予測を使った時に間違ったようです。MPMoviePlayerViewControllerに変えたらムービーのコントローラなどがちゃんと表示されました。でも、ムービー表示領域は真っ黒で「Loading...」が表示されたままです。

Loadingのままで先に進まないし、play直後にfinishしてしまう
▶fileURLWithPathではなくURLWithStringを使っていたorz

困ったときのStackOverFlowさんありがとう。

Storyboard + ARCで作っているけど、Objective-C 2.0をちゃんと勉強した後となっては正直ARCにあんまりメリット感じません。Javaとは言わないけど、せめてC++的にスタックで自動的にお掃除してくれるなら文句ないんですが。

このところ会社ではずっとTitanium mobileをいじってます。JavaScriptなんでメモリの後始末を考えなくて良いという点「だけ」は良いものの、やっぱりネイティブの方が楽です。APIなどが確実に動く(Titaniumはbound関係のAPIで値が返って来なかったりすることが多い)し、何よりInterfaceBuilderが使える。Titaniumだと「画面上に配置したオブジェクトを全部50dp下げる」なんてことが起こると座標をいじらないといけないので面倒くさくていけません。

2012年10月28日日曜日

Force.com SDK for iOSをStoryboard対応に

Force.com SDK for iOSのテンプレートを簡単にStoryboard対応にする方法をまとめました。以前はRestKitがソースごと提供されていたのでスプラッシュも含めて変更可能だったのですが、今はバイナリとヘッダだけになってしまったので簡単にはいじれません。

そこで、SFAuthorizingViewController.xibはそのまま残して、それ以外をStoryboard対象とします。

1.新しいプロジェクトをテンプレートNative Force.com REST Appから作る

Use Automatic Reference Counting(ARC)チェックはオフで。

2.新しいStoryboardを用意してTableViewControllerを貼る。

Storyboardの名前はStoryboardとします。新しく出来たStoryboardは何も入っていない状態なので、ここにTable View Controllerを貼ります。

3.Table View Controllerの設定

カスタムクラスとしてRootViewControllerを設定し、View ControllerのIdentifierを rootView にします。Storyboard上のPrototype Cells下にあるTable View Cellをクリックし、Identifierを CellIdentifier に変更します。

4.ソースの変更

AppDelegate.mのを以下のものと差し替えます。


- (UIViewController*)newRootViewController {
    UIStoryboard *storyboard 
        = [UIStoryboard storyboardWithName:@"Storyboard" 
                                    bundle:[NSBundle mainBundle]];
    RootViewController *rootVC 
        = [storyboard instantiateViewControllerWithIdentifier:@"rootView"];
    
    UINavigationController *navVC
        = [[UINavigationController alloc] initWithRootViewController:rootVC];
    
    return navVC;
}


5.SFNativeRootViewController.nib削除


残してあっても影響ないので、削除しなくても変わりありませんが。


以上で、OK。iPhone Simulatorを選んでRunするとちゃんとAuthorize画面が出て、認証後Table Viewに進みます。あとはよろしく:-)

2012年10月23日火曜日

iOS開発環境の移行

■証明書.p12を保存しておこう■

旧マシンからの移行はiTunes Connectなどのおかげもあって割と簡単なのですが、重要なことが一つ。

iTunes Connectに公開鍵などを登録しますが、その時に使った証明書.p12を保存しておかないと新しい環境上でプロビジョニングなどを有効にすることができません。

新しいマシンのXcode / Organizer上でプロビジョニング行の一番左に黄色い三角と「valid signing identify not found」の文字が表示されて実機テストが出来なくなってしまいます。

もし保存していなかった場合には、旧マシン上でKeyChainから証明書をダウンロードする必要があります(もし旧マシンが死んじゃった場合にはどーすんだろ…プロビジョニングなどを全部消してやりなおしたという記事は見たことありますけども…)。
  1. アプリケーション->ユーティリティ下にあるKeyChainを起動して左下にある「鍵」をクリックします。
  2. 右側に表示される一覧の中から、iTunes Connectへの登録時に使ったApple ID名の秘密鍵を右クリック、「"名前"の証明書を書き出す」を選びパスワードを登録します。
  3. ファイルを適当な場所に保存し、新しいマシンに移し替えます。
  4. 新しいマシンで証明書.p12ファイルをダブルクリックするとKeyChainが起動、パスワードを入力します。
これで証明書が確認されます。Xcode / Organizer上のプロビジョニングがちゃんと有効になっている、はずです。

2012年10月22日月曜日

Titanium studioのLionへのインストール

真っさらのLionにTitanium studio 2.1.2をインストールして起動したら、Permission Deniedエラーが出ました。/Library/Application SupportにTitanium SDKをインストールできない由。

ググると「Library/Application Supportのパーミッション変えろよwww」って悪魔のような回答が英語で山ほど出てくるのですが、それはさすがにセキュリティ的にいけません。

本当は~/Library/Application Support/下にTitanium SDKをインストールするのがLion的な流儀だと思うのですが、Titanium StudioのPreference->Aptana->TitaniumでTitanium SDK Homeを変更しようとしても変更できません。

ということで、妥協Work Aroundですが…自分で/Library/Application Support/Titanium/を作ってやればOKです。

1.Titanium Studioを終了


2.Finderで/Library/Application Supportへ移動

Finderで「ライブラリ」が見えない時には、Finderを選んだ状態でoptionキーを押しながら移動メニューをクリックします。で、見えたら直下のApplication Supportをクリック


3.新しいフォルダを作る

ここに新しいフォルダを作ると管理者パスワードを聞いてきますので、認証します。


4.フォルダの名前を変更する

名称未設定フォルダの名前を Titanium に変更します。この状態では自分自身がTitaniumフォルダのオーナーなので起動したアプリからここに書き込みができます。

これでTitanium Studioを起動すれば、workspaceの設定、Appceleratorアカウントの認証などの後、Titanium SDKが自動的にダウンロードされ、使えるようになるはずです。

いやはや。なお「今更Lionかよ」…という突っ込みはナシの方向で。

2012年10月21日日曜日

Force.com IDE on Eclipse juno

まっさらなMacOS X Lion環境にEclipse junoをインストールし、Install New SoftwareからForce.com IDEを入れようとしたら以下のエラーが出て失敗しました。


Cannot complete the install because one or more required items could not be found.
  Software being installed: Force.com IDE 25.0.0.201206181021 (com.salesforce.ide.feature.feature.group 25.0.0.201206181021)
  Missing requirement: Force.com IDE 25.0.0.201206181021 (com.salesforce.ide.feature.feature.group 25.0.0.201206181021) requires 'org.eclipse.update.ui 0.0.0' but it could not be found


調べたところ、このWork aroundで無事解決しました。

1.HelpメニューからEclipse Market Placeを選択

2.Find:に "EMF Compare"と入力してGO

3.検索結果から "EMF Compare : model comparison and merge"のInstallボタンをクリック

4."EMF Compare ..."を選択し、Nextボタンをクリック

5."I accept..."を選択して、Finishボタンをクリック

6.数秒間"Installing Software"を待って


7."Software Updates"でEclipseをリスタートするか?と聞いてくるのでYes
8.再起動後にForce.com IDEをインストール

今度は無事インストール完了しました。いやはや。

ところで、上の画面コピーが汚い件。

「このウィンドウだけスクリーンショットを取る」みたいなツールを入れてたはずですが、使い方をすっかり忘れてcmd+shift+4に頼ってます。

2012年10月20日土曜日

本気でTitanium mobile / ACS

■クロスプラットフォームでPush Notification必須■

会社でのアプリ開発、当初はobj-cで進めてましたが「Androidは?」という意見が出てきたので、大きな投資なしにクロスプラットフォームでのPush Notificationが使えるTitanium ACSを使うことになりました。

私、基本的にラクにラクに生きていたいのでインターフェースビルダのないツールってのは苦手なんすけど…でもHTML5+JavaScriptのPhoneGapよりJavaScript+NativeのTitaniumの方が大分サクサク動きますし、Sencha TouchほどではないにせよPhoneGapよりMVCをきれいに分離できるので、まぁいいや。

ただ、基本的にデモ程度しか作ったことがないので、ViewをフリップさせるのすらGoogle先生のお世話になりっぱなしです。

例えば、「キーボードが出てきたよ」というイベントや、その時有効な画面サイズを引っ張ってくることができない(obj-cでプラグイン書けば可能)ので、よくある「テキストを入力しようとすると適切な位置にTextFieldが動く…っていうアレを実装するのに一苦労する…というレベルです。

「obj-cなら…」というため息を抑えつつ仕事する今日この頃。

■ACSを使うには■

以前はti.cloud.jsを手動でコピーする等の手順が必要でしたが、最新のSDK 2.1では新規プロジェクトを作る際に「automatically cloud-enabled this application」をチェックすれば自動的にモジュールが読み込まれるようになりました。

ググって出てくる事例は、この辺がちょっと古いものもあるので、「本家ページ」を参照しながら読み進むと良いです。

これでcreateUser, loginまでは何の問題もなく進みます。強いていえば、サンプルのcreateLoginではパラメータとしてemailを渡していないことと、「Create Succsssが返って来ているのにACS Management側で登録されたデータが見えない」と思ったらmanagement画面のモードがDevelopmentでなくProductionになっていた、って2点ぐらいです。

■Chatメッセージを送ってみる■

本家掲載のサンプルを使って、ボタンをクリックするとメッセージを送信するテストをしてみました。なお、ここで一つハマったのは、idsです。usernameでもemailでもなく、user idを指定しなければいけません。

app.jsでログイン処理を書き、以下のコードを適当なwindow.jsに貼ります。


    var button = Ti.UI.createButton({
        top:100,
        width:50,
        height:30,
        title:'送信'
    });
    view.add(button);
    
    button.addEventListener('click', function(e) {
        var ids = ['ここはユーザID'];
        Cloud.Chats.create({
            to_ids: ids.join(','),
            message: 'Good morning'
        }, function (e) {
            if (e.success) {
                for (var i = 0; i < e.chats.length; i++) {
                    var chat = e.chats[i];
                    alert('Success:\\n' +
                        'From: ' + chat.from.first_name + ' ' + chat.from.last_name + '\\n' +
                        'Updated: ' + chat.updated_at + '\\n' +
                        'Message: ' + chat.message);
                }
            } else {
                alert('Error:\\n' +
                    ((e.error && e.message) || JSON.stringify(e)));
            }
        });        
    });


「送信」ボタンをタップすると数秒後「success」のアラートが表示されるはずです。

■ところで■

ACSはRESTベースのサービスです。
別にTitaniumに限定されているわけじゃないんですよね。

nativeだったら今頃は…。でも、このまま進みます

次回いつになるかわかりませんが、お楽しみに。

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を公開します。