SlideShare a Scribd company logo
1 of 108
Download to read offline
Go Go Gadgets!
                           Building an OpenSocial Application



                           Mark Halvorson
                           Community Member, OpenSocial Foundation Board
                           Chief Imagineer, Atlassian Software

                           Email: mark.halvorson@atlassian.com
                           Twitter: @halv0112




                                                                           1
Monday, December 6, 2010
What is an ‘Imagineer’?
Monday, December 6, 2010
!"                   #"


                           Take things that exist...
Monday, December 6, 2010
...and make something different.




Monday, December 6, 2010
Monday, December 6, 2010
Agenda
          •What it is a Gadget
          •Why Atlassian chose OpenSocial
            • Application Portability
          •Why you should too!
            • Application Sharing




                                            6
Monday, December 6, 2010
What is OpenSocial?




                                7
Monday, December 6, 2010
Social Data Model




                              8
Monday, December 6, 2010
Web Service APIs




                             9
Monday, December 6, 2010
Gadgets




                           10
Monday, December 6, 2010
Our Problem




                           11
Monday, December 6, 2010
Before
          •Enterprise Apps are Silos
                                       FishEye
Source
Code




                                          JIRA
Issues
&
Tasks




                                       Confluence
Wiki




                                                                12
Monday, December 6, 2010
Emphasize Teams, Projects & Tasks over Tools




                                                         13
Monday, December 6, 2010
Emphasize Teams, Projects & Tasks over Tools




                                                         13
Monday, December 6, 2010
Emphasize Teams, Projects & Tasks over Tools




                                                         13
Monday, December 6, 2010
Emphasize Teams, Projects & Tasks over Tools




                                                         13
Monday, December 6, 2010
Too Many Dashboards




                                14
Monday, December 6, 2010
Too Many Dashboards




                                14
Monday, December 6, 2010
Cross-Product Sharing




                                  15
Monday, December 6, 2010
Integration with Non-Atlassian apps




                                                16
Monday, December 6, 2010
Solution: OpenSocial Gadgets




                                         17
Monday, December 6, 2010
Gadgets
            are a Great Solution for Dashboard




                                                 18
Monday, December 6, 2010
After
            Open standard for
            enterprise application
            connection


                           view
complete

                              project
                           single
acCvity


                                             19
Monday, December 6, 2010
Managers Do Email
            Not just about portals,
            or internal applications.



                           view
acCvity
&

                               status
                            create
issues

                                             20
Monday, December 6, 2010
Open Standards, Industry Support




                                             21
Monday, December 6, 2010
Why Write Gadgets?
          •They’re easy!

          •They use stable, widely accessible and understood
           technologies

          •Write once, display everywhere



                                                               22
Monday, December 6, 2010
The Obligatory Hello World Example




                                               23
Monday, December 6, 2010
The Obligatory Hello World Example




                                               23
Monday, December 6, 2010
Anatomy of a Gadget




                                24
Monday, December 6, 2010
Anatomy of a Gadget
          •XML Spec File
            • Metadata, HTML Content, and JavaScript




                                                       24
Monday, December 6, 2010
Anatomy of a Gadget
          •XML Spec File
            • Metadata, HTML Content, and JavaScript
          •Core JavaScript API
            • Access Preferences, Make Requests




                                                       24
Monday, December 6, 2010
Anatomy of a Gadget
          •XML Spec File
            • Metadata, HTML Content, and JavaScript
          •Core JavaScript API
            • Access Preferences, Make Requests
          •Gadget Features
            • Additional, Optional Capabilities & APIs




                                                         24
Monday, December 6, 2010
XML Spec File




                           25
Monday, December 6, 2010
<ModulePrefs>




                           26
Monday, December 6, 2010
<ModulePrefs>

                    <?xml version="1.0" encoding="UTF-8" ?>
                    <Module>
                      <ModulePrefs
                        title="JIRA Issues"
                        author="Atlassian"
                        thumbnail="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-
                    issues-thumbnail.png"
                        description="A list of recently created Issues">

                             <Require feature="minimessage" />
                             <Require feature="dynamic-height" />

                           </ModulePrefs>



                                                                                                         26
Monday, December 6, 2010
<ModulePrefs>

                    <?xml version="1.0" encoding="UTF-8" ?>
                    <Module>
                      <ModulePrefs
                        title="JIRA Issues"
                        author="Atlassian"
                        thumbnail="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-
                    issues-thumbnail.png"
                        description="A list of recently created Issues">

                             <Require feature="minimessage" />
                             <Require feature="dynamic-height" />

                           </ModulePrefs>



                                                                                                         26
Monday, December 6, 2010
<ModulePrefs>

                    <?xml version="1.0" encoding="UTF-8" ?>
                    <Module>
                      <ModulePrefs
                        title="JIRA Issues"
                        author="Atlassian"
                        thumbnail="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-
                    issues-thumbnail.png"
                        description="A list of recently created Issues">

                             <Require feature="minimessage" />
                             <Require feature="dynamic-height" />

                           </ModulePrefs>



                                                                                                         26
Monday, December 6, 2010
<UserPref>

                           <UserPref
                             name="show_date"
                             display_name="Show Dates?"
                             datatype="bool"
                             default_value="true"/>
                           <UserPref
                             name="show_summ"
                             display_name="Show Summaries?"
                             datatype="bool"
                             default_value="true"/>
                           <UserPref
                             name="num_entries"
                             display_name="Number of Entries:"
                             default_value="5"
                             required="true"/>
                                                                 27
Monday, December 6, 2010
<UserPref>

                           <UserPref
                             name="show_date"
                             display_name="Show Dates?"
                             datatype="bool"
                             default_value="true"/>
                           <UserPref
                             name="show_summ"
                             display_name="Show Summaries?"
                             datatype="bool"
                             default_value="true"/>
                           <UserPref
                             name="num_entries"
                             display_name="Number of Entries:"
                             default_value="5"
                             required="true"/>
                                                                 27
Monday, December 6, 2010
<UserPref>

                           <UserPref
                             name="show_date"
                             display_name="Show Dates?"
                             datatype="bool"
                             default_value="true"/>
                           <UserPref
                             name="show_summ"
                             display_name="Show Summaries?"
                             datatype="bool"
                             default_value="true"/>
                           <UserPref
                             name="num_entries"
                             display_name="Number of Entries:"
                             default_value="5"
                             required="true"/>
                                                                 27
Monday, December 6, 2010
<Content>

                      <Content type="html"><![CDATA[
                        <link rel="stylesheet"
                          href="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-
                    issues.css">

                           <div id="content_div"></div>

                        <script type="text/javascript"
                          src="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-
                    issues.js"></script>
                      ]]></Content>
                    </Module>




                                                                                                      28
Monday, December 6, 2010
<Content>

                      <Content type="html"><![CDATA[
                        <link rel="stylesheet"
                          href="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-
                    issues.css">

                           <div id="content_div"></div>

                        <script type="text/javascript"
                          src="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira-
                    issues.js"></script>
                      ]]></Content>
                    </Module>




                                                                                                      28
Monday, December 6, 2010
Views - DEFAULT view




                                 29
Monday, December 6, 2010
Views - DEFAULT view




                                 29
Monday, December 6, 2010
Views - DEFAULT view




                                 30
Monday, December 6, 2010
Views - DEFAULT view




                                 30
Monday, December 6, 2010
Views - CANVAS view




                                31
Monday, December 6, 2010
Views - CANVAS view




                                31
Monday, December 6, 2010
Views - DEFAULT view (in Gmail)




                                            32
Monday, December 6, 2010
Views - DEFAULT view (in Gmail)




                                            32
Monday, December 6, 2010
Views - CANVAS view (in Gmail)




                                           33
Monday, December 6, 2010
Views - CANVAS view (in Gmail)




                                           33
Monday, December 6, 2010
Views - Custom view




                                34
Monday, December 6, 2010
Wallboards
            Gadgets go beyond
            the
            JIRA Dashboard
            onto your wall!




                                35
Monday, December 6, 2010
Wallboards
            Gadgets go beyond
            the
            JIRA Dashboard
            onto your wall!




                                35
Monday, December 6, 2010
JavaScript

                    // Create minimessage factory
                    var msg = new gadgets.MiniMessage();
                    // Show a small loading message to the user
                    var loadMessage = msg.createStaticMessage("loading...");

                    // Get configured user prefs
                    var prefs = new gadgets.Prefs();
                    var showDate = prefs.getBool("show_date");
                    var showSummary = prefs.getBool("show_summ");
                    var numEntries = prefs.getInt("num_entries");

                    // Fetch issues when the gadget loads
                    gadgets.util.registerOnLoadHandler(fetchIssues);



                                                                               36
Monday, December 6, 2010
JavaScript

                    // Create minimessage factory
                    var msg = new gadgets.MiniMessage();
                    // Show a small loading message to the user
                    var loadMessage = msg.createStaticMessage("loading...");

                    // Get configured user prefs
                    var prefs = new gadgets.Prefs();
                    var showDate = prefs.getBool("show_date");
                    var showSummary = prefs.getBool("show_summ");
                    var numEntries = prefs.getInt("num_entries");

                    // Fetch issues when the gadget loads
                    gadgets.util.registerOnLoadHandler(fetchIssues);



                                                                               36
Monday, December 6, 2010
JavaScript

                    // Create minimessage factory
                    var msg = new gadgets.MiniMessage();
                    // Show a small loading message to the user
                    var loadMessage = msg.createStaticMessage("loading...");

                    // Get configured user prefs
                    var prefs = new gadgets.Prefs();
                    var showDate = prefs.getBool("show_date");
                    var showSummary = prefs.getBool("show_summ");
                    var numEntries = prefs.getInt("num_entries");

                    // Fetch issues when the gadget loads
                    gadgets.util.registerOnLoadHandler(fetchIssues);



                                                                               36
Monday, December 6, 2010
Requesting Data from Web Services
          •AJAX + DOM

          •OAuth

          •Request Proxy

          •

                                              37
Monday, December 6, 2010
38
Monday, December 6, 2010
39
Monday, December 6, 2010
40
Monday, December 6, 2010
41
Monday, December 6, 2010
gadgets io
                . .makeRequest )
                              (




                                   42
Monday, December 6, 2010
What Can You Call?
          •Any URL

          •XML and JSON are the most useful
          •




                                              43
Monday, December 6, 2010
Fetching Issues

                    function fetchIssues() {
                      var url = "http://jira.atlassian.com/sr/" +
                        "jira.issueviews:searchrequest-xml" +
                        "/temp/SearchRequest.xml?" +
                        "created%3Aprevious=-1w&resolution=-1" +
                        "&sorter/field=issuekey&sorter/order=DESC" +
                        "&sorter/field=created&sorter/order=DESC" +
                        "&tempMax=20";

                            var params = {};
                            params[gadgets.io.RequestParameters.CONTENT_TYPE] =
                              gadgets.io.ContentType.DOM;

                           gadgets.io.makeRequest(url, handleResponse, params);
                    }
                                                                                  44
Monday, December 6, 2010
Handling the Response

                    function handleResponse(obj) {
                      var domData = obj.data;

                           var jiraIssues = {
                               title : getTitle(domData),
                               items : getItems(domData)
                           };
                           renderJiraIssues(jiraIssues);

                           msg.dismissMessage(loadMessage);
                           gadgets.window.adjustHeight();
                    }




                                                              45
Monday, December 6, 2010
Handling the Response

                    function handleResponse(obj) {
                      var domData = obj.data;

                           var jiraIssues = {
                               title : getTitle(domData),
                               items : getItems(domData)
                           };
                           renderJiraIssues(jiraIssues);

                           msg.dismissMessage(loadMessage);
                           gadgets.window.adjustHeight();
                    }




                                                              45
Monday, December 6, 2010
An Example      Text
                              Real World Example...
                                   Text
Monday, December 6, 2010
An Example      Text
                              Real World Example...
                                   Text
Monday, December 6, 2010
An Example      Text
                              Real World Example...
                                   Text
Monday, December 6, 2010
An Example      Text
                              Real World Example...
                                   Text
Monday, December 6, 2010
An Example      Text
                              Real World Example...
                                   Text
Monday, December 6, 2010
An Example      Text
                              Real World Example...
                                   Text
Monday, December 6, 2010
The Goal




                     The Goal
                                47
Monday, December 6, 2010
The Result
                                  48
Monday, December 6, 2010
The Result
                                  48
Monday, December 6, 2010
Preferences
                                   49
Monday, December 6, 2010
Statistics




                           50
Monday, December 6, 2010
Let’s Take a Step Back.




                                         51
Monday, December 6, 2010
Q: What is the purpose of an application?




                                                      52
Monday, December 6, 2010
Q: What is the purpose of an application?
          •A: DO Something. Complete some process.




                                                      52
Monday, December 6, 2010
Anatomy of an Application


                           Context   Content   Ac(on




                                                       53
Monday, December 6, 2010
An Example
                               Gmail




                           Communica(on




                             Contacts
                               Mail



                            Read
Write
                              Reply




                                          54
Monday, December 6, 2010
Q: What is the purpose of a gadget?




                                                55
Monday, December 6, 2010
Q: What is the purpose of a gadget?
          •A: DO Something. Complete some process.




                                                     55
Monday, December 6, 2010
Gadget = Reusable
                           Mini‐ApplicaCon           Atomic
                                                   Unit
of
Work




                             Context               Context


                                             •or
                            Content                Content




                             Ac(on                  Ac(on




                                                                  56
Monday, December 6, 2010
Example - “Mini-Application”

                           JIRA
Comment
Gadget




                               JIRA‐1234



                                Users

                              Comment


                             Add
Comment




                                                 57
Monday, December 6, 2010
Example - Unit of Work

                           JIRA
Comment
Gadget




                                 Context



                                Users

                              Comment


                             Add
Comment




                                                 58
Monday, December 6, 2010
Example - Unit of Work

                           JIRA
Comment
Gadget




                                 Context



                                Users

                              Comment


                             Add
Comment




                                                 58
Monday, December 6, 2010
Lesson Learned over time:
          •Gadgets as “Units of Work” are...


            • Easier to build

            • Easier to use

            • Easier to reuse




                                               59
Monday, December 6, 2010
Composite Application
                                      Gadget    Gadget    Gadget



                                      Add’l

                           Context
                                     Context   Context   Context



                           Content   Content   Content   Content



                            Ac(on    Ac(on     Ac(on     Ac(on




                                                                   60
Monday, December 6, 2010
Example - Gmail
                             Google
CommunicaCon
ApplicaCon

                                                    Google
Talk
                           Communica(on

                                                    Presence

                              Gmail


                            Contacts                   IM
                              Mail


                           Read
Write              Read
Write
                             Reply                   Reply




                                                                  61
Monday, December 6, 2010
<demo>




                           62
Monday, December 6, 2010
Get Satisfaction




                             63
Monday, December 6, 2010
Gadgets?




                           64




Monday, December 6, 2010
Gadgets?

                           Gadget?   Gadget?




                                               64




Monday, December 6, 2010
65
Monday, December 6, 2010
Gadget!
   Gadget



                           Gadget




                                    65
Monday, December 6, 2010
Get Satisfaction
          powered by JIRA




                             66
Monday, December 6, 2010
Gadgets!




                           67
Monday, December 6, 2010
Gadgets!




                           67
Monday, December 6, 2010
Gadgets!




                           Gadget!
                           Gadget!
                                     67
Monday, December 6, 2010
68
Monday, December 6, 2010
68
Monday, December 6, 2010
</demo>




                           69
Monday, December 6, 2010
Summary - Why write gadgets?
          •Easy!
            • Simple web based technologies mean anyone can write a gadget.
          •Reusable!
            • Use in any OpenSocial Container. iGoogle, Gmail, JIVE, more every day.
          •Fun!
            • Thinking about applications as atomic units of work add a new dimension to
              application design.




                                                                                           70
Monday, December 6, 2010
Questions?
               Resources
                • http://atlassian.com/opensocial

                • http://www.opensocial.org

                • http://atlassian.com/classroom




                                                    71
Monday, December 6, 2010

More Related Content

Similar to Go! Go! Gadgets. Writing an OpenSocial Application

AtlasCamp 2010 - Marketing A Plugin
AtlasCamp 2010 - Marketing A PluginAtlasCamp 2010 - Marketing A Plugin
AtlasCamp 2010 - Marketing A Pluginalexlod
 
Fcc open-developer-day
Fcc open-developer-dayFcc open-developer-day
Fcc open-developer-dayTed Drake
 
Experiences Evolving a New Analytical Platform: What Works and What's Missing
Experiences Evolving a New Analytical Platform: What Works and What's MissingExperiences Evolving a New Analytical Platform: What Works and What's Missing
Experiences Evolving a New Analytical Platform: What Works and What's MissingCloudera, Inc.
 
Must-have Plugins for Confluence & JIRA - Atlassian Summit 2010
Must-have Plugins for Confluence & JIRA - Atlassian Summit 2010Must-have Plugins for Confluence & JIRA - Atlassian Summit 2010
Must-have Plugins for Confluence & JIRA - Atlassian Summit 2010Atlassian
 
5 Thing You're Not Doing, 4 Things You Should Stop Doing & 3 Things You Shoul...
5 Thing You're Not Doing, 4 Things You Should Stop Doing & 3 Things You Shoul...5 Thing You're Not Doing, 4 Things You Should Stop Doing & 3 Things You Shoul...
5 Thing You're Not Doing, 4 Things You Should Stop Doing & 3 Things You Shoul...Atlassian
 
Joshfire Factory: Building Apps for Billion of Devices
Joshfire Factory: Building Apps for Billion of DevicesJoshfire Factory: Building Apps for Billion of Devices
Joshfire Factory: Building Apps for Billion of DevicesFrancois Daoust
 
Atlassian User Group - September 2013
Atlassian User Group - September 2013Atlassian User Group - September 2013
Atlassian User Group - September 2013Sven Peters
 
Drupal - Changing the Web by Connecting Open Minds - Josef Dabernig
Drupal - Changing the Web by Connecting Open Minds - Josef DabernigDrupal - Changing the Web by Connecting Open Minds - Josef Dabernig
Drupal - Changing the Web by Connecting Open Minds - Josef DabernigDrupalCampDN
 
Future of Data Intensive Applicaitons
Future of Data Intensive ApplicaitonsFuture of Data Intensive Applicaitons
Future of Data Intensive ApplicaitonsMilind Bhandarkar
 
DSpace RoadMap 2011
DSpace RoadMap 2011DSpace RoadMap 2011
DSpace RoadMap 2011Tim Donohue
 
GateIn - Presented at Atlanta JUG on 1/19/2010
GateIn - Presented at Atlanta JUG on 1/19/2010GateIn - Presented at Atlanta JUG on 1/19/2010
GateIn - Presented at Atlanta JUG on 1/19/2010Wesley Hales
 
Google Developer Day 2010 Japan: Part 1: Google App Engine for Business の概要 P...
Google Developer Day 2010 Japan: Part 1: Google App Engine for Business の概要 P...Google Developer Day 2010 Japan: Part 1: Google App Engine for Business の概要 P...
Google Developer Day 2010 Japan: Part 1: Google App Engine for Business の概要 P...Google Developer Relations Team
 
Html5 new sword for interactive app
Html5 new sword for interactive appHtml5 new sword for interactive app
Html5 new sword for interactive appYohan Totting
 
Big Data @ Bodensee Barcamp 2010
Big Data @ Bodensee Barcamp 2010Big Data @ Bodensee Barcamp 2010
Big Data @ Bodensee Barcamp 2010c1sc0
 
JClouds at San Francisco Java User Group
JClouds at San Francisco Java User GroupJClouds at San Francisco Java User Group
JClouds at San Francisco Java User GroupMarakana Inc.
 
OOP/MM 2017: "Seven (More) Deadly Sins of Microservices"
OOP/MM 2017: "Seven (More) Deadly Sins of Microservices"OOP/MM 2017: "Seven (More) Deadly Sins of Microservices"
OOP/MM 2017: "Seven (More) Deadly Sins of Microservices"Daniel Bryant
 
Exploring UX Techniques and Practices 4 Product Development
Exploring UX Techniques and Practices 4 Product DevelopmentExploring UX Techniques and Practices 4 Product Development
Exploring UX Techniques and Practices 4 Product DevelopmentAriadna Font Llitjos
 
Implementing MongoDB at Shutterfly (Kenny Gorman)
Implementing MongoDB at Shutterfly (Kenny Gorman)Implementing MongoDB at Shutterfly (Kenny Gorman)
Implementing MongoDB at Shutterfly (Kenny Gorman)MongoSF
 

Similar to Go! Go! Gadgets. Writing an OpenSocial Application (20)

AtlasCamp 2010 - Marketing A Plugin
AtlasCamp 2010 - Marketing A PluginAtlasCamp 2010 - Marketing A Plugin
AtlasCamp 2010 - Marketing A Plugin
 
Fcc open-developer-day
Fcc open-developer-dayFcc open-developer-day
Fcc open-developer-day
 
Experiences Evolving a New Analytical Platform: What Works and What's Missing
Experiences Evolving a New Analytical Platform: What Works and What's MissingExperiences Evolving a New Analytical Platform: What Works and What's Missing
Experiences Evolving a New Analytical Platform: What Works and What's Missing
 
Must-have Plugins for Confluence & JIRA - Atlassian Summit 2010
Must-have Plugins for Confluence & JIRA - Atlassian Summit 2010Must-have Plugins for Confluence & JIRA - Atlassian Summit 2010
Must-have Plugins for Confluence & JIRA - Atlassian Summit 2010
 
Developing XWiki
Developing XWikiDeveloping XWiki
Developing XWiki
 
5 Thing You're Not Doing, 4 Things You Should Stop Doing & 3 Things You Shoul...
5 Thing You're Not Doing, 4 Things You Should Stop Doing & 3 Things You Shoul...5 Thing You're Not Doing, 4 Things You Should Stop Doing & 3 Things You Shoul...
5 Thing You're Not Doing, 4 Things You Should Stop Doing & 3 Things You Shoul...
 
Joshfire Factory: Building Apps for Billion of Devices
Joshfire Factory: Building Apps for Billion of DevicesJoshfire Factory: Building Apps for Billion of Devices
Joshfire Factory: Building Apps for Billion of Devices
 
Atlassian User Group - September 2013
Atlassian User Group - September 2013Atlassian User Group - September 2013
Atlassian User Group - September 2013
 
Drupal - Changing the Web by Connecting Open Minds - Josef Dabernig
Drupal - Changing the Web by Connecting Open Minds - Josef DabernigDrupal - Changing the Web by Connecting Open Minds - Josef Dabernig
Drupal - Changing the Web by Connecting Open Minds - Josef Dabernig
 
Future of Data Intensive Applicaitons
Future of Data Intensive ApplicaitonsFuture of Data Intensive Applicaitons
Future of Data Intensive Applicaitons
 
DSpace RoadMap 2011
DSpace RoadMap 2011DSpace RoadMap 2011
DSpace RoadMap 2011
 
GateIn - Presented at Atlanta JUG on 1/19/2010
GateIn - Presented at Atlanta JUG on 1/19/2010GateIn - Presented at Atlanta JUG on 1/19/2010
GateIn - Presented at Atlanta JUG on 1/19/2010
 
Google Developer Day 2010 Japan: Part 1: Google App Engine for Business の概要 P...
Google Developer Day 2010 Japan: Part 1: Google App Engine for Business の概要 P...Google Developer Day 2010 Japan: Part 1: Google App Engine for Business の概要 P...
Google Developer Day 2010 Japan: Part 1: Google App Engine for Business の概要 P...
 
Html5 new sword for interactive app
Html5 new sword for interactive appHtml5 new sword for interactive app
Html5 new sword for interactive app
 
Big Data @ Bodensee Barcamp 2010
Big Data @ Bodensee Barcamp 2010Big Data @ Bodensee Barcamp 2010
Big Data @ Bodensee Barcamp 2010
 
On Storing Big Data
On Storing Big DataOn Storing Big Data
On Storing Big Data
 
JClouds at San Francisco Java User Group
JClouds at San Francisco Java User GroupJClouds at San Francisco Java User Group
JClouds at San Francisco Java User Group
 
OOP/MM 2017: "Seven (More) Deadly Sins of Microservices"
OOP/MM 2017: "Seven (More) Deadly Sins of Microservices"OOP/MM 2017: "Seven (More) Deadly Sins of Microservices"
OOP/MM 2017: "Seven (More) Deadly Sins of Microservices"
 
Exploring UX Techniques and Practices 4 Product Development
Exploring UX Techniques and Practices 4 Product DevelopmentExploring UX Techniques and Practices 4 Product Development
Exploring UX Techniques and Practices 4 Product Development
 
Implementing MongoDB at Shutterfly (Kenny Gorman)
Implementing MongoDB at Shutterfly (Kenny Gorman)Implementing MongoDB at Shutterfly (Kenny Gorman)
Implementing MongoDB at Shutterfly (Kenny Gorman)
 

Recently uploaded

H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DaySri Ambati
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 

Recently uploaded (20)

H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 

Go! Go! Gadgets. Writing an OpenSocial Application

  • 1. Go Go Gadgets! Building an OpenSocial Application Mark Halvorson Community Member, OpenSocial Foundation Board Chief Imagineer, Atlassian Software Email: mark.halvorson@atlassian.com Twitter: @halv0112 1 Monday, December 6, 2010
  • 2. What is an ‘Imagineer’? Monday, December 6, 2010
  • 3. !" #" Take things that exist... Monday, December 6, 2010
  • 4. ...and make something different. Monday, December 6, 2010
  • 6. Agenda •What it is a Gadget •Why Atlassian chose OpenSocial • Application Portability •Why you should too! • Application Sharing 6 Monday, December 6, 2010
  • 7. What is OpenSocial? 7 Monday, December 6, 2010
  • 8. Social Data Model 8 Monday, December 6, 2010
  • 9. Web Service APIs 9 Monday, December 6, 2010
  • 10. Gadgets 10 Monday, December 6, 2010
  • 11. Our Problem 11 Monday, December 6, 2010
  • 12. Before •Enterprise Apps are Silos FishEye
Source
Code JIRA
Issues
&
Tasks Confluence
Wiki 12 Monday, December 6, 2010
  • 13. Emphasize Teams, Projects & Tasks over Tools 13 Monday, December 6, 2010
  • 14. Emphasize Teams, Projects & Tasks over Tools 13 Monday, December 6, 2010
  • 15. Emphasize Teams, Projects & Tasks over Tools 13 Monday, December 6, 2010
  • 16. Emphasize Teams, Projects & Tasks over Tools 13 Monday, December 6, 2010
  • 17. Too Many Dashboards 14 Monday, December 6, 2010
  • 18. Too Many Dashboards 14 Monday, December 6, 2010
  • 19. Cross-Product Sharing 15 Monday, December 6, 2010
  • 20. Integration with Non-Atlassian apps 16 Monday, December 6, 2010
  • 21. Solution: OpenSocial Gadgets 17 Monday, December 6, 2010
  • 22. Gadgets are a Great Solution for Dashboard 18 Monday, December 6, 2010
  • 23. After Open standard for enterprise application connection view
complete
 project single
acCvity
 19 Monday, December 6, 2010
  • 24. Managers Do Email Not just about portals, or internal applications. view
acCvity
&
 status create
issues 20 Monday, December 6, 2010
  • 25. Open Standards, Industry Support 21 Monday, December 6, 2010
  • 26. Why Write Gadgets? •They’re easy! •They use stable, widely accessible and understood technologies •Write once, display everywhere 22 Monday, December 6, 2010
  • 27. The Obligatory Hello World Example 23 Monday, December 6, 2010
  • 28. The Obligatory Hello World Example 23 Monday, December 6, 2010
  • 29. Anatomy of a Gadget 24 Monday, December 6, 2010
  • 30. Anatomy of a Gadget •XML Spec File • Metadata, HTML Content, and JavaScript 24 Monday, December 6, 2010
  • 31. Anatomy of a Gadget •XML Spec File • Metadata, HTML Content, and JavaScript •Core JavaScript API • Access Preferences, Make Requests 24 Monday, December 6, 2010
  • 32. Anatomy of a Gadget •XML Spec File • Metadata, HTML Content, and JavaScript •Core JavaScript API • Access Preferences, Make Requests •Gadget Features • Additional, Optional Capabilities & APIs 24 Monday, December 6, 2010
  • 33. XML Spec File 25 Monday, December 6, 2010
  • 34. <ModulePrefs> 26 Monday, December 6, 2010
  • 35. <ModulePrefs> <?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs title="JIRA Issues" author="Atlassian" thumbnail="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira- issues-thumbnail.png" description="A list of recently created Issues"> <Require feature="minimessage" /> <Require feature="dynamic-height" /> </ModulePrefs> 26 Monday, December 6, 2010
  • 36. <ModulePrefs> <?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs title="JIRA Issues" author="Atlassian" thumbnail="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira- issues-thumbnail.png" description="A list of recently created Issues"> <Require feature="minimessage" /> <Require feature="dynamic-height" /> </ModulePrefs> 26 Monday, December 6, 2010
  • 37. <ModulePrefs> <?xml version="1.0" encoding="UTF-8" ?> <Module> <ModulePrefs title="JIRA Issues" author="Atlassian" thumbnail="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira- issues-thumbnail.png" description="A list of recently created Issues"> <Require feature="minimessage" /> <Require feature="dynamic-height" /> </ModulePrefs> 26 Monday, December 6, 2010
  • 38. <UserPref> <UserPref name="show_date" display_name="Show Dates?" datatype="bool" default_value="true"/> <UserPref name="show_summ" display_name="Show Summaries?" datatype="bool" default_value="true"/> <UserPref name="num_entries" display_name="Number of Entries:" default_value="5" required="true"/> 27 Monday, December 6, 2010
  • 39. <UserPref> <UserPref name="show_date" display_name="Show Dates?" datatype="bool" default_value="true"/> <UserPref name="show_summ" display_name="Show Summaries?" datatype="bool" default_value="true"/> <UserPref name="num_entries" display_name="Number of Entries:" default_value="5" required="true"/> 27 Monday, December 6, 2010
  • 40. <UserPref> <UserPref name="show_date" display_name="Show Dates?" datatype="bool" default_value="true"/> <UserPref name="show_summ" display_name="Show Summaries?" datatype="bool" default_value="true"/> <UserPref name="num_entries" display_name="Number of Entries:" default_value="5" required="true"/> 27 Monday, December 6, 2010
  • 41. <Content> <Content type="html"><![CDATA[ <link rel="stylesheet" href="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira- issues.css"> <div id="content_div"></div> <script type="text/javascript" src="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira- issues.js"></script> ]]></Content> </Module> 28 Monday, December 6, 2010
  • 42. <Content> <Content type="html"><![CDATA[ <link rel="stylesheet" href="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira- issues.css"> <div id="content_div"></div> <script type="text/javascript" src="http://labs.atlassian.com/svn/GADGETS/trunk/jira-issues/basic/jira- issues.js"></script> ]]></Content> </Module> 28 Monday, December 6, 2010
  • 43. Views - DEFAULT view 29 Monday, December 6, 2010
  • 44. Views - DEFAULT view 29 Monday, December 6, 2010
  • 45. Views - DEFAULT view 30 Monday, December 6, 2010
  • 46. Views - DEFAULT view 30 Monday, December 6, 2010
  • 47. Views - CANVAS view 31 Monday, December 6, 2010
  • 48. Views - CANVAS view 31 Monday, December 6, 2010
  • 49. Views - DEFAULT view (in Gmail) 32 Monday, December 6, 2010
  • 50. Views - DEFAULT view (in Gmail) 32 Monday, December 6, 2010
  • 51. Views - CANVAS view (in Gmail) 33 Monday, December 6, 2010
  • 52. Views - CANVAS view (in Gmail) 33 Monday, December 6, 2010
  • 53. Views - Custom view 34 Monday, December 6, 2010
  • 54. Wallboards Gadgets go beyond the JIRA Dashboard onto your wall! 35 Monday, December 6, 2010
  • 55. Wallboards Gadgets go beyond the JIRA Dashboard onto your wall! 35 Monday, December 6, 2010
  • 56. JavaScript // Create minimessage factory var msg = new gadgets.MiniMessage(); // Show a small loading message to the user var loadMessage = msg.createStaticMessage("loading..."); // Get configured user prefs var prefs = new gadgets.Prefs(); var showDate = prefs.getBool("show_date"); var showSummary = prefs.getBool("show_summ"); var numEntries = prefs.getInt("num_entries"); // Fetch issues when the gadget loads gadgets.util.registerOnLoadHandler(fetchIssues); 36 Monday, December 6, 2010
  • 57. JavaScript // Create minimessage factory var msg = new gadgets.MiniMessage(); // Show a small loading message to the user var loadMessage = msg.createStaticMessage("loading..."); // Get configured user prefs var prefs = new gadgets.Prefs(); var showDate = prefs.getBool("show_date"); var showSummary = prefs.getBool("show_summ"); var numEntries = prefs.getInt("num_entries"); // Fetch issues when the gadget loads gadgets.util.registerOnLoadHandler(fetchIssues); 36 Monday, December 6, 2010
  • 58. JavaScript // Create minimessage factory var msg = new gadgets.MiniMessage(); // Show a small loading message to the user var loadMessage = msg.createStaticMessage("loading..."); // Get configured user prefs var prefs = new gadgets.Prefs(); var showDate = prefs.getBool("show_date"); var showSummary = prefs.getBool("show_summ"); var numEntries = prefs.getInt("num_entries"); // Fetch issues when the gadget loads gadgets.util.registerOnLoadHandler(fetchIssues); 36 Monday, December 6, 2010
  • 59. Requesting Data from Web Services •AJAX + DOM •OAuth •Request Proxy • 37 Monday, December 6, 2010
  • 64. gadgets io . .makeRequest ) ( 42 Monday, December 6, 2010
  • 65. What Can You Call? •Any URL •XML and JSON are the most useful • 43 Monday, December 6, 2010
  • 66. Fetching Issues function fetchIssues() { var url = "http://jira.atlassian.com/sr/" + "jira.issueviews:searchrequest-xml" + "/temp/SearchRequest.xml?" + "created%3Aprevious=-1w&resolution=-1" + "&sorter/field=issuekey&sorter/order=DESC" + "&sorter/field=created&sorter/order=DESC" + "&tempMax=20"; var params = {}; params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM; gadgets.io.makeRequest(url, handleResponse, params); } 44 Monday, December 6, 2010
  • 67. Handling the Response function handleResponse(obj) { var domData = obj.data; var jiraIssues = { title : getTitle(domData), items : getItems(domData) }; renderJiraIssues(jiraIssues); msg.dismissMessage(loadMessage); gadgets.window.adjustHeight(); } 45 Monday, December 6, 2010
  • 68. Handling the Response function handleResponse(obj) { var domData = obj.data; var jiraIssues = { title : getTitle(domData), items : getItems(domData) }; renderJiraIssues(jiraIssues); msg.dismissMessage(loadMessage); gadgets.window.adjustHeight(); } 45 Monday, December 6, 2010
  • 69. An Example Text Real World Example... Text Monday, December 6, 2010
  • 70. An Example Text Real World Example... Text Monday, December 6, 2010
  • 71. An Example Text Real World Example... Text Monday, December 6, 2010
  • 72. An Example Text Real World Example... Text Monday, December 6, 2010
  • 73. An Example Text Real World Example... Text Monday, December 6, 2010
  • 74. An Example Text Real World Example... Text Monday, December 6, 2010
  • 75. The Goal The Goal 47 Monday, December 6, 2010
  • 76. The Result 48 Monday, December 6, 2010
  • 77. The Result 48 Monday, December 6, 2010
  • 78. Preferences 49 Monday, December 6, 2010
  • 79. Statistics 50 Monday, December 6, 2010
  • 80. Let’s Take a Step Back. 51 Monday, December 6, 2010
  • 81. Q: What is the purpose of an application? 52 Monday, December 6, 2010
  • 82. Q: What is the purpose of an application? •A: DO Something. Complete some process. 52 Monday, December 6, 2010
  • 83. Anatomy of an Application Context Content Ac(on 53 Monday, December 6, 2010
  • 84. An Example Gmail Communica(on Contacts Mail Read
Write Reply 54 Monday, December 6, 2010
  • 85. Q: What is the purpose of a gadget? 55 Monday, December 6, 2010
  • 86. Q: What is the purpose of a gadget? •A: DO Something. Complete some process. 55 Monday, December 6, 2010
  • 87. Gadget = Reusable Mini‐ApplicaCon Atomic Unit
of
Work Context Context •or Content Content Ac(on Ac(on 56 Monday, December 6, 2010
  • 88. Example - “Mini-Application” JIRA
Comment
Gadget JIRA‐1234 Users
 Comment Add
Comment 57 Monday, December 6, 2010
  • 89. Example - Unit of Work JIRA
Comment
Gadget Context Users
 Comment Add
Comment 58 Monday, December 6, 2010
  • 90. Example - Unit of Work JIRA
Comment
Gadget Context Users
 Comment Add
Comment 58 Monday, December 6, 2010
  • 91. Lesson Learned over time: •Gadgets as “Units of Work” are... • Easier to build • Easier to use • Easier to reuse 59 Monday, December 6, 2010
  • 92. Composite Application Gadget Gadget Gadget Add’l
 Context Context Context Context Content Content Content Content Ac(on Ac(on Ac(on Ac(on 60 Monday, December 6, 2010
  • 93. Example - Gmail Google
CommunicaCon
ApplicaCon Google
Talk Communica(on Presence Gmail Contacts IM Mail Read
Write Read
Write Reply Reply 61 Monday, December 6, 2010
  • 94. <demo> 62 Monday, December 6, 2010
  • 95. Get Satisfaction 63 Monday, December 6, 2010
  • 96. Gadgets? 64 Monday, December 6, 2010
  • 97. Gadgets? Gadget? Gadget? 64 Monday, December 6, 2010
  • 99. Gadget! Gadget Gadget 65 Monday, December 6, 2010
  • 100. Get Satisfaction powered by JIRA 66 Monday, December 6, 2010
  • 101. Gadgets! 67 Monday, December 6, 2010
  • 102. Gadgets! 67 Monday, December 6, 2010
  • 103. Gadgets! Gadget! Gadget! 67 Monday, December 6, 2010
  • 106. </demo> 69 Monday, December 6, 2010
  • 107. Summary - Why write gadgets? •Easy! • Simple web based technologies mean anyone can write a gadget. •Reusable! • Use in any OpenSocial Container. iGoogle, Gmail, JIVE, more every day. •Fun! • Thinking about applications as atomic units of work add a new dimension to application design. 70 Monday, December 6, 2010
  • 108. Questions? Resources • http://atlassian.com/opensocial • http://www.opensocial.org • http://atlassian.com/classroom 71 Monday, December 6, 2010