SlideShare une entreprise Scribd logo
1  sur  91
Télécharger pour lire hors ligne
Powering your website with
                 realtime data


                                  Bert Van Hauwaert
                          bert@becoded.be - @tbotwit
Sunday 26 February 2012
Bert Van Hauwaert

    •   Live in Belgium

    •   Founder of be.coded

    •   Freelance web application developer & consultant

    •   ZCE 5.0

    •   Working on portal sites and realtime auction sites


Sunday 26 February 2012
Overview

    •   The old days

    •   XMPP

    •   Install server

    •   Configure apache

    •   Libraries

    •   Examples

Sunday 26 February 2012
Overview

    •   The old days

    •   XMPP

    •   Install server

    •   Configure apache

    •   Libraries

    •   Examples

Sunday 26 February 2012
The old days


    •   <meta http-equiv=”refresh” content=”5” />

    •   <script >

    •   AJAX




Sunday 26 February 2012
Overview

    •   The old days

    •   XMPP

    •   Install server

    •   Configure apache

    •   Libraries

    •   Examples

Sunday 26 February 2012
Websockets




                          Source: http://caniuse.com/#feat=websockets
Sunday 26 February 2012
XMPP: what


    •   Extensible Messaging and Presence Protocol

    •   Jabber

    •   XML

    •   Client - Server - Component



Sunday 26 February 2012
XMPP: stanzas


    •   <presence>

    •   <message>

    •   <iq>




Sunday 26 February 2012
XMPP: stanzas


    •   <presence>

    •   <message>

    •   <iq>




Sunday 26 February 2012
XMPP: stanzas


    •   <presence>

    •   <message>

    •   <iq>




Sunday 26 February 2012
XMPP: stanzas


    •   <presence>

    •   <message>

    •   <iq>




Sunday 26 February 2012
XMPP: addressing


    •   JID (Jabber Identifier)

    •   Three main parts

        •   [ node "@" ] domain [ "/" resource ]




Sunday 26 February 2012
XMPP: extensions



    •   XMPP Extension Protocol - XEP

    •   http://xmpp.org/xmpp-protocols/xmpp-extensions/




Sunday 26 February 2012
XMPP: advantages


    •   Open

    •   Decentralized

    •   Secure

    •   Extensible



Sunday 26 February 2012
XMPP: disadvantages



    •   Statefulness

    •   Overhead




Sunday 26 February 2012
XMPP: example
         <stream:stream>
            <iq type="get" id="roster1">
               <query xmlns:"jabber:iq:roster" />
            </iq>

            <presence />
            <message to="attendees@phpukconference.com"
               from="bert@becoded.be/speakerroom"
               type="chat">
                   <body>
                      I hope you will enjoy this talk
                   </body>
            </message>
            <presence>
               <show>dnd</show>
               <status>Giving a talk @ PHP UK conference</status>
            </presence>
         </stream:stream>



Sunday 26 February 2012
XMPP: example
         <stream:stream>
                <iq type="get" id="roster1">
                    <query xmlns:"jabber:iq:roster" />
                </iq>

             <presence />
             <message to="attendees@phpukconference.com"
                  from="bert@becoded.be/speakerroom"
                  type="chat">
                      <body>
                           I hope you will enjoy this talk
                      </body>
             </message>
             <presence>
                  <show>dnd</show>
                  <status>Giving a talk @ PHP UK conference</status>
             </presence>
         </stream:stream>




Sunday 26 February 2012
XMPP: example
         <stream:stream>
                <iq type="get" id="roster1">
                  <query xmlns:"jabber:iq:roster" />
                </iq>
             <presence />
             <message to="attendees@phpukconference.com"
                  from="bert@becoded.be/speakerroom"
                  type="chat">
                      <body>
                           I hope you will enjoy this talk
                      </body>
             </message>
             <presence>
                  <show>dnd</show>
                  <status>Giving a talk @ PHP UK conference</status>
             </presence>
         </stream:stream>




Sunday 26 February 2012
XMPP: example
         <stream:stream>
             <iq type="get" id="roster1">
                  <query xmlns:"jabber:iq:roster" />
             </iq>


                <presence />
             <message to="attendees@phpukconference.com"
                  from="bert@becoded.be/speakerroom"
                  type="chat">
                      <body>
                           I hope you will enjoy this talk
                      </body>
             </message>
             <presence>
                  <show>dnd</show>
                  <status>Giving a talk @ PHP UK conference</status>
             </presence>
         </stream:stream>




Sunday 26 February 2012
XMPP: example
         <stream:stream>
             <iq type="get" id="roster1">
                  <query xmlns:"jabber:iq:roster" />
             </iq>

                <presence />
                <message
                  to="attendees@phpukconference.com"
                  from="bert@becoded.be/speakerroom"
                  type="chat">
                    <body>
                      I hope you will enjoy this talk
                    </body>
                </message>
             <presence>
                  <show>dnd</show>
                  <status>Giving a talk @ PHP UK conference</status>
             </presence>
         </stream:stream>


Sunday 26 February 2012
XMPP: example
         <stream:stream>
             <iq type="get" id="roster1">
                  <query xmlns:"jabber:iq:roster" />
             </iq>

                <presence />
                <message to="attendees@phpukconference.com"
                    from="bert@becoded.be/speakerroom"
                    type="chat">
                         <body>
                             I hope you will enjoy this talk
                         </body>
                </message>
                <presence>
                  <show>dnd</show>
                  <status>
                    Giving a talk @ PHP UK conference
                  </status>
                </presence>
         </stream:stream>



Sunday 26 February 2012
XMPP: example
         <stream:stream>
             <iq type="get" id="roster1">
                  <query xmlns:"jabber:iq:roster" />
             </iq>

                <presence />
                <message to="attendees@phpukconference.com"
                    from="bert@becoded.be/speakerroom"
                    type="chat">
                         <body>
                             I hope you will enjoy this talk
                         </body>
                </message>
                <presence>
                    <show>dnd</show>
                    <status>
                         Giving a talk @ PHP UK conference
                    </status>
                </presence>
         </stream:stream>


Sunday 26 February 2012
XMPP: XEP-0060   (1)




    •   PubSub (Publish / Subscribe)

    •   Bandwidth / resources




Sunday 26 February 2012
XMPP: XEP-0060   (2)



         <iq
           from="child@holiday.com/car"
           id="ams9nz78"
           to="pubsub.holiday.com"
           type="set">
             <pubsub xmlns="http://jabber.org/
             protocol/pubsub">
               <subscribe node="are-we-there-yet"
               jid="child@holiday.com"/>
             </pubsub>
         </iq>


Sunday 26 February 2012
XMPP: XEP-0060           (3)

         <iq
           from="adult@holiday.com/car"
           id="wmn78e45a" to="pubsub.holiday.com"
           type="set">
             <pubsub xmlns="http://jabber.org/protocol/pubsub">
               <publish node="are-we-there-yet">
                 <item>
                   <there xmlns="http://holiday.com/there-yet"
                   status="true"/>
                 </item>
               </publish>
             </pubsub>
         </iq>

Sunday 26 February 2012
XMPP: XEP-0060            (4)



         <message from="pubsub.holiday.com"
         to="child@holiday.com">
           <event xmlns="http://jabber.org/protocol/pubsub#event">
             <items node="are-we-there-yet">
               <item id="ax78ui789q">
                 <there xmlns="http://holiday.com/there-yet"
                 status="true"/>
               </item>
             </items>
           </event>
         </message>


Sunday 26 February 2012
XMPP: XEP-0045   (1)




    •   MUC / Multi-User Chat

    •   “Multiplier”




Sunday 26 February 2012
XMPP: XEP-0045   (2)




         <presence
           from="user@domain.com/resource"
           to="room@conference.muc.com/nickname">
             <x xmlns=
               "http://jabber.org/protocol/muc"/>
         </presence>




Sunday 26 February 2012
XMPP: XEP-0045   (3)



         <message to="room@conference.muc.com"
           from="user@domain.com/resource"
           type="groupchat ">
           <body>Lorem Ipsum</body>
         </message>

         <message to="otherUser@domain.com/resource"
         from="room@conference.muc.com/nickname"
         type="groupchat ">
         <body>Lorem Ipsum</body>
         </message>

Sunday 26 February 2012
Overview

    •   The old days

    •   XMPP

    •   Install server

    •   Configure apache

    •   Libraries

    •   Examples

Sunday 26 February 2012
Install server: starting point


    •   Debian

        •   web server

        •   SQL database

        •   SSH server



Sunday 26 February 2012
Install server: apt sources

    •   apt-get install vim

    •   vim /etc/apt/sources.list
        •   deb http://ftp.belnet.be/debian/ squeeze main non-free
            deb-src http://ftp.belnet.be/debian/ squeeze main
            deb http://security.debian.org/ squeeze/updates main non-free
            deb-src http://security.debian.org/ squeeze/updates main
            deb http://packages.dotdeb.org stable all
            deb-src http://packages.dotdeb.org stable all




Sunday 26 February 2012
Install server: prerequisites (1)


    •   wget http://www.dotdeb.org/dotdeb.gpg

    •   cat dotdeb.gpg | apt-key add -

    •   apt-get update

    •   apt-get install sun-java6-jre sun-java6-fonts ident2



Sunday 26 February 2012
Install server: prerequisites (2)


    •   apt-get install mysql-server mysql-client

    •   apt-get install php5 php5-cli php5-common php5-dev
        php5-mysql php5-curl php-pear

    •   Database & user




Sunday 26 February 2012
Install server: Openfire (1)

    •   Openfire 3.7.1

    •   http://www.igniterealtime.org/projects/openfire/

    •   wget -O openfire_3.7.1_all.deb
        http://www.igniterealtime.org/downloadServlet?
        filename=openfire/openfire_3.7.1_all.deb

    •   dpkg -i openfire_3.7.1_all.deb


Sunday 26 February 2012
Install server: Openfire (2)



    •   http://[server-ip]:9090/




Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Install server: Openfire (3)


    •   Plugins

        •   User Service

        •   Monitoring Service




Sunday 26 February 2012
Overview

    •   The old days

    •   XMPP

    •   Install server

    •   Configure apache

    •   Libraries

    •   Examples

Sunday 26 February 2012
Configure apache: why                                      (1)



                   Client - polling




                                                ta




                                                                      ta
                                      ta




                                                                             data
                                           no da




                                                                 no da
                                 no da




                  Server

                                                              d ata
                                                          w
                                                     ne




                  Client - long polling                               data



Sunday 26 February 2012
Configure apache: why           (2)




    •   BOSH (Bidirectional streams Over Synchronous HTTP)




Sunday 26 February 2012
Configure apache: proxy (1)

    •   cd /etc/apache2/mods-enabled/

    •   ln -s ../mods-available/proxy.load

    •   ln -s ../mods-available/proxy_http.load



    •   ln -s ../mods-available/rewrite.load


Sunday 26 February 2012
Configure apache: proxy (2)
        <VirtualHost *:80>
          Options FollowSymLinks
          ServerAdmin bert@becoded.be
          ServerName xmpp.dev.becoded.be
          ServerAlias static.xmpp.dev.becoded.be
          # Indexes + Directory Root.
          DirectoryIndex index.php
          DocumentRoot /var/www/vhost/xmpp.dev.becoded.be/htdocs/public/
          php_admin_value open_basedir ".:/var/www/vhost/xmpp.dev.becoded.be/htdocs:/var/www/library/Zend-latest/
        library:../:/usr/share/php:/tmp"
          php_value include_path ".:/var/www/vhost/xmpp.dev.becoded.be/htdocs:/var/www/library/Zend-latest/library:/usr/
        share/php"
          php_admin_value upload_tmp_dir "/tmp"
          SetEnv APPLICATION_ENV development

           # Logfiles
           ErrorLog /var/www/vhost/xmpp.dev.becoded.be/logs/error.log
           CustomLog /var/www/vhost/xmpp.dev.becoded.be/logs/access.log combined


        # XMPP proxy rule
        ProxyRequests Off
        ProxyPass /bind http://127.0.0.1:7070/http-bind/
        ProxyPassReverse /bind http://127.0.0.1:7070/http-bind/
        </VirtualHost>




Sunday 26 February 2012
Overview

    •   The old days

    •   XMPP

    •   Install server

    •   Configure apache

    •   Libraries

    •   Examples

Sunday 26 February 2012
Libraries

    •   ZF - http://framework.zend.com

    •   jQuery - http://jquery.com/

    •   jQuery UI - http://jqueryui.com/

    •   XMPPHP - http://code.google.com/p/xmpphp

    •   Jaxl - http://jaxl.net

    •   Strophe.js - http://strophe.im

Sunday 26 February 2012
Libraries: XMPPHP

     $connection =  new XMPPHP_XMPP(
                         $host, $port,
                         $identifier->node,
                         $identifier->password,
                         $identifier->resource,
                         $domain,
                         $printlog,
                         $loglevel);
     $connection->connect();
     $connection->processUntil('session_start');
     $connection->message('support@demo', 'Hello world');
     $connection->disconnect();




Sunday 26 February 2012
Libraries: Jaxl
     $connection = new JAXL(array(
     	 'user'	 	 	 => $identifier->node,
     	 'pass'	 	 	 => $identifier->password,
       'host' 	 	 => $host,
               	
       'domain' 		 => $domain,
     	 'port' 	 	 => $port,
               	
     	 'authType'	 => 'PLAIN',
     	 'logLevel'	 => $loglevel
     	 ));
     $connection->addPlugin('jaxl_post_auth', '_postAuthHook');
     $connection->startCore("stream");

     public function _postAuthHook ($payload, $jaxl) {
       $jaxl->sendMessage('support@demo', 'Hello world');
       $jaxl->shutdown();
     }


Sunday 26 February 2012
Libraries: Strophe.js
     var connection = new Strophe.Connection('/bind');
     connection.connect(
     	 jid, password,
     	 function (status) {
     	 	 if (status == Strophe.Status.CONNECTED) {
     	 	 	 var msg = $msg({
     	 	 	 	 to : 'support@demo',
     	 	 	 	 type : "chat"
     	 	 	 	 }).c('body').t('Hello world');
     	 	 	
     	 	 	 connection.send(msg);
     	 	 	 setTimeout(function () {
     	 	 	 	 connection.disconnect();
     	 	 	 }, 500);
     	 	 }
     	 });


Sunday 26 February 2012
Overview

    •   The old days

    •   XMPP

    •   Install server

    •   Configure apache

    •   Libraries

    •   Examples

Sunday 26 February 2012
Examples: setup




Sunday 26 February 2012
Sunday 26 February 2012
Examples: messages


    •   Browser

        •   Log

    •   Adium




Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Example: IQ ping pong (1)
     this.statusHandler = function (status) {
     	 	 var me = this;
     	 	 if (status == Strophe.Status.CONNECTED) {
     	 	 	 me.connection.addHandler(
     	 	 	 	 function(msg) {	 //(Function) handler
     	 	 	 	 	 return me.handlePong(msg);
     	 	 	 	 },
       	 	 	 null, 	 	 	 	 	 //(String) ns
     	 	 	 	 'iq', 	 	 	 	 	 //(String) name
     	 	 	 	 null, 	 	 	 	 	 //(String) type
     	 	 	 	 'pingPong');	 	 //(String) id
                           	
     	 	 	 me.sendPing(Strophe.getDomainFromJid(me.connection.jid));
     	 	 }
     	 };


Sunday 26 February 2012
Example: IQ ping pong (2)

     this.sendPing = function (to)
     {
     	 var me = this;                    <iq
     	                                     to='demo'
                                           type='get'
     	 var iq = $iq({
                                           id='pingPong'
     	 	 to	 to,
            :
                                           xmlns='jabber:client'>
     	 	 type : 'get',                     	 <ping
     	 	 id : 'pingPong'                        xmlns='urn:xmpp:ping'/>
     	 	 }).c('ping',                    </iq>
            {xmlns: 'urn:xmpp:ping'});
     	
     	 me.connection.send(iq);
     };



Sunday 26 February 2012
Example: IQ ping pong (3)
     this.handlePong = function (msg)
     {
     	 var me = this;
     	 var objMsg = $(msg);
     	 var from = objMsg.attr('from');
     	 me.log('Receiving ' + objMsg.attr('type') +
     	 	 ' from "' + objMsg.attr('from') +
     	 	 '" with id "' + objMsg.attr('id') + '"');
     	 me.connection.disconnect();
     };


     <iq xmlns="jabber:client"
       type="result" id="pingPong"
       from="demo" to="demo1@demo/eeffca60"/>


Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Example: support chat (1)
     this.bindSendMessage = function ()
     {
     	 var me = this;
     	 var chatMsg = $('#message');
     	 	
     	 $('#sendMessage').bind('click', function() {
     	 	 me.sendChatMessage(chatMsg.val());
     	 	 me.resetTextarea(chatMsg);
     	 });
     	 	
     	 chatMsg.keyup(function(event) {
     	 	 if (event.keyCode == 13 && event.shiftKey) {
     	 	 	 me.sendChatMessage(chatMsg.val());
     	 	 	 me.resetTextarea(chatMsg);
     	 	 }
     	 });
     };
Sunday 26 February 2012
Example: support chat (2)
     this.statusHandler = function (status)
     {
     	 var me = this;
     	 me.logStatus(status);
     	 if (status == Strophe.Status.CONNECTED) {
     	 	 me.connection.addHandler(
     	 	 	 function(msg) {	 	 	 	 //(Function) handler.
     	 	 	 	 return me.handleChatMessage(msg);
     	 	 	 },
     	 	 	 null, 	 	 	 	 	 	 	 	 //(String) ns
     	 	 	 'message', 	 	 	 	 	 	 //(String) name
     	 	 	 'chat'); 		 	 	 	 	 	 //(String) type
     	 }
     };


Sunday 26 February 2012
Example: support chat (3)

     this.handleChatMessage = function (msg)
     {
     	 var me = this;
     	
     	 var objMsg = $(msg);
     	 var from = objMsg.attr('from');
     	 var nick = Strophe.getNodeFromJid(from);
     	 var body = objMsg.children('body').text();
     	
     	 me.addMessageToChat(nick, body);
     	
     	 return true;
     };



Sunday 26 February 2012
Example: support chat (4)
     this.addMessageToChat = function (nick, body)
     {
     	 var me = this;
     	 var container = $('#chat');
     	 var atBottom =
            container.scrollTop() >=
               container[0].scrollHeight - container.height();
     	 	
     	 container.append('<dt>'+ nick +'</dt><dd>'+
          me.nl2br(body, true) +'</dd>');
     	 	
     	 if (atBottom) {
     	 	 container.scrollTop(container[0].scrollHeight);
     	 }
     };


Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Example: statistics

     this.handleHighChartData = function (msg)
     {
     	 var me = this;
     	 	
     	 var objMsg = $(msg);
        var body = objMsg.children('body').text();
     	 	
     	 me.chart.series[0].setData(jQuery.parseJSON(body));
     	 return true;
     };




Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Example: prebind BOSH (1)

    •   SID - RID

    •   Security

    •   User friendly

    •   Performance

    •   Persisting


Sunday 26 February 2012
Example: prebind BOSH(2)
     this.initConnection = function ()
     {
     	 var me = this;

     	 me.connection = new Strophe.Connection(me.httpBindUrl);
     	
     	 me.connection.attach(
     	 	 me.options.service.jid,
     	 	 me.options.service.sid,
     	 	 me.options.service.rid,
     	 	 function (status) {
     	 	 	 me.statusHandler(status);
     	 	 });
     };


Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Sunday 26 February 2012
Books




Sunday 26 February 2012
Thank you


    •   bert@becoded.be

    •   Code: https://github.com/becoded/talk-xmpp-demo

    •   Slides: Slideshare

    •   Rate / comments: http://joind.in



Sunday 26 February 2012
http://joind.in/4945
Sunday 26 February 2012
http://joind.in/4977
Sunday 26 February 2012
Questions



                          ?   ?   ?   ?




Sunday 26 February 2012

Contenu connexe

Tendances

Backbone JS - Journey to the Front End [Dev Nexus Conference]
Backbone JS - Journey to the Front End [Dev Nexus Conference]Backbone JS - Journey to the Front End [Dev Nexus Conference]
Backbone JS - Journey to the Front End [Dev Nexus Conference]Brian Mann
 
Type URL, Enter, and Then …
Type URL, Enter, and Then …Type URL, Enter, and Then …
Type URL, Enter, and Then …Jinglun Li
 
HPPG - high performance photo gallery
HPPG - high performance photo galleryHPPG - high performance photo gallery
HPPG - high performance photo galleryRemigijus Kiminas
 
PHP and Web Services
PHP and Web ServicesPHP and Web Services
PHP and Web ServicesBruno Pedro
 
S314011 - Developing Composite Applications for the Cloud with Apache Tuscany
S314011 - Developing Composite Applications for the Cloud with Apache TuscanyS314011 - Developing Composite Applications for the Cloud with Apache Tuscany
S314011 - Developing Composite Applications for the Cloud with Apache TuscanyLuciano Resende
 
Grok Drupal (7) Theming
Grok Drupal (7) ThemingGrok Drupal (7) Theming
Grok Drupal (7) ThemingPINGV
 
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJRealize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJLeonardo Balter
 
Progressive Downloads and Rendering
Progressive Downloads and RenderingProgressive Downloads and Rendering
Progressive Downloads and RenderingStoyan Stefanov
 

Tendances (14)

Backbone JS - Journey to the Front End [Dev Nexus Conference]
Backbone JS - Journey to the Front End [Dev Nexus Conference]Backbone JS - Journey to the Front End [Dev Nexus Conference]
Backbone JS - Journey to the Front End [Dev Nexus Conference]
 
Type URL, Enter, and Then …
Type URL, Enter, and Then …Type URL, Enter, and Then …
Type URL, Enter, and Then …
 
Week 1
Week 1Week 1
Week 1
 
Week 1
Week 1Week 1
Week 1
 
Week 1 (v3)
Week 1 (v3)Week 1 (v3)
Week 1 (v3)
 
HPPG - high performance photo gallery
HPPG - high performance photo galleryHPPG - high performance photo gallery
HPPG - high performance photo gallery
 
PHP and Web Services
PHP and Web ServicesPHP and Web Services
PHP and Web Services
 
S314011 - Developing Composite Applications for the Cloud with Apache Tuscany
S314011 - Developing Composite Applications for the Cloud with Apache TuscanyS314011 - Developing Composite Applications for the Cloud with Apache Tuscany
S314011 - Developing Composite Applications for the Cloud with Apache Tuscany
 
Hppg
HppgHppg
Hppg
 
Doctype netscape
Doctype netscapeDoctype netscape
Doctype netscape
 
Grok Drupal (7) Theming
Grok Drupal (7) ThemingGrok Drupal (7) Theming
Grok Drupal (7) Theming
 
Please dont touch-3.5
Please dont touch-3.5Please dont touch-3.5
Please dont touch-3.5
 
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJRealize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
Realize mais com HTML 5 e CSS 3 - 16 EDTED - RJ
 
Progressive Downloads and Rendering
Progressive Downloads and RenderingProgressive Downloads and Rendering
Progressive Downloads and Rendering
 

En vedette

Project 10 B Pw
Project 10 B PwProject 10 B Pw
Project 10 B Pwrix
 
Creative Commons
Creative CommonsCreative Commons
Creative CommonsAlbina
 
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 ExploitGangSeok Lee
 
Networking на конференциях
Networking на конференцияхNetworking на конференциях
Networking на конференцияхVitaliy Georgiev
 
Поршневой жидкостный насос
Поршневой жидкостный насосПоршневой жидкостный насос
Поршневой жидкостный насосGreen_Day
 
Anti social behaviour powerpoint (1)
Anti social behaviour powerpoint (1)Anti social behaviour powerpoint (1)
Anti social behaviour powerpoint (1)Dani Cathro
 
IT Security and Wire Fraud Awareness Slide Deck
IT Security and Wire Fraud Awareness Slide DeckIT Security and Wire Fraud Awareness Slide Deck
IT Security and Wire Fraud Awareness Slide DeckDon Gulling
 
Virus bulletin 2011 Conference Paper - Browser Exploit Packs - Exploitation T...
Virus bulletin 2011 Conference Paper - Browser Exploit Packs - Exploitation T...Virus bulletin 2011 Conference Paper - Browser Exploit Packs - Exploitation T...
Virus bulletin 2011 Conference Paper - Browser Exploit Packs - Exploitation T...Aditya K Sood
 
презентация туристский кластер
презентация туристский кластерпрезентация туристский кластер
презентация туристский кластерAlexandr Gorunov
 

En vedette (12)

Project 10 B Pw
Project 10 B PwProject 10 B Pw
Project 10 B Pw
 
Ws B 1 S.Bressaud
Ws B 1 S.BressaudWs B 1 S.Bressaud
Ws B 1 S.Bressaud
 
Creative Commons
Creative CommonsCreative Commons
Creative Commons
 
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
[2013 CodeEngn Conference 08] manGoo - Windows 8 Exploit
 
Networking на конференциях
Networking на конференцияхNetworking на конференциях
Networking на конференциях
 
Antisocial people
Antisocial peopleAntisocial people
Antisocial people
 
Поршневой жидкостный насос
Поршневой жидкостный насосПоршневой жидкостный насос
Поршневой жидкостный насос
 
Sp ws1 ulrich teichler
Sp ws1 ulrich teichlerSp ws1 ulrich teichler
Sp ws1 ulrich teichler
 
Anti social behaviour powerpoint (1)
Anti social behaviour powerpoint (1)Anti social behaviour powerpoint (1)
Anti social behaviour powerpoint (1)
 
IT Security and Wire Fraud Awareness Slide Deck
IT Security and Wire Fraud Awareness Slide DeckIT Security and Wire Fraud Awareness Slide Deck
IT Security and Wire Fraud Awareness Slide Deck
 
Virus bulletin 2011 Conference Paper - Browser Exploit Packs - Exploitation T...
Virus bulletin 2011 Conference Paper - Browser Exploit Packs - Exploitation T...Virus bulletin 2011 Conference Paper - Browser Exploit Packs - Exploitation T...
Virus bulletin 2011 Conference Paper - Browser Exploit Packs - Exploitation T...
 
презентация туристский кластер
презентация туристский кластерпрезентация туристский кластер
презентация туристский кластер
 

Similaire à Powering your website with realtime data

Powering your website with realtime data
Powering your website with realtime dataPowering your website with realtime data
Powering your website with realtime databecoded
 
XMPP Intro 1101 - 2008
XMPP Intro 1101 - 2008XMPP Intro 1101 - 2008
XMPP Intro 1101 - 2008Steffen Larsen
 
2016-05-12 DCRUG React.rb
2016-05-12 DCRUG React.rb2016-05-12 DCRUG React.rb
2016-05-12 DCRUG React.rbawwaiid
 
EAD Revision Progress Report, 2012-08-08
EAD Revision Progress Report, 2012-08-08EAD Revision Progress Report, 2012-08-08
EAD Revision Progress Report, 2012-08-08Michael Rush
 
What's new in PHP 5.5
What's new in PHP 5.5What's new in PHP 5.5
What's new in PHP 5.5Tom Corrigan
 
IBM dwLive, "Internet & HTTP - 잃어버린 패킷을 찾아서..."
IBM dwLive, "Internet & HTTP - 잃어버린 패킷을 찾아서..."IBM dwLive, "Internet & HTTP - 잃어버린 패킷을 찾아서..."
IBM dwLive, "Internet & HTTP - 잃어버린 패킷을 찾아서..."Dongwook Lee
 
Introduction to blogging with Jekyll
Introduction to blogging with JekyllIntroduction to blogging with Jekyll
Introduction to blogging with JekyllEric Lathrop
 
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan  Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan edthix
 
Fluentd - RubyKansai 65
Fluentd - RubyKansai 65Fluentd - RubyKansai 65
Fluentd - RubyKansai 65N Masahiro
 
WordCamp Montreal 2016 WP-API + React with server rendering
WordCamp Montreal 2016  WP-API + React with server renderingWordCamp Montreal 2016  WP-API + React with server rendering
WordCamp Montreal 2016 WP-API + React with server renderingZiad Saab
 
Build your LDAP Web Interface with LinID Directory Manager
Build your LDAP Web Interface with LinID Directory ManagerBuild your LDAP Web Interface with LinID Directory Manager
Build your LDAP Web Interface with LinID Directory ManagerLDAPCon
 
Documentation 2.0: DIY Content Delivery and Feedback in Real-time
Documentation 2.0: DIY Content Delivery and Feedback in Real-timeDocumentation 2.0: DIY Content Delivery and Feedback in Real-time
Documentation 2.0: DIY Content Delivery and Feedback in Real-timelykhinin
 
Hartwarming lightning talk in winter Sapporo
Hartwarming lightning talk in winter SapporoHartwarming lightning talk in winter Sapporo
Hartwarming lightning talk in winter SapporoJun OHWADA
 
Performance optimization - Advanced techniques
Performance optimization - Advanced techniquesPerformance optimization - Advanced techniques
Performance optimization - Advanced techniquesFilip Mares
 
Lone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AngleLone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AnglePablo Godel
 

Similaire à Powering your website with realtime data (20)

Powering your website with realtime data
Powering your website with realtime dataPowering your website with realtime data
Powering your website with realtime data
 
XMPP Intro 1101 - 2008
XMPP Intro 1101 - 2008XMPP Intro 1101 - 2008
XMPP Intro 1101 - 2008
 
2016-05-12 DCRUG React.rb
2016-05-12 DCRUG React.rb2016-05-12 DCRUG React.rb
2016-05-12 DCRUG React.rb
 
EAD Revision Progress Report, 2012-08-08
EAD Revision Progress Report, 2012-08-08EAD Revision Progress Report, 2012-08-08
EAD Revision Progress Report, 2012-08-08
 
What's new in PHP 5.5
What's new in PHP 5.5What's new in PHP 5.5
What's new in PHP 5.5
 
IBM dwLive, "Internet & HTTP - 잃어버린 패킷을 찾아서..."
IBM dwLive, "Internet & HTTP - 잃어버린 패킷을 찾아서..."IBM dwLive, "Internet & HTTP - 잃어버린 패킷을 찾아서..."
IBM dwLive, "Internet & HTTP - 잃어버린 패킷을 찾아서..."
 
Into The Box 2018 Ortus Keynote
Into The Box 2018 Ortus KeynoteInto The Box 2018 Ortus Keynote
Into The Box 2018 Ortus Keynote
 
The basics of fluentd
The basics of fluentdThe basics of fluentd
The basics of fluentd
 
NLP Project Full Circle
NLP Project Full CircleNLP Project Full Circle
NLP Project Full Circle
 
Introduction to blogging with Jekyll
Introduction to blogging with JekyllIntroduction to blogging with Jekyll
Introduction to blogging with Jekyll
 
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan  Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
 
Fluentd - RubyKansai 65
Fluentd - RubyKansai 65Fluentd - RubyKansai 65
Fluentd - RubyKansai 65
 
The Devil and HTML5
The Devil and HTML5The Devil and HTML5
The Devil and HTML5
 
Html5 intro
Html5 introHtml5 intro
Html5 intro
 
WordCamp Montreal 2016 WP-API + React with server rendering
WordCamp Montreal 2016  WP-API + React with server renderingWordCamp Montreal 2016  WP-API + React with server rendering
WordCamp Montreal 2016 WP-API + React with server rendering
 
Build your LDAP Web Interface with LinID Directory Manager
Build your LDAP Web Interface with LinID Directory ManagerBuild your LDAP Web Interface with LinID Directory Manager
Build your LDAP Web Interface with LinID Directory Manager
 
Documentation 2.0: DIY Content Delivery and Feedback in Real-time
Documentation 2.0: DIY Content Delivery and Feedback in Real-timeDocumentation 2.0: DIY Content Delivery and Feedback in Real-time
Documentation 2.0: DIY Content Delivery and Feedback in Real-time
 
Hartwarming lightning talk in winter Sapporo
Hartwarming lightning talk in winter SapporoHartwarming lightning talk in winter Sapporo
Hartwarming lightning talk in winter Sapporo
 
Performance optimization - Advanced techniques
Performance optimization - Advanced techniquesPerformance optimization - Advanced techniques
Performance optimization - Advanced techniques
 
Lone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New AngleLone StarPHP 2013 - Building Web Apps from a New Angle
Lone StarPHP 2013 - Building Web Apps from a New Angle
 

Dernier

Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesThousandEyes
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxLoriGlavin3
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
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
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
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
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsRavi Sanghani
 

Dernier (20)

Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyesHow to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
How to Effectively Monitor SD-WAN and SASE Environments with ThousandEyes
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptxPasskey Providers and Enabling Portability: FIDO Paris Seminar.pptx
Passkey Providers and Enabling Portability: FIDO Paris Seminar.pptx
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
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
 
Potential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and InsightsPotential of AI (Generative AI) in Business: Learnings and Insights
Potential of AI (Generative AI) in Business: Learnings and Insights
 

Powering your website with realtime data

  • 1. Powering your website with realtime data Bert Van Hauwaert bert@becoded.be - @tbotwit Sunday 26 February 2012
  • 2. Bert Van Hauwaert • Live in Belgium • Founder of be.coded • Freelance web application developer & consultant • ZCE 5.0 • Working on portal sites and realtime auction sites Sunday 26 February 2012
  • 3. Overview • The old days • XMPP • Install server • Configure apache • Libraries • Examples Sunday 26 February 2012
  • 4. Overview • The old days • XMPP • Install server • Configure apache • Libraries • Examples Sunday 26 February 2012
  • 5. The old days • <meta http-equiv=”refresh” content=”5” /> • <script > • AJAX Sunday 26 February 2012
  • 6. Overview • The old days • XMPP • Install server • Configure apache • Libraries • Examples Sunday 26 February 2012
  • 7. Websockets Source: http://caniuse.com/#feat=websockets Sunday 26 February 2012
  • 8. XMPP: what • Extensible Messaging and Presence Protocol • Jabber • XML • Client - Server - Component Sunday 26 February 2012
  • 9. XMPP: stanzas • <presence> • <message> • <iq> Sunday 26 February 2012
  • 10. XMPP: stanzas • <presence> • <message> • <iq> Sunday 26 February 2012
  • 11. XMPP: stanzas • <presence> • <message> • <iq> Sunday 26 February 2012
  • 12. XMPP: stanzas • <presence> • <message> • <iq> Sunday 26 February 2012
  • 13. XMPP: addressing • JID (Jabber Identifier) • Three main parts • [ node "@" ] domain [ "/" resource ] Sunday 26 February 2012
  • 14. XMPP: extensions • XMPP Extension Protocol - XEP • http://xmpp.org/xmpp-protocols/xmpp-extensions/ Sunday 26 February 2012
  • 15. XMPP: advantages • Open • Decentralized • Secure • Extensible Sunday 26 February 2012
  • 16. XMPP: disadvantages • Statefulness • Overhead Sunday 26 February 2012
  • 17. XMPP: example <stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="attendees@phpukconference.com" from="bert@becoded.be/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status>Giving a talk @ PHP UK conference</status> </presence> </stream:stream> Sunday 26 February 2012
  • 18. XMPP: example <stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="attendees@phpukconference.com" from="bert@becoded.be/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status>Giving a talk @ PHP UK conference</status> </presence> </stream:stream> Sunday 26 February 2012
  • 19. XMPP: example <stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="attendees@phpukconference.com" from="bert@becoded.be/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status>Giving a talk @ PHP UK conference</status> </presence> </stream:stream> Sunday 26 February 2012
  • 20. XMPP: example <stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="attendees@phpukconference.com" from="bert@becoded.be/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status>Giving a talk @ PHP UK conference</status> </presence> </stream:stream> Sunday 26 February 2012
  • 21. XMPP: example <stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="attendees@phpukconference.com" from="bert@becoded.be/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status>Giving a talk @ PHP UK conference</status> </presence> </stream:stream> Sunday 26 February 2012
  • 22. XMPP: example <stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="attendees@phpukconference.com" from="bert@becoded.be/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status> Giving a talk @ PHP UK conference </status> </presence> </stream:stream> Sunday 26 February 2012
  • 23. XMPP: example <stream:stream> <iq type="get" id="roster1"> <query xmlns:"jabber:iq:roster" /> </iq> <presence /> <message to="attendees@phpukconference.com" from="bert@becoded.be/speakerroom" type="chat"> <body> I hope you will enjoy this talk </body> </message> <presence> <show>dnd</show> <status> Giving a talk @ PHP UK conference </status> </presence> </stream:stream> Sunday 26 February 2012
  • 24. XMPP: XEP-0060 (1) • PubSub (Publish / Subscribe) • Bandwidth / resources Sunday 26 February 2012
  • 25. XMPP: XEP-0060 (2) <iq from="child@holiday.com/car" id="ams9nz78" to="pubsub.holiday.com" type="set"> <pubsub xmlns="http://jabber.org/ protocol/pubsub"> <subscribe node="are-we-there-yet" jid="child@holiday.com"/> </pubsub> </iq> Sunday 26 February 2012
  • 26. XMPP: XEP-0060 (3) <iq from="adult@holiday.com/car" id="wmn78e45a" to="pubsub.holiday.com" type="set"> <pubsub xmlns="http://jabber.org/protocol/pubsub"> <publish node="are-we-there-yet"> <item> <there xmlns="http://holiday.com/there-yet" status="true"/> </item> </publish> </pubsub> </iq> Sunday 26 February 2012
  • 27. XMPP: XEP-0060 (4) <message from="pubsub.holiday.com" to="child@holiday.com"> <event xmlns="http://jabber.org/protocol/pubsub#event"> <items node="are-we-there-yet"> <item id="ax78ui789q"> <there xmlns="http://holiday.com/there-yet" status="true"/> </item> </items> </event> </message> Sunday 26 February 2012
  • 28. XMPP: XEP-0045 (1) • MUC / Multi-User Chat • “Multiplier” Sunday 26 February 2012
  • 29. XMPP: XEP-0045 (2) <presence from="user@domain.com/resource" to="room@conference.muc.com/nickname"> <x xmlns= "http://jabber.org/protocol/muc"/> </presence> Sunday 26 February 2012
  • 30. XMPP: XEP-0045 (3) <message to="room@conference.muc.com" from="user@domain.com/resource" type="groupchat "> <body>Lorem Ipsum</body> </message> <message to="otherUser@domain.com/resource" from="room@conference.muc.com/nickname" type="groupchat "> <body>Lorem Ipsum</body> </message> Sunday 26 February 2012
  • 31. Overview • The old days • XMPP • Install server • Configure apache • Libraries • Examples Sunday 26 February 2012
  • 32. Install server: starting point • Debian • web server • SQL database • SSH server Sunday 26 February 2012
  • 33. Install server: apt sources • apt-get install vim • vim /etc/apt/sources.list • deb http://ftp.belnet.be/debian/ squeeze main non-free deb-src http://ftp.belnet.be/debian/ squeeze main deb http://security.debian.org/ squeeze/updates main non-free deb-src http://security.debian.org/ squeeze/updates main deb http://packages.dotdeb.org stable all deb-src http://packages.dotdeb.org stable all Sunday 26 February 2012
  • 34. Install server: prerequisites (1) • wget http://www.dotdeb.org/dotdeb.gpg • cat dotdeb.gpg | apt-key add - • apt-get update • apt-get install sun-java6-jre sun-java6-fonts ident2 Sunday 26 February 2012
  • 35. Install server: prerequisites (2) • apt-get install mysql-server mysql-client • apt-get install php5 php5-cli php5-common php5-dev php5-mysql php5-curl php-pear • Database & user Sunday 26 February 2012
  • 36. Install server: Openfire (1) • Openfire 3.7.1 • http://www.igniterealtime.org/projects/openfire/ • wget -O openfire_3.7.1_all.deb http://www.igniterealtime.org/downloadServlet? filename=openfire/openfire_3.7.1_all.deb • dpkg -i openfire_3.7.1_all.deb Sunday 26 February 2012
  • 37. Install server: Openfire (2) • http://[server-ip]:9090/ Sunday 26 February 2012
  • 45. Install server: Openfire (3) • Plugins • User Service • Monitoring Service Sunday 26 February 2012
  • 46. Overview • The old days • XMPP • Install server • Configure apache • Libraries • Examples Sunday 26 February 2012
  • 47. Configure apache: why (1) Client - polling ta ta ta data no da no da no da Server d ata w ne Client - long polling data Sunday 26 February 2012
  • 48. Configure apache: why (2) • BOSH (Bidirectional streams Over Synchronous HTTP) Sunday 26 February 2012
  • 49. Configure apache: proxy (1) • cd /etc/apache2/mods-enabled/ • ln -s ../mods-available/proxy.load • ln -s ../mods-available/proxy_http.load • ln -s ../mods-available/rewrite.load Sunday 26 February 2012
  • 50. Configure apache: proxy (2) <VirtualHost *:80> Options FollowSymLinks ServerAdmin bert@becoded.be ServerName xmpp.dev.becoded.be ServerAlias static.xmpp.dev.becoded.be # Indexes + Directory Root. DirectoryIndex index.php DocumentRoot /var/www/vhost/xmpp.dev.becoded.be/htdocs/public/ php_admin_value open_basedir ".:/var/www/vhost/xmpp.dev.becoded.be/htdocs:/var/www/library/Zend-latest/ library:../:/usr/share/php:/tmp" php_value include_path ".:/var/www/vhost/xmpp.dev.becoded.be/htdocs:/var/www/library/Zend-latest/library:/usr/ share/php" php_admin_value upload_tmp_dir "/tmp" SetEnv APPLICATION_ENV development # Logfiles ErrorLog /var/www/vhost/xmpp.dev.becoded.be/logs/error.log CustomLog /var/www/vhost/xmpp.dev.becoded.be/logs/access.log combined # XMPP proxy rule ProxyRequests Off ProxyPass /bind http://127.0.0.1:7070/http-bind/ ProxyPassReverse /bind http://127.0.0.1:7070/http-bind/ </VirtualHost> Sunday 26 February 2012
  • 51. Overview • The old days • XMPP • Install server • Configure apache • Libraries • Examples Sunday 26 February 2012
  • 52. Libraries • ZF - http://framework.zend.com • jQuery - http://jquery.com/ • jQuery UI - http://jqueryui.com/ • XMPPHP - http://code.google.com/p/xmpphp • Jaxl - http://jaxl.net • Strophe.js - http://strophe.im Sunday 26 February 2012
  • 53. Libraries: XMPPHP $connection = new XMPPHP_XMPP( $host, $port, $identifier->node, $identifier->password, $identifier->resource, $domain, $printlog, $loglevel); $connection->connect(); $connection->processUntil('session_start'); $connection->message('support@demo', 'Hello world'); $connection->disconnect(); Sunday 26 February 2012
  • 54. Libraries: Jaxl $connection = new JAXL(array( 'user' => $identifier->node, 'pass' => $identifier->password, 'host' => $host, 'domain' => $domain, 'port' => $port, 'authType' => 'PLAIN', 'logLevel' => $loglevel )); $connection->addPlugin('jaxl_post_auth', '_postAuthHook'); $connection->startCore("stream"); public function _postAuthHook ($payload, $jaxl) { $jaxl->sendMessage('support@demo', 'Hello world'); $jaxl->shutdown(); } Sunday 26 February 2012
  • 55. Libraries: Strophe.js var connection = new Strophe.Connection('/bind'); connection.connect( jid, password, function (status) { if (status == Strophe.Status.CONNECTED) { var msg = $msg({ to : 'support@demo', type : "chat" }).c('body').t('Hello world'); connection.send(msg); setTimeout(function () { connection.disconnect(); }, 500); } }); Sunday 26 February 2012
  • 56. Overview • The old days • XMPP • Install server • Configure apache • Libraries • Examples Sunday 26 February 2012
  • 57. Examples: setup Sunday 26 February 2012
  • 59. Examples: messages • Browser • Log • Adium Sunday 26 February 2012
  • 64. Example: IQ ping pong (1) this.statusHandler = function (status) { var me = this; if (status == Strophe.Status.CONNECTED) { me.connection.addHandler( function(msg) { //(Function) handler return me.handlePong(msg); }, null, //(String) ns 'iq', //(String) name null, //(String) type 'pingPong'); //(String) id me.sendPing(Strophe.getDomainFromJid(me.connection.jid)); } }; Sunday 26 February 2012
  • 65. Example: IQ ping pong (2) this.sendPing = function (to) { var me = this; <iq to='demo' type='get' var iq = $iq({ id='pingPong' to to, : xmlns='jabber:client'> type : 'get', <ping id : 'pingPong' xmlns='urn:xmpp:ping'/> }).c('ping', </iq> {xmlns: 'urn:xmpp:ping'}); me.connection.send(iq); }; Sunday 26 February 2012
  • 66. Example: IQ ping pong (3) this.handlePong = function (msg) { var me = this; var objMsg = $(msg); var from = objMsg.attr('from'); me.log('Receiving ' + objMsg.attr('type') + ' from "' + objMsg.attr('from') + '" with id "' + objMsg.attr('id') + '"'); me.connection.disconnect(); }; <iq xmlns="jabber:client" type="result" id="pingPong" from="demo" to="demo1@demo/eeffca60"/> Sunday 26 February 2012
  • 70. Example: support chat (1) this.bindSendMessage = function () { var me = this; var chatMsg = $('#message'); $('#sendMessage').bind('click', function() { me.sendChatMessage(chatMsg.val()); me.resetTextarea(chatMsg); }); chatMsg.keyup(function(event) { if (event.keyCode == 13 && event.shiftKey) { me.sendChatMessage(chatMsg.val()); me.resetTextarea(chatMsg); } }); }; Sunday 26 February 2012
  • 71. Example: support chat (2) this.statusHandler = function (status) { var me = this; me.logStatus(status); if (status == Strophe.Status.CONNECTED) { me.connection.addHandler( function(msg) { //(Function) handler. return me.handleChatMessage(msg); }, null, //(String) ns 'message', //(String) name 'chat'); //(String) type } }; Sunday 26 February 2012
  • 72. Example: support chat (3) this.handleChatMessage = function (msg) { var me = this; var objMsg = $(msg); var from = objMsg.attr('from'); var nick = Strophe.getNodeFromJid(from); var body = objMsg.children('body').text(); me.addMessageToChat(nick, body); return true; }; Sunday 26 February 2012
  • 73. Example: support chat (4) this.addMessageToChat = function (nick, body) { var me = this; var container = $('#chat'); var atBottom = container.scrollTop() >= container[0].scrollHeight - container.height(); container.append('<dt>'+ nick +'</dt><dd>'+ me.nl2br(body, true) +'</dd>'); if (atBottom) { container.scrollTop(container[0].scrollHeight); } }; Sunday 26 February 2012
  • 76. Example: statistics this.handleHighChartData = function (msg) { var me = this; var objMsg = $(msg); var body = objMsg.children('body').text(); me.chart.series[0].setData(jQuery.parseJSON(body)); return true; }; Sunday 26 February 2012
  • 81. Example: prebind BOSH (1) • SID - RID • Security • User friendly • Performance • Persisting Sunday 26 February 2012
  • 82. Example: prebind BOSH(2) this.initConnection = function () { var me = this; me.connection = new Strophe.Connection(me.httpBindUrl); me.connection.attach( me.options.service.jid, me.options.service.sid, me.options.service.rid, function (status) { me.statusHandler(status); }); }; Sunday 26 February 2012
  • 88. Thank you • bert@becoded.be • Code: https://github.com/becoded/talk-xmpp-demo • Slides: Slideshare • Rate / comments: http://joind.in Sunday 26 February 2012
  • 91. Questions ? ? ? ? Sunday 26 February 2012