• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
勉強会force#4 Chatter Integration
 

勉強会force#4 Chatter Integration

on

  • 1,068 views

 

Statistics

Views

Total Views
1,068
Views on SlideShare
1,068
Embed Views
0

Actions

Likes
1
Downloads
15
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    勉強会force#4 Chatter Integration 勉強会force#4 Chatter Integration Presentation Transcript

    • 勉強会force #4Chatter Integration ISV Architect 中嶋 一樹
    • Chatterによって変わることbefore after
    • A社からオーダーが入っています。B社に訪問してきました。田中CIOが部長の知り合いだそうです。 田中CIO 今日、C社にテレアポしました。1Mを超える案件に膨らむ可能性があります。 Force 追加情報。Forceの引き合いもあるそうです。 D社の案件、受注しました。600kです。 受注 Summer’12がリリースされました。 Partner Summitの締め切りが間近です。 HerokuにPHPサポートが追加されました。 Heroku php fogとの違いは何ですか? 100万人の集客 今年のCloudforceは100万人の集約を見込んでいます。 Service Cloudに新機能が追加されました。 Chatter Messenger機能が有効化されていますね。 Radian6の新しい資料をアップしました。 新しい資料 Homepageをリニューアルしました。 Curation
    • What is Curation?キュレーションとは、無数の情報の海の中から、自分の価値観や世界観に基づいて情報を拾い上げ、そこに新たな意味を与え、そして多くの人と共有すること。 ∼佐々木俊尚 氏の「キュレーションの時代」より引用∼
    • demo
    • Architecture キーフレーズを抽出 ③ ② ④Chatterフィードを取得 ダッシュボード生成 アクセス ①
    • Source Code// メンバーとなっているグループ一覧を取得public function get_my_chatter_groups(){ $url = $this->instance_url . "/services/data/" . $this->api_version . "/chatter/users/me/groups"; $this->logger->logger("URL : " . $url, __CLASS__, __FUNCTION__); $response = $this->callout_for_get($this->access_token, $url); if ($this->logger->error){ $this->logger->set_error("Failed to get my chatter groups.", __CLASS__, __FUNCTION__); return(false); } return($response[groups]);}// News Feedからフィード情報を取得public function get_all_feeds(){ $url = $this->instance_url . "/services/data/" . $this->api_version . "/chatter/feeds/news/me/feed-items"; $this->logger->logger("URL : " . $url, __CLASS__, __FUNCTION__); $response = $this->callout_for_get($this->access_token, $url); if ($this->logger->error){ $this->logger->set_error("Failed to get all feeds by group.", __CLASS__, __FUNCTION__); return(false); } return($response[items]);}
    • Source Code// Yahoo APIにフィード情報を送信し、キーフレーズを抽出public function get_keywords($sentence, $min_score){ $api_key = urlencode($this->api_key); $sentence = $this->strip_mention($sentence); $sentence = urlencode($sentence); $url = "http://jlp.yahooapis.jp/KeyphraseService/V1/extract?output=json&appid=" . $api_key; $response = $this->callout_for_post($url, $sentence); $offset = 0; $keywords = array(); foreach($response as $k => $v){ if ($v < $min_score){ continue; } $keywords[$offset][value] = $k; $keywords[$offset][score] = $v; $offset++; } return($keywords);}
    • 海外とのコミュニケーションbefore after
    • demo
    • Architecture 翻訳依頼 (非同期) 翻訳取得 (同期) ③ ② ④ Chatterに翻訳を書き込みChatterに書き込み ①
    • Source Code// Chatterフィードに「=>言語記号」をともなう書き込みがあれば翻訳のためのメソッド(chatter_translate.request_translate)を実行trigger feedItem_to_translate on FeedItem (after insert) { for (feedItem fi : Trigger.new) { string output_lang = ; if (fi.body.contains(=>en)){ output_lang += en,; } if (fi.body.contains(=>ja)){ output_lang += ja,; } if (fi.body.contains(=>es)){ output_lang += es,; } if (fi.body.contains(=>fr)){ output_lang += fr,; } if (fi.body.contains(=>it)){ output_lang += it,; } if (fi.body.contains(=>zh-CN)){ output_lang += zh-CN,; } if (output_lang != ){ string instanceUrl = URL.getSalesforceBaseUrl().toExternalForm(); string sid = UserInfo.getSessionId(); string fi_json = System.JSON.serialize(fi); chatter_translate.request_translate(sid, instanceUrl, feedItem, append, fi_json, output_lang); } }}
    • Source Code// 非同期で中間サーバへ翻訳リクエストを送信public with sharing class chatter_translate { @future(callout=true) public static void request_translate(string sid, string instanceUrl, string object_type, stringtranslation_mode, string object_json, string output_lang){ Http http_protocol = new Http(); HttpRequest http_request = new HttpRequest(); // Set the endpoint URL. instanceUrl = EncodingUtil.urlEncode(instanceUrl, UTF-8); sid = EncodingUtil.urlEncode(sid, UTF-8); output_lang = EncodingUtil.urlEncode(output_lang, UTF-8); String endpoint = https://chatter-translate.herokuapp.com/chatter/api.php?service=translate&sid=+ sid + &instanceUrl= + instanceUrl + &object_type= + object_type + &translation_mode= +translation_mode + &output_lang= + output_lang; http_request.setEndPoint(endpoint); // Set the HTTP verb to GET. http_request.setMethod(POST); // Set body http_request.setBody(object_json); // set callout timeout to 60sec(max) http_request.setTimeout(60000); // Send the HTTP request and get the response. // The response is in JSON format. if (!Test.isRunningTest()){ http_protocol.send(http_request); } }}
    • Source Code // Google Translate APIにテキストを送信して翻訳 public function translate($input_lang, $output_lang, $text){ if (is_array($text)){ $q = ; foreach ($text as $k => $v){ $q = $q . &q= . urlencode($v); } } else { $q = &q= . urlencode($text); } if ($input_lang){ $url = "https://www.googleapis.com/language/translate/v2?format=text&key=" . $this->api_key . $q . "&source=" .$input_lang . "&target=" . $output_lang; } else { $url = "https://www.googleapis.com/language/translate/v2?format=text&key=" . $this->api_key . $q . "&target=" .$output_lang; } $response = $this->callout($url); $array_translation = array(); foreach ($response[data][translations] as $k => $v){ array_push($array_translation, $v[translatedText]); } return($array_translation); }
    • Chatterで く。世界中から答えを得る。 質問:XXXXXXXX 回答1 質問:XXXXXXXX 回答2 回答1 回答2 回答3 回答4 回答5 回答6 before after
    • demo
    • Architecture 翻訳取得 (同期) 質問送信 (非同期) ③ ② ④ ⑤ Chatterに類似質問を 書き込み 類似質問取得 (同期)Chatterに質問 ①
    • Source Code// Chatterフィードに「=>stackoverflow」をともなう書き込みがあれば、類似QA取得のためのメソッド(chatter_stackoverflow.request_similarを実行)trigger feedItem_to_stackoverflow on FeedItem (after insert) { for (feedItem fi : Trigger.new) { if (fi.body.contains(=>stackoverflow)){ string instanceUrl = URL.getSalesforceBaseUrl().toExternalForm(); string sid = UserInfo.getSessionId(); string fi_json = System.JSON.serialize(fi); chatter_stackoverflow.request_similar(sid, instanceUrl, fi_json); } }}
    • Source Code// 非同期で中間サーバへ類似QA取得リクエストを送信public with sharing class chatter_stackoverflow { @future(callout=true) public static void request_similar(string sid, string instanceUrl, string object_json){ Http http_protocol = new Http(); HttpRequest http_request = new HttpRequest(); // Set the endpoint URL. instanceUrl = EncodingUtil.urlEncode(instanceUrl, UTF-8); sid = EncodingUtil.urlEncode(sid, UTF-8); String endpoint = https://chatter-translate.herokuapp.com/chatter/api.php?service=stackoverflow&sid=+ sid + &instanceUrl= + instanceUrl; http_request.setEndPoint(endpoint); // Set the HTTP verb to GET. http_request.setMethod(POST); // Set body http_request.setBody(object_json); // set callout timeout to 60sec(max) http_request.setTimeout(60000); // Send the HTTP request and get the response. // The response is in JSON format. if (!Test.isRunningTest()){ http_protocol.send(http_request); } }}
    • Source Code // StackExchange APIに英語翻訳された質問文を送信して類似QAを取得 public function request_similar($title){ $title = urlencode($title); $filter = urlencode(!BF)_06.x0cLAwTSeXymC1qQAk-hwP.); $url = "http://api.stackexchange.com/2.0/similar?order=desc&sort=relevance&title=" . $title ."&site=stackoverflow&filter=" . $filter; $response = $this->callout($url); return($response[items]); }
    • Chatter連携のパターン Feed型 Curation型 fb Q & A 応答型 変換型
    • Object Model FeedItem FeedComment FeedTrackedChange FeedLikeNewsFeed UserProfileFeed CollaborationGroupFeed RecordFeed
    • Chatter REST API vs. Apex例えばCollaborationGroupFeedまたはRecordFeedに投稿する場合: Chatter REST API: POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feeds/record/グルー プIDまたはレコードID/feed-items { "body" : { "messageSegments" : [ { "type": "Text", "text" : "テスト書き込み” } ] } } Apex: feedItem fi = new feedItem(body=テスト書き込み, parentId=グループIDまたはレコードID); insert fi;
    • Chatter REST API vs. Apex例えばUserProfileFeedに投稿する場合: Chatter REST API: POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feeds/user- profile/ユーザーID/feed-items { "body" : { "messageSegments" : [ { "type": "Text", "text" : "テスト書き込み” } ] } } Apex: feedItem fi = new feedItem(body=テスト書き込み, parentId=ユーザーID); insert fi;
    • Chatter REST API vs. Apex例えばFeedCommentに投稿する場合: Chatter REST API: POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feed-items/親Feed のID/comments { "body" : { "messageSegments" : [ { "type": "Text", "text" : "テスト書き込み” } ] } } Apex: feedComment fc = new feedComment(commentBody=テスト書き込み, parentId=親FeedのID); insert fc;
    • Chatter REST API vs. Apex例えばNewsFeedを取得する場合: Chatter REST API: POST https://インスタンス.salesforce.com/services/data/v25.0/chatter/feeds/news/me/feed-items Apex: List<NewsFeed> newsFeedList = [select id, parentId, body from newsfeed];
    • Follow. @nkjmhttp://nkjmkzk.net