61
1 Clouds and Web2.0 II: Case Study and Tutorial CTS08 Tutorial Hyatt Regency Irvine California May 19 2008 Geoffrey Fox, Marlon Pierce Community Grids Laboratory, School of informatics Indiana University http://www.infomall.org/multicore [email protected] , http://www.infomall.org

Using Google's GData API

Embed Size (px)

Citation preview

Page 1: Using Google's GData API

11

Clouds and Web2.0II: Case Study and Tutorial

CTS08 Tutorial Hyatt Regency Irvine California

May 19 2008

Geoffrey Fox, Marlon PierceCommunity Grids Laboratory, School of informatics

Indiana University

http://www.infomall.org/multicore [email protected], http://www.infomall.org

Page 2: Using Google's GData API

Polar Grid: A Web 2.0 Case Study

Using Microformats, GeoRSS, REST, and KML

Slides from Yu Ma

Page 3: Using Google's GData API

More Detailed Information

• See Marie’s blog: http://tethealla.blogspot.com/

• We use blogs in the lab extensively as lab books.

Page 4: Using Google's GData API
Page 5: Using Google's GData API

PolarGrid Datasets• A typical processed dataset consists of:

– One plain text header file describing the overall system and metadata of the particular chunk of measurements.

– Multiple JPG images processed from the corresponding raw data.

– Collection timestamp and fundamental properties such as waveform and transmitting (TX) /receiving (RX) antenna IDs are embedded in file names.

• Images are processed by Kansas University’s Matlab-based code, GOAP

Page 6: Using Google's GData API

Approaches• Convert unstructured metadata description

into microformats.• Construct a relational database to enable fast

and dynamic queries.• Provide geographic annotation embedded into

web feeds that can be plotted by Google Maps and Google Earth

• Technologies: – GeoRSS: RSS syndication with geo-location – Microformats: extensions to XHTML

Page 7: Using Google's GData API

Microformat Conversion• Microformats capture “semantic” metadata

information in XHTML format.• Principals for converted microformats:

– Simple: capture the most basic information unit.– Reusable: capture shared features among data.– Composable: when combined, can reflect more complex

relationships among data. • Most of our microformat classes are prefixed with

“pg:” denoting the PolarGrid project namespace, except when existing generic ones such as the geo microformat are used.

Page 8: Using Google's GData API

How To Extend XHTML

• Use either <div> or <span> tags. • Display of these tags can be controlled with

style sheets• You can also dynamically control these with

JavaScript.• Next generation of browsers will have built-in

support for well-known microformats such as hCard.

Page 9: Using Google's GData API

Simple Example: Geo Format

<span class="geo"> <span class="longitude">-2.193</span> <span class="latitude">52.686</span></span>

Page 10: Using Google's GData API

Polar Grid Microformat Examples

• Simple descriptions:<span class="pg:radar-type">MCRDS</span>

• Measurements with unit:<span class="pg:delay">

<span class="pg:value">2.5</span><span class="pg:unit">us</span>

</span>

Page 11: Using Google's GData API

Microformat Examples

• Identification for cross-references:<span class="pg:waveform”>

<span class="pg:id">1</span></span>

• Commonly shared features: (e.g. both TX and RX antennas record same kind of information) <span class="pg:antenna"><span class="pg:id">0</span><span

class="pg:type">TX/RX</span><span class="pg:attenuation">0</span>

</span>

Page 12: Using Google's GData API

Microformat Examples

• Structured collections/Arrays:<span class="pg:antenna-array"><span

class="pg:array-size">2</span><span class="pg:antenna”><span class="pg:id">0</span><span class="pg:type">TX</span><span class="pg:attenuation">0</span></span><span

class="pg:antenna”><span class="pg:id">1</span> <span

class="pg:type">TX</span> <span class="pg:attenuation">0</span></span>

</span>

Page 13: Using Google's GData API

Microformat Examples

• Complex objects: (e.g. spatial and temporal information that uniquely defines a processed data chunk)<span class="pg:data-chunk"><span

class="pg:name">Start/Stop</span><span class="pg:utc-timestamp">1202755351.892651</span><span class="geo">

<span class="longitude">-2.193</span> <span class="latitude">52.686</span></span>

</span>

Page 14: Using Google's GData API

GeoRSS-Simple Embedded Atom Feed

<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"

xmlns:georss="http://www.georss.org/georss"> <title>PolarGrid Expedition</title> <id>tag:pg3.ucs.indiana.edu,2008:polargrid-expedition-2008-05</id> <updated>2008-05-11T02:02:54Z</updated> <author> <name>Polar Grid</name> </author> <link type="application/atom+xml" rel="self"

href="http://pg3.ucs.indiana.edu/cgi-bin/getPolarGridFeed"/>

Page 15: Using Google's GData API

GeoRSS-Simple Embedded Atom Feed

<entry> <title>Data Chunk: 2008-03-11 11:55:41</title> <id>tag:pg3.ucs.indiana.edu,2008:polargrid expedition-2008-05-

262</id> <updated>2008-03-11T11:55:41Z</updated> <content type="html">

… (data chunk information described in microformats) … </content> <georss:point>77.585957 -52.448461</georss:point> <georss:point>77.580976 -52.435148</georss:point> </entry></feed>

Page 16: Using Google's GData API

Google RSS Feed Reader

Page 17: Using Google's GData API

Google Maps

Page 18: Using Google's GData API

Corresponding KML<?xml version="1.0" encoding="UTF-8"?><kml xmlns="http://earth.google.com/kml/2.2"><Document> <name>PolarGrid Expedition</name> <Placemark id="tag:pg3.ucs.indiana.edu,2008:polargrid-expedition-2008-05-

262”> <name>Data Chunk: 2008-03-11 11:55:41</name> <description><![CDATA[ … (data chunk information described in microformats) … ]]></description> <Point><coordinates>-52.448461,77.585957</coordinates></Point> <Point><coordinates>-52.435148,77.580976</coordinates></Point></Placemark></Document></kml>

Page 19: Using Google's GData API

Google Earth and KML

Page 20: Using Google's GData API

Web 2.0 Lessons

• Web 2.0 approaches can be applied to management of scientific information.

• With the right choices, you get a lot for free.• Microformats: simple ways to encode name-

value pairs, build up semantic descriptions.• GeoRSS: orders data by both time and space

– Works in all standard RSS/Atom readers.– Google Maps supports natively

Page 21: Using Google's GData API

Web 2.0 Tutorial Map

Page 22: Using Google's GData API

Browser +JavaScript Libraries

Browser + JavaScript Libraries

Browser +JavaScript Libraries

Blogs, Calendars, Docs, etc

Social Gadget Containers

Gadgets, Gadget Aggregators

Facebook

Facebook AppsServer-SideGdata Apps

User Layer

System Cloud Layer

AJAX, JSON, REST, RSS

SOAP, REST, RSS

Page 23: Using Google's GData API

Map Key• Red blocks represent browsers and things that run in them

(JavaScript).– This is the “user” level.– Client side mashups

• Green blocks represent Web servers and their applications.– This is the “developer” level.– Server-side mashups.– These can run on any hosting environment: your web server, Amazon

EC2, Google GAE, etc. • Blue blocks represent third party services.

– This is the “system cloud” layer.• Arrows represent network communications.

– Everything goes over HTTP– REST, AJAX: communication patterns. – RSS, ATOM, JSON, SOAP: message format.

Page 24: Using Google's GData API

Using Google’s GData API

How to Write Server-Side Mash-Ups

Page 25: Using Google's GData API

GData: the API to Google Services• Google provides an extensive set of online services with well-known

user interfaces.– Docs– Spreadsheet– YouTube– Blogger/Blogspot– Calendar – Picasso Photo Sharing– GMail

• These have programming interfaces as well as user interfaces.– Server side: Java, .NET, PHP, Python– Client side: JavaScript

• Client interfaces include visual components suitable for mash-ups• Server-side APIs don’t include visual components but do allow you to

make server-side mash-ups.

Page 26: Using Google's GData API

Server-Side Mash-Up Use Case• Imagine you have a Web service that runs a large parallel finite

element code.– Output can include images, movies, output files, metadata, etc.– Your web service manages the interaction with the queuing system

(another topic…) • With a server-side mash-up, your Web Service can

– Post status information about your jobs (“Step 521 Completed!”) on your blog.

– Post URLs pointing to your output files on your blog.– Upload your visualizations to Picasso and YouTube (and post links).– Generate RSS/Atom feeds of the above.– Post results to Google Calendar

• We’ll look at some Java examples.

Page 27: Using Google's GData API

Getting Started with GData • Create a Blog, make sure you can login to YouTube, etc.• You will need a clientID and associated developer key.

– Get these from http://code.google.com/apis/base/signup.html.• Get the Java code

– http://code.google.com/p/gdata-java-client/downloads/list• See any number of Google examples

– http://code.google.com/apis/base/javadevguide.html• One trick: You can get your blogger ID by examining the your Blog’s Atom

feed. – It will be in the header and look something like this:

<id>tag:blogger.com,1999:blog-19457310</id> – The blog ID to use in the code below would be 19457310 in this example.

• The full working example is here– http://communitygrids.blogspot.com/2008/03/googles-gdata-java-api.html– We will simplify for pedagogical reasons.

Page 28: Using Google's GData API

Posting Results to Your Blogspot BlogString userName="[email protected]";String password= "qwerty";String content=“…”;

GoogleService myService=new GoogleService("blogger","");

myService.setUserCredentials(userName,password);

Entry myEntry = new Entry();myEntry.setTitle(new PlainTextConstruct(title));myEntry.setContent(new PlainTextConstruct(content));

URL postUrl = new URL("http://www.blogger.com/feeds/" + blogID + "/posts/default");myService.insert(postUrl, myEntry);

Create the entry to insert

Login in

Replace these with your values

Insert the new entry using REST’s POST

Page 29: Using Google's GData API

Getting a YouTube FeedString feedUrl="http://gdata.youtube.com/feeds/api/videos/";String scarFace5sec="http://gdata.youtube.com/feeds/api/videos/egwB7hVIIEc";

YouTubeService service = new YouTubeService(clientID, developer_key);service.setUserCredentials(userName,password);

VideoFeed videoFeed =youTubeService.getFeed(new URL(feedUrl),VideoFeed.class);

VideoEntry videoEntry = youTubeService.getEntry(new URL(scarFace5sec),VideoEntry.class);

//Loop over feed entries and display.String feedContent=

"Title: " + videoEntry.getTitle().getPlainText()+”";feedContent+=videoEntry.getMediaGroup().

getDescription().getPlainTextContent()+”";

Page 30: Using Google's GData API

Posting To Google CalendarCalendarService calService=new CalendarService(clientID);calService.setUserCredentials(userName,password);URL postUrl =new URL("http://www.google.com/calendar/feeds/"+userName+"/private/full");

CalendarEventEntry myEntry = new CalendarEventEntry();myEntry.setTitle(new PlainTextConstruct(titleOfEvent));myEntry.setContent(new PlainTextConstruct(contentToPost));

DateTime startTime = new DateTime(new Date());When eventTimes = new When();eventTimes.setStartTime(startTime);myEntry.addTime(eventTimes);CalendarEventEntry insertedEntry = calendarService.insert(postUrl, myEntry);

CalendarEventEntry myEntry2 = new CalendarEventEntry();String now=(new Date()).toString();myEntry2.setContent(new PlainTextConstruct("Test post at "+now));myEntry2.setQuickAdd(true);

// Send the request and receive the response:CalendarEventEntry insertedEntry2 =calendarService.insert(postUrl, myEntry2);

Create the event time and insert

Create a new Calendar entry

Log in to the calendar service

An alternative way to post the entry

Page 31: Using Google's GData API

Some Other Things You Can Do with GData Server Code

• YouTube– Search movies by keyword tag, “related”, categories– Upload and download movies.– Put movies into collections

• Calendar– Retrieve events as RSS feed

• Spreadsheet– Remotely retrieve and insert or change row and cell data.– Use structured queries to retrieve data ranges.– Remotely invoke batch operations

Page 32: Using Google's GData API

Making FaceBook Applications

Using Facebook as a backend service.

Page 33: Using Google's GData API

Full Examples and More Detailed Notes

• PHP and JavaScript notes– http://communitygrids.blogspot.com/2008/02/

quick-facebook-javascript-api-notes.html

• JavaScript example: – http://communitygrids.blogspot.com/2008/02/

little-more-jsfacebook-hacking.html

Page 34: Using Google's GData API

Why Use FaceBook as a Portal?• Because it has 10’s of millions of users.

– The largest Web 2.0-style Web portal • Easy to create Social Networks: groups of

friends and share applications, communicate, share information, etc.– And more importantly, tools for building and

managing these networks• Can leverage many third party applications

– For example, photo albums– Of course many of them are trivial, silly

Page 35: Using Google's GData API

FaceBook APIs• These come in two flavors

– Embedded: make your application available through FaceBook.

• PHP APIs– Embedding: use Facebook authentication and social

network data in your application.• JavaScript API

• In both cases, you run your application on your Web server.– You application do anything you can implement.– And you can query FaceBook for social network

information, user metadata.

Page 36: Using Google's GData API

Using The JavaScript API• Getting Started:

– You just need a Web server to host your application.– Register as a developer– Place Facebook’s xd_receiver.htm on your web server

• Make sure the relative path used is correct. • What will happen?

– Your page will run outside of Facebook.– Anyone loading your application will be directed to Facebook to login.– User is then redirected back to your page.

• Your application can make calls back to Facebook.• And you can do anything else you want.

– So you could embed this application in a portlet, interact with a local database,

– You can build your application with .NET or Java Server Faces, etc.

Page 37: Using Google's GData API

HTML Page Example

<textarea style="width:500px;height:300px;" id="_traceTextBox">

</textarea><script

src="http://static.ak.facebook.com/js/api_lib/FacebookApi.debug.js" type="text/javascript">var api = new FB.ApiClient('<your_key_here>',

'/xd_receiver.htm', null);…

</script>

Page 38: Using Google's GData API

Interact with FaceBookapi.requireLogin(function(exception) {

api.friends_get(null,getResults);var myinfo= 'last_name,

first_name,hometown_location,work_history,pic_small';

api.users_getInfo(api.get_session().uid,myinfo,getInfo);

});

Page 39: Using Google's GData API

Notes on Previous Slides

• The requireLogin, friends_get, and users_getInfo are FaceBook API calls.

• The getResults and getInfo methods are callback methods that I defined.– Shown in next slide

• The myinfo data structure is taken from the Facebook XML user profile.– http://wiki.developers.facebook.com/index.php/

Users.getInfo

Page 40: Using Google's GData API

Developer Defined Call-Back Functions

function getResults(result,exception) {Debug.dump(api.get_session().uid,’You');Debug.dump(result,’Your Friends’);

}

function getInfo(result,exception) {Debug.dump(result,’Your info');

}

These two methods receive the output returned from Facebook by the API’s friends_get() and users_getInfo() methods. The results are dumped to the text window but you can do more interesting things.

Page 41: Using Google's GData API

Output Info Dumped to Text Area

you: 627774031Your friends: {Array}[Deleted]

Your Info: {Array}[0]: {Object}first_name: Marlonhometown_location: {Object}city:state:country:zip:last_name: Piercepic_small: http://profile.ak.facebook.com/profile6/1797/98/t627774031_2463.jpguid: 627774031work_history: {Object}

User’s Facebook ID and the ID numbers of his friends

User’s profile metadata. Note some fields are strings, some areArrays, and some are structured objects of strings.

Page 42: Using Google's GData API

Facebooks’ Query Language

• All of the FaceBook API is basically a set of wrappers around their SQL like FQL query language. So you can, if you prefer, make custom methods out of FQL query strings. var myQuery='SELECT name FROM user WHERE uid='+api.get_session().uid;

api.fql_query(myQuery, getFQLResponse);

getFQLResponse() is a developer-written callback function

Page 43: Using Google's GData API

Working with Facebook Groups

• To list information about groups you are a member of, use the following. – You can replace the value of uid with any UID you

know.– 18629081888 is the Group ID for the Open Grid

Forum’s uninteresting Facebook group

api.groups_get(api.get_session().uid,null,getGroups);

api.groups_getMembers(18629081888,getGroupMembers);

Page 44: Using Google's GData API

More Information

• The JavaScript documentation is available from here– http://wiki.developers.facebook.com/index.php/

JavaScript_Client_Library• It is pretty minimal, but it is essentially the

same as the better documented PHP API.– Replace PHP’s "." with a "_". – So PHP’s users.getInfo becomes users_getInfo(...)

in JavaScript.

Page 45: Using Google's GData API

Open Social API and Gadgets

Page 46: Using Google's GData API

What Is a Gadget?

Simple gadgets for getting a Grid proxy credential and running remote commands. Both run on my own Web server.

Page 47: Using Google's GData API

Gadget Definition

• This XML page is web accessible via http://156.56.104.143:8080/GTLAB/MyProxyGadget.xml

• This URL points to the actual application (written in JSF)• Google uses an HTML IFrame to load the page.• You can also use content type=“html” for more integrated

applications.– For example, you can send messages between gadgets in the

client.

<?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs title="MyProxy Gadget Example" scrolling="true" height="500"/> <Content type="url" href="http://156.56.104.143:8080/GTLAB/examples/MyProxyExample.jsf"> </Content> </Module>

Page 48: Using Google's GData API

Gadgets and Open Social• Open Social is a consortium of Facebook’s major

competitors.– Orkut, MySpace, Hi5, LinkedIn, Friendster, etc.

• The Open Social API has two parts– JavaScript libraries for building social gadgets.

• Must run in a gadget container (server)– REST APIs for exchanging data between container servers.

• The ideas:– JS APIs let you make portable gadgets that will work in

different containers (Hi5LinkedIn) but data will be different.

– REST will let you export/import data.

Page 49: Using Google's GData API

Getting Started• You need a Gadget container to host your gadgets.

– LinkedIn is notably selective about the gadgets it will host.• Orkut provides a sandbox, but you have to upload your

gadgets.• Apache Shindig is an extremely simple Java-based

container.– De facto reference implementation of Open Social– Not suitable for production by a long ways.– But it will work on an air plane.

• Shindig is something of a moving target.– My February notes were obsolete…

Page 50: Using Google's GData API

Getting Started with Shindig• Visit the Web site for information

– http://incubator.apache.org/shindig• Check out the code with SVN

– mkdir $HOME/shindig; cd shindig– svn co http://svn.apache.org/repos/asf/incubator/shindig/trunk/

• Build and run it with Apache Maven– Run “mvn” from $HOME/shindig/– Run “mvn -Prun” from $HOME/shindig/java/server

• Point browser to http://localhost:8080/gadgets/files/container/sample1.html and look through other samples. – You can also load these HTML files using file:// if you don't want to run the

Jetty server.• Periodically check for updates and rebuild

– svn update• The READMEs have better/more up-to-date information than the website.

Page 51: Using Google's GData API

What Do You Get?

• Shindig actually has two major parts:– A container that can run social gadgets

• This must have access to your user and social network database.

– A gadget aggregator that displays gadgets• Runs the layout manager.• Think of this as your own iGoogle server.

• Access the gadget container – http://localhost:8080/gadgets/files/

samplecontainer/samplecontainer.html

Page 52: Using Google's GData API

The gadget can be displayed in your http://localhost:8080 display container.

The gadget is actually served remotely. This is the module definition.

Page 53: Using Google's GData API

<link rel="stylesheet" href="gadgets.css"><script type="text/javascript" src="../../js/rpc.js?c=1&debug=1"></script><script type="text/javascript" src="cookies.js"></script><script type="text/javascript" src="util.js"></script><script type="text/javascript" src="gadgets.js"></script><script type="text/javascript" src="cookiebaseduserprefstore.js"></script>

Import JS Libraries into Container Page

Page 54: Using Google's GData API

var my = {};

my.gadgetSpecUrls = [ 'http://www.google.com/ig/modules/horoscope.xml', 'http://www.google.com/ig/modules/aue07otr.xml', 'http://www.labpixies.com/campaigns/todo/todo.xml'];

my.LayoutManager = function() { gadgets.LayoutManager.call(this);};

my.LayoutManager.inherits(gadgets.LayoutManager);

my.LayoutManager.prototype.getGadgetChrome = function(gadget) { var chromeId = 'gadget-chrome-' + gadget.id; return chromeId ? document.getElementById(chromeId) : null;};

Create Your Layout ManagerNote gadgets are loaded from remote hostcontainers.

Page 55: Using Google's GData API

my.init = function() { gadgets.container.layoutManager = new my.LayoutManager();};my.renderGadgets = function() { for (var i = 0; i < my.gadgetSpecUrls.length; ++i) { var gadget = gadgets.container.createGadget( {specUrl: my.gadgetSpecUrls[i]}); gadgets.container.addGadget(gadget); gadgets.container.renderGadget(gadget); }};

Initialize and Render

Page 56: Using Google's GData API

<body onLoad="my.init();my.renderGadgets()"> <h2>Sample: Dynamic Height</h2> <div id="gadget-chrome-0" class="gadgets-gadget-chrome"></div> <div id="gadget-chrome-1" class="gadgets-gadget-chrome"></div> <div id="gadget-chrome-2" class="gadgets-gadget-chrome"></div></body>

HTML Display

Shows the 3 Gadgets. As we saw, this will use “flow” layout and “chrome” styling.

Page 57: Using Google's GData API

Hosting Your Own Social Gadget

• Place your widget code here:– $HOME/shindig/javascript/samplecontainer/examples

• After compilation, these will be located here:– ./target/gadgets/files/samplecontainer/examples.

• These will be served up from– http://localhost:8080/gadgets/files/samplecontainer/

examples/myapp.xml

• Myapp.xml is the gadget definition we saw earlier.

Page 58: Using Google's GData API

http://localhost:8080/gadgets/files/samplecontainer/samplecontainer.html

Hello World Gadget in Container

User and his network of friends provided by the local container. “Hello” chosen based friend’s preferred

Uses flat XML file.

Page 59: Using Google's GData API

Shindig social network XML “database”. Real containers would use a real database.

OpenSocial API essentially lets you retrieve this sort of data.

Page 60: Using Google's GData API

my.gadgetSpecUrls = [ 'http://www.google.com/ig/modules/horoscope.xml', 'http://www.google.com/ig/modules/aue07otr.xml', 'http://localhost:8080/gadgets/files/samplecontainer/examples/SocialHelloWorld.xml'];

Page 61: Using Google's GData API

More Information

• See http://communitygrids.blogspot.com for more detailed information.

• Email: [email protected]