Download presentation
Presentation is loading. Please wait.
Published byCharla Pitts Modified over 9 years ago
2
OpenSocial Kevin Marks Chris Chabot
3
Agenda Introduction - What is OpenSocial Building an OpenSocial Application Best Practices Kinds of container Becoming an OpenSocial container Netlog Presentation
11
Why do we have so many users in Beverly Hills and Schenectady ?
12
Why do we have so many users in 90210 and 12345 ?
14
The problem
15
The solution
18
Portable Contacts REST API for Person and Contacts Compatible with OpenSocial http://portablecontacts.net
22
How to build an OpenSocial application The Basics Chris Chabot
23
An OpenSocial Application HTML Javascript CSS Gadget XML
24
Understanding the Gadget XML <![CDATA[ function init(){ alert("hello world"); } gadgets.util.registerOnLoadHandler(init); ]]>
25
Retrieve Friend Information function getFriendData() { var req = opensocial.newDataRequest(); req.add(req.newFetchPersonRequest(VIEWER), 'viewer'); req.add(req.newFetchPeopleRequest(VIEWER_FRIENDS), 'viewerFriends'); req.send(onLoadFriends); } function onLoadFriends(response) { var viewer = response.get('viewer').getData(); var viewerFriends = response.get('viewerFriends').getData(); ///More code }
26
Persisting Data function populateMyAppData() { var req = opensocial.newDataRequest(); var data1 = Math.random() * 5; var data2 = Math.random() * 100; req.add(req.newUpdatePersonAppDataRequest( "VIEWER","AppField1", data1)); req.add(req.newUpdatePersonAppDataRequest( "VIEWER","AppField2", data2)); req.send(requestMyData); }
27
Fetching persisted data function requestMyData() { var req = opensocial.newDataRequest(); var fields = ["AppField1", "AppField2"]; req.add(req.newFetchPersonRequest( opensocial.DataRequest.PersonId.VIEWER),"viewer"); req.add(req.newFetchPersonAppDataRequest("VIEWER", fields), "viewer_data"); req.send(handleReturnedData); } function handleReturnedData(data) { var mydata = data.get("viewer_data"); var viewer = data.get("viewer"); me = viewer.getData(); var appField1 = mydata[me.getId()]["AppField1"]; ///More code }
28
Posting an Activity function postActivity(text) { var params = {}; params[opensocial.Activity.Field.TITLE] = text; var activity = opensocial.newActivity(params); opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH, callback); } postActivity("This is a sample activity, created at " + new Date().toString())
29
How to build an OpenSocial application Best Practices Chris Chabot
30
function response(data) { if (!data.hadError()) {... } else { if (data.get("req").hadError()) { alert(data.get("req").getErrorMessage()); } } else { alert('Unknown error occurred'); }; Best practices : Check for errors Both the request and sub-requests can have errors, use hadError() to check.
31
function request() { var req = opensocial.newDataRequest(); var params = {}; params[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] = [ opensocial.Person.Field.PROFILE_URL ]; req.add(req.newFetchPersonRequest( opensocial.DataRequest.PersonId.VIEWER, params), "req"); req.send(response); }; Best practices : Be specific Specify which fields you want to use: only ID, NAME and THUMBNAIL_URL are returned by default
32
var supportsAboutMe = opensocial.getEnvironment().supportsField( opensocial.Environment.ObjectType.PERSON, opensocial.Person.Field.ABOUT_ME ); if (gadgets.util.hasFeature('hi5')) { mediaItem.setField( hi5.ActivityMediaItemField.LINK, "http://linkurl"); } Best practices : Capability Discovery Check for supported features and fields
33
Best Practises : Use the container's cache function showImage() { imgUrl = 'http://foo.com/bar.png'; cachedUrl = gadgets.io.getProxyUrl(imgUrl); html = [' ']; document.getElementById('dom_handle').innerHTML = html.join(''); }; showImage(); Use the container's content cache Also check out o Content-Rewriter feature o Preloading o Using App Data as content cache
34
Best practises : Web development 101 Control the caching of your content, http headers: o Cache-Control o Last-Modified o Expires o E-Tag Reduce number of http requests o Combine JS and CSS files into one file o Combine images into single sprite + CSS positioning Use Google's AJAX libraries API o <script src="http://ajax.googleapis.com/.../prototype.js Other techniques: o GZip content o Minify JS and CSS o See YSlow!
35
Hosting your application Host it anywhere you want to, with any back-end Keep in mind: o Popular apps like iLike get > 200k req / minute peak o Means dealing with lots of scalability issues! o DB Sharding, memcache pools, server farms.. Why not use a cloud service like: o Google App Engine o Joyent.com o Amazon EC2
36
Specification http://opensocial.org/ http://groups.google.com/group/opensocial-and-gadgets-spec Code Samples and Tools http://code.google.com/opensocial http://code.google.com/p/opensocial-resources/ Getting started guide http://code.google.com/apis/opensocial/articles/tutorial/tutorial- 0.8.html Application Development Resources
37
Kinds of Containers Kevin Marks
38
Containers provide a social context OpenSocial separates application logic from social context an app sees user ids - the container makes them people Users understand the social contract of the containers Save apps and users from re-registration hell
39
Containers don’t choose users Containers set up the social model, users choose to join they grow through homophily and affinity Network effect can bring unexpected userbasesuserbases
40
OpenSocial gets you to all their users You don't have to pick a site to specialise for You get to spread through multiple friend groups You'll be surprised by where your users are so make sure you plan to localizelocalize
41
Not just Social Network Sites Social network sites - Profiles and home pages Personal dashboards Sites based around a Social Object Corporate CRM systems Any web site How do we abstract these out? Viewer + friends Owner + friends
42
Owner and Viewer are defined by Container The Application gets IDs and connections to other IDs
43
the Owner need not be a Person It could be an organisation or a social object
44
Kinds of container - Social network sites Profile pages o Owner is profile page owner o Viewer may not be known, may be owner or other member Home pages o Owner is Viewer (must be logged in to see) Examples MySpace Hi5 Orkut
45
Kinds of container - Personal dashboard like Home pages o Owner is Viewer (must be logged in to see) Friends may not be defined Example: iGoogle, My Yahoo
46
Kinds of container - Social Object site Pages reflect the object - movie, picture, product o Owner is the object o Owner friends are people connected to the object may be authors or fans o Viewer is looking at it, Viewer friends are people you may want to share with Example: Imeem is a bit like this - opportunity for sites like Flickr, YouTube
47
Kinds of container - CRM systems Pages reflect the customer o Owner is the customer o Owner friends are people connected to the customer may be your colleagues, or other customers o Viewer is you, Viewer friends are your colleagues or customers Example: Oracle CRM, Salesforce
48
Kinds of container - Any web site Owner is the site o Owner friends are site users Viewer is you, o Viewer friends are your friends who have visited this site Example: Google Friend Connect will enable this for any site
49
Social Custodians
53
Becoming an OpenSocial Container Chris Chabot
54
Becoming an OpenSocial Container Question: o How do you become an OpenSocial container? Answer: o The Apache incubator project “Shindig” serves this purpose!
55
What is Shindig ? Open source reference implementation of OpenSocial & Gadgets specification An Apache Software Incubator project Available in Java & PHP http://incubator.apache.org/shindig It’s Goal: “Shindig's goal is to allow new sites to start hosting social apps in under an hour's worth of work"
56
Introduction to Shindig Architecture Gadget Server Social Data Server Gadget JavaScript
57
Gadget Server
58
Social Server
59
Implementing Shindig - PHP Integrate with your own data sources o People Service o Activities Service o App Data Service class MyPeopleService implements PeopleService {... } class MyAppDataService implements AppDataService {... } class MyActivitiesService implements ActivitiesService {... }
60
Implementing Shindig - PHP Implement functions function getActivities($ids) { $activities = array(); $res = mysqli_query($this->db, ”SELECT…"); while ($row = @mysqli_fetch_array($res,MYSQLI_ASSOC)){ $activity = new Activity($row['activityId'], $row['personId']); $activity->setStreamTitle($row['activityStream']); $activity->setTitle($row['activityTitle']); $activity->setBody($row['activityBody']); $activity->setPostedTime($row['created']); $activities[] = $activity; } return $activities; }
61
Implementing Shindig - Java import org.apache.shindig.social.opensocial.ActivitiesService; public class SQLActivitiesService implements ActivitiesService { private SQLDataLayer sqlLayer; @Inject public SQLActivitiesService(SQLDataLayer sqlLayer) { this.sqlLayer = sqlLayer;....
62
public ResponseItem > getActivities(List ids, SecurityToken token) { Map > allActivities = sqlLayer.getActivities(); List activities = new ArrayList (); for (String id : ids) { List personActivities = allActivities.get(id); if (personActivities != null) { activities.addAll(personActivities); } } return new ResponseItem >(activities); } Implementing Shindig - Java
63
Implementing - Make it a platform Add UI Elements o App Gallery o App Canvas o App Invites o Notification Browser Developer Resources o Developer Console o Application Statistics
64
Implementing - Scale it Out Prevent Concurrency issues Reduce Latency Add lots of Caching
65
Usage Example: Sample Container Static html sample container No effort to get up and running No database or features
66
Usage Example: Partuza Partuza is a Example social network site, written in PHP Allows for local gadget development & testing too Use as inspiration (or copy) for creating your own social site http://code.google.com/p/partuza
67
OpenSocial for intranet, portals Sun Microsystems Socialsite: Shindig + gadget based UI written in Java Open Source https://socialsite.dev.java.net/ https://socialsite.dev.java.net/ Upcoming from Impetus Zest: Shindig + Drupal (PHP) Zeal: Shindig + Liferay (Java)
68
Becoming a Container - Summary Become an OpenSocial Container o Get Shindig (PHP or Java) http://incubator.apache.org/shindig/ http://incubator.apache.org/shindig/ o Look at examples & documentation http://www.chabotc.com/gdd http://www.chabotc.com/gdd o Implement Services o Add UI o Scale it out Get involved, join the mailing list!
69
® friendster Who's part of OpenSocial? > 390 Million reached!
70
Learn more at code.google.com
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.