SlideShare a Scribd company logo
Bastian Hofmann
ResearchGate GmbH

Mashing up JavaScript
Wtf?
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
• JavaScript Apps
• CORS and OAuth2
• Local Storage
• OEmbed and Caja
• WebSockets, ActivityStrea.ms and
  PubsubHubbub
• OExchange
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
Mashing up JavaScript
http://slideshare.net/bashofmann
https://github.com/bashofmann/statusnet_js_mashup
Let‘s write a JS App
History & Bookmarking
www.example.com#Page
http://sammyjs.org/
API Access
Mashing up JavaScript
Same Origin Policy
Cross-Origin Resource
       Sharing
Client                         Backend
client.net                     api.twitter.com

                 AJAX

      Access-Control-Allow-Origin: *




                        http://www.w3.org/TR/cors/
var html="<ul>";
for (var i=0; i < viewers.length; i++) {
   html += "<li>" + viewers[i].displayName
+ "</li>";
}
html += "<ul>";
document.getElementById("#div").innerHTML =
html;

             Where is the error?
Templates
Mustache.JS




} https://github.com/janl/mustache.js
var feed = [];
var app = Sammy('#main', function() {
    this.use(Sammy.Mustache, 'ms');
    this.get('#/', function() {
        this.trigger('getFeed');
    });
    ...
});

jQuery(function() {
    app.run('#/');
});
var feed = [];
var app = Sammy('#main', function() {
    this.use(Sammy.Mustache, 'ms');
    this.get('#/', function() {
        this.trigger('getFeed');
    });
    ...
});

jQuery(function() {
    app.run('#/');
});
var feed = [];
var app = Sammy('#main', function() {
    this.use(Sammy.Mustache, 'ms');
    this.get('#/', function() {
        this.trigger('getFeed');
    });
    ...
});

jQuery(function() {
    app.run('#/');
});
var feed = [];
var app = Sammy('#main', function() {
    this.use(Sammy.Mustache, 'ms');
    this.get('#/', function() {
        this.trigger('getFeed');
    });
    ...
});

jQuery(function() {
    app.run('#/');
});
var feed = [];
var app = Sammy('#main', function() {
    this.use(Sammy.Mustache, 'ms');
    this.get('#/', function() {
        this.trigger('getFeed');
    });
    ...
});

jQuery(function() {
    app.run('#/');
});
this.bind('getFeed', function() {
    var that = this;
    $.ajax({
      url: 'http://..._timeline.json',
      success: function(response) {
          feed = response;
          that.trigger('renderFeed');
      }
    });
});
this.bind('renderFeed', function() {
    this.feed = feed;
    this.partial('js/templates/feed.ms');
});
this.bind('getFeed', function() {
    var that = this;
    $.ajax({
      url: 'http://..._timeline.json',
      success: function(response) {
          feed = response;
          that.trigger('renderFeed');
      }
    });
});
this.bind('renderFeed', function() {
    this.feed = feed;
    this.partial('js/templates/feed.ms');
});
this.bind('getFeed', function() {
    var that = this;
    $.ajax({
      url: 'http://..._timeline.json',
      success: function(response) {
          feed = response;
          that.trigger('renderFeed');
      }
    });
});
this.bind('renderFeed', function() {
    this.feed = feed;
    this.partial('js/templates/feed.ms');
});
this.bind('getFeed', function() {
    var that = this;
    $.ajax({
      url: 'http://..._timeline.json',
      success: function(response) {
          feed = response;
          that.trigger('renderFeed');
      }
    });
});
this.bind('renderFeed', function() {
    this.feed = feed;
    this.partial('js/templates/feed.ms');
});
this.bind('getFeed', function() {
    var that = this;
    $.ajax({
      url: 'http://..._timeline.json',
      success: function(response) {
          feed = response;
          that.trigger('renderFeed');
      }
    });
});
this.bind('renderFeed', function() {
    this.feed = feed;
    this.partial('js/templates/feed.ms');
});
this.bind('getFeed', function() {
    var that = this;
    $.ajax({
      url: 'http://..._timeline.json',
      success: function(response) {
          feed = response;
          that.trigger('renderFeed');
      }
    });
});
this.bind('renderFeed', function() {
    this.feed = feed;
    this.partial('js/templates/feed.ms');
});
<ul>
{{#feed}}
  <li>
       <p>{{{statusnet_html}}}</p>
       <p>{{created_at}}
            {{#user}}
            {{name}}
            {{/user}}
       </p>
  </li>
{{/feed}}
</ul>
<ul>
{{#feed}}
  <li>
       <p>{{{statusnet_html}}}</p>
       <p>{{created_at}}
            {{#user}}
            {{name}}
            {{/user}}
       </p>
  </li>
{{/feed}}
</ul>
<ul>
{{#feed}}
  <li>
       <p>{{{statusnet_html}}}</p>
       <p>{{created_at}}
            {{#user}}
            {{name}}
            {{/user}}
       </p>
  </li>
{{/feed}}
</ul>
<ul>
{{#feed}}
  <li>
       <p>{{{statusnet_html}}}</p>
       <p>{{created_at}}
            {{#user}}
            {{name}}
            {{/user}}
       </p>
  </li>
{{/feed}}
</ul>
DEMO
Authorization
Mashing up JavaScript
OAuth 2
       +----------+          Client Identifier     +----------------+
       |          |>---(A)-- & Redirection URI --->|                |
       |          |                                |                |
End <--+ - - - +----(B)-- User authenticates -->| Authorization |
User   |          |                                |     Server     |
       |          |<---(C)--- Redirect URI -------<|                |
       | Client |           with Access Token      |                |
       |    in    |            in Fragment         +----------------+
       | Browser |
       |          |                                +----------------+
       |          |>---(D)--- Redirect URI ------->|                |
       |          |         without Fragment       |   Web Server   |
       |          |                                |   with Client |
       |    (F)   |<---(E)--- Web Page with ------<|    Resource    |
       | Access |                Script            |                |
       |   Token |                                 +----------------+
       +----------+

                  http://tools.ietf.org/html/draft-ietf-oauth-v2
this.bind('getFeed', function() {
    oauth2.retrieveAccessToken();
    if (! oauth2.store['access_token']) {
        this.redirect('#Login');
        return;
    }
    ...
});
this.bind('getFeed', function() {
    oauth2.retrieveAccessToken();
    if (! oauth2.store['access_token']) {
        this.redirect('#Login');
        return;
    }
    ...
});
this.get('#Login', function() {
  var consumerKey = 'abc....';
  window.open('http://status.net/api/oauth2/
authorize?response_toke=token&client_id=' +
consumerKey);
});
this.get('#Login', function() {
  var consumerKey = 'abc....';
  window.open('http://status.net/api/oauth2/
authorize?response_toke=token&client_id=' +
consumerKey);
});
<script type="text/javascript">
  var fragment = location.hash.substr(1);
  opener.parent.oauth2.storeToken(fragment);
  window.close();
</script>
<script type="text/javascript">
  var fragment = location.hash.substr(1);
  opener.parent.oauth2.storeToken(fragment);
  window.close();
</script>
<script type="text/javascript">
  var fragment = location.hash.substr(1);
  opener.parent.oauth2.storeToken(fragment);
  window.close();
</script>
<form action="#Entry" method="post">
    <textarea name="comment"></textarea>
    <input type="submit" value="send"/>
</form>
<form action="#Entry" method="post">
    <textarea name="comment"></textarea>
    <input type="submit" value="send"/>
</form>
<form action="#Entry" method="post">
    <textarea name="comment"></textarea>
    <input type="submit" value="send"/>
</form>
this.post('#Entry', function() {
        var that = this;
        $.ajax({
            url: 'http://status.net/.../
update.json?oauth_token=' +
                 oauth2.store['access_token'],
            type: 'POST',
            data: {
               'status': that.params['comment']
            },
            success: function() {
                 that.redirect('#/');
            }
        });
    });
this.post('#Entry', function() {
        var that = this;
        $.ajax({
            url: 'http://status.net/.../
update.json?oauth_token=' +
                 oauth2.store['access_token'],
            type: 'POST',
            data: {
               'status': that.params['comment']
            },
            success: function() {
                 that.redirect('#/');
            }
        });
    });
this.post('#Entry', function() {
        var that = this;
        $.ajax({
            url: 'http://status.net/.../
update.json?oauth_token=' +
                 oauth2.store['access_token'],
            type: 'POST',
            data: {
               'status': that.params['comment']
            },
            success: function() {
                 that.redirect('#/');
            }
        });
    });
this.post('#Entry', function() {
        var that = this;
        $.ajax({
            url: 'http://status.net/.../
update.json?oauth_token=' +
                 oauth2.store['access_token'],
            type: 'POST',
            data: {
               'status': that.params['comment']
            },
            success: function() {
                 that.redirect('#/');
            }
        });
    });
this.post('#Entry', function() {
        var that = this;
        $.ajax({
            url: 'http://status.net/.../
update.json?oauth_token=' +
                 oauth2.store['access_token'],
            type: 'POST',
            data: {
               'status': that.params['comment']
            },
            success: function() {
                 that.redirect('#/');
            }
        });
    });
this.post('#Entry', function() {
        var that = this;
        $.ajax({
            url: 'http://status.net/.../
update.json?oauth_token=' +
                 oauth2.store['access_token'],
            type: 'POST',
            data: {
               'status': that.params['comment']
            },
            success: function() {
                 that.redirect('#/');
            }
        });
    });
Storing the access
      token
Local Storage




   http://www.w3.org/TR/webstorage/
localStorage.setItem("key", value);
localStorage.getItem("key");
DEMO
Mash it up!
cool video:
http://www.youtube.com/
watch?v=OFzkTxiwziQ
OEmbed


         http://oembed.com/
http://www.youtube.com/watch?v=OyJd2qsRkNk
Mashing up JavaScript
http://www.youtube.com/oembed?url=http%3A%2F
       %2Fwww.youtube.com%2Fwatch%3Fv
 %3DOyJd2qsRkNk&maxwidth=500&format=json
{
  "provider_url":"http://www.youtube.com/",
  "title":"Jupiter Jones - 
Das Jahr in dem ich schlief (Musik Video)",
  "html":"u003cobject width="500" height="306"u003e
u003cparam name="movie" value="http://www.youtube.com/v/
OyJd2qsRkNk?version=3"u003eu003c/paramu003eu003cparam name=
"allowFullScreen" value="true"u003eu003c/paramu003e
u003cparam name="allowscriptaccess" value="always"u003e
u003c/paramu003eu003cembed src="http://www.youtube.com/v/
OyJd2qsRkNk?version=3" type="application/x-shockwave-flash
" width="500" height="306" allowscriptaccess="always
" allowfullscreen="true"u003eu003c/embedu003eu003c/object
u003e",
  "author_name":"St182",
  "height":306,
  "thumbnail_width":480,
  "width":500,
  "version":"1.0",
  "author_url":"http://www.youtube.com/user/Stinkfist182",
  "provider_name":"YouTube",
  "thumbnail_url":"http://i4.ytimg.com/vi/OyJd2qsRkNk/
hqdefault.jpg",
  "type":"video",
  "thumbnail_height":360
}
cool video:
http://embed.ly/
Mashing up JavaScript
Caja


http://code.google.com/p/google-caja/
html_sanitize(‘<script>alert(“foo“);</script>‘)
DEMO
Instant updates without
        reloading
PubSubHubbub
                           retrieves Atom feed with Hub URL

                               subscribes
                                for feed
                                acks
                                            Hub
                            subscription

                             pings every          posts sth
                             subscriber

http://code.google.com/p/pubsubhubbub/
<link rel="alternate"href="http://
status.net.xyz:8061/index.php/api/statuses/
user_timeline/3.atom"type="application/atom
+xml" title="Notice feed for bastian
(Atom)"/>
<entry>
 <activity:object-type>http://activitystrea.ms/schema/1.0/
note</activity:object-type>
 <id>http://status.net.xyz:8061/index.php/notice/20</id>
 <title>hello from client</title>
 <content type="html">hello from client</content>
 <link rel="alternate" type="text/html" href="http://
status.net.xyz:8061/index.php/notice/20"/>
 <activity:verb>http://activitystrea.ms/schema/1.0/post</
activity:verb>
 <published>2011-05-23T21:07:33+00:00</published>
 <updated>2011-05-23T21:07:33+00:00</updated>
 <link rel="ostatus:conversation" href="http://status.net.xyz:
8061/index.php/conversation/20"/>
 <georss:point>52.52437 13.41053</georss:point>
 <link rel="self" type="application/atom+xml"href="http://
status.net.xyz:8061/index.php/api/statuses/show/20.atom"/>
 <link rel="edit" type="application/atom+xml"href="http://
status.net.xyz:8061/index.php/api/statuses/show/20.atom"/>
 <statusnet:notice_info local_id="20" source="api"
favorite="false"repeated="false"></statusnet:notice_info>
</entry>
http://activitystrea.ms/
<link href="http://status.net.xyz:8061/
index.php/main/push/hub" rel="hub"/>
PubSubHubbub
                           retrieves Atom feed with Hub URL

                               subscribes
                                for feed
                                acks
                                            Hub
                            subscription

                             pings every          posts sth
                             subscriber

http://code.google.com/p/pubsubhubbub/
http://nodejs.org/
WebSockets




  http://dev.w3.org/html5/websockets/
socket.io


            http://socket.io/
http://search.npmjs.org/#/socket.io
Browser Notifications
webkitNotifications.createNotification(image,
title, text).show();
webkitNotifications.requestPermission();
Notification


                               retrieve Stream with Hub

Ajax: request   WebSockets:
Subscription    new Post
                  subscribe at hub
                     challenge
                         ack
                       new post              new post
DEMO
Sharing
Nascar Problem
http://www.oexchange.org/
http://www.example.com/share.php?url={URI}
&title={title for the content}
&description={short description of the
content}&ctype=flash&swfurl={SWF URI}
&height={preferred SWF height}
&width={preferred swf width}
&screenshot={screenshot URI}
http://example.com/.well-
    known/host-meta



http://tools.ietf.org/html/draft-nottingham-site-meta
<?xml version='1.0' encoding='UTF-8'?>
<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
   xmlns:hm='http://host-meta.net/xrd/1.0'>
    <hm:Host>www.meinvz.net</hm:Host>

        <Link
           rel="http://oexchange.org/spec/0.8/rel/resident-target"
           type="application/xrd+xml"
           href="http://www.example.com/oexchange.xrd" >
        </Link>

</XRD>
<?xml version='1.0' encoding='UTF-8'?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
    <Subject>http://www.example.com/linkeater</Subject>
    <Property
       type="http://www.oexchange.org/spec/0.8/prop/vendor">
        Examples Inc.</Property>
    <Property
       type="http://www.oexchange.org/spec/0.8/prop/title">
        A Link-Accepting Service</Property>
    <Link
       rel= "icon" href="http://www.example.com/favicon.ico"
       type="image/vnd.microsoft.icon" />
    <Link
       rel= "http://www.oexchange.org/spec/0.8/rel/offer"
       href="http://www.example.com/linkeater/offer.php"
       type="text/html" />
</XRD>
http://search.npmjs.org/#/oexchange
DEMO
Rate and Comment




   http://joind.in/3876
h"p://twi"er.com/Bas2anHofmann
h"p://profiles.google.com/bashofmann
h"p://lanyrd.com/people/Bas2anHofmann/
h"p://slideshare.net/bashofmann

mail@bas2anhofmann.de
Ad

Recommended

Mashing up JavaScript – Advanced Techniques for modern Web Apps
Mashing up JavaScript – Advanced Techniques for modern Web Apps
Bastian Hofmann
 
EmberConf 2015 – Ambitious UX for Ambitious Apps
EmberConf 2015 – Ambitious UX for Ambitious Apps
Lauren Elizabeth Tan
 
Building Persona: federated and privacy-sensitive identity for the Web (LCA 2...
Building Persona: federated and privacy-sensitive identity for the Web (LCA 2...
Francois Marier
 
前端MVC 豆瓣说
前端MVC 豆瓣说
Ting Lv
 
Laravel 로 배우는 서버사이드 #5
Laravel 로 배우는 서버사이드 #5
성일 한
 
Add loop shortcode
Add loop shortcode
Peter Baylies
 
Things Your Mother Didn't Tell You About Bundle Configurations - Symfony Live...
Things Your Mother Didn't Tell You About Bundle Configurations - Symfony Live...
D
 
Things Your Mother Didnt Tell You About Bundle Configurations - Symfony Live…
Things Your Mother Didnt Tell You About Bundle Configurations - Symfony Live…
D
 
The Settings API
The Settings API
Konstantin Kovshenin
 
Node.js server-side rendering
Node.js server-side rendering
The Software House
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)
Fabien Potencier
 
Silex meets SOAP & REST
Silex meets SOAP & REST
Hugo Hamon
 
Matters of State
Matters of State
Kris Wallsmith
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
Konstantin Kudryashov
 
How Kris Writes Symfony Apps
How Kris Writes Symfony Apps
Kris Wallsmith
 
Как получить чёрный пояс по WordPress?
Как получить чёрный пояс по WordPress?
Yevhen Kotelnytskyi
 
Как получить чёрный пояс по WordPress? v2.0
Как получить чёрный пояс по WordPress? v2.0
Yevhen Kotelnytskyi
 
RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”
apostlion
 
Intro programacion funcional
Intro programacion funcional
NSCoder Mexico
 
The state of Symfony2 - SymfonyDay 2010
The state of Symfony2 - SymfonyDay 2010
Fabien Potencier
 
Silex Cheat Sheet
Silex Cheat Sheet
Andréia Bohner
 
Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)
danwrong
 
Sencha Touch - Introduction
Sencha Touch - Introduction
ABC-GROEP.BE
 
ApacheCon NA11 - Apache Celix, Universal OSGi?
ApacheCon NA11 - Apache Celix, Universal OSGi?
abroekhuis
 
Angular Promises and Advanced Routing
Angular Promises and Advanced Routing
Alexe Bogdan
 
Data20161007
Data20161007
capegmail
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
Leonardo Proietti
 
Php
Php
Linh Tran
 
Creating OpenSocial Apps for millions of users
Creating OpenSocial Apps for millions of users
Bastian Hofmann
 
2010 GMC Yukon in Fergus Falls, MN
2010 GMC Yukon in Fergus Falls, MN
Nelson GMC
 

More Related Content

What's hot (20)

The Settings API
The Settings API
Konstantin Kovshenin
 
Node.js server-side rendering
Node.js server-side rendering
The Software House
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)
Fabien Potencier
 
Silex meets SOAP & REST
Silex meets SOAP & REST
Hugo Hamon
 
Matters of State
Matters of State
Kris Wallsmith
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
Konstantin Kudryashov
 
How Kris Writes Symfony Apps
How Kris Writes Symfony Apps
Kris Wallsmith
 
Как получить чёрный пояс по WordPress?
Как получить чёрный пояс по WordPress?
Yevhen Kotelnytskyi
 
Как получить чёрный пояс по WordPress? v2.0
Как получить чёрный пояс по WordPress? v2.0
Yevhen Kotelnytskyi
 
RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”
apostlion
 
Intro programacion funcional
Intro programacion funcional
NSCoder Mexico
 
The state of Symfony2 - SymfonyDay 2010
The state of Symfony2 - SymfonyDay 2010
Fabien Potencier
 
Silex Cheat Sheet
Silex Cheat Sheet
Andréia Bohner
 
Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)
danwrong
 
Sencha Touch - Introduction
Sencha Touch - Introduction
ABC-GROEP.BE
 
ApacheCon NA11 - Apache Celix, Universal OSGi?
ApacheCon NA11 - Apache Celix, Universal OSGi?
abroekhuis
 
Angular Promises and Advanced Routing
Angular Promises and Advanced Routing
Alexe Bogdan
 
Data20161007
Data20161007
capegmail
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
Leonardo Proietti
 
Php
Php
Linh Tran
 
Be RESTful (Symfony Camp 2008)
Be RESTful (Symfony Camp 2008)
Fabien Potencier
 
Silex meets SOAP & REST
Silex meets SOAP & REST
Hugo Hamon
 
Decoupling with Design Patterns and Symfony2 DIC
Decoupling with Design Patterns and Symfony2 DIC
Konstantin Kudryashov
 
How Kris Writes Symfony Apps
How Kris Writes Symfony Apps
Kris Wallsmith
 
Как получить чёрный пояс по WordPress?
Как получить чёрный пояс по WordPress?
Yevhen Kotelnytskyi
 
Как получить чёрный пояс по WordPress? v2.0
Как получить чёрный пояс по WordPress? v2.0
Yevhen Kotelnytskyi
 
RubyBarCamp “Полезные gems и plugins”
RubyBarCamp “Полезные gems и plugins”
apostlion
 
Intro programacion funcional
Intro programacion funcional
NSCoder Mexico
 
The state of Symfony2 - SymfonyDay 2010
The state of Symfony2 - SymfonyDay 2010
Fabien Potencier
 
Building @Anywhere (for TXJS)
Building @Anywhere (for TXJS)
danwrong
 
Sencha Touch - Introduction
Sencha Touch - Introduction
ABC-GROEP.BE
 
ApacheCon NA11 - Apache Celix, Universal OSGi?
ApacheCon NA11 - Apache Celix, Universal OSGi?
abroekhuis
 
Angular Promises and Advanced Routing
Angular Promises and Advanced Routing
Alexe Bogdan
 
Data20161007
Data20161007
capegmail
 
Rich domain model with symfony 2.5 and doctrine 2.5
Rich domain model with symfony 2.5 and doctrine 2.5
Leonardo Proietti
 

Viewers also liked (20)

Creating OpenSocial Apps for millions of users
Creating OpenSocial Apps for millions of users
Bastian Hofmann
 
2010 GMC Yukon in Fergus Falls, MN
2010 GMC Yukon in Fergus Falls, MN
Nelson GMC
 
Radio winners cl2012
Radio winners cl2012
Advertiser - Communication Magazine
 
Social media
Social media
Show To Clients
 
IGNITE OpenSocial 2.0 - Viva La OpenAppRevolution!
IGNITE OpenSocial 2.0 - Viva La OpenAppRevolution!
Bastian Hofmann
 
Dns
Dns
Yiwei Ma
 
Common wealth game 2010,CWG 2010,Delhi,India
Common wealth game 2010,CWG 2010,Delhi,India
Show To Clients
 
GyroHSR
GyroHSR
KGS Global
 
Latsia TV - Price List
Latsia TV - Price List
UnitrustMedia
 
Radio monitor dati_1a_wave_2012
Radio monitor dati_1a_wave_2012
Advertiser - Communication Magazine
 
Our Stories, Reintegration Experiences of Survivors of Trafficking and Exploi...
Our Stories, Reintegration Experiences of Survivors of Trafficking and Exploi...
Tierra de hombres - Ayuda a la infancia
 
Why Collaboration?
Why Collaboration?
C5 Insight
 
Tdh study a_surfeit_of_children_in_europe_2010_en
Tdh study a_surfeit_of_children_in_europe_2010_en
Tierra de hombres - Ayuda a la infancia
 
Promo & activation winners cl2012
Promo & activation winners cl2012
Advertiser - Communication Magazine
 
Everbridge Webinar: Mother Nature Strikes Back
Everbridge Webinar: Mother Nature Strikes Back
Everbridge, Inc.
 
Sanremo 2012 4° puntata starcom
Sanremo 2012 4° puntata starcom
Advertiser - Communication Magazine
 
StartupChicks_Buyer Persona Presenation
StartupChicks_Buyer Persona Presenation
iFusion Marketing
 
Japan Moving Forward: 5 Communication Priorities
Japan Moving Forward: 5 Communication Priorities
Everbridge, Inc.
 
Listino pubblicitario Rai 2012 2013
Listino pubblicitario Rai 2012 2013
Advertiser - Communication Magazine
 
Creating OpenSocial Apps for millions of users
Creating OpenSocial Apps for millions of users
Bastian Hofmann
 
2010 GMC Yukon in Fergus Falls, MN
2010 GMC Yukon in Fergus Falls, MN
Nelson GMC
 
IGNITE OpenSocial 2.0 - Viva La OpenAppRevolution!
IGNITE OpenSocial 2.0 - Viva La OpenAppRevolution!
Bastian Hofmann
 
Common wealth game 2010,CWG 2010,Delhi,India
Common wealth game 2010,CWG 2010,Delhi,India
Show To Clients
 
Latsia TV - Price List
Latsia TV - Price List
UnitrustMedia
 
Our Stories, Reintegration Experiences of Survivors of Trafficking and Exploi...
Our Stories, Reintegration Experiences of Survivors of Trafficking and Exploi...
Tierra de hombres - Ayuda a la infancia
 
Why Collaboration?
Why Collaboration?
C5 Insight
 
Everbridge Webinar: Mother Nature Strikes Back
Everbridge Webinar: Mother Nature Strikes Back
Everbridge, Inc.
 
StartupChicks_Buyer Persona Presenation
StartupChicks_Buyer Persona Presenation
iFusion Marketing
 
Japan Moving Forward: 5 Communication Priorities
Japan Moving Forward: 5 Communication Priorities
Everbridge, Inc.
 
Ad

Similar to Mashing up JavaScript (20)

Mashing up JavaScript
Mashing up JavaScript
Bastian Hofmann
 
international PHP2011_Bastian Hofmann_Mashing up java script
international PHP2011_Bastian Hofmann_Mashing up java script
smueller_sandsmedia
 
Crossing the Boundaries of Web Applications with OpenSocial
Crossing the Boundaries of Web Applications with OpenSocial
Bastian Hofmann
 
Browser Internals-Same Origin Policy
Browser Internals-Same Origin Policy
Krishna T
 
External Data Access with jQuery
External Data Access with jQuery
Doncho Minkov
 
The Big Picture and How to Get Started
The Big Picture and How to Get Started
guest1af57e
 
huhu
huhu
Dung Trương
 
WebCamp: Developer Day: Web Security: Cookies, Domains and CORS - Юрий Чайков...
WebCamp: Developer Day: Web Security: Cookies, Domains and CORS - Юрий Чайков...
GeeksLab Odessa
 
OAuth: demystified (hopefully)
OAuth: demystified (hopefully)
Matt Gifford
 
HATEOAS 101 - Opinionated Introduction to a REST API Style
HATEOAS 101 - Opinionated Introduction to a REST API Style
Apigee | Google Cloud
 
Introduction to OAuth
Introduction to OAuth
Paul Osman
 
I Don't Care About Security (And Neither Should You)
I Don't Care About Security (And Neither Should You)
Joel Lord
 
Stay Out Please
Stay Out Please
efim13
 
Oauth 2.0 security
Oauth 2.0 security
vinoth kumar
 
"Протокол авторизации OAuth"
"Протокол авторизации OAuth"
Olga Lavrentieva
 
Integrating OAuth and Social Login Into Wordpress
Integrating OAuth and Social Login Into Wordpress
William Tam
 
Javascript cross domain communication
Javascript cross domain communication
ChenKuo Chen
 
OAuth 2.0
OAuth 2.0
Mihir Shah
 
Keeping Pace with OAuth’s Evolving Security Practices.pdf
Keeping Pace with OAuth’s Evolving Security Practices.pdf
Sirris
 
OAuth-as-a-service using ASP.NET Web API and Windows Azure Access Control
OAuth-as-a-service using ASP.NET Web API and Windows Azure Access Control
Maarten Balliauw
 
international PHP2011_Bastian Hofmann_Mashing up java script
international PHP2011_Bastian Hofmann_Mashing up java script
smueller_sandsmedia
 
Crossing the Boundaries of Web Applications with OpenSocial
Crossing the Boundaries of Web Applications with OpenSocial
Bastian Hofmann
 
Browser Internals-Same Origin Policy
Browser Internals-Same Origin Policy
Krishna T
 
External Data Access with jQuery
External Data Access with jQuery
Doncho Minkov
 
The Big Picture and How to Get Started
The Big Picture and How to Get Started
guest1af57e
 
WebCamp: Developer Day: Web Security: Cookies, Domains and CORS - Юрий Чайков...
WebCamp: Developer Day: Web Security: Cookies, Domains and CORS - Юрий Чайков...
GeeksLab Odessa
 
OAuth: demystified (hopefully)
OAuth: demystified (hopefully)
Matt Gifford
 
HATEOAS 101 - Opinionated Introduction to a REST API Style
HATEOAS 101 - Opinionated Introduction to a REST API Style
Apigee | Google Cloud
 
Introduction to OAuth
Introduction to OAuth
Paul Osman
 
I Don't Care About Security (And Neither Should You)
I Don't Care About Security (And Neither Should You)
Joel Lord
 
Stay Out Please
Stay Out Please
efim13
 
Oauth 2.0 security
Oauth 2.0 security
vinoth kumar
 
"Протокол авторизации OAuth"
"Протокол авторизации OAuth"
Olga Lavrentieva
 
Integrating OAuth and Social Login Into Wordpress
Integrating OAuth and Social Login Into Wordpress
William Tam
 
Javascript cross domain communication
Javascript cross domain communication
ChenKuo Chen
 
Keeping Pace with OAuth’s Evolving Security Practices.pdf
Keeping Pace with OAuth’s Evolving Security Practices.pdf
Sirris
 
OAuth-as-a-service using ASP.NET Web API and Windows Azure Access Control
OAuth-as-a-service using ASP.NET Web API and Windows Azure Access Control
Maarten Balliauw
 
Ad

More from Bastian Hofmann (20)

Introduction to rg\injection
Introduction to rg\injection
Bastian Hofmann
 
How to create OpenSocial Apps in 45 minutes
How to create OpenSocial Apps in 45 minutes
Bastian Hofmann
 
Crossing the Boundaries of Web Applications with OpenSocial
Crossing the Boundaries of Web Applications with OpenSocial
Bastian Hofmann
 
The Identity Problem of the Web and how to solve it
The Identity Problem of the Web and how to solve it
Bastian Hofmann
 
Crossing the Boundaries of Web Applications with OpenSocial
Crossing the Boundaries of Web Applications with OpenSocial
Bastian Hofmann
 
Distributed Identities with OpenID
Distributed Identities with OpenID
Bastian Hofmann
 
Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands
Bastian Hofmann
 
Creating social games for millions of users
Creating social games for millions of users
Bastian Hofmann
 
How to create social apps for millions of users
How to create social apps for millions of users
Bastian Hofmann
 
Distributed Identities with OpenID
Distributed Identities with OpenID
Bastian Hofmann
 
OpenSocial - Past, Present, Future
OpenSocial - Past, Present, Future
Bastian Hofmann
 
Distributed Social Networking
Distributed Social Networking
Bastian Hofmann
 
Technical Background of VZ-ID
Technical Background of VZ-ID
Bastian Hofmann
 
Advanced Capabilities of OpenSocial Apps
Advanced Capabilities of OpenSocial Apps
Bastian Hofmann
 
How to make your social games successfull
How to make your social games successfull
Bastian Hofmann
 
Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands
Bastian Hofmann
 
Distributed Identities with OpenID
Distributed Identities with OpenID
Bastian Hofmann
 
Creating OpenSocial Apps
Creating OpenSocial Apps
Bastian Hofmann
 
OpenSocial in der Praxis
OpenSocial in der Praxis
Bastian Hofmann
 
OpenSocial Done Right
OpenSocial Done Right
Bastian Hofmann
 
Introduction to rg\injection
Introduction to rg\injection
Bastian Hofmann
 
How to create OpenSocial Apps in 45 minutes
How to create OpenSocial Apps in 45 minutes
Bastian Hofmann
 
Crossing the Boundaries of Web Applications with OpenSocial
Crossing the Boundaries of Web Applications with OpenSocial
Bastian Hofmann
 
The Identity Problem of the Web and how to solve it
The Identity Problem of the Web and how to solve it
Bastian Hofmann
 
Crossing the Boundaries of Web Applications with OpenSocial
Crossing the Boundaries of Web Applications with OpenSocial
Bastian Hofmann
 
Distributed Identities with OpenID
Distributed Identities with OpenID
Bastian Hofmann
 
Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands
Bastian Hofmann
 
Creating social games for millions of users
Creating social games for millions of users
Bastian Hofmann
 
How to create social apps for millions of users
How to create social apps for millions of users
Bastian Hofmann
 
Distributed Identities with OpenID
Distributed Identities with OpenID
Bastian Hofmann
 
OpenSocial - Past, Present, Future
OpenSocial - Past, Present, Future
Bastian Hofmann
 
Distributed Social Networking
Distributed Social Networking
Bastian Hofmann
 
Technical Background of VZ-ID
Technical Background of VZ-ID
Bastian Hofmann
 
Advanced Capabilities of OpenSocial Apps
Advanced Capabilities of OpenSocial Apps
Bastian Hofmann
 
How to make your social games successfull
How to make your social games successfull
Bastian Hofmann
 
Opening up the Social Web - Standards that are bridging the Islands
Opening up the Social Web - Standards that are bridging the Islands
Bastian Hofmann
 
Distributed Identities with OpenID
Distributed Identities with OpenID
Bastian Hofmann
 
Creating OpenSocial Apps
Creating OpenSocial Apps
Bastian Hofmann
 
OpenSocial in der Praxis
OpenSocial in der Praxis
Bastian Hofmann
 

Recently uploaded (20)

Enhance GitHub Copilot using MCP - Enterprise version.pdf
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Nilesh Gule
 
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
pcprocore
 
Coordinated Disclosure for ML - What's Different and What's the Same.pdf
Coordinated Disclosure for ML - What's Different and What's the Same.pdf
Priyanka Aash
 
OWASP Barcelona 2025 Threat Model Library
OWASP Barcelona 2025 Threat Model Library
PetraVukmirovic
 
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
caoyixuan2019
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC
 
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
Priyanka Aash
 
Quantum AI Discoveries: Fractal Patterns Consciousness and Cyclical Universes
Quantum AI Discoveries: Fractal Patterns Consciousness and Cyclical Universes
Saikat Basu
 
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
Earley Information Science
 
Daily Lesson Log MATATAG ICT TEchnology 8
Daily Lesson Log MATATAG ICT TEchnology 8
LOIDAALMAZAN3
 
The Future of Technology: 2025-2125 by Saikat Basu.pdf
The Future of Technology: 2025-2125 by Saikat Basu.pdf
Saikat Basu
 
Curietech AI in action - Accelerate MuleSoft development
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
Lessons Learned from Developing Secure AI Workflows.pdf
Lessons Learned from Developing Secure AI Workflows.pdf
Priyanka Aash
 
Securing AI - There Is No Try, Only Do!.pdf
Securing AI - There Is No Try, Only Do!.pdf
Priyanka Aash
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
2025_06_18 - OpenMetadata Community Meeting.pdf
2025_06_18 - OpenMetadata Community Meeting.pdf
OpenMetadata
 
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
Fwdays
 
cnc-processing-centers-centateq-p-110-en.pdf
cnc-processing-centers-centateq-p-110-en.pdf
AmirStern2
 
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Enhance GitHub Copilot using MCP - Enterprise version.pdf
Nilesh Gule
 
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
pcprocore
 
Coordinated Disclosure for ML - What's Different and What's the Same.pdf
Coordinated Disclosure for ML - What's Different and What's the Same.pdf
Priyanka Aash
 
OWASP Barcelona 2025 Threat Model Library
OWASP Barcelona 2025 Threat Model Library
PetraVukmirovic
 
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
Tech-ASan: Two-stage check for Address Sanitizer - Yixuan Cao.pdf
caoyixuan2019
 
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik - Passionate Tech Enthusiast
Raman Bhaumik
 
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC and Open Hackathons Monthly Highlights June 2025
OpenACC
 
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
Priyanka Aash
 
Quantum AI Discoveries: Fractal Patterns Consciousness and Cyclical Universes
Quantum AI Discoveries: Fractal Patterns Consciousness and Cyclical Universes
Saikat Basu
 
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
Earley Information Science
 
Daily Lesson Log MATATAG ICT TEchnology 8
Daily Lesson Log MATATAG ICT TEchnology 8
LOIDAALMAZAN3
 
The Future of Technology: 2025-2125 by Saikat Basu.pdf
The Future of Technology: 2025-2125 by Saikat Basu.pdf
Saikat Basu
 
Curietech AI in action - Accelerate MuleSoft development
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
Lessons Learned from Developing Secure AI Workflows.pdf
Lessons Learned from Developing Secure AI Workflows.pdf
Priyanka Aash
 
Securing AI - There Is No Try, Only Do!.pdf
Securing AI - There Is No Try, Only Do!.pdf
Priyanka Aash
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
2025_06_18 - OpenMetadata Community Meeting.pdf
2025_06_18 - OpenMetadata Community Meeting.pdf
OpenMetadata
 
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
Fwdays
 
cnc-processing-centers-centateq-p-110-en.pdf
cnc-processing-centers-centateq-p-110-en.pdf
AmirStern2
 

Mashing up JavaScript