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版
このあたりを作ってみようと思ってます。

2012年8月23日木曜日

Force.com SDK for iOS最新版

今週の月曜日から仕事でいじってました。

GitHubからzipで落としてもダメなのは以前と同じ。ちゃんとgitでcloneしてから./install.shしましょう。

今度のリリースでローカル・キャッシュなども加わったので、その辺もぜひ試してみたいんだけど、とりあえず会社の案件では用がないので保留…この週末にでも個人用アプリで試してみますべ。

で、新しいテンプレートですが…今度こそARCとかStoryboardに対応しているのでは?と3mmぐらい期待したのですが、してません。まぁARC無くても困らないんだけど、先週この案件に向けて下調べしていたViewはStoryboardが前提だったのでちょっと苦労しました。でも、まぁnibの方が素直というかイマイチ挙動を把握し切れていないSegueよりもわかりやすいので決定的な不利にはならないのですが。あと、今まで手動でやらなきゃいけなかった設定(Linkerのオプションとかライブラリの選択)が不要になっているのは少し楽。

今回の案件は「クラウド上のデータをiPad上に表示し、ユーザの操作を収集してクラウド上に上げる、てな案件のデモ版を作る」というものです。ViewControllerの数は5つ、Force.comは全部custom objectで6 objects、親子関係4世代とその横に親子関係2世代が参照関係でつながっているという単純なものです…と文字で説明しても「何のこっちゃ?」だと思いますが、一応勤務先の案件なのでご勘弁を。

ところで、このぐらいの規模のデモアプリ、他の人はどんな感じで作業しているんでしょうかね。

私の場合はざっとこんな感じ:

  • 月曜
    • SDKを新規インストールしてテンプレートプロジェクト作成
    • nibで要求仕様通りの画面構成を実装してNavigationBarなどが邪魔しないことを確認
    • Force.comで必要なデータベースを定義して一番基本的なデータがiOSアプリのUITableView上に表示されるところまで。ほぼ定時。
  • 火曜日
    • Tableからタップして表示されるUIPageViewControllerまわりの実装
    • ModelControllerとModelViewの役割分担がいまいちわかりにくくて試行錯誤
    • Force.comのデータを少し調整
    • ほぼ定時ぐらいで全データが表示されるようになり、全画面がとりあえず見られるような状態に
  • 水曜日
    • iPadからのpush側を実装。謎のデータ消失や重複が出たものの、ModelControllerをすっきり整理することで解消。正常操作と異常操作のマトリクスを作って動作をチェック、細かいところを直したり、ミリセカンド単位で収集しているはずのデータが秒単位だったのでForce.comの項目を18.0から15.3に変更したり。だいたい定時で動作確認も終わり

と、こんな感じでした。年寄りだから遅いのは勘弁してくださひ。

そういえば先月会社のお金でObjective-cの講習会に出たのですが、これが大変役に立ちました。特にメモリ関係で悩んだりハマったりすることが激減して、さくさく(当社比)書けるようになった…ような気がします。c言語とはなんだかんだで20年以上の付き合いになりますが、objective-cになっても変わっていねーなー、というのが正直なところ。

ああ、それでもやっぱりnilと[NSNull null]の混同で何カ所かハマりました。とほほ。

--

余談ですが、今日はFlexBuilderの作業。SuicaってかFeliCaをIDカードとして使ってForce.comに問い合わせをしたりメールを送ったり、という実装をしていました。

あー肩凝った、ってか疲れた。「あれ、ActionScriptって配列の要素の数はcountだっけlengthだっけ?」と悩んだりしているせいだとおもうんですけどねorz 明日はiPadアプリのアイコンなどを作ってお化粧する予定です。

まぁ何だかんだで、なかなか楽しい日々を送っております。はい。

2012年8月16日木曜日

SplitViewControllerで右へのSwipeが効かない

iPad用のデモアプリをMaster-Detailテンプレートから作っていて、Swipe Gesture Recognizerを貼った。実機で試すと右へのSwipeが認識されない。

1時間ぐらいバインド先や順番を変えてみるなど試行錯誤するものの結果は変わらない。

試しにSingle Viewで試すとうまく認識される。

ググったら、Stack Overflowで同じ現象に悩んでいる人が見つかった。

結論:iOS 5.1のバグでした。

デモアプリはSplitViewControllerを使わない方向で作ることにした。単純なView上にTableとViewを並べるという原始的解決法。UITableViewControllerが使えないと何かとめんどくさいけど、そこは根性でカバーしますよ。とほほ。

2012年8月11日土曜日

カレー同期


■現象■

昼ご飯外でカレーライスを食べて帰ったら、家の夕食もカレーだった

■推定理由■

前日近所の家がカレーだったんじゃないだろか。その匂いをかいで、(ああ、そういえばしばらくカレー食べていなかったなぁ)と思って、翌日の昼食と夕食に反映されたんじゃないか。

…と思う。

■余談(後日加筆)■

このブログへのアクセスは知人とあとクロウラーぐらいかと思っていたんですが…このネタへのアクセスはほぼゼロだったので「ああ、検索エンジンなどから調べてここに来てくれた人もいるのだな」とわかりました。

さらに関係ないけど、AdSenseの設定がわからん…。

2012年8月10日金曜日

PhoneGapってかCordova 2.0.0

2.0になってインストール方法が少し変わりましたね。

とりあえず、今週末にLion上にインストールして試してみる予定です。

どうせまたハマると思いますので…お楽しみにorz

2012年7月12日木曜日

ADT 20でプロジェクトが作れない

会社のLionにAndroid開発キットをインストールしました。EclipseはForce.com IDE用にすでに入れてあったので、adnからインストールし、SDK ManagerからAPI 8, 10, 15、それにIntel HAXを選択。

さて、Hello worldを…と思ったら、Android Application Projectで、最後のFinishが押せません。いや、押してもすぐに戻ってきてしまって終わらない。

ググってみると、どうもADT 20の問題みたいで、いろいろwork aroundが出ている。

  • android-sdk-macosx/extras/compatibility -> supportにrename
    • すでにsupportだった
  • sdk managerからsupport libraryを削除してもう一度create new project、ライブラリがないって言われたらそこでinstallをクリック
    • 変化なし
でも、結局、症状は同じでした…。ADT 20よりも古いツールからインストールしていたマシンでは問題ありません。

とりあえず、当面Androidいじる予定ないから良いんですが…何とか早く解決してほしいものです。また何か思いついたら対策してみます。

2012年7月10日火曜日

会社にMacが来た! ・その後

標準の500GB HDDをPlextor PX-256M5Sに換装しました。外付けUSBは禁止されているので、東映のアダプタを使ってDVD Driveのところに500GB HDDをセットして移行完了。やー、廉価版SSDとはいえ、HDDとは比べものにならないぐらい爆速ですね。立ち上がりが早すぎてXPのスリープ復帰より早いです(いやマジで)。移行が終わったところで、またHDをDVD Driveに戻しました。
外したねじ置き場。まぁ右奥3本が長いだけですが。
Excelとかパワポを使わずにはいられない会社なので、BootcampにWindows7を入れました。

ツールでパーティションを切って、Windows7のDVDを入れて待つことしばし。ってか、「展開中xx%」で止まること3度。00%, 53%, 68%だっけかな。68%では30分以上止まっていたのでWindowsに詳しい人に「もうリセットしちゃおうかしら」って話に行って戻ってきたら進んでいたというオチ。しかし、インストール後、Bootcampはそのままでは暗号化できず、暗号化しないと会社の規則で持ち出せず、暗号化するとVMWareからは起動できなくなる、ということで没。

再びBootcampツールを使って、パーティションを消す。サイズを変えることはできないけど、消すことはできるのね。で、改めて、VMWareでインストール。そしたら、CPUを2個しか割り当ててないのに8分でインストール終了。さっきの「展開中」は何だったんでしょう。

MacのパーティションはFilevault 2で暗号化済なのでその上のVMWareもセキュリティ的には問題ない。ただ、MacOS上にもWindows上にもSymantec EndProtectionを入れたらとても重い。特にMac側でファイルをダウンロードした後のスキャンが異様に遅くて泣けます。Mac界で比較的評価の高いSophosとかじゃダメか聞いてみようと思います。

さて、あとは入社以来使っていたXP(Core 2 Duo / 2GB / HDD 64GB)の中身を載せ替えれば移行完了です。

インストールが一段落したら、もう一度DVD-DriveをHDDに換装して、HDDをTimeMachine用に使おうと思ってます。実は今回、超お買い得なRetinaを諦めた理由の一つがこれです。セキュリティのため普通の会社ではプロテクションのない外付けUSBは禁止されていると思いますが、TimeMachineなしでMacを使うのも不便、ならば無理矢理2スピンドル化して使おう、というココロです。

まぁTimeMachineも暗号化できるので、そこを説得できれば良いのかもしれませんが、説得するのめんどくさいのよ。

2012年7月6日金曜日

会社にMacが来た!

そういえば、このブログのタイトルには「MacもGoogle docも使えないのでここに書く。会社をやめる理由はたぶん『Macが使えないから』になる予定w」とか書いていたのですが、MacBook pro 15" mid 2012さんが来ちゃいました。

Symantecさんを入れなければいけないなど、いろいろ制約もあるのですが…ともかくきれいなフォントを見ながら仕事できるだけでもうれしいざます。

でも、「Macは印刷業界ぐらいしか使えないじゃんw」という古い人もまだまだ多いよね。実際のところ、Macとは関係ない技術会議でもほんと冗談みたいにみんなMacBook Airだもん。先日の「ヒッグス粒子発表か?」を取り上げたニュースでも、技術者が使っているのはMacばっかりだったし。Salesforceの中の人も技術職はAirがやったらと多い。

スライド上映中に会場に浮かびあがる無数のアップルロゴ、こんな日が来るなんてちょっと感無量ですわ。

というわけで、今後もこのブログは続きます。