10月 20th, 2011 | ymasuhara | No Comments Yet

http://wiki.developerforce.com/index.php/Chatter_Code_Recipes
上記掲載のChatterCodeRecipesを実際に検証しましたので、翻訳と注釈を記載しました。

Recipe 1: Update A User’s Status
ログイン中のユーザが投稿する機能

Visualforce Page

<apex:inputText value="{!status}" id="status" maxlength="100" />
<apex:commandLink style="button" value="Update User Status" action="{!doUserStatus}" />

Custom Controller

public string status     { get; set; }

public PageReference doUserStatus()   {
       User user = [select id, CurrentStatus from User where id = :UserInfo.getUserId()];
       user.CurrentStatus = status;
       update user;
       return null;
}
Recipe 2: Display a User’s Profile Image
ログイン中のユーザのプロフィール画像を表示

Visualforce Page

<apex:image id="profileImage" url="{!profileImageUrl}" />

Custom Controller

public string profileImageUrl    { get; set; }

profileImageUrl = [select FullPhotoUrl from User where Id = '1234'];

※実際の戻り値は「https://XXXXX.force.com/profilephoto/729U00000004Oz6/F」

Recipe 3: List a User’s Followers
ユーザのフォロワー一覧

Visualforce tags

<chatter:followers entityId="User Id or record Id"/>
<chatter:feedWithFollowers entityId="User Id or record Id"/>

SOQL query

List<EntitySubscription> followers =
     [select id, subscriberid, subscriber.name
      from EntitySubscription
      where parentid =:uid]; // the id of the user/record for which you want to list followers

Integer noOfFollowers = followers.size();

※<chatter:followers entityId=”User Id or record Id”/>と<chatter:feedWithFollowers entityId=”User Id or record Id”/>は同一画面には使用できない。
指定時は下記のようなイメージのみ表示

・<chatter:feedWithFollowers entityId=”User Id or record Id”/>を指定した場合は、ホームタブのChatter部品が表示される
※サンプルのSOQLはフォロワーの人数を算出している。

Recipe 4: List who a User is Following
ユーザのフォロー一覧

SOQL query

// Everyone you're following
EntitySubscription[] followingES = [select id, parentid, subscriberid, parent.name
                                    from EntitySubscription
                                    where subscriberid =:uid];//Set to the User's Id

List<EntitySubscription> following = new List<EntitySubscription> ();
String userSObjectPrefix =  User.sObjectType.getDescribe().getKeyPrefix();
for( EntitySubscription es: followingES )
{
      if( ('' + es.parentid).substring(0,3) ==
                        userSObjectPrefix) // users only
      {
             following.add(es);
      }
}
Integer followingUserCount = following.size();

※上記処理では、ユーザがフォローしているデータを取得後、Userデータのみを抽出している。
抽出方法としてはIDの頭文字3桁で判断する。(実行環境では”005″となっていた)
※フォロワー一覧のように標準部品は用意されていない。

Recipe 5: Follow a User or record
ユーザ・データをフォローする
Visualforce tag

<chatter:follow entityId="User or Record Id that you want to follow"/>

Apex code

EntitySubscription follow = new EntitySubscription (
                                 parentId = '<User Record Id you want to follow'
                                 subscriberid = :UserInfo.getUserId); //your User Id
insert follow;

※Visualforce tagでは指定したユーザ/データの状況により、下記どちらかの部品が表示される。

※Apex Codeでは指定したユーザ/データをフォローする旨だが、上記コードではエラーとなる。
正しくは下記。

EntitySubscription follow = new EntitySubscription ();
follow.parentId = 'User Record Id you want to follow';
follow.subscriberid = UserInfo.getUserId(); //your User Id
insert follow;
Recipe 6: Add a FeedItem
フィードの投稿
Apex code

//Adding a Text post
FeedItem post = new FeedItem();
post.ParentId = oId; //eg. Opportunity id, custom object id..
post.Body = 'Enter post text here';
insert post;

//Adding a Link post
FeedItem post = new FeedItem();
post.ParentId = oId; //eg. Opportunity id, custom object id..
post.Body = 'Enter post text here';
post.LinkUrl = 'http://www.someurl.com';
insert post;

//Adding a Content post
FeedItem post = new FeedItem();
post.ParentId = oId; //eg. Opportunity id, custom object id..
post.Body = 'Enter post text here';
post.ContentData = base64EncodedFileData;
post.ContentFileName = 'sample.pdf';
insert post;

※FeedItemクラスについては、APIバージョン21.0以降で使用可能。

Recipe 7: Add a Comment to a FeedItem
フィードに対してコメントを追加する
Apex code

FeedComment fcomment = new FeedComment();
fcomment.FeedItemId = fId; //Id of the FeedItem on which you want to comment
fcomment.CommentBody = 'Enter your comment here';
insert fcomment;
Recipe 8: Display my News Feed
自分のNewsFeedを取得
Apex code

List<NewsFeed> myfeed = [SELECT Id, Type,
                         CreatedById, CreatedBy.FirstName, CreatedBy.LastName,
                         ParentId, Parent.Name,
                         Body, Title, LinkUrl, ContentData, ContentFileName,
                             (SELECT Id, FieldName, OldValue, NewValue
                              FROM FeedTrackedChanges ORDER BY Id DESC),
                             (SELECT Id, CommentBody, CreatedDate,
                              CreatedBy.FirstName, CreatedBy.LastName
                              FROM FeedComments ORDER BY CreatedDate LIMIT 10),
                             (SELECT CreatedBy.FirstName, CreatedBy.LastName
                              FROM FeedLikes)
                         FROM NewsFeed
                         ORDER BY CreatedDate DESC, Id DESC
                         LIMIT 20];
Recipe 9: Display a record’s entity feed
取引先のfeedを取得
Apex code

List<AccountFeed> myfeed = [SELECT Id, Type,
                         CreatedById, CreatedBy.FirstName, CreatedBy.LastName,
                         ParentId, Parent.Name,
                         Body, Title, LinkUrl, ContentData, ContentFileName,
                             (SELECT Id, FieldName, OldValue, NewValue
                              FROM FeedTrackedChanges ORDER BY Id DESC),
                             (SELECT Id, CommentBody, CreatedDate,
                              CreatedBy.FirstName, CreatedBy.LastName
                              FROM FeedComments ORDER BY CreatedDate LIMIT 10),
                             (SELECT CreatedBy.FirstName, CreatedBy.LastName
                              FROM FeedLikes)
                         FROM AccountFeed
                         WHERE ParentID = '<Account Id>'
                         ORDER BY CreatedDate DESC, Id DESC
                         LIMIT 20];

※商談のFeedの場合は「OpportunityFeed」、カスタムオブジェクトのFeedは「カスタムオブジェクトAPI名__Feed」となる。

Recipe 10: Who has a particular file been shared with
ファイルが共有されたユーザの取得
Apex code

List<ContentDocumentLink> shares = [SELECT id, LinkedEntityId, ContentDocumentId
                                    FROM ContentDocumentLink
                                    WHERE ContentDocumentId = '<File Id>'];

※File Idについては必ず指定

Recipe 11: Monitor specific keywords on an entity feed
商談がクローズとなった際、Chatterに出力する直前で処理を行う(トリガ処理)

Apex code

trigger CheckChatterPostsOnOpportunity on FeedItem (before insert) {
    //Get the key prefix for the Opportunity object via a describe call.
    String oppKeyPrefix = Opportunity.sObjectType.getDescribe().getKeyPrefix();

    for (FeedItem f: trigger.new)
    {
        String parentId = f.parentId;
        //We compare the start of the 'parentID' field to the Opportunity key prefix to
        //restrict the trigger to act on posts made to the Opportunity object.
        if (parentId.startsWith(oppKeyPrefix) &&
            f.Body == '!close')
        {
            //Add business logic here
        }
    }
}
Recipe 12: Monitor user status updates in Chatter
Chatterで誰かが投稿する直前で、任意処理を実施する(トリガ処理)

Apex code

trigger MonitorUserStatusUpdates on User (before update) {
    for (Integer i = 0; i < trigger.new.size(); i++)
    {
        if (trigger.old[i].CurrentStatus != trigger.new[i].CurrentStatus)
        {
            //User has changed their Chatter status - take necessary action here.
        }
    }
}
Recipe 13: Integrate Chatter with other social networks OR Migrate Chatter data from one Org to another
ChatterデータをほかのSNSデータと統合するため、データを追加

Apex code

//Note that this code can only be executed by a user with the 'Insert System Field Values
//for Chatter Feeds' permission
FeedItem post = new FeedItem();
post.ParentId = oId; //eg. Opportunity id, custom object id..
post.Body = 'Enter post text here';
post.CreatedById = <Salesforce User Id of the original post author>;
post.CreatedDate = <Date and time of original post>;
insert post;

FeedItem f = [select InsertedById from FeedItem where id =:post.Id];
System.assertEquals (f.InsertedById, UserInfo.getUserId());
10月 19th, 2011 | ymasuhara | 1 Comment

Chatter Cheat Sheetを一通り検証し日本語に翻訳をしました。
※翻訳に誤ってる箇所がありましたらコメントにて指摘を頂けると助かります。
「Chatterで使用している標準オブジェクト」と一緒にご覧ください。


Chatter Data Model
Chatterで使用する主なモデルは下記となります。
Chatterオブジェクト相関図

これら上記モデルがChatterデータの大部分を占めています。

  • UserProfileFeedは、ユーザのプロフィール、ユーザのフィード変更情報が格納されています。
  • NewsFeedはユーザのフォローしているユーザのフィード情報および所属しているグループのフィード情報が格納されます。
  • CollaborationGroupFeedは所属しているグループのユーザの情報が格納されます。
  • Record feedsは共有された各オブジェクトの情報が格納されます。

これらを総称してfeed itemsと呼びます。

ですがfeed itemsに全てのChatterデータが格納されるわけではありません。
コメントはFeedComment、フィードの詳細についてはFeedTrackedChangeに格納されます。
またこれらはUserProfile、NewsFeedから必要情報を取得して参照可能となります。


Feed Items

このオブジェクトはNewsFeed、UserProfileFeed、record feedsからできています。
Type項目は、何の情報であるかを意味します。(TextPost, LinkPost,ContentPost, TrackedChangeなど)
TrackedChangeの場合にはFeedTrackedChangeに詳細情報が格納されていいます。
これら以外のTypeの場合にはAccountFeed,CollaborationGroupFeed,NewsFeedのいずれかにデータが格納されています。
またフィードの情報はそれぞれ何によって作成されたかといった情報を持っています。
例えば自分のプロフィールを変更した際に作成されるプロフィール変更のフィードには自分のUserIDがParentIDとしてセットされます。

項目 説明
Type UserStatusのいずれかがセットされる。(TextPost, LinkPost, ContentPost,TrackedChange)
CreatedDate feedの作成日
CreatedById feedを作成したユーザのID
InsertById 基本的には作成したユーザIDだが、API等を経由して作成した場合は異なるIDがセットされる。
ParentId feedに関連するID


Record Feeds

Record Feedsは基本的に殆どのfeed情報が格納されています。
全てのfeed情報にFeedItemIDがあり、このIDを使用してUserProfileFeed、NewsFeedを取得することができます。

項目 説明
FeedItemId feedのID
Body 投稿内容やユーザのプロフィール変更の情報がセット
LinkURL リンクを指定した際にセットされるリンクのURL
Title リンクやコンテンツのタイトル
ContentType コンテンツのMIME-TYPE
ContentSize コンテンツのファイルサイズ
ContentFileName コンテンツのファイル名
ContentDescription コンテンツの詳細説明
ContentData コンテンツの実態(Base64-encoded)
CommentCount フィードに対するコメントの件数
LikeCount フィードに対する「いいね」の件数


Create a new Text Post

FeedItem fItem = new FeedItem();
fItem.Type = 'TextPost';
fItem.ParentId = <Id of User or Record>;
fItem.Body = 'The mice will see you now';
insert fItem;

Typeについては変更できません。詳細はCurrentStatusを参照してください。
追加したデータは下記のページで確認できます。

  • ホームタブ
  • 投稿したデータの特定ページ
  • プロフィールタブ


Record Feeds – FeedTrackedChanges

フィードの変更があったオブジェクト(ユーザやデータ)については、変更情報をrecord feedsに保持しています。
Record Feedsは標準オブジェクト用の名前が付与されます。例えばAccountはrecord feedを表すAccountFeedオブジェクトがあります。
カスタムオブジェクトについては、Foo__cが持ってるrecord feedsはFoo__Feedといった形になります。
項目が変更された等の詳細についてはFeedTrackedChangeに格納されます。

OpportunityFeed Feed Items on a Record

ID OpportunityId = <Id of an opportunity>;
List<OpportunityFeed> oRFeed = [
    SELECT Id, Type, CreatedBy.Name, Parent.Name, Body
    FROM OpportunityFeed WHERE ParentId = :OpportunityId
    ORDER BY CreatedDate DESC, Id DESC LIMIT 20
    ];

Record Detail Page Query

ID accountId = <Id of an Account>;
List<AccountFeed> aRFeed = [
    SELECT Id, Type, CreatedDate, CreatedById, CreatedBy.Name,
    ParentId, Parent.Name, FeedItemId, Body,
    Title, LinkUrl,
    (SELECT Id, FieldName, OldValue, NewValue
        FROM FeedTrackedChanges),
    (SELECT Id, CreatedDate, CreatedById,
        CreatedBy.Name, CommentBody
        FROM FeedComments ORDER BY CreatedDate DESC)
    FROM AccountFeed WHERE ParentId = :accountId
    ORDER BY CreatedDate DESC, Id DESC LIMIT 10
    ];

このQueryはAccountレコードの詳細を表示するために使用します。
このクエリを少々変えることで、AccontFeedと異なるrecord feedを一緒に表示することも可能です。
結果についてはProfile Tab Queryでも記述しています。


NewsFeed

このオブジェクトは自分の投稿、フォローしているユーザの投稿、所属しているグループの投稿情報が格納されています。このオブジェクトはChatterタブに表示されています。
feedのParentIdにはユーザのID、フォローしているユーザのID、所属グループのIDがセットされます。
NewsFeedは自分自身の情報の閲覧可能です。

項目 説明
FeedItemId feedのID
ParentId feedに関連するID
Type UserStatusのいずれかがセットされる。

注意:
もしAcmeが私をフォローしたfeedを、私をフォローしているJACKが見た場合、ParentIDにはAcmeが設定されています。
誰による投稿か確認する場合はCreatedBy(システム項目)を使用します。

NewsFeed Feed Items on Users and Records I Follow

List <NewsFeed> aNewsFeed = [
    SELECT Id, Type, CreatedBy.Name, Parent.Name, Body
    FROM NewsFeed
    ORDER BY CreatedDate DESC, Id DESC LIMIT 20
    ];


下記の例は使用中のChatterタブに表示されているフィードから省略したデータを戻します。
CreatedBy.Nameはフィードを作成したユーザを表示するため指定します。
Parent.Nameは使用ユーザ名またはフォローしているアイテム名が設定されます。
また対象フィードのTypeがTrackedChangeでない限り、nullとなる事はありません。

Chatter Tab Query

List <NewsFeed> aNewsFeed = [
    SELECT Id Type CreatedDate
    ParentId Parent.Name FeedItemId
    Title LinkUrl
    (SELECT Id FieldName OldValue
        FROM FeedTrackedChanges)
    (SELECT Id CreatedDate CreatedById
        CreatedBy.Name CommentBody
        FROM FeedComments ORDER BY CreatedDate DESC)
    FROM NewsFeed ORDER BY CreatedDate DESC Id DESC LIMIT 10
    ];


UserProfileFeed

このオブジェクトは自分の投稿、プロフィールの変更情報および@を使用したダイレクトメッセージ情報が格納されています。
またこのフィード情報はSalesforce Chatterアプリケーションのプロファイルタブに表示されています。
UserProfileFeedのフィード情報では作成ユーザの情報を閲覧する事も可能です。

注意:UserProfileFeedを参照する場合、条件にUserIDが必須となります。

UserProfileFeed Feed Items indicating Posts a User has Made

ID userID = <id of User>;
List <UserProfileFeed> uposts = [
    SELECT Id
    FROM UserProfileFeed WHERE Type = 'TextPost'
    WITH UserId=:userId
    ORDER BY CreatedDate DESC, Id DESC LIMIT 10
    ];

このクエリでは指定したユーザに関連する直近10件の投稿情報を戻しています。
WITHを使用してどのユーザのプロファイル情報を取得するか指定します。
上記の例でWHERE句を省略した場合はType=trackedchangesを含んだレコードが戻ります。
ParentIdには更新したオブジェクトのIDがセットされています。

Profile Tab Query

ID userID = <id of User>;
List <UserProfileFeed> = [
    SELECT Id Type CreatedDate
    ParentId Parent.Name FeedItemId
    Title LinkUrl LikeCount
    (SELECT Id FieldName OldValue
        FROM FeedTrackedChanges)
    (SELECT Id CreatedDate CreatedById
        CreatedBy.Name CommentBody
        FROM FeedComments ORDER BY CreatedDate DESC)
    FROM UserProfileFeed WITH UserId = :userId
    ORDER BY CreatedDate DESC Id DESC LIMIT 10
];

このクエリではプロファイルタブの表示データを取得しています。
フィードに対して、コメントや「いいね」が紐付いてる場合には、1レコードに対して複数のリスト型のデータが戻ってきます。
またフィードのTypeがtrackedchangesの場合には、FeedTrackedChangeオブジェクトに関連するデータが格納され、プロファイル情報の更新ごとのレコードが作成されています。
なので、プロファイルを変更するユーザはFeedTrackedChangeオブジェクトを更新する権限が必要となります。


FeedTrackedChange

各フィードの変更情報が格納されています。このオブジェクトを参照する場合にはUserProfileFeed、NewsFeed、record feedを通じて行ってください。

Tracked Changes to a Record

ID OpportunityId = <Id of an opportunity>;
List<OpportunityFeed> oEFeedT = [
    SELECT Id Type CreatedBy.Name
    (SELECT OldValue NewValue FROM FeedTrackedChanges)
    FROM OpportunityFeed
    WHERE ParentId = :OpportunityId AND Type = 'TrackedChange'
    ORDER BY CreatedDate DESC Id DESC LIMIT 20
];

上記の例は商談オブジェクトの変更情報を抽出しています。


FeedComment

このオブジェクトにはコメント情報が格納されています。
コメントは各フィードの子オブジェクトとなっており、UserProfileFeedやNewsFeedと紐付けての取得のみ可能となっています。

また投稿データのIDはユーザの変更により変わる可能性があるため、ParentIDを使用してどのオブジェクトに紐付いてるか確認することができます。

Create a Comment

FeedComment fcomment = new FeedComment();
fcomment.FeedItemId = <feedItemId>;
fcomment.CommentBody = 'This is a profound comment.';
insert fcomment;

上記の例を行うには、コメントを付加するFeedのItemIDが必要となります。


EntitySubscription

このオブジェクトでは、ユーザ/データのフォロー/フォロワーの関係が格納されています。

Followers of a User or Record

ID uid = <Id of User or Record>;
List<EntitySubscription> followers = [
    SELECT Id, SubscriberId, Subscriber.Name
    FROM EntitySubscription WHERE ParentId = :uid
    ];

List the Users and Records I Follow

ID uid = <Id of User>;
EntitySubscription[] followingES = [
    SELECT Id, ParentId, SubscriberId, Parent.Name
    FROM EntitySubscription WHERE SubscriberId = :uid
    ];

WHERE句にParent.Type=’User’を付加することでユーザのみ表示することが可能です。

List Subscriptions to Records

ID uid = <Id of User>;
List<EntitySubscription> les = [
    SELECT Id, Parent.Name FROM EntitySubscription
    WHERE SubscriberId = :uid AND ParentId IN
    (SELECT Id FROM Account WHERE NumberOfEmployees >= 10)
    ];

上記の例は、従業員が10人以上取引先企業でフォローしているデータが取得できます。


CollaborationGroup

このオブジェクトにはChatterのグループ情報が格納されています。

CollaborationGroupにはCollaborationGroupFeedと呼ばれるGroup内のフィード情報を格納したデータを持っており、グループに所属するフィードを取得する際に使用します。

List Groups

List<CollaborationGroup> oG = [SELECT Name, Description,
CollaborationType, OwnerId from CollaborationGroup];

上記の例では、組織内全てのChatterグループを取得しています。CollaborationTypeにはPublicかPrivateのいずれかが設定されています。

List a Group’s Feed

ID cgid = <Id of a group>;
List<CollaborationGroupFeed> ic = [
    SELECT Id, Type, ParentId, Parent.Name, FeedItem.Id,
    FeedItem.Type , FeedItem.Body, FeedItem.Title,
    (SELECT Id, FieldName, OldValue, NewValue
        FROM FeedTrackedChanges ORDER BY Id DESC),
    (SELECT Id, CommentBody, CreatedDate, CreatedById,
        CreatedBy.FirstName, CreatedBy.LastName
        FROM FeedComments
        ORDER BY CreatedDate DESC, Id DESC LIMIT 4)
    FROM CollaborationGroupFeed WHERE ParentId = :cgid
    ORDER BY CreatedDate DESC, Id DESC LIMIT 20
    ];

グループの名前や説明を変更した際には、変更情報が表示されます。
上記の例ではグループのフィード・変更情報および付随するコメントを取得しています。


CollaborationGroupMember

このオブジェクトにはChatterグループのメンバー情報が格納されています。

List Members of a Group

ID cg = <Id of a Chatter group>;
List<CollaborationGroupMember> oM = [
    SELECT MemberId, CollaborationGroup.Name
    FROM CollaborationGroupMember WHERE CollaborationGroupId = :cg
    ];

上記の例では、指定したグループのメンバーIDと名称を取得します。

Add a User to a Group

ID uid = <Id of a user>;
ID cgid = <Id of a group>;
CollaborationGroupMember cgm = new CollaborationGroupMember(
memberid = uid, collaborationgroupid = cgid);
insert cgm;


CollaborationGroupMemberRequest

このオブジェクトでは、非公開グループにおけるユーザの申請情報が格納されています。
また自分が管理者となっているグループにおいては、承認・却下の操作も可能です。
create()を使用することで、グループの管理者に対して申請メールを送る事ができます。
グループの管理者による承認・却下を行った際に、申請者にメールで通知されます。
また却下の場合は理由を通知する事が可能です。


CurrentStatus

ユーザがChatterで投稿を行った際には、UserオブジェクトのCurrentStatusが更新されます。
またUserProfileFeedにおいても更新が行われます。

Update a User’s Status

ID uid = <Id of User>;
User user = [SELECT Id, CurrentStatus FROM User WHERE Id = :uid];
user.CurrentStatus = 'new and exciting status message';
update u;

上記の例ではユーザ投稿の更新を行います。
注意:ユーザ投稿を削除した場合、CurrentStatusの値はクリアされません。


Chatter Triggers

FeedItem、FeedCommentではApexTriggerを作成する事ができます。
record feedにおいては作成できませんが、ユーザの行動のrecord feedにおいては作成可能です。
Triggerは追加・削除のみ対応しています。FeedItemのTypeがTextPost,LinkPost,ContentPostの追加時に行うことができます。
ユーザのステータス情報更新ではTriggerは動作しません。

Apex CodeではChatterコンテキスト内の処理のみ追記可能です。

トリガーを使用して非公開グループに対して投稿を行う際には、グループに所属しているメンバーでなければなりません。
グループに所属していないメンバーの場合は、CreatedByIdにメンバーのIDがセットされFeedItemが作成されます。

下記の例では、誰かが投稿を行った時に動作するTriggerです。
例えば特定の文字に基づいて処理を実施することもできます。
(例:商談がクローズとなった場合に処理を行う。)

Trigger CheckChatterPostsOnOpportunity on FeedItem (before insert)
{
    // Get the key prefix for the Opportunity object
    // using a describe call.
    String oppKeyPrefix = Opportunity.sObjectType.getDescribe().
    getKeyPrefix();
    for (FeedItem f: trigger.new)
    {
        String parentId = f.parentId;
        // Compare the start of the 'parentID' field
        // to the Opportunity key prefix to
        // restrict the trigger to act on posts made to the
        // Opportunity object.
        if (parentId.startsWith(oppKeyPrefix) &&
        f.Body == '!close')
        {
            // Add your business logic here
        }
    }
}


Writing Efficient Chatter Triggers

  • 組織内のトリガーはすべて把握しておく
  • isEmptyを使用して、ロジックの制限を行う
  • トリガー処理の共通化
    ※殆どのトリガーはFeedItemまたはFeedCommentで起動
  • UserStatusはUser上にある事に注意する
  • FeedItemは絞り込んで処理を行う。
    ※トリガーでのフィードTypeの種類は、TextPost, LinkPost, ContentPost
    ※トリガーで、オブジェクトのTypeを識別するのは下記の形式を使用する
  • .sObjectType.getDescribe().getKeyPrefix();


ContentDocumentLink

ContentDocumentLinkではSalesForceCRMやChatterにアップされたファイルが、Chatterで共有された情報が格納されます。
ファイルは他のユーザ、Chatterグループ、SalesForceCRMと共有する事ができます。
例えばChatterでアップロードを行ったファイルのタイトル、説明を検索する事ができます。

SELECT ContentDocument.LatestPublishedVersion.Title,
    ContentDocument.LatestPublishedVersion.Description
    FROM ContentDocumentLink
    WHERE LinkedEntityid = '<entity-id>'


CollaborationInvite

このオブジェクトを使用する事でChatterに招待/削除ができます。
招待ではChatter(グループなし)またはChatter内グループのいずれかとなります。
Chatter内グループに招待する事でChatter(グループなし)の閲覧も可能となります。
招待されたユーザはグループ内のプロファイルやフィードの閲覧は可能ですが、他のデータについては閲覧できません。


Writing Efficient SOQL Queries

  • フィードを抽出する際はLIMITを使用して、1回20件程度とする
  • 抽出条件は(ParentId、Id、ParentType、CreatedById)を使用する
  • records feedの取得ではParentID = を使用する
  • ORDER BY CreateDate DESC, ID DESCで抽出を行う
    ※直近のデータを抽出


10月 18th, 2011 | ymasuhara | No Comments Yet

Chatterで使用する主な標準オブジェクトは下記となります。
Chatterオブジェクト相関図


UserProfileFeed
ユーザのプロフィール、ユーザのフィード変更情報が格納。条件にWITH UserId=’***’が必須。

項目名 注釈
Id フィードのID
Body 投稿内容
CommentCount コメントの件数
ContentData コンテンツファイル(Base64で変換した値)
ContentDescription コンテンツの説明
ContentFileName コンテンツファイル名
ContentSize コンテンツサイズ(in byte)
ContentType コンテンツのMIMEType
CreatedDate フィード作成日
FeedPostId フィードの投稿ID(バージョン22で廃止)
InsertedById 作成したユーザまたはデータのID
IsDeleted True:削除、False:既存
LastModifiedDate 最終更新日
LikeCount 「いいね」件数
LinkUrl リンクのURL
ParentId このフィードの親となるユーザまたはデータのID
RelatedRecordId ※現状取得不可
Title フィードのタイトル
Type 下記のいずれかより設定される。
UserStatus:ユーザがChatterタブやホームタブで投稿したフィード
TrackedChange:プロフィールやグループの変更時に自動的に作成されたフィード
TextPost:ユーザが他ユーザやオブジェクトより投稿したフィード
LinkPost:ユーザが投稿したフィードのリンク情報
ContentPost:ユーザが投稿したフィードのファイル情報
DashboardComponentSnapshot:ダッシュボードが更新された際に作成されたフィード
ApprovalPost:承認を実施した際に作成されるフィード

NewsFeed
Chatter内全体のデータが参照できる。非公開としているグループのデータも参照可能

項目名 注釈
Id フィードのID
Body 投稿内容
CommentCount コメントの件数
ContentData コンテンツファイル(Base64で変換した値)
ContentDescription コンテンツの説明
ContentFileName コンテンツファイル名
ContentSize コンテンツサイズ(in byte)
ContentType コンテンツのMIMEType
CreatedDate フィード作成日
InsertedById 作成したユーザまたはデータのID
IsDeleted True:削除、False:既存
LastModifiedDate 最終更新日
LikeCount 「いいね」件数
LinkUrl リンクのURL
ParentId このフィードの親となるユーザまたはデータのID
※通常はユーザID、ファイルをアップした際はコンテンツのID、グループ作成時のIDはグループID
RelatedRecordId ※現状取得不可
Title フィードのタイトル
Type UserProfileFeedを参照

CollaborationGroupFeed
グループで発信しているFeedの情報が格納

項目名 注釈
Id フィードのID
Body 投稿内容
CommentCount コメントの件数
ContentData コンテンツファイル(Base64で変換した値)
ContentDescription コンテンツの説明
ContentFileName コンテンツファイル名
ContentSize コンテンツサイズ(in byte)
ContentType コンテンツのMIMEType
CreatedDate フィード作成日
FeedPostId フィードの投稿ID(バージョン22で廃止)
InsertedById 作成したユーザまたはデータのID
IsDeleted True:削除、False:既存
LastModifiedDate 最終更新日
LikeCount 「いいね」件数
LinkUrl リンクのURL
ParentId グループのID
RelatedRecordId 関連するレコードID。
Title フィードのタイトル
Type UserProfileFeedを参照

UserFeed(record feed)
ユーザに関するフィードのみ集約されている。(オブジェクトのフィードはなし)

項目名 注釈
Id フィードのID
Body 投稿内容
CommentCount コメントの件数
ContentData コンテンツファイル(Base64で変換した値)
ContentDescription コンテンツの説明
ContentFileName コンテンツファイル名
ContentSize コンテンツサイズ(in byte)
ContentType コンテンツのMIMEType
CreatedDate フィード作成日
FeedPostId フィードの投稿ID(バージョン22で廃止)
InsertedById 作成したユーザまたはデータのID
IsDeleted True:削除、False:既存
LastModifiedDate 最終更新日
LikeCount 「いいね」件数
LinkUrl リンクのURL
ParentId このフィードの親となるユーザまたはデータのID
RelatedRecordId 関連するレコードID。
Title フィードのタイトル
Type UserProfileFeedを参照

AccountFeed(record feed)
取引先におけるフィード情報(LeadFeed、ContactFeedも類似)

項目名 注釈
Id フィードのID
Body 投稿内容
CommentCount コメントの件数
ContentData コンテンツファイル(Base64で変換した値)
ContentDescription コンテンツの説明
ContentFileName コンテンツファイル名
ContentSize コンテンツサイズ(in byte)
ContentType コンテンツのMIMEType
CreatedDate フィード作成日
FeedPostId フィードの投稿ID(バージョン22で廃止)
InsertedById 作成したユーザまたはデータのID
IsDeleted True:削除、False:既存
LastModifiedDate 最終更新日
LikeCount 「いいね」件数
LinkUrl リンクのURL
ParentId 取引先ID
RelatedRecordId ※現状取得不可
Title フィードのタイトル
Type UserProfileFeedを参照

FeedTrackedChange
フィードの変更があったオブジェクト(ユーザやデータ)を保持。直接オブジェクトの参照はできない。

項目名 注釈
Id 変更オブジェクトのID
CurrencyIsoCode ※現状取得不可
FeedItemId フィードのID
FieldName 変更があった項目の名前
NewValue 新しい値
OldCurrencyIsoCode ※現状取得不可
OldValue 前の値(新規の場合はnull)

FeedComments
フィードに対するコメント情報

項目名 注釈
CommentBody コメントの内容
FeedItemId 対応するフィード
InsertedById コメントを作成したユーザまたはアプリ等のID
ParentId このフィードの親となるユーザまたはデータのID

FeedLikes
フィードに対する「いいね」情報

項目名 注釈
CreatedById 「いいね」を行ったユーザID
FeedItemId 対応するフィード
FeedEntityId フィードかコメントのID(将来的にコメントに「いいね」が可能となるため)(※現状取得不可)
InsertedById 「いいね」を作成したユーザまたはアプリ等のID

FeedPost
バージョン21において削除。FeedItemに移行。

FeedItem
使用する際には必ずIDを条件にセットする必要がある。

項目名 注釈
Id フィードのID
Body 投稿内容
CommentCount コメントの件数
ConnectionId ※現状取得不可
ContentData コンテンツファイル(Base64で変換した値)
ContentDescription コンテンツの説明
ContentFileName コンテンツファイル名
ContentSize コンテンツサイズ(in byte)
ContentType コンテンツのMIMEType
FeedPostId フィードの投稿ID(バージョン22で廃止)
InsertedById 作成したユーザまたはデータのID
IsDeleted True:削除、False:既存
LikeCount 「いいね」件数
LinkUrl リンクのURL
ParentId このフィードの親となるユーザまたはデータのID
RelatedRecordId ※現状取得不可
Title フィードのタイトル
Type UserProfileFeedを参照

EntitySubscription
Chatterにおけるフォロー・フォロワーの関係情報

項目名 注釈
Id フォロー関係ID
ParentId フォローされているデータ
SubscriberId フォローしているデータ

CollaborationGroup
組織内に存在するグループ情報

項目名 注釈
CanHaveGuests True/False 承認していないユーザの閲覧権限(※現状取得不可)
CollaborationType Public、Privateのいずれか
Description グループの説明
FullPhotoUrl フルサイズ画像のURL
HasPrivateFieldsAccess 非公開グループの際にグループの情報タイトル/詳細の閲覧権限(※現状取得不可)
InformationBody グループの情報詳細(※現状取得不可)
InformationTitle グループの情報タイトル(※現状取得不可)
LastFeedModifiedDate グループ内の最終フィード更新日
MemberCount メンバーの人数
Name グループ名
OwnerId グループ管理者のユーザID
SmallPhotoUrl サムネイル画像のURL

CollaborationGroupMember
組織内に存在するグループの所属メンバー情報

項目名 注釈
CollaborationGroupId グループID
MemberId グループに所属しているユーザID
NotificationFrequency グループから発信するダイジェストメールの頻度
D:Daily
W:Weekly
N:Never
P:On each post

CollaborationGroupMemberRequest
ユーザがグループに所属申請を実施した場合に作成されるデータ

項目名 注釈
CollaborationGroupId 申請されたグループのID
RequesterId 申請したユーザのID
ResponseMessage 申請却下時に管理者が入力するメッセージ
Status Accepted、Declined、Pendingのいずれか

CollaborationInvitation
Chatterに同僚をメールで招待した際に作成される情報

項目名 注釈
InvitedUserEmail ラベル付きメールアドレス(XXXX 形式)
InvitedUserEmailNormalized メールアドレスのみ
InviterId 招待を行ったユーザID
OptionalMessage 送信メッセージ
ParentId このフィードの親となるユーザまたはデータのID
SharedEntityId 招待を行ったChatter内の機能のID(ユーザID、グループのID等)
Status Sent、Accepted、Canceledのいずれか

ContentDocument
組織内において、CRMやChatterでアップロードしたファイルの情報

項目名 注釈
Division 組織内のファイルのDivision(※現状取得不可)
LatestPublishedVersionId 最新のファイルバージョンID
OwnerId ファイルをアップしたユーザID
PublishStatus P(公開データ)、R(個人データ)、U(アップロード失敗)のいずれか
Title ファイルアップ時のタイトル名

ContentDocumentLink
アップロードされたファイルのリンク情報

項目名 注釈
LinkedEntityId ファイルをアップしたユーザID
ContentDocumentId コンテンツのファイルID
10月 5th, 2011 | ymasuhara | No Comments Yet

先日の「F8」において様々な新機能が発表され、更に躍進を見せるFaceBookですが
ここでAPEXによる基本的なFaceBookGraphAPIの使用方法をまとめてみました。

①アクセストークン取得の流れ

事前準備
下記サイトにアクセスし、開発者の許可を行い、FaceBookアプリを作成しAppID、AppSecretを取得します。
https://www.facebook.com/developers/
<開発者の許可画面>

<アプリ作成画面>

1.Webアプリ上から、下記URLにGETパラメータを付加して、FaceBookの認証画面にリダイレクトを行います。
<認証ダイアログURL>
https://graph.facebook.com/oauth/authorize

パラメータ名
client_id AppID
redirect_uri FaceBook認証画面からリダイレクトされるURL
scope 使用するGraphAPIの権限(カンマ区切り)
<例>
PageReference pFbLogin = new PageReference('https://graph.facebook.com/oauth/authorize?client_id=AppID&redirect_uri=http%3A%2F%2Fsample.com%2F&scope=offline_access,read_stream');
return pFbLogin.setRedirect(true);

ログイン済みであれば下記のようなダイアログが表示されます。
(ダイアログの例では使用するGraphAPIの権限を全て設定した場合)

2.認証画面にてユーザが許可した場合、GETパラメータにcodeが付加された形式でリダイレクトされるので、下記URLにアクセスしAccessTokenを取得します。
<AccessToken取得URL>
https://graph.facebook.com/oauth/access_token

パラメータ名
client_id アプリ登録画面で表示されたAppID
client_secret アプリ登録画面で表示されたAppSecret
code GETパラメータ”code”の値
<例>
Http h = new Http();
Httprequest req = new Httprequest();
req.setEndpoint('https://graph.facebook.com/oauth/access_token?client_id=AppID&client_secret=AppSecret&code=code');
req.setMethod('GET');
HttpResponse res = h.send(req);

3.上記の戻り値(res.getBody())が”access_token=アクセストークン”の形式で戻ってくるので、この値を保持しGraphAPIのアクセス時に使用します。
※アプリのアクセストークンについてはGraphAPIにおいてUser情報のme/accountsから取得できます。
(後述参照)

②GraphAPI全体概要

名前 注釈 取得 更新 AccessToken
User App
Achievement(Instance) Facebookアプリ(ゲーム)において、ユーザの実績(得点や進捗)を操作することが目的。
Album 写真アルバムの情報取得および作成。
Application 登録済みのAppに対して情報取得および更新が可能。アプリの新規作成/削除はAPIではできない。
Checkin チェックインIDを指定する事で場所やページのチェックイン情報の取得が可能。
Comment コメントIDを指定する事でコメントの情報取得、削除が可能。
Domain パラメータにFaceBookアプリ内で使用しているドメインを指定する事で情報取得。
Event イベントIDを指定しイベントの情報取得。
FriendList 友達リストIDを指定し友達リストの情報取得。
Group グループIDを指定しグループの情報取得。
Insights 管理しているFaceBookページやアプリのIDを使用して、各種統計情報が取得可能。
Link 投稿されたリンクのIDを指定する事で情報取得が可能。
Message メッセージIDを指定する事で情報取得が可能。(現在はAPI開発中で今後機能拡張が行われる予定)
Note ノートIDを指定する事で情報取得が可能。
Page ページIDを指定する事で情報取得が可能。(ページで取得できる項目については、今後ユーザの年齢や管理者のみの制限、特殊ページにおける項目追加が発生するかもしれない)
Photo 写真IDを指定する事で情報取得が可能。
Post フィードに表示されている個々の情報のIDを指定する事で、フィード上に表示されない情報が取得可能。 △削除のみ
Review アプリIDを指定する事でレビュー情報が取得可能。
Status message ウォールに表示されている個々の情報に対して、GraphAPIで扱われるステータス情報が取得可能。
Subscription ページ・アプリで使用している情報をリアルタイムに取得する事が可能。
Thread 将来リリースされる新しいメッセージシステム
User ユーザの情報。ユーザIDを指定する事で各情報の取得が可能。
Video 動画IDを指定する事で動画情報が取得可能。(ファイルの対応形式は本家リファレンス参照)

③APIのURIおよび戻り値

・アクセス方法
https://graph.facebook.com/ユーザID・ページIDなどオブジェクトのID(meを指定した場合はログインユーザ)/APIの種類(指定しない場合はユーザデータ)/?access_token=アクセストークン

・APIの種類

名前 注釈 User Page App
自分 友達 他人 いいね!有 いいね!無
accounts 所有するアプリ、ページのデータを取得
achievements 使用しているFacebookアプリ(ゲーム)の実績データ
activities プロフィールの好きなアクティビティデータ
admins ページ管理データ(ページのアクセストークンを使用する) △管理者のみ
albums アルバムデータ
apprequests 使用しているFacebookアプリからの通知データ
banned ページ管理者がブロックしているユーザリスト(ページのアクセストークンを使用する) △管理者のみ
blocked ページ管理者がブロックしているユーザリスト(ページのアクセストークンを使用する) △管理者のみ
books プロフィールで選択した好きな本
checkins チェックインの一覧
events イベントの一覧
family 家族の一覧
feed ユーザの投稿一覧
friendlists 作成した友達リスト一覧(スマートリストも含まれる)
friendrequests 承認していない友達リクエストの一覧
friends 友達一覧
games プロフィールで選択した好きなエンターテイメント
groups 所属するグループの一覧
home 自分のホームに表示されているフィード一覧
inbox メッセージの一覧
insights 管理しているFaceBookページやアプリの各種統計情報 △管理者のみ
interests プロフィールで選択した好きな趣味・関心
likes 「いいね!」の一覧
links 自分の投稿にリンクがあるデータのみ抽出した一覧
movies プロフィールで選択した好きな映画
music プロフィールで選択した好きな音楽
mutualfriends 友達の共通の友達一覧GETパラメータにuserを指定して確認する友達IDを指定。
notes ノート一覧
notifications ユーザの通知一覧
outbox メッセージの送信一覧(inboxと項目は一緒だが送信を行ったデータのみ取得可能)
reviews メッセージの送信一覧(inboxと項目は一緒だが送信を行ったデータのみ取得可能)
payments アプリ内の課金データ
permissions 当アプリ内のユーザの権限
photos タグ付した写真一覧
picture ユーザのプロフィール画像
pokes ユーザのあいさつ一覧
posts 自分から発信した投稿や友達になった時のデータ一覧
scores 使用しているFacebookアプリ(ゲーム)の点数データ
staticresources ユーザの投稿に対するいいね!やコメントの一覧 △管理者のみ
statuses ユーザの投稿に対するいいね!やコメントの一覧
settings 投稿設定情報(ユーザーによるウォール投稿許可、ユーザーによる写真の追加許可、投稿した写真へのタグ付け許可、ユーザーによる動画の追加を許可)の取得(ページのアクセストークンを使用する) △管理者のみ
subscriptions ユーザの投稿に対するいいね!やコメントの一覧 △管理者のみ
tabs タブの一覧情報(ページのアクセストークンを使用する) △管理者のみ
tagged タグ付されたデータ一覧
television プロフィールで選択した好きなテレビ
updates 更新したメッセージデータ
videos タグ付した動画一覧

・APIの戻り値(picture以外はJSON形式)

accounts

第1階層 第2階層 項目説明
data
配列
name アプリ・ページ名
access_token アプリ・アクセストークン
category カテゴリ名
id アプリID
activities

第1階層 第2階層 項目説明
data
配列
name アプリ・ページ名
category カテゴリ名(デフォルトはInterrest?)
id アプリID
admins

第1階層 第2階層 項目説明
data
配列
name 管理ユーザ名
id 管理ユーザID
albums

第1階層 第2階層 第3階層 項目説明
data
配列
id アルバムID
from
name ユーザ名
id ユーザID
name アルバム名
link アルバムのリンク先URL
cover_photo 表紙画像
count 写真数
type 種別(mobile,profile,wall等)
created_time 作成日
updated_time 更新日
blocked

第1階層 第2階層 項目説明
data
配列
name ブロックユーザ名
id ブロックユーザID
books

第1階層 第2階層 項目説明
data
配列
name 本の名前
category カテゴリ
id 本のid
created_time 作成日
checkins

第1階層 第2階層 第3階層 第4階層 項目説明
data
配列
id チェックインID
from
name ユーザ名
id ユーザID
message チェックイン時のコメント
place
id 場所ID
name 場所名
location
street 住所番地
city 住所市区町村
country 国名
zip 郵便番号
latitude 緯度
longitude 経度
application
name チェックインアプリ名
canvas_name チェックインアプリの使用したページ名
id アプリID
created_time 作成日
events

第1階層 第2階層 項目説明
data
配列
name イベント名
start_time 開始時刻
end_time 終了時刻
location 場所名
id イベントID
rsvp_status (Attending,Unsure,Declined,NotReplied)
family

第1階層 第2階層 項目説明
data
配列
name ユーザ名
id ユーザID
relationship 関係(wife,sister,cousin,unknown等)
feed

第1階層 第2階層 第3階層 項目説明
data
配列
id フィードID
from
name 投稿ユーザ名
id 投稿ユーザID
message 投稿内容
story ステータスの変更内容、友達になった場合の通知文字、いいね!ボタン押下時の通知文字等
story_tags
配列
id 関連タグID
name 関連タグ名
offset story_tags内においてカテゴライズされたキーのような値がセットされる
length 用途不明
picture 関連画像URL
link 関連リンク先URL
name フィード名
caption フィードの説明
properties ※フィードの内容がシェア当の場合に設定される。
name フィードのステータス(”By”といった文字列が設定される)
text フィードの作成者名
href フィードのリンク先
icon フィードのアイコンURL(Twitter連動の場合はTwitterのアイコン。)
actions
配列
name アクション名
link アクションを行うURL
privacy
description 公開範囲ステータス(Public等)
value 公開範囲(EVERYONE等)
allow 許可数
deny ブロック数
type フィード種別
object_id 関連したオブジェクトID(イベントやアプリ等のID)
application
name 関連アプリ名
id 関連アプリID
created_time 作成日
updated_time 更新日
friendlists

第1階層 第2階層 項目説明
data
配列
id 友達リストID
name 友達リスト名
friendrequests

第1階層 第2階層 第3階層 項目説明
data
配列
from
name 申請ユーザ名
id 申請ユーザID
created_time 作成日
unread 未読(true)
to
name 承認するユーザ名
id 承認するユーザID
friends

第1階層 第2階層 項目説明
data
配列
id 友達ユーザID
name 友達ユーザ名
games

第1階層 第2階層 項目説明
data
配列
name ゲームの名前
category ゲームカテゴリ
id ゲームのid
created_time 作成日
groups

第1階層 第2階層 項目説明
data
配列
version バージョン番号
name グループ名
id グループID
administrator 管理権限(True/False)
bookmark_order ソート順
home
・友達やいいね!を行っているページのフィードが表示される。※内容は割愛(feedを参照)
inbox

第1階層 第2階層 第3階層 第4階層 第5階層 項目説明
data
配列
id メッセージID
from
name 最初にメッセージを送信したユーザ名
id 最初にメッセージを送信したユーザID
to
data
配列
name 受信したユーザ名
id 受信したユーザID
subject メッセージタイトル
message メッセージ内容
updated_time 更新日
unread 相手の通知未確認件数
unseen 相手の未読件数
comments
data
配列
id メッセージID
from
name メッセージ送信ユーザ名
id メッセージ送信ユーザID
message メッセージ内容
created_time 作成日
metadata
connections
comments メッセージの送受信一覧
fields
name 項目名
description 項目説明
insights

第1階層 第2階層 第3階層 項目説明
data
配列
id idまたはURI
name 統計情報の名称
period 集計区分(day等)
values
配列
value
end_time 集計日
description 統計情報の説明
interests

第1階層 第2階層 項目説明
data
配列
name 趣味・関心名
category カテゴリ名
id 趣味・関心ID
created_time 作成日
likes

第1階層 第2階層 項目説明
data
配列
name いいね!したオブジェクトの名前
category いいね!したオブジェクトのカテゴリ
id いいね!したオブジェクトのID
created_time 作成日
movies

第1階層 第2階層 項目説明
data
配列
name 映画名
category カテゴリ名
id 映画ID
created_time 作成日
music

第1階層 第2階層 項目説明
data
配列
name 音楽名
category カテゴリ名
id 音楽ID
created_time 作成日
mutualfriends

第1階層 第2階層 項目説明
data
配列
name 友達のユーザ名
id 友達のユーザID
notes

第1階層 第2階層 第3階層 項目説明
data
配列
id ノートID
from
name ノート作成ユーザ名
id ノート作成ユーザID
subject ノートタイトル
message ノート内容(画像を含む)
icon ノートのアイコンURL
created_time 作成日
updated_time 更新日
notifications

第1階層 第2階層 第3階層 項目説明
data
配列
id 通知ID
from
name 通知を行ったユーザ名
id 通知を行ったユーザID
to
name 通知を受けたユーザ名
id 通知を受けたユーザID
created_time 作成日
updated_time 更新日
title 通知タイトル
message 通知内容
links 関連URL
application
name 関連アプリ名
canvas_name 関連アプリのページ名
id 関連アプリID
unread 通知未確認件数
outbox
・inboxと項目は同一
permissions

第1階層 第2階層 項目説明
data
配列
installed アプリインストール状況
status_update ステータスの更新権限
publish_checkins チェックインの更新権限
photo_upload 写真のアップロード権限
video_upload 動画のアップロード権限
sms メッセージの権限
offline_access ログインしてない状態のデータ使用権限
email メールアドレスの取得権限
create_event イベント作成権限
create_note ノート作成権限
share_item オブジェクトの公開権限
bookmarked ブックマーク
rsvp_event イベントの同行等の操作権限
read_stream フィード等の取得権限
publish_stream オブジェクトの更新権限
read_mailbox メッセージの取得権限
ads_management
read_friendlists 友達リストの取得権限
manage_friendlists 友達リストの更新権限
xmpp_login
read_insights
read_requests 友達承認待ちの取得権限
manage_notifications ユーザの通知情報の取得権限
manage_pages Fanページの管理権限
user_birthday ユーザの誕生日の取得権限
user_religion_politics ユーザの宗教情報の取得権限
user_relationships ユーザと特定の友達の関係(妻やいとこ)の取得権限
user_relationship_details ユーザと特定の友達の関係(妻やいとこ)の取得権限
user_hometown ユーザの出身地情報の取得権限
user_location ユーザの現住所の取得権限
user_likes ユーザのいいね!情報の取得権限
user_activities ユーザのアクティビティの取得権限
user_interests ユーザの活動の取得権限
user_education_history ユーザの学歴の取得権限
user_work_history ユーザの職歴の取得権限
user_online_presence ユーザのオンライン状況の取得権限
user_website ユーザのWebSiteの取得権限
user_groups ユーザのグループの取得権限
user_events ユーザのイベントの取得権限
user_photos ユーザの写真の取得権限
user_videos ユーザの動画の取得権限
user_photo_video_tags ユーザがタグ付した写真や動画の取得権限
user_notes ユーザのノートの取得権限
user_checkins ユーザのチェックイン状況の取得権限
user_about_me ユーザの基本情報の取得権限
user_status ユーザの直近の状況(更新したオブジェクト)の取得権限
friends_birthday ユーザの友達の誕生日の取得権限
friends_religion_politics ユーザの友達の宗教情報の取得権限
friends_relationships ユーザと特定の友達の関係(妻やいとこ)の取得権限
friends_relationship_details ユーザと特定の友達の関係(妻やいとこ)の取得権限
friends_hometown ユーザの友達の出身地情報の取得権限
friends_location ユーザの友達の現住所の取得権限
friends_likes ユーザの友達のいいね!情報の取得権限
friends_activities ユーザの友達のアクティビティの取得権限
friends_interests ユーザの友達の活動の取得権限
friends_education_history ユーザの友達の学歴の取得権限
friends_work_history ユーザの友達の職歴の取得権限
friends_online_presence ユーザの友達のオンライン状況の取得権限
friends_website ユーザの友達のWebSiteの取得権限
friends_groups ユーザの友達のグループの取得権限
friends_events ユーザの友達のイベントの取得権限
friends_photos ユーザの友達の写真の取得権限
friends_videos ユーザの友達の動画の取得権限
friends_photo_video_tags ユーザがタグ付した写真や動画の取得権限
friends_notes ユーザの友達のノートの取得権限
friends_checkins ユーザの友達のチェックイン状況の取得権限
friends_about_me ユーザの友達の基本情報の取得権限
friends_status ユーザの友達の直近の状況(更新したオブジェクト)の取得権限
photos

第1階層 第2階層 第3階層 第4階層 項目説明
data
配列
id 写真ID
from
name 写真をアップしたユーザ名
id 写真をアップしたユーザID
tags
data
配列
id タグ付を行ったユーザID
name タグ付を行ったユーザ名
x タグ付を行ったX座標
y タグ付を行ったY座標
created_time タグ付けを行った日
picture 写真ファイルのURL
source アップロードした写真のURL
height 写真の高さ
width 写真の幅
images
配列(4種類のサイズが用意される)
height 写真の高さ
width 写真の幅
source 写真ファイルのURL
link 写真の関連URL
icon アイコン画像のURL
created_time 写真の作成日
position 写真の表示位置
updated_time 写真の更新日
picture
・下記形式で指定する事で画像ファイルが取得できる
https://graph.facebook.com/[オブジェクトID]/picture
pokes

第1階層 第2階層 第3階層 項目説明
data
配列
to
name あいさつされたユーザ名
id あいさつされたユーザID
from
name あいさつしたユーザ名
id あいさつしたユーザID
created_time あいさつした日時
type poke
posts
・自分から発信した投稿や友達になった時のデータ一覧※内容は割愛(feedを参照)
statuses

第1階層 第2階層 第3階層 第4階層 項目説明
data
配列
id フィードID
from
name 投稿ユーザ名
id 投稿ユーザID
message 投稿内容
updated_time 投稿のの更新日
likes
data
配列
id いいね!したユーザID
name いいね!したユーザ名
comments
data
配列
id コメントしたユーザID
name コメントしたユーザ名
settings

第1階層 第2階層 項目説明
data
配列
setting 設定名
value 可否(True/False)
tabs

第1階層 第2階層 第3階層 項目説明
data
配列
id タブID
name タブ名
link タブのリンク先URL
application
name 関連アプリ名
canvas_name 関連アプリのページ名
id 関連アプリID
custom_name カスタム名 指定がない場合は自動的にセットされる
is_permanent タブの常時表示識別フラグ(True:False)
positions タブのソート順
is_non_connection_landing_tab いいね!をしていないユーザに対する表示有無(True:False)
tagged
・タグ付けされた投稿、画像、動画の一覧(feed,photo,videoを参照)
television

第1階層 第2階層 項目説明
data
配列
name テレビ番組の名前
category テレビ番組カテゴリ
id テレビ番組のid
created_time 作成日
updates
・説明は割愛(inbox参照)
videos

第1階層 第2階層 第3階層 項目説明
data
配列
id 動画ID
from
name 動画をアップしたユーザ名
id 動画をアップしたユーザID
name 動画のタイトル
description 動画の説明
picture 写真の関連URL
embed_html 動画の埋め込みHTML文字列
icon アイコン画像のURL
source アップロードした動画のURL
created_time 動画の作成日
updated_time 動画の更新日

FaceBookの機能およびAPIは逐次追加されるので、当記事も合わせて更新していきます。

10月 4th, 2011 | ymasuhara | No Comments Yet

TwitterのAPIをForce.com上で使用するため、Oauth認証を用いたAPEXのライブラリを探してみましたが
これといったライブラリが見つからなかったため、自前で作成しました。

Webアプリにおいて、Oauth認証を用いて、TwitterAPIを利用するには以下の手順が必要となります。
 Twitterにログインして、アプリ情報を登録する。
 登録したアプリの情報を使用し、Twitterに通信してRequest tokenを取得する。
 Request tokenを使用して、Twitter認証画面にリダイレクトする。
 Twitter認証画面から戻ってきた際に付加されたGETパラメータを使用してAccesstokenを取得する。
 Access tokenを使用して、各TwitterのAPIをコールする。

上記を踏まえて、下記に自分のタイムラインを表示する説明および例を記載します。

Twitterにログインして、アプリ情報を登録します。
※こちらは参考サイトが多数ありますので説明は割愛します。

アプリ登録画面に表示されたConsumer key、Consumer secret、Request token URLを使用してRequest tokenを取得します。Request token URLに対して、下記GETパラメータを付加して通信を行います。

パラメータ名
oauth_callback Twitterの認証画面からコールバックされる任意のURLをエンコードした文字列(アプリ登録時にも設定しますが、こちらが優先されます)
oauth_consumer_key アプリ登録画面に表示された文字列
oauth_nonce ハッシュを用いたその場限りの文字列(例では乱数とアクセス日時を利用して、MD5に変換しています)
oauth_signature_method HMAC-SHA1′固定
oauth_timestamp 現在時刻(UNIXタイムスタンプ形式)
oauth_version 1.0′固定
oauth_signature 送信するURLから当パラメータを除いた文字列を、HMAC-SHA1形式に変換したハッシュ値
<パラメータの指定方法(要点のみ記載)>
・oauth_callback
Encodingutil.urlEncode('任意のURL','UTF8')
・oauth_nonce
//1~9の値を使用して乱数を作成する
String CharList = '123456789';
String Res = '';
integer position;
//8桁の乱数を作成
for(Integer i = 0; i < 8; i++) {
 position = Integer.valueof(String.valueof(Math.roundToLong(CharList.length()*Math.random()))) -1;
 if(position==-1)position=0;
 Res += CharList.substring(position,position+1);
}
//現在のミリ秒を戻す
DateTime d = System.now();
String now_mm_second = String.valueOf(d.year() + d.month() + d.day() + d.hour() + d.minute() + d.second() + d.millisecond());
//乱数と現在日時を繋げた値からMD5に変換し、この値をセットする
EncodingUtil.convertToHex(Crypto.generateDigest('MD5', Blob.valueOf(now_mm_second + Res))) ;
・oauth_timestamp
String.valueOf(Datetime.now().getTime()).substring(0, 10);
・oauth_signature
//送信方式、送信URL、送信パラメータを&区切りでセットし、URLエンコードを行う
//注意点としてはoauth_callbackのURLは2回URLエンコードを行うイメージ
String sSignatureSource = 'GET&
							https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&
							oauth_callback%3D【任意のURLを2回エンコードした文字列】%26
							oauth_consumer_key%3D【アプリ登録画面に表示されたConsum key】%26
							oauth_nonce%3D【上記方法で作成した文字列】%26
							oauth_signature_method%3DHMAC-SHA1%26
							oauth_timestamp%3D【上記方法で取得した文字列】%26
							oauth_version%3D1.0';

//アプリ登録画面で表示されたConsumer secretを利用してHMAC-SHA1ハッシュ変換で使用するキーを作成
String sHashKey = 【アプリ登録画面に表示されたConsumer secret】+'&';

//上記で作成した2つの文字列を使用して、oauth_signatureの値を作成
Blob blbSignature = Crypto.generateMac('HMacSHA1', Blob.valueOf(sSignatureSource),Blob.valueOf(sHashKey));
EncodingUtil.urlEncode(EncodingUtil.base64Encode(blbSignature), 'UTF-8');
<Twitterに通信するURLの例>
https://api.twitter.com/oauth/request_token?
oauth_callback=http%3A%2F%2Fhogehoge.com%2F&
oauth_consumer_key=XXXXXXXXXXXXXXXXXXXXXX&
oauth_nonce=b1d9973f5b385f46aee43f8becbf79cc&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1317642915&
oauth_version=1.0&
oauth_signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<Twitterからの戻り値(テキスト形式)>
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_callback_confirmed=true

Request tokenを使用して、Twitter認証画面にリダイレクトします。この際に一度画面から離れてしまうためoauth_token、oauth_token_secretをカスタムオブジェクトに保持しておきます。
//カスタムオブジェクトに登録
TwitterRequestToken__c oTwiOa_ins = new TwitterRequestToken__c();
oTwiOa_ins.token__c = oauth_token;
oTwiOa_ins.token_secret__c = oauth_token_secret;
insert oTwiOa_ins;

//ログイン画面にリダイレクト
PageReference pTwitterLogin = new PageReference('https://twitter.com/oauth/authenticate?oauth_token='+oauth_token);
return pTwitterLogin.setRedirect(true);

※アプリ登録画面のAuthorize URLではhttps://api.twitter.com/oauth/authorizeが表示されますが、上記のURL(/authenticate)を使用することで、既にTwtterにログイン済みでアプリの許可を行っている場合は認証画面が表示されず、コールバックに指定したURLに直接リダイレクトされます。

コールバックされた際のGETパラメータであるoauth_token、oauth_verifierを使用してAccess tokenを取得します。アプリ登録画面に表示されたAccess token URLに対して、下記GETパラメータを付加して通信を行います。またoauth_token_secretも使用するので、先ほど登録したカスタムオブジェクトより、GETパラメータのoauth_tokenを条件に抽出します。

パラメータ名
oauth_consumer_key アプリ登録画面に表示された文字列
oauth_nonce ハッシュを用いたその場限りの文字列(例では乱数とアクセス日時を利用して、MD5に変換しています)
oauth_signature_method HMAC-SHA1′固定
oauth_timestamp 現在時刻(UNIXタイムスタンプ形式)
oauth_version 1.0′固定
oauth_token コールバックされた際のGETパラメータ
oauth_verifier コールバックされた際のGETパラメータ
oauth_signature 送信するURLから当パラメータを除いた文字列を、HMAC-SHA1形式に変換したハッシュ値
<パラメータの指定方法(要点のみ記載)>
・oauth_signature
//Request token取得で作成した方法と基本的には同じ
//異なる点としてHMAC-SHA1ハッシュ変換で使用するキーにoauth_token_secretも使用
String sSignatureSource = 'GET&
							https%3A%2F%2Fapi.twitter.com%2Foauth%2Faccess_token&
							oauth_consumer_key%3D【アプリ登録画面に表示されたConsum key】%26
							oauth_nonce%3D【コールバック後、再作成するnonce文字列】%26
							oauth_signature_method%3DHMAC-SHA1%26
							oauth_timestamp%3D【コールバック後、再取得するtimestamp文字列】%26
							oauth_token%3D【コールバックされた際のGETパラメータ】%26
							oauth_verifier%3D【コールバックされた際のGETパラメータ】%26
							oauth_version%3D1.0';

//アプリ登録画面で表示されたConsumer secretおよびReqest tokenを利用してHMAC-SHA1ハッシュ変換で使用するキーを作成
String sHashKey = 【アプリ登録画面に表示されたConsumer secret】+'&'+【カスタムオブジェクトより取得したoauth_token_secret】;

//上記で作成した2つの文字列を使用して、oauth_signatureの値を作成
Blob blbSignature = Crypto.generateMac('HMacSHA1', Blob.valueOf(sSignatureSource),Blob.valueOf(sHashKey));
EncodingUtil.urlEncode(EncodingUtil.base64Encode(blbSignature), 'UTF-8');
<Twitterに通信するURLの例>
https://api.twitter.com/oauth/access_token?
oauth_consumer_key=XXXXXXXXXXXXXXXXXXXXXX&
oauth_nonce=c04cc4ffc2d54cec65246060aa20b145&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1317642918&
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_verifier=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_version=1.0&
oauth_signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<Twitterからの戻り値(テキスト形式)>
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_token_secret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
user_id=XXXXXXXXX&
screen_name=ログインしたユーザ名

Access tokenを使用して、ログインユーザのタイムライン情報を取得します。
※各APIのアクセスURLについては他サイトに多数ありますので、そちらを参照してください。

ユーザのタイムラインを取得するURL:http://api.twitter.com/1/statuses/home_timeline.xml

パラメータ名
oauth_consumer_key アプリ登録画面に表示された文字列
oauth_nonce ハッシュを用いたその場限りの文字列(例では乱数とアクセス日時を利用して、MD5に変換しています)
oauth_signature_method HMAC-SHA1′固定
oauth_timestamp 現在時刻(UNIXタイムスタンプ形式)
oauth_token ④で取得したAccess token
oauth_version 1.0′固定
oauth_signature 送信するURLから当パラメータを除いた文字列を、HMAC-SHA1形式に変換したハッシュ値
<パラメータの指定方法(要点のみ記載)>
・oauth_signature
//Access token取得で作成した方法と基本的には同じ
//異なる点としてはHMAC-SHA1ハッシュ変換で使用するキーにRequest tokenのoauth_token_secretから
//Access tokenのoauth_token_secretに変更
String sSignatureSource = 'GET&
							http%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fhome_timeline.xml&
							oauth_consumer_key%3D【アプリ登録画面に表示されたConsum key】%26
							oauth_nonce%3D【リクエスト時に再作成するnonce文字列】%26
							oauth_signature_method%3DHMAC-SHA1%26
							oauth_timestamp%3D【リクエスト時に再取得するtimestamp文字列】%26
							oauth_token%3D【Access token】%26
							oauth_version%3D1.0%26
							source_screen_name%3D【ユーザ名】';

//アプリ登録画面で表示されたConsumer secretおよびAccess tokenを利用してHMAC-SHA1ハッシュ変換で使用するキーを作成
String sHashKey = 【アプリ登録画面に表示されたConsumer secret】+'&'+【Access tokenのoauth_token_secret】;

//上記で作成した2つの文字列を使用して、oauth_signatureの値を作成
Blob blbSignature = Crypto.generateMac('HMacSHA1', Blob.valueOf(sSignatureSource),Blob.valueOf(sHashKey));
EncodingUtil.urlEncode(EncodingUtil.base64Encode(blbSignature), 'UTF-8');
<Twitterに通信するURLの例>
http://api.twitter.com/1/statuses/home_timeline.xml?
oauth_consumer_key=XXXXXXXXXXXXXXXXXXXXXX&
oauth_nonce=718a0e118eed5d6c4dfa628a13b41b5b&
oauth_signature_method=HMAC-SHA1&
oauth_timestamp=1317642919&
oauth_token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&
oauth_version=1.0&
source_screen_name=表示ユーザ&
oauth_signature=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

<Twitterからの戻り値(テキスト形式)>
タイムラインのXML文字列

ここまでが一連の流れとなります。AccessTokenについてはユーザ・アプリ単位で一意となり
無期限で使用できるため、予め使用ユーザが分かっていれば上記④までの初回のみでOKです。
※RequestTokenについては1度しか使用できないようです。

また上記のサンプルソースをこちらで公開しています。

9月 28th, 2011 | ave | No Comments Yet


先日フィリピンにて短期英語留学をしてきました。1週間と短い期間でしたが非常に有意義な時間を過ごすことができました。

昨今スカイプ経由のフィリピン人との英会話が話題になっていますが、実際に現地で学ぶタイプの学校もいくつかあります。 私は検索で見つけたCNE1 という学校に滞在しました。この体験記が同様の検討をされている皆様の参考になれば幸いです。

  • 教育スタイル
    CNE1の一日の流れは以下のようになります。
    07:00~07:30 朝食
    08:00~09:50 レッスン2時間(途中10分間の休息)
    10:00~11:50 レッスン2時間(途中10分間の休息)
    12:00~12:50 ランチタイム
    13:00~14:50 レッスン2時間(途中10分間の休息)
    15:00~15:50 インターカルチャルプログラム / フリースタイルクラス
    16:00~17:50 レッスン2時間(途中10分間の休息)
    18:00~19:30 ディナータイム
    19:30~ 自習・休息
    午後の2時間x2レッスンはとらないこともできます。私は1週間だったので大丈夫でしたが長期滞在の場合は8時間/日の授業はきつくなる場合があるようで、自分の体力、滞在時間、学習ペースとの相談になります。また土日はお休みで各々の時間を過ごします。休んだり勉強したりショッピングに行ったり海や山や観光地に行ったり自由です。
    私は発音・リスニングの授業に重点を置いていたのですが そのことを事前に伝えれば別のレッスンでも発音・リスニングを重点的に教えてくれます。先生達は生徒のレベルを的確に把握してガイドしてくれます。
    ほとんどの先生は20代女性で友達感覚で授業を受けられます。話題がレッスンから横道にそれる場合も多くそこから得るものも多かったです。また授業の課題もシリアスな物が多かったので(結婚、人種、IT技術、犯罪、等々)必然的に深いコミュニケーションをカジュアルに体験することができました。
  • 生活環境
    学校と宿泊場所と食堂は同じ場所にあり滞在中は生活のほとんどの時間を生徒/先生と共に過ごします。住み込みの先生も多く、校庭や自習室や食堂には常に誰かがいて全員が気軽に話しかけ合い、家族のような感覚でした。勉強以外にも、ふざけあったり楽器弾いたり歌ったり運動したり、と好き勝手に過ごせます。生活を共に過ごす中で授業以外の時間から得るものは非常に多かったです。代表の井坂さんはそのような気軽にコミュニケーションできる空間を意識的に作っておられるとのことでした。

    また、学校はマニラから車で3時間ほど走る片田舎にあります。もちろんバス等で移動はできるのですが、現地はある種の隔離空間になっています。それ故の高揚感や連帯感が学習環境として非常に有用に機能しているように感じました。

  • 生徒層
    時期とタイミングによって生徒層は異なりますが、私の滞在中は9割が日本人、8割が大学生といった感じでした。韓国人や社会人がもっと多いときもあるそうです。
  • 仕事環境
    肝心の仕事環境ですが、4Mの無線LANが用意されています。インターネット環境は重視されており滞在中にもどんどんアンテナが追加されていました。コンセントの数はそれほど多いわけではないのでACタップを持参すると良いかもしれません。私の場合はほとんどクラウド環境で仕事しているということもあり、ノートPC一台あればPC環境的困ることはありませんでした。

    空調も整備されており暑さも余り気にならず、むしろ日差しの下で外で仕事するのも新鮮で心地よかったです。また、現在新校舎を建設中で年内には完成しそうでした。個室や電源や空調が整備されてより仕事のしやすい環境になりそうです。

    電話については、日本のを持って行ってローミングで通話もできますし、ほとんどの時間を校内で過ごすので無線LAN経由のSkypeでも十分です。また多くの方は現地のプリペイド携帯を使っていました。

  • 訛り
    フィリピンでの英語学習ということで訛りを気にされる方も多いかと思います。私の印象としては人それぞれという感じで、訛りというよりも個々の先生の癖や学習環境に依存するような気がしました。基本的にはアメリカ英語を学習するにあたってはそれほど支障にはなりませんでした。
  • 今後に期待する点
    唯一予想と違った点として、私の場合は完全に日本語を断絶する環境を求めていたのですが、ほとんどの生徒は日本人だったため生活の中で日本語を話すことができてしまうのが残念な点です。「English Speaking Only」というラベルを胸に貼ったりみんな色々工夫はしています。ただ次はもう少し長期で完全な日本語断絶環境にも挑戦してみたいと思っています。
  • まとめ
    代表の井坂さんはインターネット業界出身で、1年半前からCNE1を始められました。非常にエネルギッシュな方で、ネットの世界で起きているさまざまな新しい考え方の潮流、フラット化/民主化/クラウド化などを別の業界にも応用したい、その一つがフィリピン英会話とおっしゃっておりました。その戦略は非常に的を射ているように感じます。

    多くの日本企業が英語を重視する中で、『TOEIC』で一定スコアをとるまでフィリピン英語学校に缶詰、というネット企業も出てきていると聞きました。地理的、経済的なメリットを活かし仕事も十分に両立可能なフィリピン英会話は今後も更に発展するのではないかと思います。

ガジェット通信さんに寄稿させて頂きました。

9月 7th, 2011 | ave | No Comments Yet

連載第3回です。

TechTarget – おススメForce.comアプリ紹介【第3回】 Webサイト構築を支援するForce.comアプリケーション

ぜひご覧ください!

9月 5th, 2011 | ave | 1 Comment

7月に注文していたChromebookがやっと届きました。購入してきてくれたまめこさんありがとう!

9月に日本でも販売開始するらしいですが、これは米国で販売されているサムスンのWifiモデルです。これは米Amazon経由だったようですが、日本では企業向け月額プランが開始するようなのでどんな流通で販売されるのでしょうかね。期待です。

8月 2nd, 2011 | ave | No Comments Yet

まだまだ募集してます、クラウドシステム開発プログラマ。特に以下の経験者大歓迎です。

  • プロジェクトマネジメント経験
  • AJAX開発経験
  • その他Web開発経験

詳細はこちら:
http://uhuru.co.jp/recruit/index.html#cs_engineer

今年度で社員数は倍増し現在約40名となりました。秋にはオフィス拡張のために引っ越しを行います。

クラウドに興味のある方、今までとはひと味違った業務システム開発をしてみたい方、Web技術の新しい可能性を追求してみたい方、ご応募お待ちしてます!

7月 29th, 2011 | ave | No Comments Yet

前回の海外レポートに続いて、今度は日本国内のレポート。NTTレゾナントさんとループスコミュニケーションさんが実施されたようです。

参考:第3回「企業におけるソーシャルメディア活用状況」に関する調査結果

総括としては以下のような感じ。

  • 5割の企業がYouTube、ブログを活用、Twitterは4割が活用
  • 広報やキャンペーンでの活用が中心、ソーシャルメディアは企業のPR手段の一つ
  • 5割以上はチーム人数が3人、従業員規模の大きさに従ってチーム体制整備が進む
  • 運用上の課題は、営業成果への貢献、人材不足、コンテンツ準備
  • 6割が自前でソーシャルメディア活用環境を整備、今後は人的トレーニングが課題
  • 今後活用したいソーシャルメディアは、Twitter、Facebook、YouTube

現時点ではまだブログ、Youtubeの活用割合が高いようですが、今後はTwitter、Facebookへの活用意欲が非常に高いようです。また、わずかですがGree、Mobageもポイントを伸ばしています。Twitterがほぼスタンダードになっている海外状況よりも少し遅れている印象です。

今後の課題としては、「ネタ不足」「効果が見えない」ということが挙げられています。効果に関してはツール側やマーケ側で様々な指標は設けられていますが、導入する業務によって求められる成果が異なるためまだ標準化がされていない気がします。