<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Phil Leggetter - Real-Time Web Software and Technology Evangelist</title>
	
	<link>http://www.leggetter.co.uk</link>
	<description>Real-Time Web, Real-Time Data and Social Media Software and Technology Evangelist and Consultant</description>
	<lastBuildDate>Sun, 27 May 2012 04:00:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/PhilLeggettersBlog" /><feedburner:info uri="philleggettersblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Realtime Web Apps in the Wild at HTML5DevConf</title>
		<link>http://feedproxy.google.com/~r/PhilLeggettersBlog/~3/rVUth6hrNpY/realtime-web-apps-in-the-wild-at-html5devconf.html</link>
		<comments>http://www.leggetter.co.uk/2012/05/21/realtime-web-apps-in-the-wild-at-html5devconf.html#comments</comments>
		<pubDate>Mon, 21 May 2012 18:45:51 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[pusher]]></category>
		<category><![CDATA[realtime web]]></category>
		<category><![CDATA[realtime web apps]]></category>
		<category><![CDATA[talks]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=23273</guid>
		<description><![CDATA[<p>I&#8217;ve just finished giving my presentation on HTML Web Apps in the wild at <a href="http://html5devconf.com">HTML5DevConf</a>. The Wifi stood up so hopefully the second screen experience really helped to demonstrate how realtime web technologies, and of course <a href="http://pusher.com">Pusher</a> can be used to enhanced interaction and engagement within applications.</p> <p>You can find the slides, 2nd [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html' rel='bookmark' title='Hosted realtime services &#8211; making the realtime web more accessible'>Hosted realtime services &#8211; making the realtime web more accessible</a></li>
<li><a href='http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html' rel='bookmark' title='Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web'>Edinburgh Techmeetup, Web Browsers &#038; the Realtime Web</a></li>
<li><a href='http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html' rel='bookmark' title='Realtime Commenting blog post on Smashing Magazine'>Realtime Commenting blog post on Smashing Magazine</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just finished giving my presentation on HTML Web Apps in the wild at <a  href="http://html5devconf.com">HTML5DevConf</a>. The Wifi stood up so hopefully the second screen experience really helped to demonstrate how realtime web technologies, and of course <a  href="http://pusher.com">Pusher</a> can be used to enhanced interaction and engagement within applications.</p>
<p>You can find the slides, 2nd screen app and the slides in &#8220;controller mode&#8221; via:<br />
<a  href="http://www.leggetter.co.uk/pres/html5devconf/">http://www.leggetter.co.uk/pres/html5devconf/</a></p>
<p><img src="http://www.html5devconf.com/img/header-15.png" alt="" /></p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html' rel='bookmark' title='Hosted realtime services &#8211; making the realtime web more accessible'>Hosted realtime services &#8211; making the realtime web more accessible</a></li>
<li><a href='http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html' rel='bookmark' title='Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web'>Edinburgh Techmeetup, Web Browsers &#038; the Realtime Web</a></li>
<li><a href='http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html' rel='bookmark' title='Realtime Commenting blog post on Smashing Magazine'>Realtime Commenting blog post on Smashing Magazine</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2012/05/21/realtime-web-apps-in-the-wild-at-html5devconf.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.leggetter.co.uk/2012/05/21/realtime-web-apps-in-the-wild-at-html5devconf.html</feedburner:origLink></item>
		<item>
		<title>A year as a Developer Evangelist</title>
		<link>http://feedproxy.google.com/~r/PhilLeggettersBlog/~3/IhiDzPd0Zno/a-year-as-a-developer-evangelist.html</link>
		<comments>http://www.leggetter.co.uk/2012/05/20/a-year-as-a-developer-evangelist.html#comments</comments>
		<pubDate>Sat, 19 May 2012 23:04:18 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[thoughts]]></category>
		<category><![CDATA[api-fanboy]]></category>
		<category><![CDATA[Jobs]]></category>
		<category><![CDATA[pusher]]></category>
		<category><![CDATA[real-time]]></category>
		<category><![CDATA[realtime web]]></category>
		<category><![CDATA[work/life integration]]></category>
		<category><![CDATA[Working from home]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=23259</guid>
		<description><![CDATA[<p>I can&#8217;t believe it, but I&#8217;ve now been working for <a href="http://pusher.com">Pusher</a> for a year. It&#8217;s been an exciting year both in life and in business &#8211; and it&#8217;s great when you spend a lot of the time working on something you are really interested in. So, I thought I&#8217;d push out a post covering [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html' rel='bookmark' title='Realtime Commenting blog post on Smashing Magazine'>Realtime Commenting blog post on Smashing Magazine</a></li>
<li><a href='http://www.leggetter.co.uk/2011/06/28/recent-article-in-net-magazine-websockets-code-a-real-time-survey.html' rel='bookmark' title='Recent article in .net magazine: WebSockets &#8211; Code a real-time survey'>Recent article in .net magazine: WebSockets &#8211; Code a real-time survey</a></li>
<li><a href='http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html' rel='bookmark' title='Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web'>Edinburgh Techmeetup, Web Browsers &#038; the Realtime Web</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I can&#8217;t believe it, but I&#8217;ve now been working for <a  href="http://pusher.com">Pusher</a> for a year. It&#8217;s been an exciting year both in life and in business &#8211; and it&#8217;s great when you spend a lot of the time working on something you are really interested in. So, I thought I&#8217;d push out a post covering the things that I&#8217;ve done this year along with a few thoughts.</p>
<h2>A Developer Evangelist?</h2>
<p>I&#8217;m a strong believer that we are much more than a job title and that each person has their own strengths, weaknesses and interests so they should get to work on the things that will most benefit them and through that benefit the company they work for.</p>
<p><img src="http://distilleryimage10.s3.amazonaws.com/9b70782e894511e192e91231381b3d7a_7.jpg" width="500" /><br />
<small>Illustration by <a  href="http://twitter.com/ZESanders">@ZESanders</a> from <a  href="http://twitter.com/IanSanders">@IanSanders</a>&#8216; new book <a  href="http://tinyurl.com/mashupbook">Mash-Up</a>.</small></p>
<p>But, the job title of &#8220;Developer Evangelist&#8221;, &#8220;Technical Evangelist&#8221; or &#8220;Developer Advocate&#8221; does generally mean you do a few things:</p>
<ul>
<li>Write blog posts about technology. This could be your product or just interesting technology in general.</li>
<li>Attend events: tech meetups, hack days, hack weekends and conferences.</li>
<li>Talk at events: as above.</li>
<li>Generally use social media to interact with other developers. Blogging is part of this but also Twitter, Google+, irc, StackOverflow and various other channels. It&#8217;s not an all or nothing thing though.</li>
<li>Keep up to speed with relevant technologies.</li>
</ul>
<p>There will be other responsibilities based on the role and the person. I spend quite a bit of time handling support queries. This is a great way of understanding how people are using Pusher and ways in which we could make our service better.</p>
<p>For me the job covers customer support (communication and tech support), marketing, a bit of product strategy and of course development. And probably a bunch of other things from time to time.</p>
<p>Interestingly enough I&#8217;ve never been very keen on public speaking. Yet, it&#8217;s actually pretty core to this job. So, I&#8217;m having to do it even though I&#8217;m not sure if I really want to do it or not, I just understand the importance of doing it. In any job you have to try new things and test yourself &#8211; this is the biggest test for me.</p>
<p>If you like the sound of this job, we are looking to <a  href="http://pusher.com/jobs">hire another Developer Evangelist</a> <img src='http://www.leggetter.co.uk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Finally, I <strong>highly recommend</strong> <a  href="http://developer-evangelism.com/">Christian Heilmann&#8217;s Developer Evangelist handbook</a>. It&#8217;s one of the things that made me realised that this is what I wanted to do.</p>
<h2>A year in review</h2>
<p>Here&#8217;s a list of things that I&#8217;ve done over the past year. But for faster consumption, my highlights have been:</p>
<ol>
<li><a  href="http://www.leggetter.co.uk/2011/06/28/recent-article-in-net-magazine-websockets-code-a-real-time-survey.html">Tutorial published in .net magazine</a>. It was really cool so see an article I&#8217;d written in print on the shelves of places like WHSmith.</li>
<li>Being on a <a  href="http://www.leggetter.co.uk/2011/11/09/the-right-place-at-the-right-time-how-the-real-time-web-influences-the-local-world.html">panel at the Local Social Summit</a>. It was really fulfilling to think about social and business aspects of the realtime web.</li>
<li><a  href="http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html">Talking at Tech Meetup Edinburgh</a>. I&#8217;ve been to techmeetup a few times so it felt really good, after the event, to have spoken and my talk seemed to have gone down well.</li>
<li>Getting involved in <a  href="http://www.leggetter.co.uk/2012/03/19/code-africa-the-impact-of-realtime.html">Code Africa at News International</a>. It was great to be part of a team that produced something really usable and with a real application in such a short space of time.</li>
<li><a href="coding.smashingmagazine.com/2012/05/09/building-real-time-commenting-system">Tutorial published in Smashing Magazine</a></li>
</ol>
<p>Read on for more details and additional links.</p>
<h3>May 2011</h3>
<ul>
<li>Started at Pusher
<ul>
<li><a  href="http://www.leggetter.co.uk/2011/05/21/goodbye-kwwika-hello-pusher.html">http://www.leggetter.co.uk/2011/05/21/goodbye-kwwika-hello-pusher.html</a><br />
<img src="http://www.leggetter.co.uk/wp-content/uploads/2011/05/damien_phil_pusher-300x224.jpg" alt="" /></li>
</ul>
</li>
<li>Attended Falsy Values in Warsaw
<ul>
<li><a  href="http://blog.pusher.com/2011/5/22/pusher-at-falsy-values">http://blog.pusher.com/2011/5/22/pusher-at-falsy-values</a></li>
<li><a  href="http://www.leggetter.co.uk/2011/05/24/notes-on-falsy-values.html">http://www.leggetter.co.uk/2011/05/24/notes-on-falsy-values.html</a><br />
<img src="http://blog.pusher.com/media/2011/05/23/14/21/04/272/pusher_crockford.jpg?m=resize&amp;o[geometry]=550x400&amp;s=f7f5591d6a486a86" alt="" /></li>
</ul>
</li>
<li>Wrote a &#8220;Building a realtime survey&#8221; tutorial article for .net magazine</li>
</ul>
<h3>June 2011</h3>
<ul>
<li>Spent quite a long time reviewing and updated the Pusher documentation
<ul>
<li><a  href="http://blog.pusher.com/2011/6/28/new-and-improved-docs">http://blog.pusher.com/2011/6/28/new-and-improved-docs</a></li>
</ul>
</li>
<li>Refactored Pusher .NET client library and created Silverlight library
<ul>
<li><a  href="https://github.com/leggetter/PusherClientDotNet">https://github.com/leggetter/PusherClientDotNet</a></li>
</ul>
</li>
<li>Created Realtime Web Technology Guide:
<ul>
<li><a  href="http://www.leggetter.co.uk/real-time-web-technologies-guide">http://www.leggetter.co.uk/real-time-web-technologies-guide</a></li>
</ul>
</li>
</ul>
<h3>July 2011</h3>
<ul>
<li>Added functionality to a Pusher REST .NET library and packaged as a Nuget library
<ul>
<li><a  href="https://github.com/grahamscott/pusherrestdotnet">https://github.com/grahamscott/pusherrestdotnet</a></li>
<li><a  href="http://nuget.org/packages/PusherRESTDotNet">http://nuget.org/packages/PusherRESTDotNet</a></li>
</ul>
</li>
<li>First ASP.NET blog post on building a real-time stock level indicator
<ul>
<li><a  href="http://blog.pusher.com/2011/6/25/the-easiest-way-to-add-real-time-functionality-to-an-asp-net-e-commerce-application">http://blog.pusher.com/2011/6/25/the-easiest-way-to-add-real-time-functionality-to-an-asp-net-e-commerce-application</a></li>
</ul>
</li>
<li>Started planning for onGameStart
<ul>
<li><a  href="http://blog.pusher.com/2011/7/7/join-us-in-the-html5-game-revolution-at-ongamestart">http://blog.pusher.com/2011/7/7/join-us-in-the-html5-game-revolution-at-ongamestart</a></li>
</ul>
</li>
</ul>
<h3>August 2011</h3>
<ul>
<li>What came before Websockets
<ul>
<li><a  href="http://blog.pusher.com/2011/8/10/what-came-before-websockets">http://blog.pusher.com/2011/8/10/what-came-before-websockets</a></li>
<li>This one got a reasonable amount of coverage.<br />
<img src="http://www.w3.org/html/logo/img/class-header-connectivity.jpg" width="200" /></li>
</ul>
</li>
<li>Second ASP.NET tutorial &#8211; A Who&#8217;s online shopping widget:
<ul>
<li><a  href="http://blog.pusher.com/2011/8/3/adding-a-real-time-who-s-shopping-widget-to-an-asp-net-web-app">http://blog.pusher.com/2011/8/3/adding-a-real-time-who-s-shopping-widget-to-an-asp-net-web-app</a></li>
</ul>
</li>
<li>Article published in .net magazine. The article is now available online too.
<ul>
<li><a  href="http://www.leggetter.co.uk/2011/06/28/recent-article-in-net-magazine-websockets-code-a-real-time-survey.html">http://www.leggetter.co.uk/2011/06/28/recent-article-in-net-magazine-websockets-code-a-real-time-survey.html</a><br />
<img src="http://www.leggetter.co.uk/wp-content/uploads/2011/06/start.png" alt="" /></li>
</ul>
</li>
</ul>
<h3>September 2011</h3>
<ul>
<li>Coverage in Mozilla Hack Weekly
<ul>
<li><a  href="http://hacks.mozilla.org/2011/09/mozilla-hacks-weekly-september-1st-2011/">http://hacks.mozilla.org/2011/09/mozilla-hacks-weekly-september-1st-2011/</a></li>
</ul>
</li>
<li>Attended onGameStart in Warsaw
<ul>
<li><a  href="http://blog.pusher.com/2011/9/26/ongamestart-a-bright-future-for-html5-games">http://blog.pusher.com/2011/9/26/ongamestart-a-bright-future-for-html5-games</a></li>
</ul>
</li>
<li>Gave a talk on the Realtime Web at Dundee Web Standards
<ul>
<li><a  href="http://www.eventbrite.com/event/2103797515">http://www.eventbrite.com/event/2103797515</a></li>
<li><a  href="http://speakerrate.com/talks/8340-why-the-realtime-web-matters">http://speakerrate.com/talks/8340-why-the-realtime-web-matters</a></li>
</ul>
</li>
<li>Gave a talk on the Realtime Web to Aberdeen .NET User Group
<ul>
<li><a  href="http://speakerrate.com/talks/8484-why-the-realtime-web-matters">http://speakerrate.com/talks/8484-why-the-realtime-web-matters</a></li>
</ul>
</li>
<li>Testing your integration with the Pusher JavaScript library blog post
<ul>
<li><a  href="http://blog.pusher.com/2011/9/2/testing-your-integration-with-the-pusher-javascript-library">http://blog.pusher.com/2011/9/2/testing-your-integration-with-the-pusher-javascript-library</a></li>
</ul>
</li>
</ul>
<h3>October 2011</h3>
<ul>
<li>Helped organise and publicise the first Pusher Challenge
<ul>
<li><a  href="http://blog.pusher.com/2011/10/9/win-prizes-for-making-your-app-more-awesome">http://blog.pusher.com/2011/10/9/win-prizes-for-making-your-app-more-awesome</a></li>
<li><a  href="http://blog.programmableweb.com/2011/10/11/get-real-time-in-the-pusher-api-challenge/">http://blog.programmableweb.com/2011/10/11/get-real-time-in-the-pusher-api-challenge/</a></li>
<li><a  href="http://phpdeveloper.org/news/16979">http://phpdeveloper.org/news/16979</a></li>
<li><a  href="http://blog.pusher.com/2011/10/19/pusher-challenge-results">http://blog.pusher.com/2011/10/19/pusher-challenge-results</a></li>
</ul>
</li>
<li>Wrote a realtime charity thermometer widget tutorial for GiveCamp UK
<ul>
<li><a  href="http://blog.pusher.com/2011/10/20/a-realtime-charity-thermometer-for-givecamp-uk">http://blog.pusher.com/2011/10/20/a-realtime-charity-thermometer-for-givecamp-uk</a></li>
<li><a  href="https://github.com/pusher/pusher-realtime-thermometer">https://github.com/pusher/pusher-realtime-thermometer</a></li>
<li>Coverage in JavaScript Weekly <a  href="http://javascriptweekly.com/archive/50.html">http://javascriptweekly.com/archive/50.html</a></li>
</ul>
</li>
<li>Attended GiveCamp UK<br />
<img src="http://melfindlater.files.wordpress.com/2011/11/20111116-133800.jpg" alt="" /><br />
<small>(<a  href="http://melfindlater.wordpress.com/2011/11/16/bringing-people-together-doing-amazing-things-givecampuk/">source</a>)</small></li>
<li>WebSocket article published in MSDN UK Flash newsletter
<ul>
<li><a  href="http://view.email.microsoftemail.com/?j=fe9915717063077c71&#038;m=fef81d77716605&#038;ls=fe2715707d610c7b701675&#038;l=feb41c78706d037b&#038;s=fe241772706c0775771078&#038;jb=ff9a1071&#038;ju=fe671671706705787117&#038;r=0">Newsletter</a></li>
<li><a  href="http://blogs.msdn.com/b/ukmsdn/archive/2011/10/17/web-sockets.aspx">Article in full</a></li>
</ul>
</li>
</ul>
<h3>November 2011</h3>
<ul>
<li>Attended the Mozilla Festival
<ul>
<li>Wrote a blog post about using Pusher at MozFest beforehand
<ul>
<li><a  href="http://blog.pusher.com/2011/11/3/ways-to-use-pusher-at-the-mozilla-festival">http://blog.pusher.com/2011/11/3/ways-to-use-pusher-at-the-mozilla-festival</a></li>
</ul>
</li>
<li>Ran a realtime web workshop at MozFest</li>
<li><a  href="https://wiki.mozilla.org/Festival2011/Playing_with_Real-Time_Web_Technology">https://wiki.mozilla.org/Festival2011/Playing_with_Real-Time_Web_Technology</a></li>
</ul>
</li>
<li>Attended the Local Social Summit and was on the Realtime Web panel discussion
<ul>
<li><a  href="http://www.localsocialsummit.com/lss/the-right-time-how-the-real-rime-web-influences-the-local-world-panel-teaser-lss11/">http://www.localsocialsummit.com/lss/the-right-time-how-the-real-rime-web-influences-the-local-world-panel-teaser-lss11/</a></li>
<li><a  href="http://www.leggetter.co.uk/2011/11/09/the-right-place-at-the-right-time-how-the-real-time-web-influences-the-local-world.html">http://www.leggetter.co.uk/2011/11/09/the-right-place-at-the-right-time-how-the-real-time-web-influences-the-local-world.html</a></li>
</ul>
</li>
<li>Gave a talk on the Realtime Web at Developer Developer Developer Dundee (DunDDD) with <a  href="http://twitter.com/garyshort">Gary Short</a>
<ul>
<li><a  href="http://speakerrate.com/talks/8970-the-realtime-web-is-shocking">http://speakerrate.com/talks/8970-the-realtime-web-is-shocking</a></li>
</ul>
</li>
</ul>
<p>You have a some months where you look back and you&#8217;re not exactly sure what you were up to. December and January were two such months. That said, the following months were pretty busy so busy months obviously require a bit of preparation &#8211; I&#8217;m guessing <img src='http://www.leggetter.co.uk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>December 2011</h3>
<ul>
<li>As well as holidays I hit StackOverflow quite hard
<ul>
<li><a  href="http://stackoverflow.com/users/39904/leggetter">http://stackoverflow.com/users/39904/leggetter</a></li>
</ul>
</li>
<li>Made a start on new Pusher Tutorials
<ul>
<li><a  href="http://pusher.com/tutorials">http://pusher.com/tutorials</a></li>
</ul>
</li>
</ul>
<h3>Januaray 2012</h3>
<ul>
<li>HTML5 Realtime Push Notifications tutorial:
<ul>
<li><a  href="http://pusher.com/tutorials/html5_realtime_push_notifications">http://pusher.com/tutorials/html5_realtime_push_notifications</a></li>
</ul>
</li>
<li>Realtime Activity Streams tutorial
<ul>
<li><a  href="http://pusher.com/tutorials/realtime_activity_streams">http://pusher.com/tutorials/realtime_activity_streams</a></li>
</ul>
</li>
<li>Realtime Chat Widget tutorial:
<ul>
<li><a  href="http://pusher.com/tutorials/realtime_chat_widget">http://pusher.com/tutorials/realtime_chat_widget</a></li>
</ul>
</li>
</ul>
<h3>February 2012</h3>
<ul>
<li>Gave a talk at Edinburgh TechMeetup &#8220;Web Browsers &amp; the Realtime Web&#8221;
<ul>
<li><a  href="http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html">http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html</a></li>
<li><a  href="http://www.slideshare.net/leggetter/web-browsers-the-realtime-web">http://www.slideshare.net/leggetter/web-browsers-the-realtime-web</a></li>
<li></li>
</ul>
</li>
</ul>
<p><iframe src="http://player.vimeo.com/video/36602961?title=0&amp;byline=0&amp;portrait=0" width="400" height="225" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></p>
<ul>
<li>Attended jQuery UK conference in Oxford
<ul>
<li><a  href="http://www.leggetter.co.uk/2012/02/19/jquery-uk-2012-event-dont-always-use-jquery.html">http://www.leggetter.co.uk/2012/02/19/jquery-uk-2012-event-dont-always-use-jquery.html</a></li>
</ul>
</li>
<li>Attended Guardian Hackday
<ul>
<li><a  href="http://www.leggetter.co.uk/2012/02/18/ideas-for-apihackathon.html">http://www.leggetter.co.uk/2012/02/18/ideas-for-apihackathon.html</a></li>
<li><a  href="http://blog.pusher.com/2012/2/21/epic-pusher-hacks-at-the-guardian-london">http://blog.pusher.com/2012/2/21/epic-pusher-hacks-at-the-guardian-london</a></li>
<li><img src="http://developer.pearson.com/sites/default/files/pictures/120218PhilPusher.png" alt="" /><br />
<small>Photo by Dan Murphy from Pearson (<a  href="http://developer.pearson.com/blog/apigee-hackathon-guardian">Source</a>)</small></li>
</ul>
</li>
</ul>
<h3>March 2012</h3>
<ul>
<li>Gave a realtime web talk at the University of Dundee<br />
<img src="http://a.yfrog.com/img618/5950/z2qpg.jpg" alt="" /></li>
<li>Attended Code Africa hack weekend at The Times
<ul>
<li><a  href="http://blog.pusher.com/2012/3/21/pusher-at-code-africa">http://blog.pusher.com/2012/3/21/pusher-at-code-africa</a></li>
<li><a  href="http://www.leggetter.co.uk/2012/03/19/code-africa-the-impact-of-realtime.html">http://www.leggetter.co.uk/2012/03/19/code-africa-the-impact-of-realtime.html</a><br />
<img src="http://farm8.staticflickr.com/7230/6931655746_ca68009a9f_z.jpg" alt="" /><br />
<small>Photo by <a  href="http://www.flickr.com/photos/iliasbartolini/">Ilias Bartolini</a></small></li>
</ul>
</li>
<li>Attended Hackathon London hack weekend:
<ul>
<li><a  href="http://blog.pusher.com/2012/3/26/pusher-at-hackldn">http://blog.pusher.com/2012/3/26/pusher-at-hackldn</a></li>
</ul>
</li>
<li>Ran a Realtime Web Workshop in Edinburgh (hosted at Skyscanner)
<ul>
<li><a  href="https://groups.google.com/forum/?fromgroups#!topic/techmeetup/8GRGxGBDFFo">https://groups.google.com/forum/?fromgroups#!topic/techmeetup/8GRGxGBDFFo</a></li>
</ul>
</li>
<li>Gave a Pusher talk at <a  href="http://www.rga.com/">R/GA</a> London</li>
<li>Gave a Pusher talk to <a  href="http://developer.pearson.com/">Pearson Future Technologies team</a> in London</li>
<li>Started writing a tutorial for Smashing Magazine</li>
</ul>
<h3>April 2012</h3>
<ul>
<li>Wrote Realtime Location-Aware Visitor Tracker article for Web Resources Depot</li>
<li>Attended <a  href="http://www.welcometosync.com/hack/">Culture Hack Scotland</a>
<ul>
<li>Great to see the winner of the &#8216;most fun&#8217; category and overall winner of the event using Pusher.<br />
<a  href="http://blog.pusher.com/2012/5/3/shakey-has-it-all-realtime-mobile-browser-and-user-audience-engagement">http://blog.pusher.com/2012/5/3/shakey-has-it-all-realtime-mobile-browser-and-user-audience-engagement</a><br />
<img src="http://f.cl.ly/items/210o1G0S2H0e252b2r3b/chscot.jpeg" alt="" /></li>
</ul>
</li>
</ul>
<h3>May</h3>
<ul>
<li>How to Build a Realtime Commenting System tutorial published in Smashing Magazine
<ul>
<li>&lt;www.webresourcesdepot.com/location-aware-realtime-visitor-tracker-using-pusher-tutorial></li>
</ul>
</li>
<li>Gave a realtime web talk at <a  href="http://mrm-meteorite.com/">MRM Meteorite</a></li>
<li>Hereford .NET User Group talk on the realtime web
<ul>
<li><a  href="http://www.nxtgenug.net/ViewEvent.aspx?EventID=499">http://www.nxtgenug.net/ViewEvent.aspx?EventID=499</a></li>
</ul>
</li>
<li>Travel to San Francisco
<ul>
<li>Talking at HTML5DevConf</li>
<li>&lt;html5devconf.com/sessions.html#phill></li>
<li>Talking at Fluent Conf</li>
<li>http://fluentconf.com/fluent2012/public/schedule/speaker/139350</li>
<li>Look out for other hack events to attend/speak at.</li>
<li>Hopefully meet up with a number of current an potential Pusher customers.</li>
</ul>
</li>
<li>Organise Webinar Series with AT&amp;T</li>
<li>Agreed to be a technical reviewer on a realtime web book</li>
<li>Agreed to submit an article to an HTML5 Hacks book</li>
</ul>
<h2>Finally</h2>
<p>Finally I&#8217;d like to say thanks to <a  href="http://twitter.com/dctanner">Damien</a> and <a  href="http://twitter.com/maxthelion">Max</a>, the co-founders of Pusher. They saw what I had done with Kwwika, and despite having to deal with the occasional <strong>massive</strong> email from me, have given me the opportunity to continue doing something I really believe in &#8211; helping others understand and use realtime web technologies.</p>
<p>Finally, finally &#8211; since I&#8217;m in San Francisco I get to publish this blog post whilst sitting in <a  href="http://yerbabuenagardens.com/">Yerba Buena Gardens</a>. Pretty cool!</p>
<p><img src="https://is1.4sqi.net/pix/Pm0piJ0EiVZW4nviGwDrqNZsm7yyJXLQKb26f42i8tY.jpg" alt="" /></p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html' rel='bookmark' title='Realtime Commenting blog post on Smashing Magazine'>Realtime Commenting blog post on Smashing Magazine</a></li>
<li><a href='http://www.leggetter.co.uk/2011/06/28/recent-article-in-net-magazine-websockets-code-a-real-time-survey.html' rel='bookmark' title='Recent article in .net magazine: WebSockets &#8211; Code a real-time survey'>Recent article in .net magazine: WebSockets &#8211; Code a real-time survey</a></li>
<li><a href='http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html' rel='bookmark' title='Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web'>Edinburgh Techmeetup, Web Browsers &#038; the Realtime Web</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2012/05/20/a-year-as-a-developer-evangelist.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.leggetter.co.uk/2012/05/20/a-year-as-a-developer-evangelist.html</feedburner:origLink></item>
		<item>
		<title>Realtime Commenting blog post on Smashing Magazine</title>
		<link>http://feedproxy.google.com/~r/PhilLeggettersBlog/~3/5I11rItxffQ/realtime-commenting-blog-post-on-smashing-magazine.html</link>
		<comments>http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html#comments</comments>
		<pubDate>Wed, 09 May 2012 13:51:50 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[progressive enhancement]]></category>
		<category><![CDATA[pusher]]></category>
		<category><![CDATA[realtime web]]></category>
		<category><![CDATA[websockets]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=23247</guid>
		<description><![CDATA[<p>Really pleased to see my <a href="http://coding.smashingmagazine.com/2012/05/09/building-real-time-commenting-system/">realtime commenting system blog post</a> appearing on <a href="http://coding.smashingmagazine.com">Smashing Magazine</a>. The post took a reasonable amount of time to write but I really like the way that the application is built from near-scratch and is progressively enhanced, first with AJAX and then realtime web functionality.</p> <p><a href="http://coding.smashingmagazine.com/2012/05/09/building-real-time-commenting-system/"></a><br /> Big [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2009/04/28/caplin-systems-blog-post-what-is-the-real-time-web.html' rel='bookmark' title='Caplin Systems Blog Post &#8211; What is the real-time web?'>Caplin Systems Blog Post &#8211; What is the real-time web?</a></li>
<li><a href='http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html' rel='bookmark' title='Hosted realtime services &#8211; making the realtime web more accessible'>Hosted realtime services &#8211; making the realtime web more accessible</a></li>
<li><a href='http://www.leggetter.co.uk/2011/06/28/recent-article-in-net-magazine-websockets-code-a-real-time-survey.html' rel='bookmark' title='Recent article in .net magazine: WebSockets &#8211; Code a real-time survey'>Recent article in .net magazine: WebSockets &#8211; Code a real-time survey</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Really pleased to see my <a  href="http://coding.smashingmagazine.com/2012/05/09/building-real-time-commenting-system/">realtime commenting system blog post</a> appearing on <a  href="http://coding.smashingmagazine.com">Smashing Magazine</a>. The post took a reasonable amount of time to write but I really like the way that the application is built from near-scratch and is progressively enhanced, first with AJAX and then realtime web functionality.</p>
<p><a  href="http://coding.smashingmagazine.com/2012/05/09/building-real-time-commenting-system/"><img src="http://f.cl.ly/items/1L3v1O0m0n2J3L0G0x15/websockets_html5_pusher.png" /></a><br />
<small>Big thanks to <a  href="https://twitter.com/saulegoode">Bryce Wilson</a> of <a  href="http://zendit.com">zendit.com</a> for putting the HTML5, WebSockets (connectivity) and Pusher image together.</a></p>
<p>You can <a  href="http://coding.smashingmagazine.com/2012/05/09/building-real-time-commenting-system/">read the &quot;How To Build A Real-Time Commenting System&quot; post</a> on Smashing Magazine now. And here&#8217;s the tweet from <a  href="http://twitter.com/smashingmag">@smashingmag</a>:</p>
<blockquote class="twitter-tweet"><p>New on Smashing Coding: How To Build A Real-Time Commenting System &#8211; <a  href="http://t.co/cY3yZt2X" title="http://coding.smashingmagazine.com/2012/05/09/building-real-time-commenting-system/">coding.smashingmagazine.com/2012/05/09/bui…</a></p>
<p>&mdash; Smashing Magazine (@smashingmag) <a  href="https://twitter.com/smashingmag/status/200196453698764801" 0="data-datetime="2012-05-09T12:12:08+00:00"">May 9, 2012</a></p></blockquote>
<p><script src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2009/04/28/caplin-systems-blog-post-what-is-the-real-time-web.html' rel='bookmark' title='Caplin Systems Blog Post &#8211; What is the real-time web?'>Caplin Systems Blog Post &#8211; What is the real-time web?</a></li>
<li><a href='http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html' rel='bookmark' title='Hosted realtime services &#8211; making the realtime web more accessible'>Hosted realtime services &#8211; making the realtime web more accessible</a></li>
<li><a href='http://www.leggetter.co.uk/2011/06/28/recent-article-in-net-magazine-websockets-code-a-real-time-survey.html' rel='bookmark' title='Recent article in .net magazine: WebSockets &#8211; Code a real-time survey'>Recent article in .net magazine: WebSockets &#8211; Code a real-time survey</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html</feedburner:origLink></item>
		<item>
		<title>WebSockets realise Comet. They’re not an alternative.</title>
		<link>http://feedproxy.google.com/~r/PhilLeggettersBlog/~3/3DzyzCRxIEk/websockets-realise-comet-theyre-not-an-alternative.html</link>
		<comments>http://www.leggetter.co.uk/2012/04/22/websockets-realise-comet-theyre-not-an-alternative.html#comments</comments>
		<pubDate>Sun, 22 Apr 2012 18:58:14 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[api-fanboy]]></category>
		<category><![CDATA[comet]]></category>
		<category><![CDATA[Realime Push]]></category>
		<category><![CDATA[Realtime browser push]]></category>
		<category><![CDATA[realtime web]]></category>
		<category><![CDATA[websockets]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=23220</guid>
		<description><![CDATA[<p> &#8220;WebSockets or Comet&#8221; </p> <p>I’ve been thinking about writing about this frequently used statement for a while, and I’ve seen a few comments and discussions previously about this e.g. from <a href="http://twitter.com/martintyler">Martin Tyler</a> of <a href="http://www.caplin.com">Caplin Systems</a> and Peter Lubbers of <a href="http://kaazing.com">Kaazing</a> in a <a href="http://www.infoq.com/articles/Web-Sockets-Proxy-Servers#view_54559">post on InfoQ</a>).</p> <p>Martin&#8217;s point of view is:</p> [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/08/25/what-came-before-websockets.html' rel='bookmark' title='What came before WebSockets?'>What came before WebSockets?</a></li>
<li><a href='http://www.leggetter.co.uk/2009/11/14/why-comet-is-key-to-the-truly-real-time-web.html' rel='bookmark' title='Why Comet is key to the Truly Real-Time Web'>Why Comet is key to the Truly Real-Time Web</a></li>
<li><a href='http://www.leggetter.co.uk/2011/09/07/qa-are-websockets-ready-for-commercial-use.html' rel='bookmark' title='Q&amp;A: Are WebSockets ready for commercial use?'>Q&#038;A: Are WebSockets ready for commercial use?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<blockquote><p>
  &#8220;WebSockets or Comet&#8221;
</p></blockquote>
<p>I’ve been thinking about writing about this frequently used statement for a while, and I’ve seen a few comments and discussions previously about this e.g. from <a  href="http://twitter.com/martintyler">Martin Tyler</a> of <a  href="http://www.caplin.com">Caplin Systems</a> and Peter Lubbers of <a  href="http://kaazing.com">Kaazing</a> in a <a  href="http://www.infoq.com/articles/Web-Sockets-Proxy-Servers#view_54559">post on InfoQ</a>).</p>
<p>Martin&#8217;s point of view is:</p>
<blockquote><p>
  One thing I don&#8217;t understand is your stance on Comet. You seem to want to distance Kaazing from Comet, despite the fact that your WebSocket emulation is surely Comet. More than this though, WebSocket itself is also Comet since Comet is just a paradigm, not a any specific transport mechanism.
</p></blockquote>
<p>Peter&#8217;s opinion is:</p>
<blockquote><p>
  Comet is a programming model that allows a web server to push data to a browser. This is often achieved through a long-held HTTP request, but there really is no standard or specification for Comet; it is just an umbrella term for all the different ways that can be used to achieve this.</p>
<p>  WebSocket, on the other hand, is a well-defined API and protocol that allows for full-duplex, bidirectional communication (not just server push).
</p></blockquote>
<p>Can you really say WebSockets is an alternative to Comet when Comet servers use WebSockets?</p>
<p>My current thinking is the same as Martin&#8217;s (I did used to work with Martin). It is that:</p>
<p><strong>Comet is a paradigm, not only for server push but also for bi-directional communication.</strong></p>
<p>The need to do this with a web browser resulted in WebSockets – something which natively supported this in a way that HTTP did not. So, we have Comet to thank for WebSockets.</p>
<p>The <a  href="http://en.wikipedia.org/wiki/Comet_(programming)">Wikipedia Comet entry</a> states:</p>
<blockquote><p>
  Comet is a web application model in which a long-held HTTP request allows a web server to push data to a browser, without the browser explicitly requesting it. Comet is an umbrella term, encompassing multiple techniques for achieving this interaction.
</p></blockquote>
<p>Alex Russell’s <a  href="http://infrequently.org/2006/03/comet-low-latency-data-for-the-browser/">original Comet blog post</a> states:</p>
<blockquote><p>
  Fundamentally, they all use long-lived HTTP connections to reduce the latency with which messages are passed to the server.</p>
<p>  The architecture relies on a view of data which is event driven on both sides of the HTTP connection.
</p></blockquote>
<p>All very HTTP related. <strong>But</strong> the second quote interestingly says <strong>“event driven on both sides”</strong>. This bi-directional communication, backed up by the diagram from the web post (see below), seems to have been lost in the wikipedia entry.</p>
<p>
<figure>
  <img alt="Original Comet diagram by Alex Russell" src="http://infrequently.org/wp-content/Comet.png" /></p>
<figcaption>Original Comet diagram by Alex Russell. <small><a  href="http://infrequently.org/2006/03/comet-low-latency-data-for-the-browser/">source</a></small></figcaption>
</figure>
<p>What I’m suggesting is that Comet is a paradigm for realtime bi-directional communication between a server and a client. Initially it used long-lived HTTP connections in addition to a second short-lived connection for command requests (e.g. subscribe) <strong>because it was the only solution</strong>. Comet servers now use WebSockets because they are now available, are better than the HTTP-based alternatives and help Comet (the paradigm) be achieved and finally truly realised in a standardised way.</p>
<p>I’m suggesting that HTTP Long-Polling or HTTP-Streaming (all using XMLHttpRequest, Script tag polling, IFRAMES, ActiveX objects) and WebSockets are transfer technologies (Martin used the term &#8220;transfer mechanism&#8221;) that make the Comet paradigm possible.</p>
<p>I’m suggesting that saying “Comet or WebSockets” is an invalid statement and that the Wikipedia article is incorrect and that this diagram better reflects the relationship between WebSockets and Comet:</p>
<p>
<figure>
    <img alt="realtime web technology stack hierarchy" src="http://www.gliffy.com/pubdoc/2894748/L.png" /></p>
<figcaption>Realtime web technology stack hierarchy</figcaption>
</figure>
<p>I’m prepared to be wrong by being convinced otherwise. But I don&#8217;t think I am or will. Interested in hearing your opinions.</p>
<p><em>Note: I originally posted the core text to this as a <a  href="http://jfarcand.wordpress.com/2012/04/19/websockets-or-comet-or-both-whats-supported-in-the-java-ee-land/#comment-2271">comment</a> on a blog post <a  href="http://jfarcand.wordpress.com/2012/04/19/websockets-or-comet-or-both-whats-supported-in-the-java-ee-land/">&#8220;Websockets or Comet or Both? What’s supported in the Java EE land&#8221;</a></em></p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/08/25/what-came-before-websockets.html' rel='bookmark' title='What came before WebSockets?'>What came before WebSockets?</a></li>
<li><a href='http://www.leggetter.co.uk/2009/11/14/why-comet-is-key-to-the-truly-real-time-web.html' rel='bookmark' title='Why Comet is key to the Truly Real-Time Web'>Why Comet is key to the Truly Real-Time Web</a></li>
<li><a href='http://www.leggetter.co.uk/2011/09/07/qa-are-websockets-ready-for-commercial-use.html' rel='bookmark' title='Q&amp;A: Are WebSockets ready for commercial use?'>Q&#038;A: Are WebSockets ready for commercial use?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2012/04/22/websockets-realise-comet-theyre-not-an-alternative.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://www.leggetter.co.uk/2012/04/22/websockets-realise-comet-theyre-not-an-alternative.html</feedburner:origLink></item>
		<item>
		<title>Code Africa &amp; the Impact of Realtime</title>
		<link>http://feedproxy.google.com/~r/PhilLeggettersBlog/~3/Mt-wsMHmDks/code-africa-the-impact-of-realtime.html</link>
		<comments>http://www.leggetter.co.uk/2012/03/19/code-africa-the-impact-of-realtime.html#comments</comments>
		<pubDate>Mon, 19 Mar 2012 11:28:10 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[api-fanboy]]></category>
		<category><![CDATA[codeafrica]]></category>
		<category><![CDATA[pusher]]></category>
		<category><![CDATA[realtime]]></category>
		<category><![CDATA[realtimeweb]]></category>
		<category><![CDATA[thetimes]]></category>
		<category><![CDATA[twilio]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=22759</guid>
		<description><![CDATA[<p><br /> Over the weekend I attended the Code Africa hack weekend which was organised and hosted by <a href="http://www.thetimes.co.uk/">The Times</a>. The event saw developers, designers, journalists and entrepreneurs come together to try and form ideas and build prototypes over one weekend. My main takeaways from the event were a much better understanding of the [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html' rel='bookmark' title='Hosted realtime services &#8211; making the realtime web more accessible'>Hosted realtime services &#8211; making the realtime web more accessible</a></li>
<li><a href='http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html' rel='bookmark' title='Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web'>Edinburgh Techmeetup, Web Browsers &#038; the Realtime Web</a></li>
<li><a href='http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html' rel='bookmark' title='Realtime Commenting blog post on Smashing Magazine'>Realtime Commenting blog post on Smashing Magazine</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img src="http://ebmedia.eventbrite.com/s3-s3/eventlogos/28569369/3090015319-1.jpg" alt="Code Africa logo" align="right" /><br />
Over the weekend I attended the Code Africa hack weekend which was organised and hosted by <a  href="http://www.thetimes.co.uk/">The Times</a>. The event saw developers, designers, journalists and entrepreneurs come together to try and form ideas and build prototypes over one weekend. My main takeaways from the event were a much better understanding of the state of technology in Africa, how technology can be used to help the people living within the continent and how <strong>realtime technologies can be used not only to improve application functionality, but also provide real impact</strong> in demonstrations and presentations.</p>
<h2>Ideas &amp; Prototypes</h2>
<h3>Simple SMS Education</h3>
<p>Using SMS and mobile to help deliver interactive, remote and continuous teaching &#8211; <a  href="http://www.twitter.com/danielbprobert">Daniel Probert</a>.</p>
<p><a  href="https://github.com/iliasbartolini/code-africa-education"><img src="http://simple-education-system.phpfogapp.com/images/logo.png" alt="Simple SMS Education logo" /></a></p>
<p><a  href="https://github.com/iliasbartolini/code-africa-education">See the code in github</a></p>
<h3>TransAfrik</h3>
<p>A number of ideas around crowd sourcing all sorts of information with an initial focus on travel; traffic, route planning and more.</p>
<p><img src="http://distilleryimage0.instagram.com/5a7ad14e712011e181bd12313817987b_7.jpg" alt="TransAfrik presentation" width="400" /></p>
<h3>Chircle</h3>
<p>A way of making a single charity payment and being able to distribute parts of that payment to multiple chosen charities &#8211; <a  href="http://twitter.com/setf">Stef Lewandowski</a></p>
<p><a  href="http://chircle.com"><img src="http://f.cl.ly/items/0e2A0p080x1D1n300f05/chircle_screen.png" width="400" /></a></p>
<p><a  href="http://chircle.com/">Visit Chircle.com and signup</a></p>
<h3>De-code Africa</h3>
<p>Build a fun way of discovering interesting facts and stats about Africa, and the countries within the content, and compare the information against other non-African countries.</p>
<p><a  href="http://thetimescodejam.appspot.com/"><img src="http://thetimescodejam.appspot.com/img/logo.png" width="400" /></a></p>
<p><a  href="http://thetimescodejam.appspot.com/">See the app in action</a></p>
<h2>The Pitch</h2>
<p>At the end of the second day each idea was given three minutes to pitch, and if possible demo. And today (Monday, March 19) they will be pitching to a group of 100 people including numerous company CEOs, at least two country presidents and a former Prime Minister at The Times CEO Summit Africa (<a  href="http://www.thetimes.co.uk/tto/public/ceo-summit-africa/?service=rss">RSS news feed</a>) &#8211; a real opportunity to potentially get funding and affect change.</p>
<p><img src="http://i.imgur.com/2yHgb.jpg" width="600" alt="ex-Prime Minister" /></p>
<h2>The Impact of Realtime</h2>
<p>Public speaking is quite new to me. In the past couple of years I&#8217;ve spoken at just a handful of events. However, over the past few weeks I&#8217;ve give more talks than ever about Realtime web technologies, including a lightening talk yesterday at CodeAfrica.</p>
<p>The more talks and workshops I give the more I realise that no amount of speaking will beat actually demonstrating a realtime web technology. But not only demonstrating, also using the technology to make the audience part of the presentation, and make it an interactive presentation which encourages discussion and stimulates ideas.</p>
<p>I saw this again yesterday when Daniel Probert, who lead the Simple SMS Education team which I was part of, demoed the prototype. As part of his three minute pitch Daniel used the prototype web app to send a question via SMS (thanks to <a  href="http://twilio.com">Twilio</a> to a number of people in the room. They then reply to that SMS with the answer to the question. These answers are instantly displayed within the prototype application (thanks to Twilio WebHooks and <a  href="http://pusher.com">Pusher</a>). This was described by one of the feedback panel as <em>&#8220;A killer demonstration&#8221;</em>.</p>
<p>The ability to instantly demonstrate interaction between multiple people using SMS and realtime web technologies has a real WOW-factor. I&#8217;ve used this sort of technology for over 10 years and I&#8217;m still excited and wowed by it!</p>
<h2>Final Thoughts &amp; Thanks</h2>
<p>CodeAfrica was organised and ran by <a  href="https://twitter.com/federicacocco">Federica Cocco</a>, <a  href="https://twitter.com/petermacrobert">Peter MacRobert</a> and <a  href="https://twitter.com/TomWhitwell">Tom Whitwell</a> and <a  href="https://twitter.com/xenophin">Xen Lategan</a> so they deserve a lot of credit for a great event and bringing so many interesting and creative people together.</p>
<p>It was also great to work with <a  href="https://twitter.com/anibe">Anibe Agamah</a>, <a  href="https://twitter.com/danielbprobert">Daniel Probert</a>, <a  href="https://twitter.com/tianjianfeng">Jianfeng Tian</a>, <a  href="https://twitter.com/iliasbartolini">Ilias Bartolini</a>, <a  href="https://twitter.com/andreiashu">Andrei Simion</a> and <a  href="https://twitter.com/SimonaCiocoiu">Simona Ciocoiu</a>.</p>
<p><img src="http://i54.twitgoo.com/1h8j91.jpg" width="600" alt="Simple SMS Education standup" /></p>
<p>With my core interest in technologies being realtime technologies I thought that the lack of Internet infrastructure (mobile data networks) in some areas of Africa was going to mean that I wouldn&#8217;t be able to use this technology over the weekend. However, it was used (and will be used today in Daniel&#8217;s pitch) to add real impact when demonstrating how technology can really make a difference.</p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html' rel='bookmark' title='Hosted realtime services &#8211; making the realtime web more accessible'>Hosted realtime services &#8211; making the realtime web more accessible</a></li>
<li><a href='http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html' rel='bookmark' title='Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web'>Edinburgh Techmeetup, Web Browsers &#038; the Realtime Web</a></li>
<li><a href='http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html' rel='bookmark' title='Realtime Commenting blog post on Smashing Magazine'>Realtime Commenting blog post on Smashing Magazine</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2012/03/19/code-africa-the-impact-of-realtime.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.leggetter.co.uk/2012/03/19/code-africa-the-impact-of-realtime.html</feedburner:origLink></item>
		<item>
		<title>jQuery UK 2012 Event – don’t always use jQuery</title>
		<link>http://feedproxy.google.com/~r/PhilLeggettersBlog/~3/vOshJyTC7z0/jquery-uk-2012-event-dont-always-use-jquery.html</link>
		<comments>http://www.leggetter.co.uk/2012/02/19/jquery-uk-2012-event-dont-always-use-jquery.html#comments</comments>
		<pubDate>Sun, 19 Feb 2012 07:27:48 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[api-fanboy]]></category>
		<category><![CDATA[Event]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jquk]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=22726</guid>
		<description><![CDATA[<p>I started writing this right after the jQuery UK event but have only just found time to finish it off sitting in Stansted airport at 7am.</p> <p>jQuery is a funny thing; it&#8217;s made JavaScript coding easy for advanced developers and accessible to web designers, and you could even say that the web designer role has [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2009/01/31/drag-drop-bug-in-jquery-ui-153.html' rel='bookmark' title='Drag Drop bug in JQuery UI 1.5.3'>Drag Drop bug in JQuery UI 1.5.3</a></li>
<li><a href='http://www.leggetter.co.uk/2012/02/12/considerations-when-updating-the-dom-to-display-realtime-data.html' rel='bookmark' title='Considerations when updating the DOM to display realtime data'>Considerations when updating the DOM to display realtime data</a></li>
<li><a href='http://www.leggetter.co.uk/2011/03/23/looking-for-a-c-javascript-real-time-web-contractor.html' rel='bookmark' title='Looking for a C# (ASP.NET MVC), jQuery &amp; Real-Time Web Contractor'>Looking for a C# (ASP.NET MVC), jQuery &amp; Real-Time Web Contractor</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><em>I started writing this right after the jQuery UK event but have only just found time to finish it off sitting in Stansted airport at 7am.</em></p>
<p>jQuery is a funny thing; it&#8217;s made JavaScript coding easy for advanced developers and accessible to web designers, and you could even say that the web designer role has very much changed because of it. It&#8217;s made web interfaces much richer and interactive. But, it&#8217;s also made us lazy because it&#8217;s so easy to use. It&#8217;s time to take a step back and start thinking about best practices. And sometimes that might mean <em>not using</em> jQuery.</p>
<p>I was really pleased to hear <a  href="http://twitter.com/codepo8">Christian Heilmann</a>&#8216;s talk on moving back to using native methods, rather than always using jQuery (you can read Christian&#8217;s write-up and get see his slides <a  href="http://christianheilmann.com/2012/02/11/jquery-uk-conference-in-oxford-england-slides-audio-impressions-and-notes/">here</a>). His reasons for this were:</p>
<ul>
<li>To encourage education about native browser functionality</li>
<li>Native browser methods can perform better</li>
</ul>
<p>This latter point is of particular interest to me. Whilst at <a  href="http://www.caplin.com">Caplin Systems</a> I was part of a development team where performance was critical. We were (they still are) building realtime web libraries and UIs which need to deal with both high frequency of data updates and large data sets displayed within the UI. I met up with <a  href="http://twitter.com/fauna5">Rich Chamberlain</a>, Caplin&#8217;s dev manager, about a month ago and he reminded me of this. So, I set about comparing <code>document.getElementById('someId')</code> with <code>$('#someId')</code> and unsurprisingly the native method was by far superior.</p>
<p>For the results of this, and to test for yourself, see <a  href="http://www.leggetter.co.uk/2012/02/12/considerations-when-updating-the-dom-to-display-realtime-data.html">Considerations when updating the DOM to display realtime data</a>.</p>
<p>What was surprising was just how much better <code>document.getElementById</code> is. You would assume (I haven&#8217;t looked at the source) that within the <code>$</code> function that the selector would simply be checked:</p>
<pre><code>$ = function(selector) {
  if( isIdSelector(selector) ) {
    var el = document.getElementById(selector);
    return warpInJQueryStuff(el); // el could be null
  }
  // else …
};
</code></pre>
<p>Ok, it&#8217;s probably nothing like this. But you get the idea. So, what is it that makes using jQuery comparatively so expensive? My guess is that it&#8217;s the <code>warpInJQueryStuff</code>. One of the parts of jQuery that makes it so powerful (all those functions you can call after selecting elements, and the chaining functionality e.g.</p>
<pre><code>$('.something')
.doSomething()
.doSomethingElse()
.soOn();
</code></pre>
<p>The same goes when the <code>selector</code> isn&#8217;t just an <code>id</code> attribute selector i.e. a more advance CSS query.</p>
<pre><code>$ = function(selector) {
  if( isIdSelector(selector) ) {
    //...
  }
  else if( isQuerySelector(selector) ) {
    var els = document.querySelector(selector); //**TODO: check**
    return wrapInjQueryStuff(els);
  }
  // else …
};
</code></pre>
<p>The jQuery library shoots itself in the foot a little bit here because they&#8217;ve added non-CSS selectors (I can&#8217;t find an example right now but <a  href="http://www.google.co.uk/search?ix=teb&#038;sourceid=chrome&#038;ie=UTF-8&#038;q=jquery+non-standard+selectors#sclient=psy-ab&#038;hl=en&#038;safe=off&#038;source=hp&#038;q=jquery+%22non-standard+selectors%22&#038;pbx=1&#038;oq=jquery+%22non-standard+selectors%22&#038;aq=f&#038;aqi=&#038;aql=&#038;gs_sm=3&#038;gs_upl=3450l5414l0l5599l4l4l0l0l0l2l966l1518l5-1.1l2l0&#038;bav=on.2,or.r_gc.r_pw.r_cp.,cf.osb&#038;fp=a16cf6b4817c4ef9&#038;biw=1440&#038;bih=746&#038;ix=teb">a google</a> suggests this is correct). However, this isn&#8217;t anything that a <code>RegExp</code> couldn&#8217;t test for and if the jQuery-specific selectors aren&#8217;t found then the native function can be used. Again, maybe it&#8217;s the <code>wrapInjQueryStuff</code> that&#8217;s the problem?</p>
<p>Anyway, the point is: don&#8217;t always use jQuery. As with anything, consider what you are trying to achieve and if performance matters, or you just want to learn, use the native methods instead. But remember to check for <a  href="http://caniuse.com/queryselector">browser support</a>.</p>
<p>If performance matters and you find this type of thing interesting then Doug Neiner&#8217;s talk on <a  href="http://www.slideshare.net/dcneiner/contextual-jquery">Contextual jQuery</a> will probably interest you too.</p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2009/01/31/drag-drop-bug-in-jquery-ui-153.html' rel='bookmark' title='Drag Drop bug in JQuery UI 1.5.3'>Drag Drop bug in JQuery UI 1.5.3</a></li>
<li><a href='http://www.leggetter.co.uk/2012/02/12/considerations-when-updating-the-dom-to-display-realtime-data.html' rel='bookmark' title='Considerations when updating the DOM to display realtime data'>Considerations when updating the DOM to display realtime data</a></li>
<li><a href='http://www.leggetter.co.uk/2011/03/23/looking-for-a-c-javascript-real-time-web-contractor.html' rel='bookmark' title='Looking for a C# (ASP.NET MVC), jQuery &amp; Real-Time Web Contractor'>Looking for a C# (ASP.NET MVC), jQuery &amp; Real-Time Web Contractor</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2012/02/19/jquery-uk-2012-event-dont-always-use-jquery.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.leggetter.co.uk/2012/02/19/jquery-uk-2012-event-dont-always-use-jquery.html</feedburner:origLink></item>
		<item>
		<title>Ideas for #APIHackathon</title>
		<link>http://feedproxy.google.com/~r/PhilLeggettersBlog/~3/teKGTrTNcBU/ideas-for-apihackathon.html</link>
		<comments>http://www.leggetter.co.uk/2012/02/18/ideas-for-apihackathon.html#comments</comments>
		<pubDate>Sat, 18 Feb 2012 11:33:40 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[apihackathon]]></category>
		<category><![CDATA[Events]]></category>
		<category><![CDATA[realtime]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=22721</guid>
		<description><![CDATA[<p>Realtime location tracking Poll (I&#8217;m sure they&#8217;ll introduce WebHooks soon) the Vodafone API and push realtime updates to a map.</p> <p>A better Betfair Ok, you probably won&#8217;t be able to build an app that&#8217;s better than betfair. But using our API in conjunction with Betfair you&#8217;ll be able to build a realtime betting system. The [...]
No related posts.]]></description>
			<content:encoded><![CDATA[<p><strong>Realtime location tracking</strong> Poll (I&#8217;m sure they&#8217;ll introduce WebHooks soon) the Vodafone API and push realtime updates to a map.</p>
<p><strong>A better Betfair</strong> Ok, you probably won&#8217;t be able to build an app that&#8217;s better than betfair. But  using our API in conjunction with Betfair you&#8217;ll be able to build a realtime betting system. The questions is: can you get realtime data from Betfair? Things like realtime odds?</p>
<p><strong>Multiplayer Hangman</strong> A simple turn-based game. Take the ideas that Dan from Pearson spoke about and use Pusher to push those results to multiple users.</p>
<p><strong>Realtime context sensitive advertising</strong> Advertising tends to be pretty static once an application loads. Why not analyse how a user is using an application and dynamically push different adverts to their app… using Pusher <img src='http://www.leggetter.co.uk/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Any questions please give me a shout. I&#8217;m <a  href="http://twitter.com/leggetter">@leggetter</a> on Twitter.</p>
<p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2012/02/18/ideas-for-apihackathon.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.leggetter.co.uk/2012/02/18/ideas-for-apihackathon.html</feedburner:origLink></item>
		<item>
		<title>Considerations when updating the DOM to display realtime data</title>
		<link>http://feedproxy.google.com/~r/PhilLeggettersBlog/~3/ZkByL9EHZNo/considerations-when-updating-the-dom-to-display-realtime-data.html</link>
		<comments>http://www.leggetter.co.uk/2012/02/12/considerations-when-updating-the-dom-to-display-realtime-data.html#comments</comments>
		<pubDate>Sun, 12 Feb 2012 15:18:26 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[api-fanboy]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=22632</guid>
		<description><![CDATA[<p>When data is being delivered to web applications the chances are that you&#8217;ll be displaying that data within the user interface (UI). In order to do this you need to find the element in the <a href="http://en.wikipedia.org/wiki/Document_Object_Model">Document Object Model</a> (DOM) and then update it. Whilst the performance of web browsers is improving all the time [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/02/19/jquery-uk-2012-event-dont-always-use-jquery.html' rel='bookmark' title='jQuery UK 2012 Event &#8211; don&#8217;t always use jQuery'>jQuery UK 2012 Event &#8211; don&#8217;t always use jQuery</a></li>
<li><a href='http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html' rel='bookmark' title='Hosted realtime services &#8211; making the realtime web more accessible'>Hosted realtime services &#8211; making the realtime web more accessible</a></li>
<li><a href='http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html' rel='bookmark' title='Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web'>Edinburgh Techmeetup, Web Browsers &#038; the Realtime Web</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>When data is being delivered to web applications the chances are that you&#8217;ll be displaying that data within the user interface (UI). In order to do this you need to find the element in the <a  href="http://en.wikipedia.org/wiki/Document_Object_Model">Document Object Model</a> (DOM) and then update it. Whilst the performance of web browsers is improving all the time DOM manipulation can still be costly (use up time and resources) if you are pushing through a lot of data so it&#8217;s worth keeping the interaction with the DOM to a minimum. You should also consider how you access the DOM. Should you use a utility/library function or should you use native browser methods?
<br /></p>

<p>To demonstrate this, and show the considerations I&#8217;ve written a few small helper functions which can be called a number of times from tests and for each test I&#8217;ll time how long it takes to update the DOM a certain number of times.
<br /></p>

<p>For many web developers a script tag referencing in the jQuery library is one of the first elements to be added to any web page &#8211; it&#8217;s even in some web framework templates by default. So, a good first test is to time how long it takes for jQuery to update an element a number of times.
<br /></p>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>

<pre data-code='testDefinitions_jQueryNoCache'></pre>

<script data-code-target="testDefinitions_jQueryNoCache" type="text/javascript">
var methods = {};
var elId = 'updateMe';

methods.jQueryNoCache = function(value) {
  jQuery('#' + elId).text(value);
};
</script>

<p>Now that we&#8217;ve defined one way of updating the DOM let&#8217;s add a way of caching a reference to the jQuery object that we create with the <code>jQuery(selector)</code> call. So, instead of having to make that call each time we can just access the object from a cache. This means that a new <code>jQuery</code> object doesn&#8217;t need to be created for every update.
<br /></p>

<pre data-code='testDefinitions_jQueryCache'></pre>

<script data-code-target="testDefinitions_jQueryCache">
var cache = {};
methods.jQueryCache = function(value) {
  if(!cache['#' + elId]) {
    cache['#' + elId] = jQuery('#' + elId);
  }
  cache['#' + elId].text(value);
};
</script>

<br />

<p>jQuery uses CSS selectors to find elements so rather than going directly to single elements using <code>id</code> attributes let&#8217;s also define a test that uses a nested selector: <code>div.top div.middle div.bottom p.update-me</code>.
<br /></p>

<pre data-code="testDefinitions_jQueryCSSSelectorNoCache"></pre>

<script data-code-target="testDefinitions_jQueryCSSSelectorNoCache">
var elCSSSelector = 'div.top div.middle div.bottom p.update-me';
methods.jQueryCSSSelectorNoCache = function(value) {
 jQuery(elCSSSelector).text(value);
};
</script>

<div class="top" style="width: 5px; height: 5px; overflow: hidden;">
  <div class="middle">
    <div class="bottom">
      <p class="update-me"></p>
    </div>
  </div>
</div>

<br />

<p>Finally, as a comparison let&#8217;s define functions which update the DOM by directly using the native <code>document.getElementById</code> and <code>document.querySelector</code> native browser functions, and both of these again using the caching technique we used earlier.
<br /></p>

<pre data-code='testDefinitions_byId'></pre>

<script data-code-target="testDefinitions_byId">
methods.byIdNoCache = function(value) {
  document.getElementById(elId).innerText = value;
};

methods.querySelectorNoCache = function(value) {
  document.querySelector(elCSSSelector).innerText = value;
};

methods.byIdCache = function(value) {
  if(!cache[elId]) {
    cache[elId] = document.getElementById(elId);
  }
  cache[elId].innerText = value;
};

methods.querySelectorCache = function(value) {
  if(!cache[elCSSSelector]) {
    cache[elCSSSelector] = document.querySelector(elCSSSelector);
  }
  cache[elId].innerText = value;
};
</script>

<p>If we execute each of these methods so that they are called 500 times to update the DOM and repeat that 10 times we see results as shown in the following graph.
<br /></p>

<figure>

<div id="timeSeriesChart"></div>

<p><figcaption style="font-size: 10px; padding-top: 5px;">Time in milliseconds (y-axis) it takes to update an element within the DOM <span id="updateMe"></span>(+1) times. The test is ran a number of times (x-axis)</figcaption>
</figure></p>

<p>And if we take each of the results and average them out we see the following:
<br /></p>

<figure>

<div id="avgSeriesChart"></div>

<p><figcaption style="font-size: 10px; padding-top: 5px;">The chart above shows the average time it takes to find the element and update the DOM using different techniques</figcaption>
</figure></p>

<aside style="width: 300px; float: right; background-color: #F8F8F8; border: 1px #CCC solid; padding: 1em; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; font-size: 12px; margin-left: 20px; padding-bottom: 0;">

<fieldset>
  <legend><strong>Run DOM Manipulation Tests</strong></legend>
  <label for='numUpdates'>How many updates per test?</label>
  <input id="numUpdates" type="number" value="500" max="2500" required="required" /><small>(2500 max)</small><br />
  <label for="numLoops">How many times should each test be run?</label>
  <input id="numLoops" type="number" value="10" max="25" required="required" /><small>(25 max)</small><br />
  <button id="runTestsBtn">Run Tests</button>
</fieldset>

<p>If you&#8217;d like to try running the tests with different numbers you can do so using this form. When the tests complete the graphs will update. The numbers have been restricted in an effort to reduce the chances of your web browser hanging.
</aside>
<br /></p>

<script>
$(function() {
  $('#runTestsBtn').click(function() {
    var updates = $('#numUpdates').val();
    var loop = $('#numLoops').val();
    if(isNaN(updates) || isNaN(loop)) {
      return;
    }
    updates = Math.min(updates, 2500);
    loop = Math.min(loop, 25);
    runTests(updates, loop);
  });
})
</script>

<br />

<h3>Conclusion</h3>

The graphs are dynamically generated based on the browser viewing this blog post so the results will differ but even so the graphs suggest to following to me:

<ul>
<li>If you are sending a reasonable number of updates, and you are going to be updated the UI a lot, that you should be using <code>document.getElementById</code> to access and update the DOM.</li>
<li>If you want to use jQuery and the DOM structure isn&#8217;t going to update all that often then the caching references to jQuery objects is an efficient mechanism.</li>
<li>If you are are using CSS queries then the native <code>document.querySelector</code> performs better than <code>jQuery</code>. In both cases the complexity of the query is undoubtedly going to impact the performance.</li>
<li>Caching lookups of <code>document.querySelector</code> is a good idea since it improves performance.</li>
<li>Unsurprisingly direct <code>id</code> attributes lookups are fastest of all.</li>
<li><code>document.getElementById</code> is the fastest way of accessing the DOM and caching lookups doesn&#8217;t make a big difference.</li>
</ul>

The important thing is that you will know better than anybody else the sort of data that is going to be pushed into your app and it does with it. Balance performance and maintainability within your application and make decisions about how you are going to deal with updating the DOM based on that.

If your application gets infrequent updates then you&#8217;ll be fine using jQuery all the time. If your app gets a lot of realtime data streamed to it, maybe it&#8217;s a trading application, then you&#8217;ll need to fine-tune your app.

<p><script src="http://leggetter.github.com/script-cdn/jqplot/1.0.0b2/jquery.jqplot.min.js"></script>
<script src="http://leggetter.github.com/script-cdn/jqplot/1.0.0b2/plugins/jqplot.canvasTextRenderer.min.js"></script>
<script src="http://leggetter.github.com/script-cdn/jqplot/1.0.0b2/plugins/jqplot.canvasAxisTickRenderer.min.js"></script>
<script src="http://leggetter.github.com/script-cdn/jqplot/1.0.0b2/plugins/jqplot.canvasAxisLabelRenderer.min.js"></script>
<script src="http://leggetter.github.com/script-cdn/jqplot/1.0.0b2/plugins/jqplot.barRenderer.min.js"></script>
<script src="http://leggetter.github.com/script-cdn/jqplot/1.0.0b2/plugins/jqplot.categoryAxisRenderer.min.js"></script></p>

<link type="text/css" rel="stylesheet" href="http://leggetter.github.com/script-cdn/jqplot/1.0.0b2/jquery.jqplot.min.css" />

<script>
$(function() {
  var updates = 500;
  var loop = 10;
  runTests(updates, loop);
});

function clearChart() {
  $('#timeSeriesChart').html('');
  $('#avgSeriesChart').html('');
}

function runTests(updates, loop) {
  clearChart();
  
  function doTest(updateMethod) {
    var start = new Date();
    
    for(var i = 0; i < updates; ++i) {
      updateMethod(i);
    }
    
    var end = new Date();
    var took = (end - start);
    
    return took;
  }
  
  function log(msg) {
    //$(document.body).append('<div>' + msg + '</div>');
  }
  
  log('***');
  log('Starting test loop');
  
  var results = {};
  var took;
  for(var testName in methods) {
    if(!results[testName]) {
      results[testName] = [];
    }
    
    for(var j = 0; j < loop; ++j) {
      took = doTest(methods[testName]);
      results[testName].push(took);
    }
  }
  
  var timeSeries = [];
  var timeSeriesLabels = [];
  var averageSeries = [];
  var testResults;
  for(var ranTestName in results) {
    testResults = results[ranTestName];
    
    log('Ran ' + ranTestName + ' ' + loop + ' times with ' + updates + ' updates');
    log('Took: ' + testResults.join('ms, ') + 'ms');
    log('<br />');
    
    timeSeries.push(testResults);
    timeSeriesLabels.push(ranTestName);
    
    var total = 0;
    for(var i = 0, l = testResults.length; i < l; ++i) {
      total += testResults[i];
    }
    averageSeries.push((total/testResults.length));
  }
  
  var timeSeriesChart = $.jqplot ('timeSeriesChart', timeSeries, {legend: {show:true, labels:timeSeriesLabels}});
  
  var avgSeriesChart = $.jqplot('avgSeriesChart', [averageSeries], {
      seriesDefaults:{
          renderer:$.jqplot.BarRenderer,
          rendererOptions: {fillToZero: true}
      },
      series:timeSeriesLabels,
      axes: {
        xaxis: {
          tickRenderer: $.jqplot.CanvasAxisTickRenderer ,
          tickOptions: {
            fontFamily: 'Georgia',
            fontSize: '10pt',
            angle: -30
          },
          renderer: $.jqplot.CategoryAxisRenderer,
          ticks: timeSeriesLabels
        }
      }
  });
}
</script>

<script src="http://leggetter.github.com/script-cdn/blog_helpers/js/script-to-html.js"></script>

<script>
$(function() {
  $.scriptToHtml();
});
</script>

<p><style type="text/css">
.jqplot-table-legend { width: auto !important; }
.jqplot-table-legend td { text-align: left !important; }
</style></p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/02/19/jquery-uk-2012-event-dont-always-use-jquery.html' rel='bookmark' title='jQuery UK 2012 Event &#8211; don&#8217;t always use jQuery'>jQuery UK 2012 Event &#8211; don&#8217;t always use jQuery</a></li>
<li><a href='http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html' rel='bookmark' title='Hosted realtime services &#8211; making the realtime web more accessible'>Hosted realtime services &#8211; making the realtime web more accessible</a></li>
<li><a href='http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html' rel='bookmark' title='Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web'>Edinburgh Techmeetup, Web Browsers &#038; the Realtime Web</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2012/02/12/considerations-when-updating-the-dom-to-display-realtime-data.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.leggetter.co.uk/2012/02/12/considerations-when-updating-the-dom-to-display-realtime-data.html</feedburner:origLink></item>
		<item>
		<title>Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web</title>
		<link>http://feedproxy.google.com/~r/PhilLeggettersBlog/~3/KYCdXHB8zAg/edinburgh-techmeetup-web-browsers-the-realtime-web.html</link>
		<comments>http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html#comments</comments>
		<pubDate>Thu, 09 Feb 2012 10:48:33 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[api-fanboy]]></category>
		<category><![CDATA[pusher]]></category>
		<category><![CDATA[realtime web]]></category>
		<category><![CDATA[SPDY]]></category>
		<category><![CDATA[web browsers]]></category>
		<category><![CDATA[websockets]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=22601</guid>
		<description><![CDATA[I gave a presentation yesterday at Edinburgh <a href="http://techmeetup.co.uk/">techmeetup</a>. A big thanks to <a href="https://twitter.com/daleharvey">Dale Harvey</a> for inviting me to talk and to all the attendees for taking the time to attend, listen and interact. <a href="http://twitter.com/aaronbassett">Aaron Bassett</a> also gave a good talk on Avoiding Integration Hell so I&#8217;d recommend you follow him for more [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html' rel='bookmark' title='Hosted realtime services &#8211; making the realtime web more accessible'>Hosted realtime services &#8211; making the realtime web more accessible</a></li>
<li><a href='http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html' rel='bookmark' title='Realtime Commenting blog post on Smashing Magazine'>Realtime Commenting blog post on Smashing Magazine</a></li>
<li><a href='http://www.leggetter.co.uk/2012/03/19/code-africa-the-impact-of-realtime.html' rel='bookmark' title='Code Africa &amp; the Impact of Realtime'>Code Africa &#038; the Impact of Realtime</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[I gave a presentation yesterday at Edinburgh <a  href="http://techmeetup.co.uk/">techmeetup</a>. A big thanks to <a  href="https://twitter.com/daleharvey">Dale Harvey</a> for inviting me to talk and to all the attendees for taking the time to attend, listen and interact. <a  href="http://twitter.com/aaronbassett">Aaron Bassett</a> also gave a good talk on Avoiding Integration Hell so I&#8217;d recommend you follow him for more info.

<p>Here&#8217;s a direct link to the <a  href="http://www.leggetter.co.uk/pres/techmeetup_edi_2012-02-08/">&#8220;Web Browsers &amp; the Realtime Web 
the past, present &amp; future&#8221; slides</a>.</p>

And here&#8217;s the recording of my talk (thanks to <a  href="http://twitter.com/MariusCiocanel">Marius Ciocanel</a>):

<iframe src="http://player.vimeo.com/video/36602961?title=0&amp;byline=0&amp;portrait=0" width="100%" height="400" frameborder="0" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>

<a  href="http://vimeo.com/36602961">TechMeetup Talks &#8211; Phil @Leggetter on the past present and future of the Realtime web</a> from <a  href="http://vimeo.com/techmeetup">TechMeetup</a> on <a  href="http://vimeo.com">Vimeo</a>.

After the presentation there were a number of good questions asked here they are, and my answers. If you&#8217;ve any other questions please <a href="mailto:phil@leggetter.co.uk?subject=Web Browsers &#038; the Realtime Web Qs">drop me an email</a> or leave a comment.

<h3>Does WebSockets provide support for common use cases? Does it natively support Pub/Sub?</h3>

As with most standardised technology WebSockets offer the very basics of what is required to enable realtime bi-directional communication between a server and a client;

<ul>
<li><code>var ws = new WebSocket(url)</code> &#8211; connect</li>
<li><code>ws.onopen = function() {};</code> &#8211; connected</li>
<li><code>ws.onmessage = function(ev) {};</code> &#8211; some data has arrived</li>
<li><code>ws.send({"some":"data"});</code> &#8211; send some data to the server</li>
<li><code>ws.onclose = function() {};</code> &#8211; the connection has closed</li>
<li><code>ws.close();</code> &#8211; close the connection</li>
</ul>

If you want functionality like auto reconnection, connection stability checking (<a  href="http://www.whatwg.org/specs/web-apps/current-work/multipage/network.html#ping-and-pong-frames">ping/pong is hopefully coming</a>), the ability to subscribe to channels/topics/subjects in order to filter and partition data then you need to build this functionality yourself or user a client/server combination that already offers this. We&#8217;ve built this functionality into our Pusher JavaScript library and service.

<h3>How do people on shared hosting use this technology?</h3>

If you are on a shared hosting then the hosting provide doesn&#8217;t tend to like this sort of technology because it requires you to maintain persistent connections between the hosting server and the client. I don&#8217;t know for sure but I think PHP hosting services may do something to stop this sort of thing from working. However, I&#8217;m pretty sure that hosting services like <a  href="http://www.joyent.com/">Joyent</a> will provide support since <a  href="http://socket.io">socket.io</a> is quite possibly one of the most popular packages available. I could be wrong, but I&#8217;d be surprised if I am. If you know, please get in touch.

A great option here is to use <a  href="http://pusher.com">Pusher</a> since it remove the need to maintain the persistent connections &#8211; it&#8217;s technology agnostic.

<h3>Do WebSockets have problems with proxies and firewalls?</h3>

Yes, but connecting over a secure connection (WSS:// over port 443) will work in the majority of cases. For those cases it doesn&#8217;t work I&#8217;ve seen HTTP Long-Polling and HTTP Streaming also having problems where proxies and firewalls don&#8217;t like the long-held requests. It&#8217;s really a battle between realtime technologies and older Internet infrastructure.

<h3>Where does SPDY fit into the Realtime Web?</h3>

&#8220;<a  href="http://www.chromium.org/spdy/spdy-whitepaper">SPDY is an experimental protocol for a faster web</a>&#8220;. It&#8217;s actually used by Google Chrome and a number of Google web apps already (a quick Google suggestions <a  href="http://www.datamation.com/open-source/firefox-11-gets-spdy.html">Firefox 11 will support SPDY</a>). The main problem is that in order for this protocol to be used we need the Internet Infrastructure to upgrade. This isn&#8217;t going to happen to quickly. So, SPDY sounds very promising but it&#8217;ll be a while until we see it widely adopted/used.

It&#8217;s easier to move client technology forward (we need IE to auto update), but server technology looks like it&#8217;ll be slower to move forward.

I recommend keeping an eye on <a  href="http://www.igvita.com/2011/04/07/life-beyond-http-11-googles-spdy/">Ilya Grigorik&#8217;s blog</a> for related tech info.

Please let me know if I&#8217;ve missed any questions (I&#8217;m sure I have) or if you have any further questions by [dropping me an email](mailto:phil@leggetter.co.uk?subject=Web Browsers &amp; the Realtime Web Qs) or leaving a comment
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html' rel='bookmark' title='Hosted realtime services &#8211; making the realtime web more accessible'>Hosted realtime services &#8211; making the realtime web more accessible</a></li>
<li><a href='http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html' rel='bookmark' title='Realtime Commenting blog post on Smashing Magazine'>Realtime Commenting blog post on Smashing Magazine</a></li>
<li><a href='http://www.leggetter.co.uk/2012/03/19/code-africa-the-impact-of-realtime.html' rel='bookmark' title='Code Africa &amp; the Impact of Realtime'>Code Africa &#038; the Impact of Realtime</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html</feedburner:origLink></item>
		<item>
		<title>Hosted realtime services – making the realtime web more accessible</title>
		<link>http://feedproxy.google.com/~r/PhilLeggettersBlog/~3/JLiriPS_040/hosted-realtime-services-making-the-realtime-web-more-accessible.html</link>
		<comments>http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html#comments</comments>
		<pubDate>Tue, 24 Jan 2012 09:05:11 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[api-fanboy]]></category>
		<category><![CDATA[pusher]]></category>
		<category><![CDATA[real-time web]]></category>
		<category><![CDATA[realtime hosted services]]></category>
		<category><![CDATA[self-hosted realtime services]]></category>
		<category><![CDATA[socket.io]]></category>
		<category><![CDATA[websockets]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=22151</guid>
		<description><![CDATA[The real-time web started off by just being &#8220;cool&#8221;; a quirky and fun space to be in with lots of &#8220;cool&#8221; technology. People weren&#8217;t sure whether it was just a fad, stimulated by hype. The value it delivers in the form of customer engagement, interaction, collaboration and the opportunities it can provide by being real-time [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html' rel='bookmark' title='Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web'>Edinburgh Techmeetup, Web Browsers &#038; the Realtime Web</a></li>
<li><a href='http://www.leggetter.co.uk/2012/03/19/code-africa-the-impact-of-realtime.html' rel='bookmark' title='Code Africa &amp; the Impact of Realtime'>Code Africa &#038; the Impact of Realtime</a></li>
<li><a href='http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html' rel='bookmark' title='Realtime Commenting blog post on Smashing Magazine'>Realtime Commenting blog post on Smashing Magazine</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[The <strong>real-time web</strong> started off by just being &#8220;cool&#8221;; a quirky and fun space to be in with lots of &#8220;cool&#8221; technology. People weren&#8217;t sure whether it was just a fad, stimulated by hype. The value it delivers in the form of customer engagement, interaction, collaboration and the opportunities it can provide by being real-time is now much clearer, and consequently the benefits of using real-time technologies are beginning to be understood.

<h2>Realtime Web Technology Accessibility</h2>

One of the problems with real-time technologies over the past 10+ years has been the accessibility. Comet servers were difficult to install, a pain to maintain and upgrade and generally difficult to use due to numerous configuration options and technology quirks, mainly exposed by different web browsers. There have been a number of very important changes have happened over the past few years that now make real-time technologies much more accessible.

<h3>Web Browser Wars</h3>

For such a long time Internet Explorer 6 was by far the best web browser available. It&#8217;s the reason that Microsoft &#8220;dropped the ball&#8221; and why Firefox and Chrome are where they are today. But now we are in a great position of having a number of actively developed web browsers being driven by real competition to offer the best browsing experience. This has lead to a general improvements in browser speed (JavaScript and rendering engines) but also improvements in web technology available to web browsers and, possibly most important of all, web standardisation. <strong>HTML5 does indeed rock!</strong>

<h3>Cloud Hosted Services</h3>

Cloud hosted services, frequently referred to as Infrastructure as a Service (IaaS). These hosted solutions take away the pain of installation, maintenance and scaling, and frequently deliver them at a fraction of the cost possible if you were self-hosting.

<h3>Better self hosted solutions</h3>

Cloud hosted services are awesome (I would say that, but they are!) but the <a  href="http://www.leggetter.co.uk/real-time-web-technologies-guide#self-hosted">self hosted realtime web solutions</a> that are available and the ease of installation has massively improved. As an example, you can have a <a  href="http://socket.io">socket.io</a> example page up and running on node.js within minutes. These improvements have been driven by an increased demand for

<h3>WebSockets</h3>

WebSockets is a standard for continuous bi-directional single-connection communication between client and server. Real-time technologies, and in particular real-time messaging within a web browser, has been possible before but not until WebSockets has there been a standard that is so likely to succeed.

Unfortunately WebSockets don&#8217;t mean that the pain has completely gone away. The technology, whilst more accessible, still isn&#8217;t as easy as it could be for developers to use. On some platforms WebSocket server installation can still take too long, maintenance is just something developers don&#8217;t really want to do, and scaling takes time, effort and lots of configuration. So, we turn to the first important change as a solution to this problem &#8211; hosted realtime services.

<h2>Hosted realtime services</h2>

Hosted realtime services, like <a  href="http://pusher.com">Pusher</a> who I work for, make it much faster and easier for developers to start adding real-time functionality (push notifications, activity streams, realtime chat, collaboration, realtime data visualisations, multiplayer games, 2nd screen/Social TV experiences etc.) to their applications within minutes. For bigger organisations, the same solution also means that you know your developers are busy adding value, not installing, configuring and maintaining. This means they are happy and productive.

The web is only around 20 years old and the real-time web is younger still. We don&#8217;t know exactly where the next few years will take the web but I&#8217;m sure that HTML5, WebSockets and real-time messaging will be a key component, and services like Pusher in a great position to help provide the infrastructure that developers need to easily use these technologies.

<h2>Where next?</h2>

<ul>
<li>If you found this interesting you might find my <a  href="http://www.leggetter.co.uk/real-time-web-technologies-guide">Realtime Web Technology Guide/List</a> of interest. If you know of any technologies that I&#8217;ve missed, please <a  href="/contact-me">get in touch</a>.</li>
<li>Why not take a look at <a  href="http://pusher.com">Pusher</a> and the <a  href="http://blog.pusher.com">Pusher Blog</a></li>
</ul>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2012/02/09/edinburgh-techmeetup-web-browsers-the-realtime-web.html' rel='bookmark' title='Edinburgh Techmeetup, Web Browsers &amp; the Realtime Web'>Edinburgh Techmeetup, Web Browsers &#038; the Realtime Web</a></li>
<li><a href='http://www.leggetter.co.uk/2012/03/19/code-africa-the-impact-of-realtime.html' rel='bookmark' title='Code Africa &amp; the Impact of Realtime'>Code Africa &#038; the Impact of Realtime</a></li>
<li><a href='http://www.leggetter.co.uk/2012/05/09/realtime-commenting-blog-post-on-smashing-magazine.html' rel='bookmark' title='Realtime Commenting blog post on Smashing Magazine'>Realtime Commenting blog post on Smashing Magazine</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.leggetter.co.uk/2012/01/24/hosted-realtime-services-making-the-realtime-web-more-accessible.html</feedburner:origLink></item>
	</channel>
</rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced (Requested URI contains query)
Database Caching 22/104 queries in 0.056 seconds using disk: basic

Served from: www.leggetter.co.uk @ 2012-05-28 11:08:32 -->

