SlideShare a Scribd company logo
1 of 71
Download to read offline
Real-Time Ruby for the Real-Time Webaka IM for web-applications,[object Object],Ilya Grigorik,[object Object],CTO / PostRank,[object Object]
www.postrank.com,[object Object],www.igvita.com,[object Object],@igrigorik,[object Object],Background: ,[object Object], - PHP, Perl,[object Object], - Ruby + Rails from ‘06,[object Object]
Real-Time: the hype & the technology,[object Object],Real-Time: the benefits,[object Object],XMPP,[object Object],AMQP,[object Object],PSHB,[object Object],WebHooks,[object Object],Ruby examples,[object Object],Real-life applications,[object Object],Fully buzzword compliant!,[object Object],The slides…,[object Object],Questions & Comments,[object Object],My blog,[object Object]
The Hype! Make it stop!,[object Object]
“Solution Exhibits Under 700 Nanoseconds of Latency for Inter-Process Communication Messaging”,[object Object],(micro/nano) seconds,[object Object],milliseconds,[object Object],500ms is real-time enough to feel real-time for IM. ,[object Object],seconds,[object Object],Real-time web is IM for web-services,[object Object],minutes / hours,[object Object],Real-Time has many definitions,[object Object],It all depends on your context,[object Object]
+ New Applications,[object Object],+ Better Architecture,[object Object]
Many wasteful checks,[object Object],Data?,[object Object],No,[object Object],Data?,[object Object],No,[object Object],Data?,[object Object],Yes,[object Object],Polling: painful, wasteful,[object Object]
Real-time Ruby for the Real-time Web
Extensible Messaging and Presence Protocol ,[object Object]
From: A, To: B,[object Object],Hello!,[object Object],From: A, To: B,[object Object],Hello!,[object Object],Extensible Messaging and Presence Protocol (XMPP),[object Object]
Event-stream protocol,[object Object],Persistent connections,[object Object],Presence,[object Object],XMPP Features,[object Object],Identity and authentication,[object Object]
User,[object Object],Domain,[object Object],Resource,[object Object],ilya@postrank.com/office,[object Object],Jabber Software Foundation,[object Object],JID: Federation, Identity  & Authentication,[object Object]
<message from="ilya@postrank.com/office" type="chat" to="ilya@igvita.com" id="aae1a">,[object Object],<body>hello</body>,[object Object],<active xmlns="http://jabber.org/protocol/chatstates"/>,[object Object],</message>,[object Object],Verbose protocol (XML),[object Object],Example: Message Routing with XMPP,[object Object]
XMPP in the wild: Google Talk,[object Object]
XMPP in the wild: Google Talk + Video,[object Object]
Psi: cross-platform Jabber/XMPP client,[object Object]
require"rubygems",[object Object],require"xmpp4r",[object Object],jid=Jabber::JID::new("ilya@postrank.com"),[object Object],client=Jabber::Client.new(jid),[object Object],client.connect("talk.google.com"),[object Object],client.auth("password"),[object Object],to = "ilya@aiderss.com",[object Object],subject = "Jabber client",[object Object],message = "Hello XMPP World!",[object Object],piclient.sendJabber::Message::new(to, message).set_subject(subject),[object Object],# <message to='ilya@igvita.com'>,[object Object],#   <body>Hello XMPP World!</body>,[object Object],#   <subject>Jabber client</subject>,[object Object],# </message>,[object Object],XMPP4R (Ruby) Demo,[object Object]
require "rubygems",[object Object],require "xmpp4r",[object Object],jid= Jabber::JID::new("ilya@postrank.com"),[object Object],client = Jabber::Client.new(jid),[object Object],client.connect("talk.google.com"),[object Object],client.auth("password"),[object Object],to = "ilya@postrank.com",[object Object],subject = "Jabber client",[object Object],message = "Hello XMPP World!",[object Object],piclient.sendJabber::Message::new(to, message).set_subject(subject),[object Object],# <message to='ilya@igvita.com'>,[object Object],#   <body>Hello XMPP World!</body>,[object Object],#   <subject>Jabber client</subject>,[object Object],# </message>,[object Object],XMPP4R (Ruby) Demo,[object Object]
client.send(Jabber::Presence.new.set_type(:away)),[object Object],#  <presence from='daniel@aiderss.com/iMac8D2CB97D' to='ilya@postrank.com/0EDD826C' xmlns='jabber:client'>,[object Object],#    <show>away</show>,[object Object],#    <priority>0</priority>,[object Object],#    <x xmlns='http://www.apple.com/xmpp/idle'>,[object Object],#      <idle-since>2009-04-01T21:48:15Z</idle-since>,[object Object],#    </x>,[object Object],#  </presence>,[object Object],client.add_message_callbackdo|m|,[object Object],  puts  "#{m.from} -- #{m.body}",[object Object],end,[object Object],# > daniel@postrank.com  -- Hey!,[object Object],Client Idle…,[object Object],XMPP4R (Ruby) Demo,[object Object]
client.send(Jabber::Presence.new.set_type(:available)),[object Object],#  <presence from='daniel@aiderss.com/iMac8D2CB97D' to='ilya@aiderss.com/0EDD826C' xmlns='jabber:client'>,[object Object],#    <show>away</show>,[object Object],#    <priority>0</priority>,[object Object],#    <x xmlns='http://www.apple.com/xmpp/idle'>,[object Object],#      <idle-since>2009-04-01T21:48:15Z</idle-since>,[object Object],#    </x>,[object Object],#  </presence>,[object Object],client.add_message_callbackdo|m|,[object Object],puts"#{m.from} -- #{m.body}",[object Object],end,[object Object],# > daniel@postrank.com  -- Hey!,[object Object],Client Idle…,[object Object],XMPP4R (Ruby) Demo,[object Object]
One-to-many distribution + C2S,[object Object]
XEP-0060: Publish-Subscribe (Pubsub),[object Object]
Persistent connection,[object Object],Subscribe,[object Object],New message!,[object Object],Publish-Subscribe,[object Object]
<iqtype='set‘ from='hamlet@denmark.lit/blogbot' to='pubsub.shakespeare.lit'id='pub1'>,[object Object],<pubsubxmlns='http://jabber.org/protocol/pubsub'>,[object Object],<publishnode='princely_musings'>,[object Object],      <item>,[object Object],        <entry xmlns='http://www.w3.org/2005/Atom'>,[object Object],          <title>Soliloquy<title>,[object Object],          <summary>,[object Object],To be, or not to be: that is the question!,[object Object],          <summary>,[object Object],          <link rel='alternate' type='text/html',[object Object],href='http://denmark.lit/2003/12/13/atom03'/>,[object Object],          <id>tag:denmark.lit,2003:entry-32397</id>,[object Object],          <published>2003-12-13T18:30:02Z</published>,[object Object],          <updated>2003-12-13T18:30:02Z</updated>,[object Object],        </entry>,[object Object],      </item>,[object Object],</publish>,[object Object],</pubsub>,[object Object],</iq>,[object Object],IQ Stanza,[object Object],PubSub Protocol: Client XML,[object Object]
<iq type='set‘ from='hamlet@denmark.lit/blogbot' to='pubsub.shakespeare.lit'id='pub1'>,[object Object],  <pubsubxmlns='http://jabber.org/protocol/pubsub'>,[object Object],    <publish node='princely_musings'>,[object Object],<item>,[object Object],<entryxmlns='http://www.w3.org/2005/Atom'>,[object Object],<title>Soliloquy<title>,[object Object],<summary>,[object Object],To be, or not to be: that is the question!,[object Object],<summary>,[object Object],<linkrel='alternate'type='text/html' ,[object Object],href='http://denmark.lit/2003/12/13/atom03'/>,[object Object],<id>tag:denmark.lit,2003:entry-32397</id>,[object Object],<published>2003-12-13T18:30:02Z</published>,[object Object],<updated>2003-12-13T18:30:02Z</updated>,[object Object],</entry>,[object Object],</item>,[object Object],    </publish>,[object Object],  </pubsub>,[object Object],</iq>,[object Object],AtomPub,[object Object],PubSub Protocol: Client XML,[object Object]
Distribute,[object Object],XEP-0060: Publish-Subscribe (Pubsub),[object Object],Publish,[object Object]
<messagefrom='pubsub.shakespeare.lit' to='francisco@denmark.lit' id='foo'>,[object Object],<eventxmlns='http://jabber.org/protocol/pubsub#event'>,[object Object],<itemsnode='princely_musings'>,[object Object],<itemid='ae890ac52d0df67ed7cfdf51b644e901'>,[object Object],[...ENTRY...],[object Object],</item>,[object Object],</items>,[object Object],</event>,[object Object],</message>,[object Object],<messagefrom='pubsub.shakespeare.lit' to='bernardo@denmark.lit' id='bar'>,[object Object],<eventxmlns='http://jabber.org/protocol/pubsub#event'>,[object Object],<itemsnode='princely_musings'>,[object Object],<itemid='ae890ac52d0df67ed7cfdf51b644e901'>,[object Object],[...ENTRY...],[object Object],</item>,[object Object],</items>,[object Object],</event>,[object Object],</message>,[object Object],Subscriber A,[object Object],Subscriber B,[object Object],XEP-0060: Publish-Subscribe (Pubsub),[object Object]
XMPP,[object Object],XMPP,[object Object],XMPP,[object Object],Real-time communication,[object Object]
Real-time Ruby for the Real-time Web
require'fire_hydrant',[object Object],require'yaml',[object Object],hydrant=FireHydrant.new(YAML.load(File.read("config.yml"))),[object Object],hydrant.on_location_updatedo|user|,[object Object],puts"#{user.token} has moved to #{user.locations.first}.",[object Object],end,[object Object],hydrant.run!,[object Object],Push notifications,[object Object],Ruby + FireEagle via XMPP,[object Object]
EjabberdErlang,[object Object],Djabberd			Perl,[object Object],OpenFire			Java,[object Object],Tigase			Java,[object Object],Defacto XMPP server,[object Object],RPM, GUI, shiny,[object Object],XMPP / Jabber Servers,[object Object]
Advanced Message Queuing Protocol (AMQP),[object Object]
“AMQP is an open Internet Protocol for Business Messaging”,[object Object],AMQP Working Group (16 companies),[object Object]
Consumer,[object Object],AMQP Broker,[object Object],AMQP Architecture,[object Object],Publisher,[object Object]
Broker Clustering,[object Object],AMQP Clustering,[object Object]
Routing key:usd.stock.amzMessage: I like AMZ!,[object Object],Direct Exchange,[object Object],Topic Exchange,[object Object],Fanout Exchange,[object Object],AMQP Broker Internals,[object Object]
Routing key:usd.stock.amzMessage: I like AMZ!,[object Object],Direct Exchange,[object Object],Topic Exchange,[object Object],Fanout Exchange,[object Object],Queue,[object Object],Name: amazonBind:usd.stock.amz,[object Object],AMQP Direct Exchange,[object Object]
Routing key:usd.stock.amzMessage: I like AMZ!,[object Object],Direct Exchange,[object Object],Topic Exchange,[object Object],Fanout Exchange,[object Object],Queue,[object Object],Name: stocksBind:usd.stock.*,[object Object],AMQP Topic Exchange,[object Object]
Routing key:usd.stock.msftMessage: I like Microsoft! ,[object Object],Direct Exchange,[object Object],Topic Exchange,[object Object],Fanout Exchange,[object Object],Queue,[object Object], Message: I like Microsoft! ,[object Object],AMQP Topic Exchange,[object Object]
Routing key:usd.stock.msftMessage: I like Microsoft!,[object Object],Direct Exchange,[object Object],Topic Exchange,[object Object],Fanout Exchange,[object Object],Queue 2,[object Object],Name: stocksBind:“”,[object Object],Queue 1,[object Object],AMQP Fanout Exchange,[object Object]
Routing key: usd.stock.msftMessage: I like Microsoft! ,[object Object],Direct Exchange,[object Object],Topic Exchange,[object Object],Fanout Exchange,[object Object],Queue 2,[object Object],Message: I like Microsoft,[object Object],Queue 1,[object Object],AMQP Fanout Exchange,[object Object]
AMQP Kung-fu: Load-balancing,[object Object]
Routing key:usd.stock.amzMessage: I like AMZ! ,[object Object],Direct Exchange,[object Object],Topic Exchange,[object Object],Fanout Exchange,[object Object],Only one client gets the message!,[object Object],Queue,[object Object],AMQP Load Balancing,[object Object]
Bind:purchase.pdf,[object Object],GET/purchase,[object Object],OK,[object Object],Elastic AMQP Load-balancing,[object Object]
More AMQP Kung-fu:,[object Object],  - Pubsub,[object Object],  - Key routing,[object Object],  - Failover,[object Object],  - Instant feedback,[object Object],  - At least once, exactly-once,[object Object],  - …,[object Object],http://bit.ly/igvita-amqp,[object Object]
require'mq',[object Object],AMQP.start(:host=>'amqp-server.com')do,[object Object],mq=MQ.new,[object Object],mq.topic('stocks').publish("5.95",:key=>"usd.amz"),[object Object],end,[object Object],AMQP.start(:host => 'amqp-server.com') do,[object Object],mq= MQ.new,[object Object],mq.queue(’stocks').bind(mq.topic('stocks'), :key => 'usd.*').subscribe{ |price|,[object Object],      print ’stock quote: ', price,[object Object],},[object Object],end,[object Object],Publisher,[object Object],AMQP + Ruby Example,[object Object]
require 'mq',[object Object],AMQP.start(:host => 'amqp-server.com') do,[object Object],mq= MQ.new,[object Object],mq.topic('stocks').publish("5.95", :key => "usd.amz"),[object Object],end  ,[object Object],AMQP.start(:host=>'amqp-server.com')do,[object Object],mq=MQ.new,[object Object],mq.queue(‘stocks').bind(mq.topic('stocks'),:key=>'usd.*').subscribe{|price|,[object Object],print‘stock quote: ',price,[object Object],},[object Object],end,[object Object],Consumer,[object Object],AMQP + Ruby Example,[object Object]
Real-time Ruby for the Real-time Web
http://blog.webhooks.org/2009/04/23/slides-from-pivotal-labs-talk/,[object Object],WebHooks:,[object Object],Pattern for enabling user-defined callbacks in web-applications,[object Object]
http://blog.webhooks.org/2009/04/23/slides-from-pivotal-labs-talk/,[object Object],WebHooks @ PayPal,[object Object]
http://blog.webhooks.org/2009/04/23/slides-from-pivotal-labs-talk/,[object Object],/register  http://callback-1.com,[object Object],/register  http://callback-2.com,[object Object],1,[object Object],ok,[object Object],http://blog.webhooks.org/2009/04/23/slides-from-pivotal-labs-talk/,[object Object],/post  Hello World!,[object Object],2,[object Object],ok,[object Object],/post  Hello World!,[object Object],http://callback-1.com,[object Object],3,[object Object],http://callback-2.com,[object Object],WebHooks Workflow,[object Object],/post  Hello World!,[object Object]
WebHooks Workflow,[object Object],WebHooks @ GitHub,[object Object]
Rails ActiveRecord  + WebHooks,[object Object]
http://github.com/jcapote/watercoolr,[object Object],-> POST /channels,[object Object],← { 'id':'2d0128d' },[object Object],1,[object Object],-> POST /subscribers data={,[object Object],    'channel':'2d0128d', ,[object Object],    'url':'http://api.calback.com/handler' ,[object Object],},[object Object],← { 'status': 'OK' },[object Object],2,[object Object],you -> POST /messages data={ 'channel':'2d0128d', 'message':'hey guys!' },[object Object],watercoolr -> POSThttp://api.callback.com/handler data='hey guys!',[object Object],   ...for every subscriber...,[object Object],← { 'status': 'OK' },[object Object],3,[object Object],Watercoolr: Ruby WebHooks Server,[object Object],via a simple Sinatra app,[object Object]
require'rubygems',[object Object],require'rest_client',[object Object],require'json',[object Object],# ruby postbin.rb http://www.postbin.org/1j11vyp,[object Object],puts "creating channel...",[object Object],resp=RestClient.post'http://watercoolr.appspot.com/channels', :data => '',[object Object],id =JSON.parse(resp)["id"],[object Object],puts "adding subscriber to channel #{id}",[object Object],resp = RestClient.post 'http://watercoolr.appspot.com/subscribers', ,[object Object],                :data => { :channel => id, :url => ARGV[0] }.to_json,[object Object],puts resp # {"status":"OK"},[object Object],puts "posting message to #{id}",[object Object],resp = RestClient.post 'http://watercoolr.appspot.com/messages', ,[object Object],                :data => { :channel => id, :message => 'Hello World' }.to_json,[object Object],puts resp # {"status":"OK"},[object Object],Watercoolr on Google App Engine,[object Object],DataMapper + Sinatra + Jruby,[object Object]
require'rubygems',[object Object],require'rest_client',[object Object],require'json',[object Object],# ruby postbin.rb http://www.postbin.org/1j11vyp,[object Object],puts "creating channel...",[object Object],resp = RestClient.post 'http://watercoolr.appspot.com/channels', :data => '',[object Object],id = JSON.parse(resp)["id"],[object Object],puts "adding subscriber to channel #{id}",[object Object],resp=RestClient.post'http://watercoolr.appspot.com/subscribers', ,[object Object],:data => { :channel => id, :url => ARGV[0] }.to_json,[object Object],puts resp# {"status":"OK"},[object Object],puts "posting message to #{id}",[object Object],resp = RestClient.post 'http://watercoolr.appspot.com/messages', ,[object Object],                :data => { :channel => id, :message => 'Hello World' }.to_json,[object Object],puts resp # {"status":"OK"},[object Object],Watercoolr on Google App Engine,[object Object],DataMapper + Sinatra + Jruby,[object Object]
require'rubygems',[object Object],require'rest_client',[object Object],require'json',[object Object],# ruby postbin.rb http://www.postbin.org/1j11vyp,[object Object],puts "creating channel...",[object Object],resp = RestClient.post 'http://watercoolr.appspot.com/channels', :data => '',[object Object],id = JSON.parse(resp)["id"],[object Object],puts "adding subscriber to channel #{id}",[object Object],resp = RestClient.post 'http://watercoolr.appspot.com/subscribers', ,[object Object],                :data => { :channel => id, :url => ARGV[0] }.to_json,[object Object],puts resp # {"status":"OK"},[object Object],puts "posting message to #{id}",[object Object],resp=RestClient.post'http://watercoolr.appspot.com/messages', ,[object Object],:data => { :channel => id, :message => 'Hello World' }.to_json,[object Object],puts resp# {"status":"OK"},[object Object],Watercoolr on Google App Engine,[object Object],DataMapper + Sinatra + Jruby,[object Object]
http://bit.ly/igvita-watercoolr,[object Object],http://www.github.com/igrigorik/watercoolr,[object Object],http://www.postbin.org,[object Object],POST’ing to PostBin,[object Object],great debugging tool,[object Object]
PubSub over HTTP,[object Object],basically, WebHooks…,[object Object]
“A simple, open, server-to-server web-hook-based pubsub (publish/subscribe) protocol as an extension to Atom and RSS.”,[object Object],“Parties (servers) speaking the PubSubHubbub protocol can get near-instant notifications (via webhook callbacks) when a topic (feed URL) they're interested in is updated.” ,[object Object],http://pubsubhubbub.googlecode.com/svn/trunk/pubsubhubbub-core-0.2.html,[object Object],http://docs.google.com/present/view?id=ajd8t6gk4mh2_34dvbpchfs,[object Object],+Spec’edPubSub Protocol,[object Object],+  Deployed & Available,[object Object],+  XML Transport  ,[object Object],-  XML Transport,[object Object],-  Not as general purpose,[object Object],-  No firehose,[object Object]
1,[object Object],2,[object Object]
3,[object Object],4,[object Object]
PSHB in the Wild,[object Object],Google, Typepad, Wordpress…,[object Object]
require'pubsubhubbub',[object Object],EventMachine.run {,[object Object],  hub =EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/'),[object Object],# subscribe to real-time notifications,[object Object],hub.subscribe"http://blog.yoursite.com/atom.xml", "http://yourhub.com/hubbub”,[object Object],# unsubscribe ,[object Object],hub.unsubscribe "http://blog.yoursite.com/atom.xml", "http://yourhub.com/hubbub”,[object Object],hub.callback { puts "Processed" },[object Object],hub.errback  { puts "Error! " + hub.response_header.status.to_s },[object Object],},[object Object],Consuming PSHB in Ruby,[object Object],gem install pubsubhubbub,[object Object]
require'pubsubhubbub',[object Object],EventMachine.run {,[object Object],  hub =EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/'),[object Object],# subscribe to real-time notifications,[object Object],hub.subscribe "http://blog.yoursite.com/atom.xml", "http://yourhub.com/hubbub”,[object Object],# unsubscribe ,[object Object],hub.unsubscribe"http://blog.yoursite.com/atom.xml", "http://yourhub.com/hubbub”,[object Object],hub.callback { puts "Processed" },[object Object],hub.errback  { puts "Error! " + hub.response_header.status.to_s },[object Object],},[object Object],Consuming PSHB in Ruby,[object Object],gem install pubsubhubbub,[object Object]
require'pubsubhubbub',[object Object],EventMachine.run {,[object Object],  hub =EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/'),[object Object],  # subscribe to real-time notifications,[object Object],hub.subscribe "http://blog.yoursite.com/atom.xml", "http://yourhub.com/hubbub”,[object Object],  # unsubscribe ,[object Object],hub.unsubscribe "http://blog.yoursite.com/atom.xml", "http://yourhub.com/hubbub”,[object Object],hub.callback { puts "Processed" },[object Object],hub.errback  { puts "Error! "+hub.response_header.status.to_s },[object Object],},[object Object],Consuming PSHB in Ruby,[object Object],gem install pubsubhubbub,[object Object]
require'pubsubhubbub',[object Object],EventMachine.run {,[object Object],  hub =EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/publish'),[object Object],# publish notification to all subscribers,[object Object],hub.publish ['http://www.test.com', 'http://www.test.com/2'],[object Object],hub.callback { puts "Notified PSHB Hub" },[object Object],hub.errback  { puts "Notification failed" + hub.response_header.status.to_s }  ,[object Object],},[object Object],Publishing PSHB in Ruby,[object Object],gem install pubsubhubbub,[object Object]
require'pubsubhubbub',[object Object],EventMachine.run {,[object Object],  hub =EventMachine::PubSubHubbub.new('http://pubsubhubbub.appspot.com/publish'),[object Object],# publish notification to all subscribers,[object Object],hub.publish ['http://www.test.com', 'http://www.test.com/2'],[object Object],hub.callback { puts "Notified PSHB Hub" },[object Object],hub.errback  { puts "Notification failed"+hub.response_header.status.to_s }  ,[object Object],},[object Object],Publishing PSHB in Ruby,[object Object],gem install pubsubhubbub,[object Object]
http://github.com/igrigorik/pubsubhubbub,[object Object]
Real-Time Web = “IM for web applications”,[object Object],XMPP  :  Presence,[object Object],AMQP :  Routing,[object Object],WebHooks:  Extensibility,[object Object],PubsubHubbub:  PubSub over HTTP,[object Object]
Related Blog Posts:,[object Object],http://bit.ly/igvita-amqp,[object Object],http://bit.ly/igvita-webhooks,[object Object],http://bit.ly/igvita-pshb,[object Object],Questions?,[object Object],The slides…,[object Object],Questions & Comments,[object Object],My blog,[object Object]

More Related Content

What's hot

Don't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web ApplicationsDon't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web ApplicationsStoyan Stefanov
 
scaling compiled applications - highload 2013
scaling compiled applications - highload 2013scaling compiled applications - highload 2013
scaling compiled applications - highload 2013ice799
 
Building Realtime Apps with Ember.js and WebSockets
Building Realtime Apps with Ember.js and WebSocketsBuilding Realtime Apps with Ember.js and WebSockets
Building Realtime Apps with Ember.js and WebSocketsBen Limmer
 
HTML5 Real-Time and Connectivity
HTML5 Real-Time and ConnectivityHTML5 Real-Time and Connectivity
HTML5 Real-Time and ConnectivityPeter Lubbers
 
Ajax to the Moon
Ajax to the MoonAjax to the Moon
Ajax to the Moondavejohnson
 
Pragmatics of Declarative Ajax
Pragmatics of Declarative AjaxPragmatics of Declarative Ajax
Pragmatics of Declarative Ajaxdavejohnson
 
Xdebug, KCacheGrind and Webgrind with WampServer
Xdebug, KCacheGrind and Webgrind with WampServer  Xdebug, KCacheGrind and Webgrind with WampServer
Xdebug, KCacheGrind and Webgrind with WampServer Mediovski Technology
 
Ajax Tutorial
Ajax TutorialAjax Tutorial
Ajax Tutorialoscon2007
 
Ruby application based on http
Ruby application based on httpRuby application based on http
Ruby application based on httpRichard Huang
 
Migrating existing monolith to serverless in 8 steps
Migrating existing monolith to serverless in 8 stepsMigrating existing monolith to serverless in 8 steps
Migrating existing monolith to serverless in 8 stepsYan Cui
 
Essential open source tools for serverless developers
Essential open source tools for serverless developersEssential open source tools for serverless developers
Essential open source tools for serverless developersYan Cui
 
The Once And Future Script Loader (v2)
The Once And Future Script Loader (v2)The Once And Future Script Loader (v2)
The Once And Future Script Loader (v2)Kyle Simpson
 
Basics of node.js
Basics of node.jsBasics of node.js
Basics of node.jsYasir Wani
 
Building a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBuilding a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBen Limmer
 
Chef Conf 2015: Package Management & Chef
Chef Conf 2015: Package Management & ChefChef Conf 2015: Package Management & Chef
Chef Conf 2015: Package Management & Chefice799
 
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love itDrupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love itRyan Weaver
 

What's hot (20)

Don't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web ApplicationsDon't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web Applications
 
scaling compiled applications - highload 2013
scaling compiled applications - highload 2013scaling compiled applications - highload 2013
scaling compiled applications - highload 2013
 
Building Realtime Apps with Ember.js and WebSockets
Building Realtime Apps with Ember.js and WebSocketsBuilding Realtime Apps with Ember.js and WebSockets
Building Realtime Apps with Ember.js and WebSockets
 
HTML5 Real-Time and Connectivity
HTML5 Real-Time and ConnectivityHTML5 Real-Time and Connectivity
HTML5 Real-Time and Connectivity
 
Ajax to the Moon
Ajax to the MoonAjax to the Moon
Ajax to the Moon
 
Pragmatics of Declarative Ajax
Pragmatics of Declarative AjaxPragmatics of Declarative Ajax
Pragmatics of Declarative Ajax
 
Dust.js
Dust.jsDust.js
Dust.js
 
Xdebug, KCacheGrind and Webgrind with WampServer
Xdebug, KCacheGrind and Webgrind with WampServer  Xdebug, KCacheGrind and Webgrind with WampServer
Xdebug, KCacheGrind and Webgrind with WampServer
 
Making the web faster
Making the web fasterMaking the web faster
Making the web faster
 
What is HTML 5?
What is HTML 5?What is HTML 5?
What is HTML 5?
 
Ajax Tutorial
Ajax TutorialAjax Tutorial
Ajax Tutorial
 
Ruby application based on http
Ruby application based on httpRuby application based on http
Ruby application based on http
 
Migrating existing monolith to serverless in 8 steps
Migrating existing monolith to serverless in 8 stepsMigrating existing monolith to serverless in 8 steps
Migrating existing monolith to serverless in 8 steps
 
Essential open source tools for serverless developers
Essential open source tools for serverless developersEssential open source tools for serverless developers
Essential open source tools for serverless developers
 
The Once And Future Script Loader (v2)
The Once And Future Script Loader (v2)The Once And Future Script Loader (v2)
The Once And Future Script Loader (v2)
 
Basics of node.js
Basics of node.jsBasics of node.js
Basics of node.js
 
Building a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBuilding a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profit
 
Chef Conf 2015: Package Management & Chef
Chef Conf 2015: Package Management & ChefChef Conf 2015: Package Management & Chef
Chef Conf 2015: Package Management & Chef
 
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love itDrupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
Drupal 8: Huge wins, a Bigger Community, and why you (and I) will Love it
 
Progressive Enhancement
Progressive EnhancementProgressive Enhancement
Progressive Enhancement
 

Similar to Real-time Ruby for the Real-time Web

Djabot – Python Jabber Bot
Djabot – Python Jabber BotDjabot – Python Jabber Bot
Djabot – Python Jabber Botmarekkuziel
 
Lecture 3 - Comm Lab: Web @ ITP
Lecture 3 - Comm Lab: Web @ ITP Lecture 3 - Comm Lab: Web @ ITP
Lecture 3 - Comm Lab: Web @ ITP yucefmerhi
 
Improving Soap Message Serialization
Improving Soap Message SerializationImproving Soap Message Serialization
Improving Soap Message SerializationPrabath Siriwardena
 
An Introduction to Solr
An Introduction to SolrAn Introduction to Solr
An Introduction to Solrtomhill
 
XML and Web Services with PHP5 and PEAR
XML and Web Services with PHP5 and PEARXML and Web Services with PHP5 and PEAR
XML and Web Services with PHP5 and PEARStephan Schmidt
 
XMPP, TV and the Semantic Web
XMPP, TV and the Semantic WebXMPP, TV and the Semantic Web
XMPP, TV and the Semantic WebDan Brickley
 
Evolution of API With Blogging
Evolution of API With BloggingEvolution of API With Blogging
Evolution of API With BloggingTakatsugu Shigeta
 
Real time web (Orbited) at BCNE3
Real time web (Orbited) at BCNE3Real time web (Orbited) at BCNE3
Real time web (Orbited) at BCNE3Alex Kavanagh
 
Kurzeinführung: Atom Publishing Protocol
Kurzeinführung: Atom Publishing ProtocolKurzeinführung: Atom Publishing Protocol
Kurzeinführung: Atom Publishing ProtocolDirk Haun
 
Comet web applications with Python, Django & Orbited
Comet web applications with Python, Django & OrbitedComet web applications with Python, Django & Orbited
Comet web applications with Python, Django & Orbitedskam
 
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google InfrastructureLiving in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructureguest517f2f
 
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google InfrastructureLiving in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google InfrastructurePamela Fox
 
10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]
10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]
10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]Chris Toohey
 
Internet protocalls & WCF/DReAM
Internet protocalls & WCF/DReAMInternet protocalls & WCF/DReAM
Internet protocalls & WCF/DReAMWoody Pewitt
 
RDFa: The Semantic Web's Missing Link
RDFa: The Semantic Web's Missing LinkRDFa: The Semantic Web's Missing Link
RDFa: The Semantic Web's Missing LinkMark Birbeck
 

Similar to Real-time Ruby for the Real-time Web (20)

Djabot – Python Jabber Bot
Djabot – Python Jabber BotDjabot – Python Jabber Bot
Djabot – Python Jabber Bot
 
Lecture 3 - Comm Lab: Web @ ITP
Lecture 3 - Comm Lab: Web @ ITP Lecture 3 - Comm Lab: Web @ ITP
Lecture 3 - Comm Lab: Web @ ITP
 
Improving Soap Message Serialization
Improving Soap Message SerializationImproving Soap Message Serialization
Improving Soap Message Serialization
 
An Introduction to Solr
An Introduction to SolrAn Introduction to Solr
An Introduction to Solr
 
XML and Web Services with PHP5 and PEAR
XML and Web Services with PHP5 and PEARXML and Web Services with PHP5 and PEAR
XML and Web Services with PHP5 and PEAR
 
XMPP, TV and the Semantic Web
XMPP, TV and the Semantic WebXMPP, TV and the Semantic Web
XMPP, TV and the Semantic Web
 
Putting SOAP to REST
Putting SOAP to RESTPutting SOAP to REST
Putting SOAP to REST
 
Evolution of API With Blogging
Evolution of API With BloggingEvolution of API With Blogging
Evolution of API With Blogging
 
Real time web (Orbited) at BCNE3
Real time web (Orbited) at BCNE3Real time web (Orbited) at BCNE3
Real time web (Orbited) at BCNE3
 
XMPP - Beyond IM
XMPP - Beyond IMXMPP - Beyond IM
XMPP - Beyond IM
 
Lecture1 B Frames&Forms
Lecture1 B  Frames&FormsLecture1 B  Frames&Forms
Lecture1 B Frames&Forms
 
Kurzeinführung: Atom Publishing Protocol
Kurzeinführung: Atom Publishing ProtocolKurzeinführung: Atom Publishing Protocol
Kurzeinführung: Atom Publishing Protocol
 
Comet web applications with Python, Django & Orbited
Comet web applications with Python, Django & OrbitedComet web applications with Python, Django & Orbited
Comet web applications with Python, Django & Orbited
 
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google InfrastructureLiving in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
 
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google InfrastructureLiving in the Cloud: Hosting Data & Apps Using the Google Infrastructure
Living in the Cloud: Hosting Data & Apps Using the Google Infrastructure
 
10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]
10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]
10 Things You're Not Doing [IBM Lotus Notes Domino Application Development]
 
Internet protocalls & WCF/DReAM
Internet protocalls & WCF/DReAMInternet protocalls & WCF/DReAM
Internet protocalls & WCF/DReAM
 
RDFa: The Semantic Web's Missing Link
RDFa: The Semantic Web's Missing LinkRDFa: The Semantic Web's Missing Link
RDFa: The Semantic Web's Missing Link
 
Develop webservice in PHP
Develop webservice in PHPDevelop webservice in PHP
Develop webservice in PHP
 
DevDays09 Internet Explorer 8
DevDays09 Internet Explorer 8DevDays09 Internet Explorer 8
DevDays09 Internet Explorer 8
 

More from Ilya Grigorik

Making the web fast(er) - RailsConf 2012
Making the web fast(er) - RailsConf 2012Making the web fast(er) - RailsConf 2012
Making the web fast(er) - RailsConf 2012Ilya Grigorik
 
0-60 with Goliath: High performance web services
0-60 with Goliath: High performance web services0-60 with Goliath: High performance web services
0-60 with Goliath: High performance web servicesIlya Grigorik
 
0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-Services0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-ServicesIlya Grigorik
 
Intelligent Ruby + Machine Learning
Intelligent Ruby + Machine LearningIntelligent Ruby + Machine Learning
Intelligent Ruby + Machine LearningIlya Grigorik
 
No callbacks, No Threads - Cooperative web servers in Ruby 1.9
No callbacks, No Threads - Cooperative web servers in Ruby 1.9No callbacks, No Threads - Cooperative web servers in Ruby 1.9
No callbacks, No Threads - Cooperative web servers in Ruby 1.9Ilya Grigorik
 
No Callbacks, No Threads - RailsConf 2010
No Callbacks, No Threads - RailsConf 2010No Callbacks, No Threads - RailsConf 2010
No Callbacks, No Threads - RailsConf 2010Ilya Grigorik
 
Ruby C10K: High Performance Networking - RubyKaigi '09
Ruby C10K: High Performance Networking - RubyKaigi '09Ruby C10K: High Performance Networking - RubyKaigi '09
Ruby C10K: High Performance Networking - RubyKaigi '09Ilya Grigorik
 
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09Ilya Grigorik
 
Leveraging Social Media - Strategies & Tactics - PostRank
Leveraging Social Media - Strategies & Tactics - PostRankLeveraging Social Media - Strategies & Tactics - PostRank
Leveraging Social Media - Strategies & Tactics - PostRankIlya Grigorik
 
Ruby Proxies for Scale, Performance, and Monitoring
Ruby Proxies for Scale, Performance, and MonitoringRuby Proxies for Scale, Performance, and Monitoring
Ruby Proxies for Scale, Performance, and MonitoringIlya Grigorik
 
Building Mini Google in Ruby
Building Mini Google in RubyBuilding Mini Google in Ruby
Building Mini Google in RubyIlya Grigorik
 
Ruby Proxies for Scale, Performance, and Monitoring - GoGaRuCo - igvita.com
Ruby Proxies for Scale, Performance, and Monitoring - GoGaRuCo - igvita.comRuby Proxies for Scale, Performance, and Monitoring - GoGaRuCo - igvita.com
Ruby Proxies for Scale, Performance, and Monitoring - GoGaRuCo - igvita.comIlya Grigorik
 
Event Driven Architecture - MeshU - Ilya Grigorik
Event Driven Architecture - MeshU - Ilya GrigorikEvent Driven Architecture - MeshU - Ilya Grigorik
Event Driven Architecture - MeshU - Ilya GrigorikIlya Grigorik
 
Taming The RSS Beast
Taming The  RSS  BeastTaming The  RSS  Beast
Taming The RSS BeastIlya Grigorik
 

More from Ilya Grigorik (14)

Making the web fast(er) - RailsConf 2012
Making the web fast(er) - RailsConf 2012Making the web fast(er) - RailsConf 2012
Making the web fast(er) - RailsConf 2012
 
0-60 with Goliath: High performance web services
0-60 with Goliath: High performance web services0-60 with Goliath: High performance web services
0-60 with Goliath: High performance web services
 
0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-Services0-60 with Goliath: Building High Performance Ruby Web-Services
0-60 with Goliath: Building High Performance Ruby Web-Services
 
Intelligent Ruby + Machine Learning
Intelligent Ruby + Machine LearningIntelligent Ruby + Machine Learning
Intelligent Ruby + Machine Learning
 
No callbacks, No Threads - Cooperative web servers in Ruby 1.9
No callbacks, No Threads - Cooperative web servers in Ruby 1.9No callbacks, No Threads - Cooperative web servers in Ruby 1.9
No callbacks, No Threads - Cooperative web servers in Ruby 1.9
 
No Callbacks, No Threads - RailsConf 2010
No Callbacks, No Threads - RailsConf 2010No Callbacks, No Threads - RailsConf 2010
No Callbacks, No Threads - RailsConf 2010
 
Ruby C10K: High Performance Networking - RubyKaigi '09
Ruby C10K: High Performance Networking - RubyKaigi '09Ruby C10K: High Performance Networking - RubyKaigi '09
Ruby C10K: High Performance Networking - RubyKaigi '09
 
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09
Lean & Mean Tokyo Cabinet Recipes (with Lua) - FutureRuby '09
 
Leveraging Social Media - Strategies & Tactics - PostRank
Leveraging Social Media - Strategies & Tactics - PostRankLeveraging Social Media - Strategies & Tactics - PostRank
Leveraging Social Media - Strategies & Tactics - PostRank
 
Ruby Proxies for Scale, Performance, and Monitoring
Ruby Proxies for Scale, Performance, and MonitoringRuby Proxies for Scale, Performance, and Monitoring
Ruby Proxies for Scale, Performance, and Monitoring
 
Building Mini Google in Ruby
Building Mini Google in RubyBuilding Mini Google in Ruby
Building Mini Google in Ruby
 
Ruby Proxies for Scale, Performance, and Monitoring - GoGaRuCo - igvita.com
Ruby Proxies for Scale, Performance, and Monitoring - GoGaRuCo - igvita.comRuby Proxies for Scale, Performance, and Monitoring - GoGaRuCo - igvita.com
Ruby Proxies for Scale, Performance, and Monitoring - GoGaRuCo - igvita.com
 
Event Driven Architecture - MeshU - Ilya Grigorik
Event Driven Architecture - MeshU - Ilya GrigorikEvent Driven Architecture - MeshU - Ilya Grigorik
Event Driven Architecture - MeshU - Ilya Grigorik
 
Taming The RSS Beast
Taming The  RSS  BeastTaming The  RSS  Beast
Taming The RSS Beast
 

Recently uploaded

UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPathCommunity
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioChristian Posta
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostMatt Ray
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesDavid Newbury
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?IES VE
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfinfogdgmi
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsSeth Reyes
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesMd Hossain Ali
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaborationbruanjhuli
 
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxBuilding AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxUdaiappa Ramachandran
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.YounusS2
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024SkyPlanner
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024D Cloud Solutions
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6DianaGray10
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfAijun Zhang
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Brian Pichman
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Adtran
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarPrecisely
 

Recently uploaded (20)

UiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation DevelopersUiPath Community: AI for UiPath Automation Developers
UiPath Community: AI for UiPath Automation Developers
 
Comparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and IstioComparing Sidecar-less Service Mesh from Cilium and Istio
Comparing Sidecar-less Service Mesh from Cilium and Istio
 
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCostKubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
KubeConEU24-Monitoring Kubernetes and Cloud Spend with OpenCost
 
Linked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond OntologiesLinked Data in Production: Moving Beyond Ontologies
Linked Data in Production: Moving Beyond Ontologies
 
How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?How Accurate are Carbon Emissions Projections?
How Accurate are Carbon Emissions Projections?
 
Videogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdfVideogame localization & technology_ how to enhance the power of translation.pdf
Videogame localization & technology_ how to enhance the power of translation.pdf
 
Computer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and HazardsComputer 10: Lesson 10 - Online Crimes and Hazards
Computer 10: Lesson 10 - Online Crimes and Hazards
 
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just MinutesAI Fame Rush Review – Virtual Influencer Creation In Just Minutes
AI Fame Rush Review – Virtual Influencer Creation In Just Minutes
 
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online CollaborationCOMPUTER 10: Lesson 7 - File Storage and Online Collaboration
COMPUTER 10: Lesson 7 - File Storage and Online Collaboration
 
Building AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptxBuilding AI-Driven Apps Using Semantic Kernel.pptx
Building AI-Driven Apps Using Semantic Kernel.pptx
 
Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.Basic Building Blocks of Internet of Things.
Basic Building Blocks of Internet of Things.
 
Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024Salesforce Miami User Group Event - 1st Quarter 2024
Salesforce Miami User Group Event - 1st Quarter 2024
 
Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024Artificial Intelligence & SEO Trends for 2024
Artificial Intelligence & SEO Trends for 2024
 
201610817 - edge part1
201610817 - edge part1201610817 - edge part1
201610817 - edge part1
 
UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6UiPath Studio Web workshop series - Day 6
UiPath Studio Web workshop series - Day 6
 
20230104 - machine vision
20230104 - machine vision20230104 - machine vision
20230104 - machine vision
 
Machine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdfMachine Learning Model Validation (Aijun Zhang 2024).pdf
Machine Learning Model Validation (Aijun Zhang 2024).pdf
 
Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )Building Your Own AI Instance (TBLC AI )
Building Your Own AI Instance (TBLC AI )
 
Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™Meet the new FSP 3000 M-Flex800™
Meet the new FSP 3000 M-Flex800™
 
AI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity WebinarAI You Can Trust - Ensuring Success with Data Integrity Webinar
AI You Can Trust - Ensuring Success with Data Integrity Webinar
 

Real-time Ruby for the Real-time Web

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.

Editor's Notes

  1. ResourceFederationClient to Server <> Server to ServerJabber.orgis the original IM service based on XMPP, the open standard for instant messaging. The service is run by a small group of volunteers. For that reason, you’ll often find people using Jabber and XMPP as synonyms. For all intents and purposes though, they are exactly the same. Having said that, each XMPP user has a “JID” or “Jabber ID”, which captures the following components: user, domain and resource.If you discard the resource component for a second, you’re left with an email address! Hence, as you may guess, the user identification and authentication will be done by a jabber server running on aiderss.com. And then the resource component simply assigns a unique handle, or location for that user. Unlike SMTP, which is stateless, we can have multiple clients be connected to our jabber server, which means we need a unique ID for each one.
  2. XMPP is also not limited to routing text snippets. Recently, Google integrated video chat into their products, once again, using XMPP. You can use XMPP to transfer binary files, real-time video, or anything else that your heart desires (not that it’s a necessarily good idea to do that though).
  3. Fire eagle exposes an XMPP endpoint which anyone can consume to receive your location updates. This saves them a lot of bandwidth and server resources, since the clients don’t have to poll for updates!
  4. Another interesting and fairly popular use for XMPP is the dynamic scalability. Instead of trying to build your own glue to detect and register new servers in the cloud, you could use XMPP and presence to solve this for you: whenever a server comes online, it logs into the XMPP server announcing it’s presence as available. Under load? Set it to “do not disturb”. If the server falls off the network, the XMPP server will detect that and remove it from its roster.