ソーシャル機能を取り入れた
エンタープライズアプリケーション
チームスピリットのご紹介




                倉谷 彰
          デジタルコースト株式会社
              研究開発グループ
                 エンジニア
デジタルコーストとは

         を組み込んだ、
ソーシャル・ワークフォースマネジメント・サービス

                                       を開発・提供している会社です。




1            Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
とは
                                                                                            デモを
ビジネスで起こる全ての活動をタイムラインで記録                                                                     ご覧ください
                                                                                     勤怠管理
行動を記録




                                                タイムライン
                                                                                             プロジェクト
                                                                                              工数管理




                                                                                     経費精算
     Project A   移動 Project B


            実労働時間



 2                              Copyright © DigitalCoast Inc. All Rights Reserved.            2012/7/30
少し技術的なお話
ソーシャル・エンタープライズを実現する業務アプリの作り方
チームスピリットのアーキテクチャ



      勤怠管理                                                             認証


    プロジェクト工数管理                                                        Chatter


                                                                      権限管理
      経費精算

                                                                承認プロセス


                                                       レポート/ダッシュボード


    業務に関連する機能                                                汎用的な機能


4                Copyright © DigitalCoast Inc. All Rights Reserved.             2012/7/30
例えば、Chatter




              Chatter投稿




5             Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
コードはどうなっているか?
モバイル                                                              Force.com
       { “time” : ”2012/07/27”,
         “feed” : “今日は○○社の・・・”,                                   public with sharing class TxsActivityLogic {
         “latitude” : 35.684337,                                    public static void insertActivity(
         “longitude” : 139.739649                                       Map<String,Object> r, RestRequest req) {
         “placeId” : “WGS84”,                                           Map<String, String> p = req.params;
         “placeName” : “デジタルコースト・・・” }
                                                                        String s = p.get('time');
                                                Force.com
                                                                        DateTime tim = TxsUtil.now();
                                                                        if(s != null)
               REST                                                         tim = DateTime.valueOf(s);
              リソース
                                                                        TxsLog__c log = new TxsLog__c(TargetTime__c=tim);
                    クラス                                                 log.Status__c = null;
                  TxsActivity                                           ・・・(位置情報や画像をレコードにセットする)

                                               行動ログ                     String feed = p.get('feed');
                                                                        if(feed != null) {
                                               TxsLog
                                                                            FeedItem post = new FeedItem();
                             クラス                                            post.ParentId = UserInfo.getUserId();
                           TxsActivity                                      post.Body = feed;                        Chatter投稿
                             Logic                                          post.Type = 'TextPost';
                                                                            insert post;

                                                                            log.FeedId__c = post.Id;
                                                                        }

                                                                        insert log;            行動ログレコード追加
                                                                        r.put('id', log.Id);
                                                                     }
                                                                     ・・・


  6                                      Copyright © DigitalCoast Inc. All Rights Reserved.                         2012/7/30
例えば、承認プロセス

                                 承認プロセスの設定




            承認申請




7       Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
コードはどうなっているか?


    Force.com側
     // id : 承認申請対象とするオブジェクトのID
     // comment : 承認申請時のコメント
     // approver : 承認プロセスのID
     ・・・
     Approval.ProcessSubmitRequest req1 = new             Approval.ProcessSubmitRequest();

     req1.setObjectId(id);
     req1.setComments(comment);

     if(approver != null) {
         req1.setNextApproverIds(new Id[]{ approver });
     }

     Approval.ProcessResult result = Approval.process(req1);
     ・・・




8                                 Copyright © DigitalCoast Inc. All Rights Reserved.         2012/7/30
モバイル・アプリケーション
モバイル側                                                          クラウドサービス側




        Salesforce Toolkit
        for Appcelarator                                         OAuth2.0




                                       JSON
                             { “time” : ”2012/07/27”,
                               “feed” : “今日は○○社の・・・”,
                                                                Apex REST
                               “latitude” : 35.684337,
                               “longitude” : 139.739649
                               “placeId” : “WGS84”,
                               “placeName” : “デジタルコースト・・・” }




 9                           Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
OAuth2.0

     Force.com側




10                Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
Apex REST:コードはどうなっているか?
                   RestResourceアノテーションを利用することで簡単に
                    RESTリソースを公開できます
モバイル側                                                                        Force.com側
postBtn.addEventListener(‘click’, function() {                              @RestResource(urlMapping='/txsapi2/activity/*')
  ・・・                                                                       global with sharing class TxsActivity {
  var oauthJson = JSON.parse(oauthData);                                       @HttpPost
                                                                               global static void doPost(RestRequest req, RestResponse res) {
     var uri = '/services/apexrest/txsapi2/activity/?';                           Map<String,Object> r = new Map<String,Object>();
     uri += 'time=' + TSX.timeAsString();                                         try {
     uri += '&feed=' + (commentText.value ? commentText.value : '');                 String id = TxsUtil.getParamId(req);
     var restUrl = encodeURI(                                                        if(id != null)
        Ti.Network.decodeURIComponent(oauthJson.instance_url) +
                                                                                            TxsActivityLogic.updateActivity(r, req, id);
        uri);
                                                                                     else
                                                                                            TxsActivityLogic.insertActivity(r, req);
     var xhr = Ti.Network.createHTTPClient();
     xhr.onload = function() {
                                                                                     r.put('success', true);
        var res = JSON.parse(this.responseText);                                  }
        // Callbackでの処理                                                           catch(Exception e) { TxsUtil.setException(r, e); }
        ・・・                                                                       res.responseBody = Blob.valueof(JSON.serialize(r));
     };                                                                        }

     xhr.open(“GET”, restUrl, true);                                         @HttpGet
     xhr.setRequestHeader(                                                   global static void doGet(RestRequest req, RestResponse res) {
         “Authorization”, “OAuth ” +                                            Map<String,Object> r = new Map<String,Object>();
         Ti.Network.decodeURIComponent(oauthJson.access_token));            ・・・
     xhr.setRequestHeader("Content-Type", "application/json");
     xhr.send();
     ・・・
};


           11                                          Copyright © DigitalCoast Inc. All Rights Reserved.                      2012/7/30
モバイルとForce.comアプリの役割分担
モバイル側                                   クラウドサービス側

                                         OAuth2.0
              画面制御


                                                                                                      外部
          Salesforce Toolkit            RESTリソース                  ロジック                                Web
           for Appcelarator                TxsActivity
                                                                                                      サービス


                                        RESTリソース                  ロジック              駅探経路探索エンジン
                                          TxsExpense2




                                        RESTリソース                  ロジック               勤怠計算エンジン
                                        TxsWorkTimeLogic


   サーバ側にロジックを集約
    複雑な勤怠計算や経路探索はサーバ側に任せた

   クライアント側は画面制御に特化
    短期間でプロトタイプを開発し、試作を繰り返
    すことができた




    12                         Copyright © DigitalCoast Inc. All Rights Reserved.                2012/7/30
最後に
ソーシャル化した企業はどのように変わったか?
業務アプリをソーシャル化するということ




      エンジニアのちょっとしたアイデアで
     お客様の業務が大きく変えることができる



14         Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30
15   Copyright © DigitalCoast Inc. All Rights Reserved.   2012/7/30

More Related Content

PDF
オンラインゲームソリューション@トレジャーデータ
PDF
Mahout Canopy Clustering - #TokyoWebmining 9
PDF
Mahout JP - #TokyoWebmining 11th #MahoutJP
PDF
Introduction to Mahout Clustering - #TokyoWebmining #6
PDF
"Mahout Recommendation" - #TokyoWebmining 14th
PDF
ベイジアンネットとレコメンデーション -第5回データマイニング+WEB勉強会@東京
PDF
「R言語による Random Forest 徹底入門 -集団学習による分類・予測-」 - #TokyoR #11
PDF
R言語による アソシエーション分析-組合せ・事象の規則を解明する-(第5回R勉強会@東京)
オンラインゲームソリューション@トレジャーデータ
Mahout Canopy Clustering - #TokyoWebmining 9
Mahout JP - #TokyoWebmining 11th #MahoutJP
Introduction to Mahout Clustering - #TokyoWebmining #6
"Mahout Recommendation" - #TokyoWebmining 14th
ベイジアンネットとレコメンデーション -第5回データマイニング+WEB勉強会@東京
「R言語による Random Forest 徹底入門 -集団学習による分類・予測-」 - #TokyoR #11
R言語による アソシエーション分析-組合せ・事象の規則を解明する-(第5回R勉強会@東京)

What's hot (6)

PPTX
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.1.0対応)
PDF
20140708 オンラインゲームソリューション
PDF
トレジャーデータ新サービス発表 2013/12/9
PDF
データ可視化勉強会
PDF
ソーシャルデザインパターン -評判と情報収集-
PDF
『モバゲーの大規模データマイニング基盤におけるHadoop活用』-Hadoop Conference Japan 2011- #hcj2011
NGSIv1 を知っている開発者向けの NGSIv2 の概要 (Orion 2.1.0対応)
20140708 オンラインゲームソリューション
トレジャーデータ新サービス発表 2013/12/9
データ可視化勉強会
ソーシャルデザインパターン -評判と情報収集-
『モバゲーの大規模データマイニング基盤におけるHadoop活用』-Hadoop Conference Japan 2011- #hcj2011
Ad

Similar to 夏サミ2012 [A-2]ソーシャルプラットフォームを使った業務アプリ開発の現場(ソーシャル機能を取り入れたエンタープライズアプリケーション) (20)

PPTX
データサイエンティストが力を発揮できるアジャイルデータ活用基盤
PDF
Apexデザインパターン
PDF
トレジャーデータ株式会社について(for all Data_Enthusiast!!)
PPTX
Entity Framework 5.0 deep dive
PDF
Twitter連携chrome extension作り方
PDF
Heroku Postgres
PDF
PDF
アプリを成長させるためのログ取りとログ解析に必要なこと
PPT
クラウド時代の並列分散処理技術
PDF
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
PDF
[DI10] IoT を実践する最新のプラクティス ~ Azure IoT Hub 、SDK 、Azure IoT Suite ~
PDF
20170703_05 IoTビジネス共創ラボ
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
PDF
GoAzure 2015:IoTなどの大量データをStream Analyticsでリアルタイムデータ分析してみよう
PDF
Treasure Data Intro for Data Enthusiast!!
PDF
クラウドではじめるリアルタイムデータ分析 #seccamp
PPTX
文字コードの脆弱性はこの3年間でどの程度対策されたか?
PDF
ビッグデータ処理データベースの全体像と使い分け
PDF
初めての Data api cms どうでしょう - 大阪夏の陣
PDF
初めての Data API CMS どうでしょう - 仙台編 -
データサイエンティストが力を発揮できるアジャイルデータ活用基盤
Apexデザインパターン
トレジャーデータ株式会社について(for all Data_Enthusiast!!)
Entity Framework 5.0 deep dive
Twitter連携chrome extension作り方
Heroku Postgres
アプリを成長させるためのログ取りとログ解析に必要なこと
クラウド時代の並列分散処理技術
[Cloud OnAir] 最新アップデート Google Cloud データ関連ソリューション 2020年5月14日 放送
[DI10] IoT を実践する最新のプラクティス ~ Azure IoT Hub 、SDK 、Azure IoT Suite ~
20170703_05 IoTビジネス共創ラボ
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
GoAzure 2015:IoTなどの大量データをStream Analyticsでリアルタイムデータ分析してみよう
Treasure Data Intro for Data Enthusiast!!
クラウドではじめるリアルタイムデータ分析 #seccamp
文字コードの脆弱性はこの3年間でどの程度対策されたか?
ビッグデータ処理データベースの全体像と使い分け
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data API CMS どうでしょう - 仙台編 -
Ad

More from Akira Kuratani (20)

PDF
[Japan Dreamin' 2022] エンジニアが学ぶカスタマーサクセス
PDF
愛される管理画面の作り方
PDF
Japan dreamin' 2020 - AppExchangeプロダクト開発を続けて見えてきたプラクティス
PPTX
Salesforce World Tour Tokyo 2018 愛される AppExchangeアプリを創るべき「3つの理由」
PPTX
Salesforce World Tour Tokyo 2017 (SalesforceDX〜Salesforceにも継続的デリバリーを〜)
PDF
静的解析、はじまったな
PDF
ReactとSeleniumの幸せな関係
PDF
AppExchange Growth Hacks - Aiming for the world -
PDF
Tokyo Salesforce DG Meetup 2017新年会〜Advent Calendarふりかえり〜
PDF
Salesforce dug [tokyo] meetup 2016 新年会
PDF
Salesforce DUG meetup #10 MiniHack完全制覇の旅
PDF
Salesforce DUG TOKYO Meetup #9
PDF
Lightning componentの研究ポイントあるいは…
PDF
Salesforce DUG Meetup 2015 新年会
PDF
Salesforce dugもくもく会 #1
PDF
Salesforce dug meetup #6
PDF
Crowd hackchallenge2014 LT
PDF
Salesforce dug meetup #5
PDF
Salesforce DUG meetup #4 LT
PDF
Force.com lightning talks cfj2012 by A.Kuratani
[Japan Dreamin' 2022] エンジニアが学ぶカスタマーサクセス
愛される管理画面の作り方
Japan dreamin' 2020 - AppExchangeプロダクト開発を続けて見えてきたプラクティス
Salesforce World Tour Tokyo 2018 愛される AppExchangeアプリを創るべき「3つの理由」
Salesforce World Tour Tokyo 2017 (SalesforceDX〜Salesforceにも継続的デリバリーを〜)
静的解析、はじまったな
ReactとSeleniumの幸せな関係
AppExchange Growth Hacks - Aiming for the world -
Tokyo Salesforce DG Meetup 2017新年会〜Advent Calendarふりかえり〜
Salesforce dug [tokyo] meetup 2016 新年会
Salesforce DUG meetup #10 MiniHack完全制覇の旅
Salesforce DUG TOKYO Meetup #9
Lightning componentの研究ポイントあるいは…
Salesforce DUG Meetup 2015 新年会
Salesforce dugもくもく会 #1
Salesforce dug meetup #6
Crowd hackchallenge2014 LT
Salesforce dug meetup #5
Salesforce DUG meetup #4 LT
Force.com lightning talks cfj2012 by A.Kuratani

夏サミ2012 [A-2]ソーシャルプラットフォームを使った業務アプリ開発の現場(ソーシャル機能を取り入れたエンタープライズアプリケーション)

  • 1. ソーシャル機能を取り入れた エンタープライズアプリケーション チームスピリットのご紹介 倉谷 彰 デジタルコースト株式会社 研究開発グループ エンジニア
  • 2. デジタルコーストとは を組み込んだ、 ソーシャル・ワークフォースマネジメント・サービス を開発・提供している会社です。 1 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 3. とは デモを ビジネスで起こる全ての活動をタイムラインで記録 ご覧ください 勤怠管理 行動を記録 タイムライン プロジェクト 工数管理 経費精算 Project A 移動 Project B 実労働時間 2 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 5. チームスピリットのアーキテクチャ 勤怠管理 認証 プロジェクト工数管理 Chatter 権限管理 経費精算 承認プロセス レポート/ダッシュボード 業務に関連する機能 汎用的な機能 4 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 6. 例えば、Chatter Chatter投稿 5 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 7. コードはどうなっているか? モバイル Force.com { “time” : ”2012/07/27”, “feed” : “今日は○○社の・・・”, public with sharing class TxsActivityLogic { “latitude” : 35.684337, public static void insertActivity( “longitude” : 139.739649 Map<String,Object> r, RestRequest req) { “placeId” : “WGS84”, Map<String, String> p = req.params; “placeName” : “デジタルコースト・・・” } String s = p.get('time'); Force.com DateTime tim = TxsUtil.now(); if(s != null) REST tim = DateTime.valueOf(s); リソース TxsLog__c log = new TxsLog__c(TargetTime__c=tim); クラス log.Status__c = null; TxsActivity ・・・(位置情報や画像をレコードにセットする) 行動ログ String feed = p.get('feed'); if(feed != null) { TxsLog FeedItem post = new FeedItem(); クラス post.ParentId = UserInfo.getUserId(); TxsActivity post.Body = feed; Chatter投稿 Logic post.Type = 'TextPost'; insert post; log.FeedId__c = post.Id; } insert log; 行動ログレコード追加 r.put('id', log.Id); } ・・・ 6 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 8. 例えば、承認プロセス 承認プロセスの設定 承認申請 7 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 9. コードはどうなっているか? Force.com側 // id : 承認申請対象とするオブジェクトのID // comment : 承認申請時のコメント // approver : 承認プロセスのID ・・・ Approval.ProcessSubmitRequest req1 = new Approval.ProcessSubmitRequest(); req1.setObjectId(id); req1.setComments(comment); if(approver != null) { req1.setNextApproverIds(new Id[]{ approver }); } Approval.ProcessResult result = Approval.process(req1); ・・・ 8 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 10. モバイル・アプリケーション モバイル側 クラウドサービス側 Salesforce Toolkit for Appcelarator OAuth2.0 JSON { “time” : ”2012/07/27”, “feed” : “今日は○○社の・・・”, Apex REST “latitude” : 35.684337, “longitude” : 139.739649 “placeId” : “WGS84”, “placeName” : “デジタルコースト・・・” } 9 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 11. OAuth2.0 Force.com側 10 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 12. Apex REST:コードはどうなっているか?  RestResourceアノテーションを利用することで簡単に RESTリソースを公開できます モバイル側 Force.com側 postBtn.addEventListener(‘click’, function() { @RestResource(urlMapping='/txsapi2/activity/*') ・・・ global with sharing class TxsActivity { var oauthJson = JSON.parse(oauthData); @HttpPost global static void doPost(RestRequest req, RestResponse res) { var uri = '/services/apexrest/txsapi2/activity/?'; Map<String,Object> r = new Map<String,Object>(); uri += 'time=' + TSX.timeAsString(); try { uri += '&feed=' + (commentText.value ? commentText.value : ''); String id = TxsUtil.getParamId(req); var restUrl = encodeURI( if(id != null) Ti.Network.decodeURIComponent(oauthJson.instance_url) + TxsActivityLogic.updateActivity(r, req, id); uri); else TxsActivityLogic.insertActivity(r, req); var xhr = Ti.Network.createHTTPClient(); xhr.onload = function() { r.put('success', true); var res = JSON.parse(this.responseText); } // Callbackでの処理 catch(Exception e) { TxsUtil.setException(r, e); } ・・・ res.responseBody = Blob.valueof(JSON.serialize(r)); }; } xhr.open(“GET”, restUrl, true); @HttpGet xhr.setRequestHeader( global static void doGet(RestRequest req, RestResponse res) { “Authorization”, “OAuth ” + Map<String,Object> r = new Map<String,Object>(); Ti.Network.decodeURIComponent(oauthJson.access_token)); ・・・ xhr.setRequestHeader("Content-Type", "application/json"); xhr.send(); ・・・ }; 11 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 13. モバイルとForce.comアプリの役割分担 モバイル側 クラウドサービス側 OAuth2.0 画面制御 外部 Salesforce Toolkit RESTリソース ロジック Web for Appcelarator TxsActivity サービス RESTリソース ロジック 駅探経路探索エンジン TxsExpense2 RESTリソース ロジック 勤怠計算エンジン TxsWorkTimeLogic  サーバ側にロジックを集約 複雑な勤怠計算や経路探索はサーバ側に任せた  クライアント側は画面制御に特化 短期間でプロトタイプを開発し、試作を繰り返 すことができた 12 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 15. 業務アプリをソーシャル化するということ エンジニアのちょっとしたアイデアで お客様の業務が大きく変えることができる 14 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30
  • 16. 15 Copyright © DigitalCoast Inc. All Rights Reserved. 2012/7/30