李です。

クラウドサービスとの連携に限らず、通信が発生するシステムにおいては常に通信周りの例外処理が課題でしたが、これまでシステム連携は多くの場合自社のデータセンターにある別サーバーや、VPNによって結ばれた連携先システムなど、"信頼できる"システムが殆どでした。
しかしSaaSなどの登場によって、遠隔地にある外国のサービスとの連携など今までと比べて複雑で、変化が早い通信経路を辿って、直接のやり取りが難しい相手のシステムと頻繁にデータの交換を行うパターンが増えました。
"このサービスは夜間不安定でリトライ回数を調整したい" "このサービスは時々セッションが切れるので、この条件下では自動で再ログインがしたい"などの通信周りの複雑な要件は、従来の設計ではなかなか対応し辛いものです。

さて、VMforceの発表やGoogleとVMwareとの連携の発表などで、それまであまりパッとしないSpring Rooが注目されるようになりました。
Spring Rooというプロダクト自体の紹介は詳しい方に任せるとして、このプロダクトの特徴はなんといっても変更を自動で検知しコード生成をサポートするエンジンと、それによって生成されるAspectJコードによるAOP(Aspect-Oriented Programming)の実装です。
これによってAOPが再評価される意見も多いので、今回はそれに便乗して冒頭で述べた問題をAOPで解決する簡単な例をお見せしたいと思います。

例えば下記のような、リモートサービスと通信し、ひたすらレスポンスを表示するだけのプログラムがあります:
public class CloudServiceConnect {
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            String response = getDataFromServiceA();
            System.out.println(response);
        }
    }
この中で呼び出されているgetDataFromServiceA()は、リモートサービスと通信するモジュールとします。
約10回に1回は例外になる、悪いヤツです。
    /**
     * リモートシステムからデータを取得するメソッド
     */
    private static String getDataFromServiceA() {
        // リモートシステムが一定の確率で通信エラーなどが原因で例外が発生することをシミュレーションするため、10回に一回RuntimeExceptionを返す
        Random r = new Random();
        if (r.nextInt(10) == 0) {
            throw new RuntimeException("雲の向こうで何かが起きた");
        }
        return "good response from serviceA";
    }
単純に例外処理をするだけなら簡単です、getDataFromServiceAを呼び出すところをtry-catchで囲んで、例外が発生したとメッセージを表示すればとりあえず処理は継続できますが、複雑なシステムとのやり取りなら当然インターフェースとなるメソッドは一箇所ではなくう、例外処理すべき箇所が多くてすべての呼び出しにそのようなコードを書くのはあまり楽しい仕事ではないし、なにより同様なコードが散在することでバグの原因になる可能性があります。

では通信モジュールに例外処理のコードを書くか、例外処理用のラッパーを作るにしても、今度はそれを呼ぶ側の事情によっては都合が悪かったりと柔軟性に欠けます。

そこで、AOPの出番です。(ここではAspectJのコードを使いますが、とてもこのブログに収まる話ではないので詳しい説明は省きます。)

アノテーションが使える最近のAspectJなら、下記のようなコードを入れるだけで、CloudServiceConnect内にあるすべてのget..という名前と一致するメソッドに例外処理を編みこんでくれます。

    @Around("execution(* test.CloudServiceConnect.get*(..))")
    public Object exceptionRecoveryAdvice(final ProceedingJoinPoint joinPoint) throws Throwable {
        Object result = null;
        try {
            result = joinPoint.proceed();
        }
        catch (RuntimeException e) {
            //なにもしないでnullを返す
        }
        return result;
    }
これだけあまり魅力を感じないかもしれませんが、例えばServiceAの他により通信条件が悪く、しかもデータを必ず必要で、取れるまでリトライしたいServiceBがあるとします。
その場合、下記のコードを追加するだけで対応できます。(対応を分けるということで、上記のexceptionRecoveryAdviceのexecutionをget*ServiceAに変更する必要があります)

    @Around("execution(* test.CloudServiceConnect.get*ServiceB(..))")
    public Object retryAdvice(final ProceedingJoinPoint joinPoint) throws Throwable {
        Object result = null;
        try {
            result = joinPoint.proceed();
        }
        catch (RuntimeException e) {
            System.out.println("通信に失敗した、リトライ開始");
            for (int i = 0; i < 10; i++) {
                try {
                    result = joinPoint.proceed();
                    return result;
                }
                catch (RuntimeException e1) {
                    System.out.println(String.format("リトライに失敗(%d)回目",i+1));
                }
            }
        }
        return result;
    }
実際の業務ではもっと複雑な例外処理が必要ですし、Spring AOP(設定ファイルベースでのAOP適用をサポート)の利用によって適用対象自体の外出しなど実務では使いたい技術は今回では紹介できませんでしたが
命名規則などを固めてある前提ですが、このパターンを適用すればソースコードを汚さずに、確実な例外処理を簡単に実装できることが伝われば幸いです。

竹澤です。

日本時間の本日の早朝、Salesforce.comよりVMforceという新しいサービスが発表されましたね。今秋からDeveloper Previewが提供されるらしいのですが、公式サイトには早速 [Get Developer Preview] というボタンが置かれています。なんと気の早い。。。でも同じく気の早い私は早速クリックしました。

さて、昨年くらいからForce.comのSecondary Language Supportの噂はあり、また今月に入ってVMforceの名前を聞いた瞬間から ?> SpringSource ?> Java と連想し、心の準備はできていました。

で、本日の発表だったのですが、我々デベロッパーから見た観点でいうと

  • Java (=SpringSourceの各種フレームワーク) を使ってWebアプリが構築できる
  • アプリのデータストアとしてForce.comのオブジェクト(いわゆるRDBMSのテーブル)が使える

というのが骨子のようです。

一見、Force.comのログインなどの認証機能、サイト検索機能、レポート・ダッシュボード機能がJava系のアーキテクチャで作った画面上のコンポーネントとして表示できる、ように錯覚しましたが、(いまのところの理解でいうと)そうではなくて、どちらかというと従来あったForce.com SitesのJava版といった理解を私はしています。

つまり、こんな感じ。

  画面開発言語 ロジック開発言語 データストア
Force.com Sites Visualforce Apex Force.com オブジェクト
VMforce JavaServer Facesなど Java Force.com オブジェクト


VisualforceはJSFライクな言語仕様で、ApexもJavaをベースにしているので、一見大きな違いはないように思いますが、Force.comではアプリケーションを開発するためのフレームワークみたいなものがまだ成熟していないので、Springと連携できる(Strutsを含む)各種Javaのフレームワークを利用できそうな点は、複雑な画面フローを伴うアプリの開発生産性向上には寄与するかもしれません。

また、Visualforceは日本の携帯向けの画面開発は若干難しい部分があったので、VMforceによってそのあたりが解消されることは期待できますね。

あとは、SpringベースではないJavaのミドルウェアを動かす方法があるのか、とかそのあたりは良く分かりません。当社はデータ連携のミドルウェアがあるので、このあたりをVMforceに載せることができたら面白いのにと思います。
また、Amazon VPCのようにVMforce上のJavaアプリと社内LANがVPNみたいなものを通じて通信できる、ということが実現できると、データ連携などで面白いことができるかもというアイディアもありますね。

いずれにしてもしばらく目が離せない話題になりそうです。

DataSpiderのスクリプトの作り方が悪いとOutOfMemoryが発生することがある。
"大容量データ処理を行う"ようにすれば殆どの問題が解決出来るが、
どこでメモリを消費しているかを把握するために、Java SEに標準で付属している
『プロファイラ hprof』を使用した時のメモです。

竹澤です。
先週の木曜日に MIJS の技術部会で「Force.comによるアプリケーション開発の生産性が高い理由」と題して60分の講演をさせていただきました。
IDCのレポートなどでもForce.com開発はJavaや.NET開発に比べて5倍の生産性、などという調査結果が出ていますね。。。私が当日行ったデモは掲示板アプリを作成する、というものだったのですが
 ・入力画面と参照画面
 ・掲示板の検索機能
 ・管理者向けの投稿数レポーティング機能
の3つの機能をもったアプリが、テーブル(カスタムオブジェクト)作成から3分強で出来上がり、全世界の従業員で共有できる、というものでした。

ところで今回は技術部会ということで日本を代表するパッケージベンダーのエンジニアの方の前での講演。後半20分の質疑応答では、たくさんの質問をいただいたのですが、やはり皆さんが比較対象にされているのはGoogle AppEngineみたいですね。
個人的にはForce.comはテクニカルな部分はあまり意識せず、業務がどうあるべきか、という点にフォーカスしてアプリを作成できるので、AppEngineに比べて楽だなーと感じています。

特にAppEngineだと「分散システム」的なところを強く意識して設計しないといけないですよね。
その点Force.comの場合はupdateされたレコードは誰が読み出しても同じ内容ですし、sum()、min()、max()などの集計関数も今春(2/14)のバージョンアップから使えるようになりますし。。。

下は当社マーケ担当 兼 カメラ好きの田中が撮影してくれた会場の様子です。


blog_0204.jpg

ランチ日記 胡椒饅頭

| コメント(0) | トラックバック(0)

河本です。 ランチマップ2回目

今回は胡椒饅頭の紹介です。
先日放送された「アドマチック天国」で紹介された中華料理屋さんです。
この店の特徴は店の名前にもあるように、"こしょう"がメインの創作中華です。
「胡椒饅頭」が有名らしいですが、夜のメニューだそうです。麺には胡椒が練りこんでいます。

同じチームの吉田といってきました。

薬丸印のデザートは仕込が出来てないとの事で食べれませんでしたが、ラーメンを食べてきました。

この辺です。

200912011206000
結構込んでます。

200912011221000
吉田が食べた 海鮮塩胡椒ラーメン 960円

200912011228000
河本が食べた 酸辣こしょう麺 890円
すっぱ辛くておいしいです

竹澤です。

ランチマップが欲しい、という話が以前社内であったのですが、誰かが作ったという話が出ていません!
ということで、新たにランチ日記を始めてみました。3日坊主にならないようにがんばります。
(協力たのむよ > チームメンバー)

弊社に来ていただくお客様に、
「ブログに載っていたXXXという店良さそうですね。連れて行ってください。」
といっていただくのを目標にします。

記念すべき第一回は、当社のすぐ隣のビルの1Fにある、「生蕎麦 大新」です。

鴨せいろが私のお気に入り。いつも大盛り(通称:おお鴨せいろ)にします。
鴨肉が入った熱々の麺つゆに蕎麦をつけて食べます。めちゃめちゃうまい!
値段は850円。
欠点は16時くらいになるとお腹がすいてくることです。

うちのチームの河本さんは、カツ煮定食もおススメといっています。

場所は、このへん です。

IMG00018-20091120-1319

竹澤です。

マラソン部の活動を終えて寝る準備ができたのが深夜1:00。Dreamforceでマーク・ベニオフ氏の基調講演が始まるのが2:00!この疲労度合いからして1時間の仮眠で起きられるか心配でしたが・・・

昨年は現地で聞いていたのですが、今年は深夜の日本で何とか起床してパソコンの前に座りました。
それにしても始まるのが遅い・・・。これを書き始めた2:25の時点でまだ始まっていません。

といっているうちにイメージビデオが流れ始めました。いよいよ開演のようです!

2:33 マーク登場!えらいハイテンションですな。
19,000人が参加だそうです。すごい!

3:00すぎまでは昨年と同じような話でした。
来年は3:00に起きればいいかなあ(笑)
それにしても同時表示されるプレゼンのスライドが画質が悪い。小さめの文字とかは読み取れないなあ・・・
ここまでのトピックとしては・・・
世界で67,900社以上の会社が利用しているとのことで、日本企業では日本郵政とCanonの名前もありました。
あとはSalesforce社の1%ルールの話。いつも思うんですが、これは非常にいいコンセプトですよね?あと、サンフランシスコ市長も登場してNPO支援の紹介など。

3:05-3:37。
先日発表された5 minutes upgradeの話。
ほか既存のForce.comプラットフォームの機能の話。
そしてDELLを事例にしたService Cloud 2のデモなど。Facebookとの連携とか、Twitterで@ask_dellに質問した内容がSalesforce上に表示されてSalesforce上から返信できるものなど。

3:38-4:04
Sales Cloud 2のここ1年の新機能の紹介。
かのGeorge Hu氏の登場。今年は"Who?"のジョークはなかったですね。
コンシューマー向けのWebテクノロジをエンタープライズに持ち込んだ、という趣旨の話で、Genius、Content Library、新しいレポート/ダッシュボードの機能、Salesforce?to-Salesforceなどが紹介されました。
デモはGeniusを使った類似商談の検索や、Contentを使ったプレゼンテーションスライドのDrag&Drop編集、新しいスケジュラー機能など。スケジュールをSalesforceの機能を使って相手と調整するデモは初見だったのでちょっと興味深かったですね。
それにしてもSalesforceの機能UPの速度はすさまじいですね。
コンサルタントであるわれわれも相当努力しないとついていけなくなりそうです。

今年の目玉の発表まだかなあ、ちょっと眠くなってきました。

4:05-4:14
再びHu氏が登場し、新しい画面デザイン(スタイル)を少し紹介。
Facebookっぽいと話していましたが良く分かりませんでした。関連リストの並び順をユーザーがDrag&Dropで変えられる、というのもありましたが。色合いは今の www.salesforce.com のページと似たような感じです。

4:15-5:05
ベニオフ氏再登場で、いよいよ4つめのCloudの話か?
Biggest Breakthroughだそうです。そして・・・

"Salesforce Chattrer" - Collaboration Cloud
image
オープニングの最初のビデオでなんか変な入れ歯がうろうろしているシーンがあったのですが、これだったんですね。

簡単に言うとTwitterのようなユーザーインターフェースをSalesforce内に構築したようなものです。

image
TwitterのようにFriend(=People)とのつぶやきをTimeline(=Feeds)上に表示できるだけでなく、

・商談などのオブジェクトの更新をFeeds上に表示する
・HashTag(#)でグループ化ができ、Feeds上はリンクで表示される。クリックすると同じHashTagを持つ発言を一覧表示できる。
・Salesforceのセキュリティモデルに従っている。
・FacebookやTwitterのコンテンツを同じFeedsに表示できる。
・発言にドキュメントなどを添付できる。
・作成したアプリからPeopleのプロファイルにアクセスしたり、Feedsに書き込みできる。

といった機能があるようです。
(誤りがあったらごめんなさい。)

あ、時間付で紹介したのはあとからビデオを見る人の参考に、という意図です。
今は5:00過ぎ、Twitterの人が登場しましたが、とりあえず明日の仕事に差し支えるのでそろそろ寝ます!

と思ったらベニオフ氏が「もう1つのサプライズ」といって・・・

image

Saasy(サーシー)の仲間のChatty(チャッティー)(だったかな?)を紹介して、おしまい。

眠い。。。おやすみなさい。

吉田です。

NTT SOFT Solution Fair 2009」での野村総合研究所 城田氏のセミナー『クラウドの本質とそのインパクト』を聞いてきたので、セミナーの内容を簡単にまとめてみました。

吉田です。
クラウドとともに注目されている「仮想化」についてのセミナーがありました。
クラウド化を検討しているISV向けのものですが、クラウド(というトレンド)好きな私は喜んで参加してきました。

以前SコントロールでSalesforce組織内のオブジェクト情報を 調査するツールを作成し社内で公開していたのですが、 最近読み込むjavascriptライブラリのバージョンを16.0から17.0に変更したら動かなくなったとの報告が。

調べてみたところ、どうやらsforce.connection.describeGlobal()の結果がいままでのバージョンと変わっている様子。

いままでは

(function() {
  var result = sforce.connection.describeGlobal();
  var types = result.types; //各オブジェクトAPI参照名の配列
  for (var i = 0; i < types.length; i++) {
    var sobjectName = types[i];
    console.log(sobjectName);
  }
})();

で各オブジェクトのAPI参照名のみしか取得できませんでしたが、

Version17.0では

(function() {
  var result = sforce.connection.describeGlobal();
  var sobjects = result.sobjects; //各オブジェクト情報の配列
  for (var i = 0; i < sobjects.length; i++) {
    var sobjectInfo = sobjects[i];
    console.log(sobjectInfo);
  }
})();

でより詳しい情報が取得できるようになりました。
ここでsobjectInfoから取得できるプロパティは、

activateable
createable
custom
customSetting
deletable
deprecatedAndHidden
keyPrefix
label
labelPlural
layoutable
mergeable
name
queryable
replicateable
retrieveable
searchable
triggerable
undeletable
updateable

でした。

このバージョンアップにより、オブジェクト一覧を表示したい時に API参照名ではなくラベルを表示できるようになりました。

connection.describeSObjectsをしなくても権限やラベルを取得できるようになったのはありがたいですね。