<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Phil Leggetter - Real-Time Web Software and Technology Evangelist &#187; real-time web</title>
	<atom:link href="http://www.leggetter.co.uk/tag/real-time-web/feed" rel="self" type="application/rss+xml" />
	<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, 29 Jan 2012 05:00:00 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Hosted realtime services &#8211; making the realtime web more accessible</title>
		<link>http://www.leggetter.co.uk/2012/01/24/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[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[<p>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/2010/08/27/google-realtime-search-isnt-real-time.html' rel='bookmark' title='Google realtime search isn&#8217;t real-time'>Google realtime search isn&#8217;t real-time</a></li>
<li><a href='http://www.leggetter.co.uk/2010/09/14/client-push-services-open-up-real-time-to-everyone.html' rel='bookmark' title='Client Push Services Open Up Real-Time to Everyone'>Client Push Services Open Up Real-Time to Everyone</a></li>
<li><a href='http://www.leggetter.co.uk/2010/03/12/making-cross-domain-javascript-requests-using-xmlhttprequest-or-xdomainrequest.html' rel='bookmark' title='Making cross domain JavaScript requests using XMLHttpRequest or XDomainRequest'>Making cross domain JavaScript requests using XMLHttpRequest or XDomainRequest</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>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.</p>
<h2>Realtime Web Technology Accessibility</h2>
<p>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.</p>
<h3>Web Browser Wars</h3>
<p>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></p>
<h3>Cloud Hosted Services</h3>
<p>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.</p>
<h3>Better self hosted solutions</h3>
<p>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</p>
<h3>WebSockets</h3>
<p>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.</p>
<p>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.</p>
<h2>Hosted realtime services</h2>
<p>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.</p>
<p>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.</p>
<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/2010/08/27/google-realtime-search-isnt-real-time.html' rel='bookmark' title='Google realtime search isn&#8217;t real-time'>Google realtime search isn&#8217;t real-time</a></li>
<li><a href='http://www.leggetter.co.uk/2010/09/14/client-push-services-open-up-real-time-to-everyone.html' rel='bookmark' title='Client Push Services Open Up Real-Time to Everyone'>Client Push Services Open Up Real-Time to Everyone</a></li>
<li><a href='http://www.leggetter.co.uk/2010/03/12/making-cross-domain-javascript-requests-using-xmlhttprequest-or-xdomainrequest.html' rel='bookmark' title='Making cross domain JavaScript requests using XMLHttpRequest or XDomainRequest'>Making cross domain JavaScript requests using XMLHttpRequest or XDomainRequest</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>
		</item>
		<item>
		<title>Adding a real-time &quot;Who&#8217;s shopping?&quot; widget to an ASP.NET Web App</title>
		<link>http://www.leggetter.co.uk/2011/08/04/adding-a-real-time-whos-shopping-widget-to-an-asp-net-web-app.html</link>
		<comments>http://www.leggetter.co.uk/2011/08/04/adding-a-real-time-whos-shopping-widget-to-an-asp-net-web-app.html#comments</comments>
		<pubDate>Thu, 04 Aug 2011 00:00:00 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[pusher]]></category>
		<category><![CDATA[real-time]]></category>
		<category><![CDATA[real-time web]]></category>

		<guid isPermaLink="false">http://blog.pusherapp.com/2011/8/3/adding-a-real-time-who-s-shopping-widget-to-an-asp-net-web-app</guid>
		<description><![CDATA[<p>In our last ASP.NET post, <a href="http://blog.pusher.com/2011/6/25/the-easiest-way-to-add-real-time-functionality-to-an-asp-net-e-commerce-application">The easiest way to add real-time functionality to an ASP.NET e-commerce application</a>, I demonstrated how to add realtime stock level updates and notifications to an ASP.NET e-commerce application. In this post I&#8217;m going to show how to add a &#8220;Who&#8217;s shopping?&#8221; widget to the same application. The purpose of [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/07/05/the-easiest-way-to-add-real-time-functionality-to-an-asp-net-e-commerce-application.html' rel='bookmark' title='The easiest way to add real-time functionality to an ASP.NET e-commerce application'>The easiest way to add real-time functionality to an ASP.NET e-commerce application</a></li>
<li><a href='http://www.leggetter.co.uk/2010/12/17/kwwika-powered-real-time-opta-sports-cricket-widget.html' rel='bookmark' title='Kwwika Powered Real-Time Opta Sports Cricket Widget'>Kwwika Powered Real-Time Opta Sports Cricket Widget</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>In our last ASP.NET post, <a  href="http://blog.pusher.com/2011/6/25/the-easiest-way-to-add-real-time-functionality-to-an-asp-net-e-commerce-application">The easiest way to add real-time functionality to an ASP.NET e-commerce application</a>, I demonstrated how to add realtime stock level updates and notifications to an ASP.NET e-commerce application. In this post I&#8217;m going to show how to add a &#8220;Who&#8217;s shopping?&#8221; widget to the same application. The purpose of this widget is to show other users that interest in the product they are viewing is high and that, in combination with the realtime stock levels, will encourage them to make a purchase before the product sells out.</p>
<p>In this tutorial I&#8217;ll show how to:</p>
<ul>
<li>subscribe to a presence channel</li>
<li>authenticate a subscription to a channel</li>
<li>provide Pusher with additional information about a user</li>
<li>display presence information on a product page for the &#8220;Who&#8217;s shopping?&#8221; widget</li>
</ul>
<p>If you are desperate to see the demo in action you can see the <a  href="http://realtimewebstore.apphb.com/">Real-Time Web Store demo here</a>.</p>
<h2>Pusher Presence</h2>
<p>To achieve the &#8220;Who&#8217;s shopping?&#8221; functionality I&#8217;m going to be using a feature in Pusher called <a  href="http://pusher.com/docs/client_api_guide/client_channels#subscribe-presence-channels">presence</a>. Presence provides you with additional information about a channel you are subscribed to so that you know:</p>
<ul>
<li>who is subscribed to that channel</li>
<li>when new users subscribe</li>
<li>when existing users unsubscribe (by either actually unsubscribing or navigating away from the page).</li>
</ul>
<p>We are going to have a presence channel per product so that we know who is viewing each product.</p>
<h2>User Info &amp; Authentication</h2>
<h3>Subscribing to a presence channel</h3>
<p>You subscribe to a presence channel in the same way that you do to any other channel but the name of the channel must have a <code>presence-</code> prefix. Presence channels are normal channels with two additions; authentication and presence information. With this in mind we are just going to update our application to use a presence channel.</p>
<p>The JavaScript that makes the subscription in our Razor view looks like this:</p>
<pre><code>var productId = "@Model.ProductId";
var pusher = new Pusher("APP_KEY");
var channel = pusher.subscribe("presence-" + productId);
</code></pre>
<p>We also need to update the code in our <code>StoreController</code> to publish our stock events on the new presence channel:</p>
<pre><code>var stockEvent = new StockUpdatedEvent(model, socketId);
ObjectPusherRequest request = new ObjectPusherRequest("presence-" + stockEvent.ProductId, "stockUpdated", stockEvent);
_provider.Trigger(request);
</code></pre>
<p><em>Note: If you are continuing where we left off in our last blog post there are a final couple of updates that are required to change the app to use the latest version of the Pusher JavaScript API. We recently released version 1.9 which introduced <a  href="http://blog.pusher.com/2011/7/12/connections-states">new connection state functionality</a> and also a new <code>connection</code> object. So, update your Pusher script tag as follows:</em></p>
<pre><code>&lt;script src="http://js.pusherapp.com/1.9/pusher.js"&gt;&lt;/script&gt;
</code></pre>
<p><em>And you&#8217;ll also need to update any pieces of code that access the <code>socket_id</code> via the <code>Pusher</code> instance. It should now be accessed via the new <code>connection</code> object as follows:</em></p>
<pre><code>var socketId = pusher.connection.socket_id;
</code></pre>
<h3>Getting User information</h3>
<p>If Pusher is to send events about users subscribing to and unsubscribing from presence channels it needs information about the users. It gets this information from your application when the subscription request to the channel is made (<code>pusher.subscribe('presence-channel')</code>). Since we can&#8217;t really trust the web browser/client (it&#8217;s so easy to hack JavaScript running in a web browser) the Pusher library requests this information from your web server by making an AJAX call. By default this call goes to <code>/pusher/auth</code> and passes two parameters; <code>channel_name</code>, which is the name of the channel being subscribed to, and <code>socket_id</code>, which is a unique identifier for the current user&#8217;s connection to Pusher.</p>
<pre><code>/pusher/auth/?channel_name=presence-pusher-tshirt&amp;socket_id=&lt;unique_socket_id&gt;
</code></pre>
<p>When our application responds to this request we must provide an authentication signature to confirm that the user can subscribe to the channel and, importantly for our &#8220;Who&#8217;s shopping?&#8221; widget, information about the current user. The way we&#8217;ll handle this within our ASP.NET MVC application is by creating a <code>PusherController</code> with an <code>Auth(string socket_id, string channel_name)</code> action, and by using the authentication functionality within the <a  href="https://github.com/leggetter/pusher-rest-dotnet">PusherRESTDotNet library</a>. This library is also available as a <a  href="http://nuget.org/List/Packages/PusherRESTDotNet">NuGet package</a>.</p>
<p><em>Note: If you got the NuGet package as part of the last tutorial you&#8217;ll need to update it since the authentication functionality has just been added. You should also check that the .NET 3.5 runtime version of Newtonsoft.Json is added.</em></p>
<h3>Handling the authentication request</h3>
<p>As mentioned above, the Pusher JavaScript library will make a request to <code>/pusher/auth</code> when making the authentication request. Our new <code>PusherController</code> with <code>Auth</code> action does the following:</p>
<ol>
<li>Fetches our Pusher credentials from the Web.config file.</li>
<li>Creates a new <code>PusherProvider</code> using the Pusher credentials</li>
<li>Creates a unique <code>user_id</code> for the presence channel</li>
<li>Creates an authentication string and returns that string as the <code>Content</code> of a <code>ContentResult' with the</code>ContentType<code>set to</code>application/json` in response to the AJAX request.</li>
</ol>
<p>For the moment this code doesn&#8217;t do any user authentication or provide any additional information about the current user.</p>
<pre><code>using System;
using System.Configuration;
using System.Web.Mvc;
using PusherRESTDotNet;
using PusherRESTDotNet.Authentication;

namespace RealTimeWebStore.Controllers
{
    public class PusherController : Controller
    {
        public ActionResult Auth(string channel_name, string socket_id)
        {
            var applicationId = ConfigurationManager.AppSettings["application_id"];
            var applicationKey = ConfigurationManager.AppSettings["application_key"];
            var applicationSecret = ConfigurationManager.AppSettings["application_secret"];

            var channelData = new PresenceChannelData()
            {
                user_id = Guid.NewGuid().ToString()
            };

            var provider = new PusherProvider(applicationId, applicationKey, applicationSecret);
            string authJson = provider.Authenticate(channel_name, socket_id, channelData);

            return new ContentResult { Content = authJson, ContentType = "application/json" };
        }
    }
}
</code></pre>
<p>If we use one of the many web browser development tools available to us to inspect the authentication call within the browser we&#8217;ll see the JSON response coming back.</p>
<p><img alt="Screen+shot+2011-08-04+at+17" src="http://blog.pusher.com/media/2011/08/04/09/07/01/978/Screen+shot+2011-08-04+at+17.06.17.jpg?m=resize&amp;o%5Bgeometry%5D=500x400&amp;s=0d9d3c037a95e8d6" /></p>
<p>You&#8217;ll see the response contains a <code>channel_data</code> property which itself has a <code>user_id</code> with a unique <a  href="http://msdn.microsoft.com/en-us/library/system.guid.aspx"><code>Guid</code></a> value and a <code>user_info</code> property with a <code>null</code> value. Pusher uses this <code>user_id</code> value to uniquely identify the user subscription to the presence channel. So it&#8217;s very important to make sure that each user has a unique ID.</p>
<h3>Adding authentication</h3>
<p>We&#8217;ve mentioned authentication a few times but as yet we haven&#8217;t authenticated the user. If the user has already logged (our app doesn&#8217;t have this functionality, but most do) in we can use the existing <code>User.Identity</code> or else we can just assign a guest identity to the user. Once we have a unique ID for the user we&#8217;ll also add some additional <code>user_info</code> to the <code>channelData</code>. The value of <code>user_info</code> can be anything you like from a simple string to a complex object. This gives you the ability to push as much additional information through Pusher and to the web page as you like. In our case we&#8217;ll just send through a timestamp which identifies how long the user has been on the site.</p>
<pre><code>public ActionResult Auth(string channel_name, string socket_id)
{
    var channelData = new PresenceChannelData();
    if (User.Identity.IsAuthenticated)
    {
        channelData.user_id = User.Identity.Name;
    }
    else
    {
        channelData.user_id = GetUniqueUserId();
    }
    channelData.user_info = GetUserInfo();

    var provider = new PusherProvider(applicationId, applicationKey, applicationSecret);
    string authJson = provider.Authenticate(channel_name, socket_id, channelData);

    return new ContentResult { Content = authJson, ContentType = "application/json" };
}
</code></pre>
<p><em>Note: In our case we don&#8217;t really need to authorise a user but in other situations where the user needs to be logged in we can return a 401  <a  href="http://msdn.microsoft.com/en-us/library/system.web.mvc.httpstatuscoderesult(v=vs.98).aspx?ppud=4"><code>HttpStatusCodeResult</code></a>.</em></p>
<h2>Who&#8217;s Shopping?</h2>
<p>Now that we&#8217;ve got a <code>PusherController</code> that gives Pusher information about the user, we can start showing information about the user on the product page. You can get information about the users subscribed to presence channels by binding to the <a  href="http://pusher.com/docs/client_api_guide/client_presence_events#pusher-subscription-succeeded"><code>pusher:subscription_succeeded</code></a> event on the presence channel object. The callback method for this event receives a <a  href="http://pusher.com/docs/client_api_guide/client_presence_events#members-parameter"><code>members</code></a> parameter which contains all the information about users subscribed to the channel.</p>
<p>First we&#8217;ll create some HTML within our web page where we are going to show &#8220;Who&#8217;s shopping?&#8221;. Then we&#8217;ll add the users to the HTML when pusher notifies us of them.</p>
<p><strong>HTML</strong></p>
<pre><code>&lt;div class="whos-shopping"&gt;
    &lt;h3&gt;Who's shopping?&lt;/h3&gt;
    &lt;ul&gt;&lt;/ul&gt;
&lt;/div&gt;
</code></pre>
<p><strong>JavaScript</strong></p>
<pre><code>var pusher = new Pusher("006c79b1fe1700c6c10d");
var channel = pusher.subscribe("presence-" + productId);
channel.bind("pusher:subscription_succeeded", function(members) {

    members.each(function(member) {
        addMember(member);
    });

});

function addMember(member) {
    var enteredSite = new Date(member.info.timestamp);
    var now = new Date();
    var timeOnSite = (now - enteredSite);
    var li = $("&lt;li data-user-id='" + member.id + "'&gt;" +
                    member.id + " here for " +
                    toReadableTime(timeOnSite) +
               "&lt;/li&gt;");
    $(".whos-shopping ul").append(li);
};
</code></pre>
<p><em>Note: The <code>members</code> object comes with a handy <code>each</code> method to make iterating the members collection really easy.</em></p>
<p>Of course new users can navigate to the page and existing users can leave it so the Pusher JavaScript library also exposes <a  href="http://pusher.com/docs/client_api_guide/client_presence_events#pusher-member-added"><code>pusher:member_added</code></a> and <a  href="http://pusher.com/docs/client_api_guide/client_presence_events#pusher-member-removed"><code>pusher:member_removed</code></a> events on the presence channel object. When these events fire we should add or remove the user as required.</p>
<pre><code>channel.bind("pusher:member_added", function(member) {
    addMember(member);
});
channel.bind("pusher:member_removed", function(member) {
    removeMember(member);
});

function addMember(member) {
    /* as before */
};

function removeMember(member) {
    $(".whos-shopping ul li[data-user-id='" + member.id + "']").remove();
};
</code></pre>
<p>With this in place we now have a fully functioning &#8220;Who&#8217;s shopping?&#8221; widget that shows the current user who else is viewing the same product as they are.</p>
<p><img alt="Screen+shot+2011-08-03+at+21" src="http://blog.pusher.com/media/2011/08/03/13/19/53/544/Screen+shot+2011-08-03+at+21.10.42.jpg?m=resize&amp;o%5Bgeometry%5D=500x400&amp;s=ee8762b09260ca71" /></p>
<p>As mentioned in the opening paragraph, the theory here is that if shoppers can see that others users are viewing the same product it might give them that little push they need to take the plunge and make that purchase &#8220;while stocks last&#8221;.</p>
<p>There are a few refinements and enhancements that could be made to this widget such as filtering out the current user from the &#8220;Who&#8217;s shopping?&#8221; list or possibly showing them which one they are. You could also use the notification system from last time to notify the shopper when another shopper joins or leaves the product page. And, of course, you could add some user chat functionality to get the users discussing the product and really engaging. You could also have a staff member user who could answer any questions that the shoppers may have.</p>
<p>Just as last time all the code from this post is available in the <a  href="https://github.com/leggetter/realtime-webstore">real-time web store github repo</a>. You can also see the <a  href="http://realtimewebstore.apphb.com/">Real-Time Web Store application up and running</a> on <a  href="https://appharbor.com/">AppHarbor</a>. I&#8217;ve tried to link to relevant parts of the <a  href="http://pusher.com/docs">Pusher documentation</a> throughout the post but if there anything that isn&#8217;t clear, if there&#8217;s anything that I&#8217;ve not provided enough detail on and it all just seems too <em>&#8216;magical&#8217;</em>, then please leave a comment or send an email to me (<a  href="mailto:phil@pusher.com?subject=ASP.NET%20real-time%20web%20store">phil@pusher.com</a>).</p>
<p>Here are some links to the key things covered in this post:</p>
<ul>
<li><a  href="http://pusher.com/docs/presence">Presence channels</a></li>
<li><a  href="http://pusher.com/docs/client_api_guide/client_presence_events">Presence channel events</a></li>
<li><a  href="http://pusher.com/docs/authenticating_users">Authenticating Users</a></li>
<li><a  href="http://pusher.com/docs/rest_libraries#cs">Pusher REST .NET Library</a> | <a  href="http://nuget.org/List/Packages/PusherRESTDotNet">NuGet package</a></li>
<li><a  href="https://github.com/leggetter/realtime-webstore">ASP.NET real-time web store in github</a></li>
<li><a  href="http://realtimewebstore.apphb.com/">Real-Time Web Store application up and running</a></li>
<li><a  href="http://www.asp.net/mvc/mvc3">ASP.NET MVC 3</a></li>
</ul>
<h2>Addendum: What about WebForms?</h2>
<p>The post above shows how to user the Pusher REST .NET library within an ASP.NET MVC application but it can just as easily be used within an ASP.NET WebForms app. The way I achieved this was by adding a new Generic HTTP Handler to our web app which will handle the authentication AJAX call.</p>
<p><img alt="Screen+shot+2011-08-02+at+16" src="http://blog.pusher.com/media/2011/08/03/13/22/53/682/Screen+shot+2011-08-02+at+16.07.19.jpg?m=resize&amp;o%5Bgeometry%5D=500x400&amp;s=8b9774ad1cdd29ca" /></p>
<p>In the code below the <code>ProcessRequest</code> method does the following things:</p>
<ol>
<li>Fetches our Pusher credentials from the Web.config file.</li>
<li>Gets the values of the <code>channel_name</code> and <code>socket_id</code> parameters from the <code>context.Request</code></li>
<li>Creates a new <code>PusherProvider</code> using the Pusher credentials</li>
<li>Creates a unique <code>user_id</code> for the presence channel</li>
<li>Creates an authentication string and returns that string as the response body of the AJAX request.</li>
</ol>
<p>For the moment this code doesn&#8217;t do any user authentication or provide any additional information about the current user.</p>
<pre><code>using System.Configuration;
using System.Web;
using PusherRESTDotNet;
using PusherRESTDotNet.Authentication;
using System;

namespace RealTimeWebStore
{
    public class AuthHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            var applicationId = ConfigurationManager.AppSettings["pusher-application-id"];
            var applicationKey = ConfigurationManager.AppSettings["pusher-application-key"];
            var applicationSecret = ConfigurationManager.AppSettings["pusher-application-secret"];

            var socketID = context.Request["socket_id"].ToString();
            var channelName = context.Request["channel_name"].ToString();
            var channelData = new PresenceChannelData()
            {
                user_id = Guid.NewGuid().ToString()
            };

            var provider = new PusherProvider(applicationId, applicationKey, applicationSecret);
            string authJson = provider.Authenticate(channelName, socketId,  channelData);

            context.Response.Write(authJson);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
</code></pre>
<p>Finally we need to configure our handler in the application <code>Web.config</code> file. We want the <code>ProcessRequest</code> method of our handler to be invoked for any call to <code>/pusher/auth</code>. To do this we just add a handler to the <code>httpHandlers</code> element and specify our handler, <code>RealTimeWebStore.AuthHandler</code> as the handler:</p>
<pre><code>&lt;system.web&gt;
  &lt;!-- other config --&gt;
  &lt;httpHandlers&gt;
    &lt;add verb="*"
         path="/pusher/auth/"
         type="RealTimeWebStore.AuthHandler" /&gt;
  &lt;/httpHandlers&gt;
&lt;/system.web&gt;
</code></pre>
<p><script>
var div = $("
<div/>")
.css({
"text-align":"center",
"margin":"auto",
"margin-bottom":"10px"
});
$(".entrybody img")
.css({
"-moz-border-radius": "4px", 
"-webkit-border-radius": "4px", 
"-o-border-radius": "4px", 
"-ms-border-radius": "4px", 
"-khtml-border-radius": "4px", 
"border-radius": "4px", 
"border": "1px solid #DEDEDE", 
"padding": "4px"})
.wrap(div);
</script></p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/07/05/the-easiest-way-to-add-real-time-functionality-to-an-asp-net-e-commerce-application.html' rel='bookmark' title='The easiest way to add real-time functionality to an ASP.NET e-commerce application'>The easiest way to add real-time functionality to an ASP.NET e-commerce application</a></li>
<li><a href='http://www.leggetter.co.uk/2010/12/17/kwwika-powered-real-time-opta-sports-cricket-widget.html' rel='bookmark' title='Kwwika Powered Real-Time Opta Sports Cricket Widget'>Kwwika Powered Real-Time Opta Sports Cricket Widget</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/2011/08/04/adding-a-real-time-whos-shopping-widget-to-an-asp-net-web-app.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The easiest way to add real-time functionality to an ASP.NET e-commerce application</title>
		<link>http://www.leggetter.co.uk/2011/07/05/the-easiest-way-to-add-real-time-functionality-to-an-asp-net-e-commerce-application.html</link>
		<comments>http://www.leggetter.co.uk/2011/07/05/the-easiest-way-to-add-real-time-functionality-to-an-asp-net-e-commerce-application.html#comments</comments>
		<pubDate>Tue, 05 Jul 2011 00:00:00 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[pusher]]></category>
		<category><![CDATA[real-time]]></category>
		<category><![CDATA[real-time web]]></category>

		<guid isPermaLink="false">http://blog.pusherapp.com/2011/6/25/the-easiest-way-to-add-real-time-functionality-to-an-asp-net-e-commerce-application</guid>
		<description><![CDATA[While adding realtime functionality to ASP.NET applications has often seemed difficult due to the connection limitations of the IIS platform, it can actually be achieved fairly easily by offloading this component to third party services like Pusher. In...
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/08/04/adding-a-real-time-whos-shopping-widget-to-an-asp-net-web-app.html' rel='bookmark' title='Adding a real-time &quot;Who&#8217;s shopping?&quot; widget to an ASP.NET Web App'>Adding a real-time &quot;Who&#8217;s shopping?&quot; widget to an ASP.NET Web App</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/2009/11/07/which-rich-internet-application-technology-will-dominate.html' rel='bookmark' title='Which Rich Internet Application Technology will dominate?'>Which Rich Internet Application Technology will dominate?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>While adding realtime functionality to ASP.NET applications has often seemed difficult due to the connection limitations of the IIS platform, it can actually be achieved fairly easily by offloading this component to third party services like Pusher. In this series of posts, I&#8217;ll get you started with this exciting technology through a number of hands-on tutorials. In the first one we&#8217;ll build a simple e-commerce application that displays realtime stock levels to the customers.</p>
<p>One of the problems with existing e-commerce solutions can be trying to buy something which, whilst you&#8217;ve been online, has sold out. This can be a big problem for high demand products like gig tickets or sporting events such as the Olympics. A really good way of avoiding this is to show the customers just how fast tickets are selling. The added benefit of this, from a business point of view, is that it can give users that little push they needed to make that purchase. In this tutorial I&#8217;ll show how to:</p>
<ul>
<li>establish a connection to Pusher in the view</li>
<li>subscribe to a product channel</li>
<li>bind events from this channel to our stock indicator in the view and update the stock level</li>
<li>send stock level update from our server when someone buys something</li>
</ul>
<h2>Getting started</h2>
<p>To demonstrate adding real-time functionality to an ASP.NET website I&#8217;m going to start with a simple one page e-commerce site which has one product: our cool Pusher t-shirt (Sorry, they&#8217;re not really for sale. You&#8217;ve got to earn them!). On the product page there is a counter which tells the customer how many t-shirts we have in stock.</p>
<div style="margin:auto; text-align:center;margin-bottom:20px;"><img alt="One-browser" src="http://blog.pusher.com/media/2011/06/27/05/04/29/40/one-browser.jpg?m=resize&amp;o%5Bgeometry%5D=600x300&amp;s=413d474f960a2e7c" /></div>
<p>To start off with our e-commerce website is a simple ASP.NET MVC3 app with:</p>
<ul>
<li>A <code>StoreController</code> with two actions. One to display the default view and one to handle the &#8220;Buy&#8221; button being clicked and the stock level being decreased.</li>
<li>A single <a  href="http://weblogs.asp.net/scottgu/archive/2010/07/02/introducing-razor.aspx">Razor</a> view displaying the single product</li>
<li>Two models; one for the product called <code>ProductModel</code> and one for images called <code>ProductImage</code></li>
<li>A <code>ProductRepository</code> where we store our products</li>
</ul>
<h2>Connect to Pusher</h2>
<p>As I&#8217;ve already said, adding real-time functionality is really simple &#8211; that&#8217;s the point! Firstly we have to include the Pusher JavaScript client library. We&#8217;ll add this to the view for the moment although we might want to make the include part of the site layout in the future.</p>
<p><em>Note: If your e-commerce page was being served up over HTTPS you would include our library over HTTPS too to avoid any browser warnings.</em></p>
<p>Since we are using ASP.NET MVC we&#8217;ve already got jQuery included from the <code>_Layout.cs.html</code> so we can wait until the page has loaded and connect to Pusher. The script include and the code that connects to Pusher looks as follows:</p>
<pre><code>&lt;script src="http://js.pusherapp.com/1.8/pusher.min.js"&gt;&lt;/script&gt;
&lt;script&gt;
    $(function() {
        var pusher = new Pusher("006c79b1fe1700c6c10d");
    });
&lt;/script&gt;
</code></pre>
<h2>Subscribe to the product channel</h2>
<p>Now that we&#8217;ve connected to Pusher we can push events from our StoreController to all connected browsers if any information changes about the product. The main piece of information that customers might want to know about is if the stock level changes. These t-shirts could sell out fast!</p>
<p>We need to choose a channel name to subscribe and publish to and the obvious choice is to use the unique product id for this. We&#8217;ll also prefix it with <code>product-</code> just so it&#8217;s really clear that the channels is for a product. We subscribe to this channel on the client as follows getting the product id from the Model that has been bound to the page:</p>
<pre><code>var channel = pusher.subscribe("product-@Model.ProductId");
</code></pre>
<h2>Bind to stock update events</h2>
<p>Once we&#8217;ve got a channel object we can bind to events on it. We want to be informed when the stock level changes so let&#8217;s bind to an event called <code>stockUpdated</code>. We&#8217;ll also expect a JSON object to be passed which represents the <code>ProductModel</code> and will have the same properties on it. That way we can simply update the stock level in the page to match the value on the server by accessing the <code>ProductModel.StockLevel</code> value. We can also update the stock status:</p>
<pre><code>channel.bind("stockUpdated", function(product) {
    $(".product .stock .level").html(product.StockLevel);
    $(".product .stock .status").html(product.StockStatus);
});
</code></pre>
<h2>Trigger stock update events</h2>
<p>As you can see, this is really easy to do. It&#8217;s just as easy to trigger the event on the server too. To do this we&#8217;re going to be using the <a  href="https://github.com/grahamscott/pusherrestdotnet">C# REST API library</a> within our <code>StoreController</code>. You can get the PusherRESTDotNet library from <a  href="https://github.com/grahamscott/pusherrestdotnet">github</a> or <a  href="http://nuget.org/Package/Edit/PusherRESTDotNet/1.0">via NugGet</a>.</p>
<div style="margin:auto;text-align:center;margin-bottom:20px;"><a  href="http://nuget.org/Package/Edit/PusherRESTDotNet/1.0"><img alt="Pusher-rest-library-nuget" src="http://blog.pusher.com/media/2011/06/25/14/08/10/392/pusher-rest-library-nuget.jpg?m=resize&amp;o%5Bgeometry%5D=600x300&amp;s=837c6fbf2f053537" /></a></div>
<p>Once we&#8217;ve added our PusherRESTDotNet reference we can add a few lines of code to our <code>StoreController</code> to instantly push any changes in stock level to all connected web browsers viewing our t-shirt page.</p>
<p>The first thing to do is to create a <code>PusherProvider</code> and pass in our Pusher details. In this example we are storing these details in the ASP.NET MVC3 <code>Web.config</code>.</p>
<h3>Web.config</h3>
<pre><code>&lt;configuration&gt;
  &lt;appSettings&gt;
    &lt;add key="application_id" value="APP_ID" /&gt;
    &lt;add key="application_key" value="APP_KEY" /&gt;
    &lt;add key="application_secret" value="APP_SECRET" /&gt;

    &lt;!-- more settings --&gt;
  &lt;/appSettings&gt;

  &lt;!-- more config --&gt;
&lt;/configuration&gt;
</code></pre>
<h3>StoreController.cs</h3>
<pre><code>public class StoreController : Controller
{
  private IPusherProvider _provider;

  public StoreController()
  {
      string applicationKey = ConfigurationManager.AppSettings["application_key"];
      string applicaitonSecret = ConfigurationManager.AppSettings["application_secret"];
      string applicationId = ConfigurationManager.AppSettings["application_id"];
      _provider = new PusherProvider(applicationId, applicationKey, applicaitonSecret);
  }

  // more code here...
}
</code></pre>
<p>Once we&#8217;ve created our instance of the <code>PusherProvider</code> we can create a <code>PusherObjectRequest</code> to push the <code>ProductModel</code>, with an updated <code>StockLevel</code> following the purchase, to the clients. The serialisation of the model object is handled for us by the PusherRESTDotNet library. The full <code>StoreController.Index</code> HTTP POST handling action looks like this:</p>
<pre><code>[HttpPost]
public ActionResult Index()
{
  bool bought = MvcApplication.ProductRepository.Buy(MvcApplication.BLUE_TSHIRT_ID);
  var model = MvcApplication.ProductRepository.GetProductById(MvcApplication.BLUE_TSHIRT_ID);

  if (bought)
  {
      ViewBag.Info = model.Title + " successfully bought";

      ObjectPusherRequest request = new ObjectPusherRequest("product-" + model.ProductId, "stockUpdated", model);
      _provider.Trigger(request);
  }
  else
  {
      ViewBag.Error = "There was a problem buying " + model.Title;
  }

  return View("Index", model);
}
</code></pre>
<p>Now, if you run your application and open two or more windows, as soon as a user in one window clicks the &#8220;Buy&#8221; button you&#8217;ll see that the stock level value instantly updates in all other windows.</p>
<div style="margin:auto; text-align:center;margin-bottom:20px;"><iframe src="http://www.screenr.com/embed/kfNs" width="600" height="366" frameborder="0"></iframe><br />
<small><em>Note: the video looks a little jittery because it was recorded on a VM running on Mac</em></small></div>
<h2>Next time &#8211; displaying real-time &#8220;Who&#8217;s shopping&#8221; info with Pusher presence</h2>
<p>We now have the stock level indicator changing in real-time. This tells the users that these t-shirts are selling out fast and gives them an added incentive to make that impulse buy. This is a simple yet effective change but there&#8217;s more we can do. What if we also show the user how many other users are viewing that product at the same time so that they know there is competition for the last few t-shirts? We can do that easily using Pusher&#8217;s <a  href="http://pusher.com/docs/presence">presence</a> functionality and I&#8217;ll cover that in my next <strong>Real-Time ASP.NET</strong> blog post which will also go into how to add Pusher <a  href="http://pusher.com/docs/authenticating_users">user authentication</a> to your ASP.NET web application.</p>
<p>In the meantime you can download the source of the <a  href="https://github.com/leggetter/realtime-webstore">Real-Time Web Store from github</a>. The solution contains a project with the basic web store without any real-time Pusher functionality as well as a solution project. Here are some additional things you you might also want to try out:</p>
<ul>
<li>Changing the form submission when the user clicks &#8220;Buy&#8221; so that the <code>POST</code> to the <code>Buy</code> action it is made using a <a  href="http://api.jquery.com/jQuery.ajax/">jQuery ajax call</a></li>
<li>Making the change in stock levels more visually interesting. Try adding an <a  href="http://jqueryui.com/docs/effect/">effect</a> to the number change or providing a <a  href="http://webtoolkit4.me/2009/08/13/jquery-growl-likenotification-systems/">growl-like notification</a></li>
<li>Changing the CSS &#8211; it&#8217;s not my strong point <img src='http://www.leggetter.co.uk/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
</ul>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/08/04/adding-a-real-time-whos-shopping-widget-to-an-asp-net-web-app.html' rel='bookmark' title='Adding a real-time &quot;Who&#8217;s shopping?&quot; widget to an ASP.NET Web App'>Adding a real-time &quot;Who&#8217;s shopping?&quot; widget to an ASP.NET Web App</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/2009/11/07/which-rich-internet-application-technology-will-dominate.html' rel='bookmark' title='Which Rich Internet Application Technology will dominate?'>Which Rich Internet Application Technology will dominate?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2011/07/05/the-easiest-way-to-add-real-time-functionality-to-an-asp-net-e-commerce-application.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Collecta Gets Dispensed: Was It Solving a Hard Enough Problem?</title>
		<link>http://www.leggetter.co.uk/2011/06/02/collecta-gets-dispensed-was-it-solving-a-hard-enough-problem.html</link>
		<comments>http://www.leggetter.co.uk/2011/06/02/collecta-gets-dispensed-was-it-solving-a-hard-enough-problem.html#comments</comments>
		<pubDate>Thu, 02 Jun 2011 07:00:47 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[business models]]></category>
		<category><![CDATA[collecta]]></category>
		<category><![CDATA[product development]]></category>
		<category><![CDATA[real-time]]></category>
		<category><![CDATA[real-time search]]></category>
		<category><![CDATA[real-time web]]></category>
		<category><![CDATA[realtime]]></category>
		<category><![CDATA[social mention]]></category>
		<category><![CDATA[Topsy]]></category>

		<guid isPermaLink="false">http://blog.programmableweb.com/2011/06/01/collecta-gets-dispensed-were-they-solving-a-hard-enough-problem/</guid>
		<description><![CDATA[<a href="http://www.programmableweb.com/api/collecta"><img src="http://www.programmableweb.com/images/apis/at1703.png" alt="Collecta" class="imgRight" /></a>At the beginning of 2011 we reported that <a href="http://blog.programmableweb.com/2011/01/24/collecta-drops-its-real-time-search-api/">Collect had decided to drop it's API</a> in order to change their offering to something more profitable. But now ReadWriteWeb have reported <a href="http://www.readwriteweb.com/archives/the_lights_go_out_at_collecta_real_time_search.php">the disappointing demise of Collecta</a>. This has the potential of being the first big failure of a well funded real-time web focused company, so questions need to be asked about why this happened and why Collecta weren't successful. Back in January of this year we asked "<a href="http://blog.programmableweb.com/2011/01/25/is-it-finally-the-end-for-real-time-search-engines/">Is It Finally the End for Real-time Search Engines?"</a> and it now looks like that very question is being raised again.
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2008/12/10/problem-solving-lessons-relearnt.html' rel='bookmark' title='Problem solving lessons relearnt'>Problem solving lessons relearnt</a></li>
<li><a href='http://www.leggetter.co.uk/2009/10/23/how-i-approach-problem-solving-in-code.html' rel='bookmark' title='How I approach problem solving in code?'>How I approach problem solving in code?</a></li>
<li><a href='http://www.leggetter.co.uk/2011/01/25/is-it-finally-the-end-for-real-time-search-engines.html' rel='bookmark' title='Is It Finally the End for Real-time Search Engines?'>Is It Finally the End for Real-time Search Engines?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.programmableweb.com/api/collecta"><img src="http://www.programmableweb.com/images/apis/at1703.png" alt="Collecta" class="imgRight" /></a>At the beginning of 2011 we reported that <a  href="http://blog.programmableweb.com/2011/01/24/collecta-drops-its-real-time-search-api/">Collect had decided to drop it&#8217;s API</a> in order to change their offering to something more profitable. But now ReadWriteWeb have reported <a  href="http://www.readwriteweb.com/archives/the_lights_go_out_at_collecta_real_time_search.php">the disappointing demise of Collecta</a>. This has the potential of being the first big failure of a well funded real-time web focused company, so questions need to be asked about why this happened and why Collecta weren&#8217;t successful. Back in January of this year we asked &#8220;<a  href="http://blog.programmableweb.com/2011/01/25/is-it-finally-the-end-for-real-time-search-engines/">Is It Finally the End for Real-time Search Engines?&#8221;</a> and it now looks like that very question is being raised again.</p>
<p>A very important question, that I recently heard from <a  href="http://twitter.com/#!/roanlavery">Roan Laverly</a> of <a  href="http://www.freeagentcentral.com/">FreeAgent</a>: &#8220;Is your product solving a hard enough problem?&#8221; Well, what problems was Collecta solving?</p>
<p><a  href="http://collecta.com"><img style="vertical-align: middle; display: block; margin-left: auto; margin-right: auto;" src="http://blog.programmableweb.com/wp-content/collecta1.png" alt="" width="448" height="335" /></a></p>
<p>The first problem Collecta was solving was search, and the problem with building a search product in general is that the market is massively dominated by Google. Even Microsoft&#8217;s Bing and Yahoo! can&#8217;t really make a significant dent in the search market, so how can anybody compete? Collecta tried to compete by using real-time search results as their unique selling point &#8211; Google now has a real-time search option, and if a topic is trending real-time search results can form part of the general search results too.</p>
<p>Another problem that Collecta was solving was making real-time data accessible. So many companies that have real-time data are now opening up their own APIs and increasing the ease at which anybody can access that data. This means individuals and companies can now got direct to source and build their own search offering, or just extract just the data they need themselves. I&#8217;m quite sure that Collecta has some very clever technology that delivered their best guess (algorithmically computed) search results in real-time. But again, it doesn&#8217;t sound like that was enough.</p>
<p>Creating real-time technology components capable of consuming, processing and distributing large amounts of data was another problem that Collecta had to answer. Initially building the technology capable of doing this was difficult but now, a few years later, real-time technology components are much more widely accessible. So whilst the difficulty level is still high the problem isn&#8217;t as difficult as it once was. This in itself has meant that data companies can build their own APIs.</p>
<p>Then there&#8217;s the problem of creating a compelling application and products. A website showing real-time search results in a intuitive and informative way. Widgets showing search results in an easy to digest and embeddable format. The post on ReadWriteWeb provides a comment by one of their own writers, Jared Smith, on Collecta&#8217;s applications:</p>
<blockquote><p>Collecta&#8217;s emphasis on a search experience that went beyond Twitter into photos and videos made it a great tool to truly watch a story unfold in real time. Their embeddable widget, which I used regularly on ReadWriteWeb&#8217;s event sites, was far more powerful than what Twitter provided and is still unmatched in my mind.</p>
</blockquote>
<p>So, even though they were building a useful products it wasn&#8217;t enough. Did Jared pay for the widget, and if not would he have been willing to? Would enough users have been willing to pay?</p>
<p>The good news out of all of this is that it sounds like the Collecta technology is going to be open sourced. A quote on the ReadWriteWeb post states:</p>
<blockquote><p>Collecta now says it will open source its software and is working with a variety of organizations to do so &#8211; including United Nations crisis relief projects.</p>
</blockquote>
<p>Is the real-time search problem hard enough? We should keep our eyes on <a  href="http://topsy.com/">Topsy</a> and <a  href="http://www.socialmention.com/">Social Mention</a> to see how they get on. What we can be sure of though is that with Collecta open sourcing their technology the real-time search technology question will now be easier than ever to answer.</p>
<p>
Originally written by me and <a  href="http://blog.programmableweb.com/2011/06/02/collecta-gets-dispensed-was-it-solving-a-hard-enough-problem/">posted on Programmable Web</a></p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2008/12/10/problem-solving-lessons-relearnt.html' rel='bookmark' title='Problem solving lessons relearnt'>Problem solving lessons relearnt</a></li>
<li><a href='http://www.leggetter.co.uk/2009/10/23/how-i-approach-problem-solving-in-code.html' rel='bookmark' title='How I approach problem solving in code?'>How I approach problem solving in code?</a></li>
<li><a href='http://www.leggetter.co.uk/2011/01/25/is-it-finally-the-end-for-real-time-search-engines.html' rel='bookmark' title='Is It Finally the End for Real-time Search Engines?'>Is It Finally the End for Real-time Search Engines?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2011/06/02/collecta-gets-dispensed-was-it-solving-a-hard-enough-problem.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Who Curates the Real-Time Web?</title>
		<link>http://www.leggetter.co.uk/2011/03/31/who-curates-the-real-time-web.html</link>
		<comments>http://www.leggetter.co.uk/2011/03/31/who-curates-the-real-time-web.html#comments</comments>
		<pubDate>Thu, 31 Mar 2011 08:00:23 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Cadmus]]></category>
		<category><![CDATA[Curation]]></category>
		<category><![CDATA[DataSift]]></category>
		<category><![CDATA[Keepstream]]></category>
		<category><![CDATA[Klout]]></category>
		<category><![CDATA[Madia Gazer]]></category>
		<category><![CDATA[Mass Relevance]]></category>
		<category><![CDATA[Peer Index]]></category>
		<category><![CDATA[real-time data]]></category>
		<category><![CDATA[real-time web]]></category>
		<category><![CDATA[realtime]]></category>
		<category><![CDATA[Salience]]></category>
		<category><![CDATA[Storify]]></category>
		<category><![CDATA[Trapit]]></category>

		<guid isPermaLink="false">http://blog.programmableweb.com/?p=18775</guid>
		<description><![CDATA[<a href="http://www.flickr.com/photos/blakespot/4011035061/"><img src="http://blog.programmableweb.com/wp-content/stopwatch.jpg" alt="Real-time" width="100" height="75" class="imgRight" /></a><a href="http://schedule.sxsw.com/">SXSW</a> was the source of a flood of real-time information on the web. Information flowed from attendees using social media tools to share what was being discussed, their thoughts and their experiences. This information was amplified further by the information be re-shared (retweeted on Twitter) and by other opinions being expressed about all things SXSW. But how is it that you ensure you don't miss an important piece of information from within your social media connections or even outside of your normal social media circles? From an earlier <a href="http://blog.programmableweb.com/2011/02/15/cadmus-offers-algorithmic-twitter-feed-curation/">post on Cadmus</a>, an algorithmic Twitter feed service, you may be aware of the idea of curation - filtering content to ensure that you don't miss the most relevant information. But who performs this curation and what roles do technology have in the process?
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/01/17/browse-build-and-share-real-time-streams-with-datasift.html' rel='bookmark' title='Browse, Build and Share Real-time Streams with DataSift'>Browse, Build and Share Real-time Streams with DataSift</a></li>
<li><a href='http://www.leggetter.co.uk/2010/12/21/why-client-apis-are-an-important-part-of-any-real-time-service.html' rel='bookmark' title='Why client APIs are an important part of any real-time service'>Why client APIs are an important part of any real-time service</a></li>
<li><a href='http://www.leggetter.co.uk/2010/08/12/the-benefits-of-real-time-push-once.html' rel='bookmark' title='The benefits of Real-Time Push-Once'>The benefits of Real-Time Push-Once</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.flickr.com/photos/blakespot/4011035061/"><img class="imgRight" title="Real-time" src="http://blog.programmableweb.com/wp-content/stopwatch.jpg" alt="Real-time" width="100" height="75" /></a><a  href="http://schedule.sxsw.com/">SXSW</a> was the source of a flood of real-time information on the web. Information flowed from attendees using social media tools to share what was being discussed, their thoughts and their experiences. This information was amplified further by the information be re-shared (retweeted on Twitter) and by other opinions being expressed about all things SXSW. But how is it that you ensure you don&#8217;t miss an important piece of information from within your social media connections or even outside of your normal social media circles? From an earlier <a  href="http://blog.programmableweb.com/2011/02/15/cadmus-offers-algorithmic-twitter-feed-curation/">post on Cadmus</a>, an algorithmic Twitter feed service, you may be aware of the idea of curation &#8211; filtering content to ensure that you don&#8217;t miss the most relevant information. But who performs this curation and what roles do technology have in the process?out</p>
<p>It is technology that has made it possible for us to produce, share and consume so much information. We are living in a time that is often referred to as an era of digital overload. It&#8217;s therefore very interesting and essential that the cause of this data overload should also be the solution: Technology, in combination with human input, can help us solve these new problems through automated curation of data.</p>
<p>SXSW ran a panel covering this subject: &#8220;<a  href="http://schedule.sxsw.com/events/event_IAP7907">Humans Versus Robots: Who Curates the Real-Time Web?</a>&#8220;. The panel consisted of representatives from curation services including Henry Nothhaft from <a  href="http://trap.it/">Trapit</a>, Jim England from <a  href="http://keepstream.com/">Keepstream</a>, Sam Decker from <a  href="http://www.massrelevance.com/">Mass Relevance</a>, Xavier Damman from <a  href="http://storify.com/">Storify</a>, and Megan McCarthy from <a  href="http://www.mediagazer.com/">Media Gazer</a> who chaired the discussion. Unsurprisingly there wasn&#8217;t a definitive answer to this question. The answer really depends on the data that is being curated. It was agreed that automated curation (robots) was required in cases where there was so much data that it would not be possible for humans to possibly curate. However, the consensus was that generally once the amount of data had been reduced to a more acceptable level that it was humans who could provide the best form of curation since they can understand and apply more context and objectivity to any data. Technology will of course improve and we&#8217;ll see the robots getting smarter and smarter.</p>
<p>Curation cannot be solved by any one technology and it will require smooth interaction and integration between numerous technologies in order to solve this problem. APIs will play a massive part in the curation process and we&#8217;ve already seen this directly through the <a  href="http://www.programmableweb.com/api/cadmus">Cadmus API</a> and within services such as <a  href="http://blog.programmableweb.com/2011/01/17/browse-build-and-share-real-time-streams-with-datasift/">DataSift</a>, where they use third party services such as <a  href="http://klout.com/">Klout</a>, <a  href="http://www.peerindex.net/">Peer Index</a> and <a  href="http://www.lexalytics.com/solutions/enterprise-software">Salience</a> for influence and sentiment analysis. DataSift provide a delivery and curation service but they can&#8217;t do everything on their own which is why they have outsourced some parts of the process to other services. As more curation techniques and algorithms are identified we&#8217;ll see these techniques exposed through additional services and APIs and in turn these APIs will be integrated into other curation services.</p>
<p>The amount of information being published to the real-time web is going to increase and as it does so will the importance of curation. It might not be long until it will be essential in ensuring that we don&#8217;t all suffer digital overload. How long will it be before Twitter.com and the ever increasing list of official Twitter clients, who presently only offer manual curation through selective follows and lists, join in and add curation to their service? Will they build it themselves, use a number of the available APIs (unlikely based on the amount of data) or make another acquisition?</p>
<p>Photo via <a  href="http://www.blakespot.com/">Blake Patterson</a></p>
<p>Originally written by me for <a  href="http://blog.programmableweb.com/2011/03/31/who-curates-the-real-time-web/">Programmable Web</a><br />
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/01/17/browse-build-and-share-real-time-streams-with-datasift.html' rel='bookmark' title='Browse, Build and Share Real-time Streams with DataSift'>Browse, Build and Share Real-time Streams with DataSift</a></li>
<li><a href='http://www.leggetter.co.uk/2010/12/21/why-client-apis-are-an-important-part-of-any-real-time-service.html' rel='bookmark' title='Why client APIs are an important part of any real-time service'>Why client APIs are an important part of any real-time service</a></li>
<li><a href='http://www.leggetter.co.uk/2010/08/12/the-benefits-of-real-time-push-once.html' rel='bookmark' title='The benefits of Real-Time Push-Once'>The benefits of Real-Time Push-Once</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2011/03/31/who-curates-the-real-time-web.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Looking for a C# (ASP.NET MVC), jQuery &amp; Real-Time Web Contractor</title>
		<link>http://www.leggetter.co.uk/2011/03/23/looking-for-a-c-javascript-real-time-web-contractor.html</link>
		<comments>http://www.leggetter.co.uk/2011/03/23/looking-for-a-c-javascript-real-time-web-contractor.html#comments</comments>
		<pubDate>Wed, 23 Mar 2011 09:45:04 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[ASP.NET MVC]]></category>
		<category><![CDATA[BDD]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Job]]></category>
		<category><![CDATA[Jobs]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[real-time data]]></category>
		<category><![CDATA[real-time web]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://leggetter.posterous.com/looking-for-a-c-javascript-real-time-web-cont</guid>
		<description><![CDATA[        
	I&#039;m very hopeful that I&#039;ll be looking to hire a contractor very soon and I thought I would post this to get a feeling for who is out there and interested. The skills I&#039;m looking for are as follows:EssentialC#Advanced JavaScriptTD...
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/2009/10/29/real-time-rich-internet-applications-rtria.html' rel='bookmark' title='Real-Time Rich Internet Applications (RTRIA)'>Real-Time Rich Internet Applications (RTRIA)</a></li>
<li><a href='http://www.leggetter.co.uk/2011/01/20/the-real-time-web-techmeetup-aberdeen-19012011.html' rel='bookmark' title='The Real-Time Web: TechMeetup Aberdeen &#8211; 19/01/2011'>The Real-Time Web: TechMeetup Aberdeen &#8211; 19/01/2011</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m looking for a contractor for a provisional 3 month contract with the following skills, experience and interests:</p>
<p><strong>Essential</strong></p>
<ul>
<li>C#</li>
<li>jQuery</li>
<li>TDD/BDD</li>
<li>ASP.NET MVC</li>
<li>ADO.NET Entity Framework or other ORM</li>
</ul>
<p><strong>Great to have</strong></p>
<ul>
<li>Passionate about the real-time web and real-time data (essential for the longer term)</li>
<li>Knowledge of building scalable systems on Amazon Infrastructure</li>
<li>Experience of integrating with 3rd party payment systems and building basic ecommerce functionality</li>
<li>Experience of building a SaaS or IaaS offering</li>
<li>Interest/experience in API and Web Service development</li>
<li>Advanced JavaScript</li>
<li>CSS</li>
<li>Excited about HTML5</li>
<li>Part of a tech community</li>
</ul>
<p><strong>Location</strong></p>
<p>The role will be primarily home-based but at times we may need to meet around 2 to 3 times a week at a location that we agree on anywhere between or around Dundee and Edinburgh.</p>
<p>Moving forward I&#8217;m hopeful that this could develop into a fulltime role so it would be ideal if we could get somebody who was interested in this also.</p>
<p>If you are interested please <a  href="mailto:phil@kwwika.com">get in touch</a>&nbsp;with&nbsp;your availability and your rate.</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/2009/10/29/real-time-rich-internet-applications-rtria.html' rel='bookmark' title='Real-Time Rich Internet Applications (RTRIA)'>Real-Time Rich Internet Applications (RTRIA)</a></li>
<li><a href='http://www.leggetter.co.uk/2011/01/20/the-real-time-web-techmeetup-aberdeen-19012011.html' rel='bookmark' title='The Real-Time Web: TechMeetup Aberdeen &#8211; 19/01/2011'>The Real-Time Web: TechMeetup Aberdeen &#8211; 19/01/2011</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2011/03/23/looking-for-a-c-javascript-real-time-web-contractor.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Real-Time Web: TechMeetup Aberdeen &#8211; 19/01/2011</title>
		<link>http://www.leggetter.co.uk/2011/01/20/the-real-time-web-techmeetup-aberdeen-19012011.html</link>
		<comments>http://www.leggetter.co.uk/2011/01/20/the-real-time-web-techmeetup-aberdeen-19012011.html#comments</comments>
		<pubDate>Thu, 20 Jan 2011 12:51:26 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Aberdeen]]></category>
		<category><![CDATA[http streaming]]></category>
		<category><![CDATA[pubsubhubbub]]></category>
		<category><![CDATA[real-time data]]></category>
		<category><![CDATA[real-time web]]></category>
		<category><![CDATA[real-time web platforms]]></category>
		<category><![CDATA[real-time web services]]></category>
		<category><![CDATA[TechMeetup]]></category>
		<category><![CDATA[websockets]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=5479</guid>
		<description><![CDATA[<p>I did my first ever <a href="http://www.techmeetup.co.uk/">TechMeetup</a> talk yesterday in Aberdeen and my chosen subject, unsurprisingly, was The Real-Time Web. We started out discussing what real-time was, then what The Real-Time Web is and when receiving information in real-time mattered. I also went on to cover some of the key real-time web technologies including HTTP [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/01/08/delivery-as-a-service-and-data-as-a-service-in-2011.html' rel='bookmark' title='Delivery as a Service and Data as a Service in 2011'>Delivery as a Service and Data as a Service in 2011</a></li>
<li><a href='http://www.leggetter.co.uk/2010/09/17/xmpp-pubsub-or-pubsubhubbub-for-real-time-server-push.html' rel='bookmark' title='XMPP PubSub or PubSubHubbub for real-time server push?'>XMPP PubSub or PubSubHubbub for real-time server push?</a></li>
<li><a href='http://www.leggetter.co.uk/2011/01/07/real-time-data-delivery-http-streaming-versus-pubsubhubbub.html' rel='bookmark' title='Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub'>Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I did my first ever <a  href="http://www.techmeetup.co.uk/">TechMeetup</a> talk yesterday in Aberdeen and my chosen subject, unsurprisingly, was <strong>The Real-Time Web</strong>. We started out discussing what real-time was, then what The Real-Time Web is and when receiving information in real-time mattered. I also went on to cover some of the key real-time web technologies including <strong>HTTP Streaming</strong>, <strong>PubSubHubbub</strong> and <strong>WebSockets</strong> and then on to <strong>real-time web services and platforms</strong>.</p>
<p>A big thanks to <a  href="http://twitter.com/#!/aboynejames">@aboynejames</a> for suggesting I do the talk and <a  href="http://www.abdn.ac.uk/~csc228/blog/">Bruce Scharlau</a> for inviting me along. I&#8217;d also like to thank everybody who attended and made me feel very welcome and certainly seemed interested.</p>
<h3>Feedback</h3>
<p>If you where there then please leave a comment letting me know what you thought or just to let me know who you are. If you&#8217;d rather email you can get me using <a href="mailto:phil@leggetter.co.uk?subject=Aberdeen TechMeetup">phil@leggetter.co.uk</a>.</p>
<h3>Video</h3>
<p>Here&#8217;s a video of the first 10 minutes of the talk. Unfortunately the video recorder ran out of batteries.</p>
<div style="text-align:center;"><iframe src="http://player.vimeo.com/video/19060295" width="400" height="227" frameborder="0"></iframe>
<p><a  href="http://vimeo.com/19060295">TM January 2011: Phil Leggetter &#8211; Real-Time Web</a> from <a  href="http://vimeo.com/user2219054">Alan Gardner</a> on <a  href="http://vimeo.com">Vimeo</a>.</p>
</div>
<h3>Presentation and Notes</h3>
<p><iframe src="https://docs.google.com/present/embed?id=dhf7xbgp_184gqqj6hhc&#038;size=m" frameborder="0" width="555" height="451"></iframe></p>
<p>Unfortunately I can&#8217;t find a way of showing my slide notes in the above embeded Google Presentation so here they are in pretty rough form.</p>
<h4>What is Real-Time?</h4>
<p>Respond or react within a predictable time after an event has occurred.</p>
<p>There may also be a maximum time constraint.</p>
<p>Because after that maximum time the information loses value and context.</p>
<p>Maybe we should really call it:<br />
Right-Time</p>
<h4>When does Real-Time matter?</h4>
<p><strong>When does NOW matter?</strong></p>
<p>When do you think being informed of something the instant it occurs really matters?</p>
<ul>
<li><strong>Critical systems</strong>. </li>
<li><strong>Live events</strong> where things lose context.</li>
<li>Systems requiring synchronisation:<br />
The 2Screen experience e.g. <a  href="http://tellylinks.com">TellyLinks.com</a></li>
<li>Interactive/collaborative things e.g. chat, Google Wave, Google Docs (docs, spreadsheets, drawing)</li>
<li><b>Sensor data</b> e.g. Car ABS breaks</li>
<li><strong>Trading</strong>: You&#8217;ve got to be sure you are seeing the correct trade price in order to be able to make a decision on whether to trade or not.</li>
<li><strong>Betting</strong>: You want to make sure you bet at the right odds and you don&#8217;t want clients to be able to bed when the odds have changed.</li>
</ul>
<h4>Evolution of the Web</h4>
<p><strong>From Pull to Push</strong></p>
<p>Although I&#8217;m going to use the Web Browser as the example client the client could of course be anything. Another web server any desktop application, a mobile application, an embedded app on any device.</p>
<p>I&#8217;m also going to focus on HTTP but the mechanisms could be applied to standard TCP socket connections.</p>
<h4>HTTP Pull (Request, Response)</h4>
<p>Note: client. This can be a web browser but doesn&#8217;t have to be.</p>
<p>1) Each request would result in a page reload.<br />
2) Event occurs on server there&#8217;s no way of the server telling the browser.<br />
3) e.g. chat pages where you would need to click the &#8220;Refresh&#8221; button to see what other users are saying </p>
<h4>HTTP Polling</h4>
<p>A user hitting F5 or clicking the refresh button is one manual example.</p>
<p>1) REFRESH-META<br />
2) Then frames<br />
3) XMLHttpRequest -> Outlook web access (ActiveX object) </p>
<p>Check if the information has changed by polling.</p>
<p>The problem with this is you can easily waste requests and it can be resource intensive for both the client and the server.</p>
<p>A large amount of services still take this approach although the web, and the technologies, have evolved to allow for real-time push.</p>
<p>For quite some time I&#8217;ve said if a service uses HTTP Polling when push technology is available and a much better option that <a  href="http://itsnotrealtime.com">it&#8217;s not real-time</a></p>
<h4>HTTP Push</h4>
<p>In this diagram you could replace the Client with Server. The initialization could be classed as a subscription or webhook.</p>
<p>Various techniques have been developed to hold a connection open to a web server from a browser.</p>
<p>Difficulties :</p>
<p>* Proxies/Firewall<br />
* Connection reselience<br />
* Browsers<br />
* Messaging API</p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/01/08/delivery-as-a-service-and-data-as-a-service-in-2011.html' rel='bookmark' title='Delivery as a Service and Data as a Service in 2011'>Delivery as a Service and Data as a Service in 2011</a></li>
<li><a href='http://www.leggetter.co.uk/2010/09/17/xmpp-pubsub-or-pubsubhubbub-for-real-time-server-push.html' rel='bookmark' title='XMPP PubSub or PubSubHubbub for real-time server push?'>XMPP PubSub or PubSubHubbub for real-time server push?</a></li>
<li><a href='http://www.leggetter.co.uk/2011/01/07/real-time-data-delivery-http-streaming-versus-pubsubhubbub.html' rel='bookmark' title='Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub'>Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2011/01/20/the-real-time-web-techmeetup-aberdeen-19012011.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Browse, Build and Share Real-time Streams with DataSift</title>
		<link>http://www.leggetter.co.uk/2011/01/17/browse-build-and-share-real-time-streams-with-datasift.html</link>
		<comments>http://www.leggetter.co.uk/2011/01/17/browse-build-and-share-real-time-streams-with-datasift.html#comments</comments>
		<pubDate>Mon, 17 Jan 2011 08:00:20 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[APIs]]></category>
		<category><![CDATA[DataSift]]></category>
		<category><![CDATA[digg]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[google buzz]]></category>
		<category><![CDATA[http streaming]]></category>
		<category><![CDATA[InfoChimps]]></category>
		<category><![CDATA[Klout]]></category>
		<category><![CDATA[myspace]]></category>
		<category><![CDATA[Peer Index]]></category>
		<category><![CDATA[real-time]]></category>
		<category><![CDATA[real-time data]]></category>
		<category><![CDATA[real-time web]]></category>
		<category><![CDATA[realtime]]></category>
		<category><![CDATA[Salience]]></category>
		<category><![CDATA[Sentiment]]></category>
		<category><![CDATA[SixApart]]></category>
		<category><![CDATA[TweetMeme]]></category>
		<category><![CDATA[websockets]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://blog.programmableweb.com/?p=17676</guid>
		<description><![CDATA[<a href="http://www.programmableweb.com/api/datasift"><img src="http://www.programmableweb.com/images/apis/at2922.png" alt="DataSift" class="imgRight" /></a>A core feature of the real-time web is the continuously updating real-time streams of information. These streams are commonly generated by social networks and with the continued uptake of social networking the amount of information is only going to increase. This will continue to introduce opportunities for companies to create products and services that extract value from that vast amount of data. Some of the most common services built around these streams include trend and sentiment analysis, data storage, aggregation, sorting, search and filtering. <a href="http://datasift.net/">DataSift</a> is a service that offers a host of exciting features including the ability to let users browse, build and share their own real-time streams using social media data drawn from a host of sources.
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/03/31/who-curates-the-real-time-web.html' rel='bookmark' title='Who Curates the Real-Time Web?'>Who Curates the Real-Time Web?</a></li>
<li><a href='http://www.leggetter.co.uk/2011/01/07/real-time-data-delivery-http-streaming-versus-pubsubhubbub.html' rel='bookmark' title='Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub'>Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub</a></li>
<li><a href='http://www.leggetter.co.uk/2010/12/21/why-client-apis-are-an-important-part-of-any-real-time-service.html' rel='bookmark' title='Why client APIs are an important part of any real-time service'>Why client APIs are an important part of any real-time service</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.programmableweb.com/api/datasift"><img class="imgRight" src="http://www.programmableweb.com/images/apis/at2922.png" alt="DataSift" /></a>A core feature of the real-time web is the continuously updating real-time streams of information. These streams are commonly generated by social networks and with the continued uptake of social networking the amount of information is only going to increase. This will continue to introduce opportunities for companies to create products and services that extract value from that vast amount of data. Some of the most common services built around these streams include trend and sentiment analysis, data storage, aggregation, sorting, search and filtering. <a  href="http://datasift.net/">DataSift</a> is a service that offers a host of exciting features including the ability to let users browse, build and share their own real-time streams using social media data drawn from a host of sources.</p>
<p>DataSift <a  href="http://techcrunch.com/2010/09/27/tweetmeme-founders-datasift-helps-you-find-a-needle-in-a-tweetstack/">launched</a> its Alpha service at TechCrunch Disrupt in September and describe it as a &#8220;real time social media filtering engine.&#8221; The initial buzz around DataSift was generated when Twitter agreed to give them access to the Twitter firehose, but they now have access to a much wider range of data including the Google Buzz, MySpace, SixApart, WordPress, Facebook and Digg. These sources of data within DataSift, sometimes called input services, are defined as <a  href="http://support.datasift.net/help/kb/fsdl/targets">Targets</a> in the DataSift knowledge base.</p>
<p>Users can use Targets to <a  href="http://support.datasift.net/help/kb/getting-started/creating-your-first-stream">create their own streams</a> from within the My Streams section of the DataSift dashboard using a language called <a  href="http://support.datasift.net/help/kb/fsdl/an-introduction-to-fsdl">FSDL</a> (Filtered Stream Definition Language). The Web editor used to define your streams is pretty simple but it does provide some basic syntax highlighting as well as validating your syntax whenever you save. FSDL also provides access to <a  href="http://support.datasift.net/help/kb/targets/targets-augmentations">augmentation Targets</a> through services such as Salience, TweetMeme, Peer Index, Klout and InfoChimps that allow streams to be augmented with third party data.</p>
<p style="text-align: center;"><img class="aligncenter" style="max-width: 800px;" title="DataSift Stream Edit Definition Page (FSDL)" src="http://www.leggetter.co.uk/wp-content/uploads/2011/01/FSDLEditor.png" alt="" width="602" height="326" /></p>
<p>Once a stream has been defined you can choose to build your feed. At present this takes up to 60 minutes and the dashboard will show you the progress of the build as well as a host of other features including a data preview, a live example of the data, a graph showing matched stream items (iterations per minute) and the history of the feed definition.</p>
<p><strong>Update:</strong> Nick Halstead (CEO of DataSift) has provided a clarification about the stream preview, the live stream feature and also when the stream can be used via the API:</p>
<blockquote><p>The stream ‘preview’ does not need to be built for anything to work, you can define + attach to API immediately (or just hit ‘live’ tab to see live results) – the preview was to allow stream owners to demonstrate what the stream would offer.</p>
</blockquote>
<p>You can see Nick&#8217;s full comment in <a  href="http://blog.programmableweb.com/2011/01/17/browse-build-and-share-real-time-streams-with-datasift/#comment-167921">the comments section</a> below.</p>
<p style="text-align: center;"><a  href="http://www.leggetter.co.uk/wp-content/uploads/2011/01/DataSiftDashBoard.png" class="thickbox no_icon" rel="gallery-5224" title="DataSift Stream Dashboard page"><img class="aligncenter" style="max-width: 800px;" title="DataSift Stream Dashboard page" src="http://www.leggetter.co.uk/wp-content/uploads/2011/01/DataSiftDashBoard.png" alt="" width="592" height="485" /></a></p>
<p>DataSift is encouraging its users to build feeds that are discoverable and accessible to other users, although it does offer a private feed option, by providing a number of options on the stream page including tagging, an area to encourage you to tell others about it on common social networks and a comments area to encourage users to interact and visits to the stream page. Recently added, most commented and top rated streams are also featured on the home section of the DataSift dashboard.</p>
<p style="text-align: center;"><img class="aligncenter" style="max-width: 800px;" title="DataSift Dashboard Homepage" src="http://blog.programmableweb.com/wp-content/DataSiftDashBoardHome.png" alt="" width="596" height="478" /></p>
<p>Once the stream has been built it <a  href="http://blog.datasift.com/2010/12/10/building-on-top-of-other-streams/">can also be used</a> in the definition of another user stream, and it in another stream and so on. DataSift really have exposed a lot of functionality and capabilities within their user dashboard and the <a  href="http://support.datasift.net/help/kb">documentation</a> that they provide is quite thorough and really helps a user get to grips with creating streams reasonably quickly.</p>
<p>All these rich features would be a waste unless there was a way of accessing the data and using it with an application. Unsurprisingly, the <a  href="http://www.programmableweb.com/api/datasift">DataSift API</a> delivers by providing three endpoints, including access to filtered data in a paged manner, HTTP Streaming and an RSS endpoint. It also recently introduced a <a  href="http://support.datasift.net/help/kb/streaming-api/websocket-streaming">WebSockets Streaming API</a>.</p>
<p>Although DataSift is still in Alpha it is offering what seems <a  title="DataSift pricing" href="http://datasift.net/pricing?hash=8ee1d6ba2359b33a8a0427723bfec28f&#038;id=2402">an affordable</a> and very impressive service which should excite any developer interested in real-time technologies and data. The company&#8217;s access to a wide range of data sources, engaging and intuitive user dashboard and range of API endpoints should mean that most developers will have their technology needs met.</p>
<div class="youtube-video" style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.youtube.com/v/X7aiKaCi8O8&amp;feature=youtube_gdata_player" /><param name="wmode" value="transparent" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://www.youtube.com/v/X7aiKaCi8O8&amp;feature=youtube_gdata_player" wmode="transparent"></embed></object></div>
<p>A good starting point to learn about DataSift is an <a  href="http://www.youtube.com/watch?v=X7aiKaCi8O8">interview</a> by Robert Scoble with Nick Halstead, the CEO of DataSift (embedded above). The video is a little old but provides a good overview and an example of creating a stream. If you&#8217;ve any comments or questions about DataSift please leave a comment here. After that you should head over to <a  href="http://datasift.net">http://datasift.net</a> and register for the DataSift Alpha program.</p>
<p>This <a  href="http://blog.programmableweb.com/2011/01/17/browse-build-and-share-real-time-streams-with-datasift/">post</a> was originally written by me for <a  href="http://blog.programmableweb.com">ProgrammableWeb</a></p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/03/31/who-curates-the-real-time-web.html' rel='bookmark' title='Who Curates the Real-Time Web?'>Who Curates the Real-Time Web?</a></li>
<li><a href='http://www.leggetter.co.uk/2011/01/07/real-time-data-delivery-http-streaming-versus-pubsubhubbub.html' rel='bookmark' title='Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub'>Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub</a></li>
<li><a href='http://www.leggetter.co.uk/2010/12/21/why-client-apis-are-an-important-part-of-any-real-time-service.html' rel='bookmark' title='Why client APIs are an important part of any real-time service'>Why client APIs are an important part of any real-time service</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2011/01/17/browse-build-and-share-real-time-streams-with-datasift.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment on The Rise of Multi-user, Multi-device Tablet Applications by Kate Ho</title>
		<link>http://www.leggetter.co.uk/2011/01/10/comment-on-the-rise-of-multi-user-multi-device-tablet-applications-by-kate-ho.html</link>
		<comments>http://www.leggetter.co.uk/2011/01/10/comment-on-the-rise-of-multi-user-multi-device-tablet-applications-by-kate-ho.html#comments</comments>
		<pubDate>Mon, 10 Jan 2011 10:07:38 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[comments]]></category>
		<category><![CDATA[real-time collaboration]]></category>
		<category><![CDATA[real-time messaging]]></category>
		<category><![CDATA[real-time web]]></category>
		<category><![CDATA[StartupCafe]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=4813</guid>
		<description><![CDATA[<p>I&#8217;ve just posted <a href="http://startupcafe.co.uk/2011/01/10/predictions-for-2011-3-the-rise-of-multi-user-multi-device-tablet-applications/#comment-2030">a comment</a> on a really good article by Kate Ho of Startup Cafe about her predictions on <a href="http://startupcafe.co.uk/2011/01/10/predictions-for-2011-3-the-rise-of-multi-user-multi-device-tablet-applications">the rise of multi-user, multi-device table applications</a>. Obviously my comments are focused really on the technology behind such a rise. Here&#8217;s my comment in full, slightly edited to be a bit more readable [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/01/12/comment-on-real-time-delivery-explained-post-by-feedmyinbox.html' rel='bookmark' title='Comment on Real-Time Delivery Explained post by feedmyinbox'>Comment on Real-Time Delivery Explained post by feedmyinbox</a></li>
<li><a href='http://www.leggetter.co.uk/2009/10/29/real-time-rich-internet-applications-rtria.html' rel='bookmark' title='Real-Time Rich Internet Applications (RTRIA)'>Real-Time Rich Internet Applications (RTRIA)</a></li>
<li><a href='http://www.leggetter.co.uk/2010/03/19/using-fiddler-to-help-develop-cross-domain-capable-javascript-web-applications.html' rel='bookmark' title='Using Fiddler to help develop cross domain capable JavaScript web applications'>Using Fiddler to help develop cross domain capable JavaScript web applications</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve just posted <a  href="http://startupcafe.co.uk/2011/01/10/predictions-for-2011-3-the-rise-of-multi-user-multi-device-tablet-applications/#comment-2030">a comment</a> on a really good article by Kate Ho of Startup Cafe about her predictions on <a  href="http://startupcafe.co.uk/2011/01/10/predictions-for-2011-3-the-rise-of-multi-user-multi-device-tablet-applications">the rise of multi-user, multi-device table applications</a>. Obviously my comments are focused really on the technology behind such a rise. Here&#8217;s my comment in full, slightly edited to be a bit more readable as a blog post.</p>
<blockquote cite="http://startupcafe.co.uk/2011/01/10/predictions-for-2011-3-the-rise-of-multi-user-multi-device-tablet-applications/#comment-2030"><p>
Kate &#8211; another very insightful post. And another set of predictions that I completely agree with you about and really excite me because I&#8217;m working on technology that makes this possible and more easily accessible. For multi-user games and collaborative applications the information about a player move, new document update or chat notification generally needs to be instantly sent to all other users. Even where real-time is not absolutely essential to the application a push notification is still more beneficial (UX and resource usage) than notification via polling.</p>
<p>During the last year we started to see, or at least notice, a lot more real-time collaboration applications and games which used the Internet as the network for the messages. In <a  href="http://blog.programmableweb.com/2010/09/14/client-push-services-open-up-real-time-to-everyone/">this post</a> I wrote for Programmable Web on real-time client push services the first screenshot is of a web-based scrabble-like game.</p>
<p>Some other well know examples are Google Docs documents, drawing and <a  href="http://docs.google.com/support/bin/answer.py?hl=en&#038;answer=44680">spreadsheets real-time collaboration</a>, <a  href="http://wave.google.com">Google Wave</a>, <a  href="http://pbworks.com/real-time-collaboration">PBWorks</a> and real-time chat services such as <a  href="http://nurph.com">Nurph</a> (although they currently use polling). I also think that services such as <a  href="http://balsamiq.com/">Balsamiq</a>, a UI mocking app, plan to introduce real-time collaboration functionality.</p>
<p>The user experience side of things is also very interesting. When real-time data delivery becomes a possibility the application developer really needs to consider how this impacts the UX. Just because you can stream 1000&#8242;s of tweets a minute into an application it doesn&#8217;t mean you should. search.twitter.com is a good example of this; they&#8217;ve chose to just show a notification that new tweets are available rather than actually push them into view. These two examples also show notifications being pushed into view:</p>
<ul>
<li><a  href="http://www.twitterfall.com/">Twitter Fall</a></li>
<li><a  href="http://kwwika.com/Standalone/Demos/javascript-examples/simple-twitter-subscriber/">Simple real-time streaming of Tweets demo on Kwwika (click on NOWPLAYING)</a></li>
</ul>
<p>I&#8217;d love to know what people think about this and hear any idea about how we can solve this real-time notification UX problem.</p>
<p>During 2011 I absolutely believe that we will start to see a lot more real-time and cross platform collaborative applications and games where one user may be on a smartphone, another on a PC running in a web browser and another on a native iPad app. These applications will be powered by real-time technologies either hosted by the game or application developers or using one of the real-time push notification and messaging services that started up last year.</p>
<p>My hope is that people will choose to use a service for that infrastructure and that <a  href="http://kwwika.com">Kwwika</a> is well placed to fill that role by having a foundation of technology developed over 10 years and <a  href="http://wiki.kwwika.com/api">APIs</a> for the majority of technologies (JavaScript [Web], Objective-C [iPhone/iPad], C, Java, .NET, Flash, Silverlight).
</p></blockquote>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/01/12/comment-on-real-time-delivery-explained-post-by-feedmyinbox.html' rel='bookmark' title='Comment on Real-Time Delivery Explained post by feedmyinbox'>Comment on Real-Time Delivery Explained post by feedmyinbox</a></li>
<li><a href='http://www.leggetter.co.uk/2009/10/29/real-time-rich-internet-applications-rtria.html' rel='bookmark' title='Real-Time Rich Internet Applications (RTRIA)'>Real-Time Rich Internet Applications (RTRIA)</a></li>
<li><a href='http://www.leggetter.co.uk/2010/03/19/using-fiddler-to-help-develop-cross-domain-capable-javascript-web-applications.html' rel='bookmark' title='Using Fiddler to help develop cross domain capable JavaScript web applications'>Using Fiddler to help develop cross domain capable JavaScript web applications</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2011/01/10/comment-on-the-rise-of-multi-user-multi-device-tablet-applications-by-kate-ho.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Delivery as a Service and Data as a Service in 2011</title>
		<link>http://www.leggetter.co.uk/2011/01/08/delivery-as-a-service-and-data-as-a-service-in-2011.html</link>
		<comments>http://www.leggetter.co.uk/2011/01/08/delivery-as-a-service-and-data-as-a-service-in-2011.html#comments</comments>
		<pubDate>Sat, 08 Jan 2011 13:32:30 +0000</pubDate>
		<dc:creator>Phil Leggetter</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[comet]]></category>
		<category><![CDATA[http streaming]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[PubSubHubbbub]]></category>
		<category><![CDATA[real-time client push]]></category>
		<category><![CDATA[real-time data]]></category>
		<category><![CDATA[real-time notifications]]></category>
		<category><![CDATA[real-time web]]></category>
		<category><![CDATA[web browsers]]></category>
		<category><![CDATA[XMPP]]></category>

		<guid isPermaLink="false">http://www.leggetter.co.uk/?p=4703</guid>
		<description><![CDATA[<p><a href="http://dashes.com/anil/2010/12/delivery-as-a-service.html">Delivery as a Service</a> and <a href="http://en.wikipedia.org/wiki/Data_as_a_Service">Data as a Service</a> (both DaaS) are definitely going to be big in 2011. Things really kicked off in 2010 with the emergence of companies focusing on real-time data delivery and mobile. We also started to see really exciting services focused on delivering real-time client push notifications to web [...]
Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/01/07/real-time-data-delivery-http-streaming-versus-pubsubhubbub.html' rel='bookmark' title='Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub'>Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub</a></li>
<li><a href='http://www.leggetter.co.uk/2011/01/20/the-real-time-web-techmeetup-aberdeen-19012011.html' rel='bookmark' title='The Real-Time Web: TechMeetup Aberdeen &#8211; 19/01/2011'>The Real-Time Web: TechMeetup Aberdeen &#8211; 19/01/2011</a></li>
<li><a href='http://www.leggetter.co.uk/2010/12/21/why-client-apis-are-an-important-part-of-any-real-time-service.html' rel='bookmark' title='Why client APIs are an important part of any real-time service'>Why client APIs are an important part of any real-time service</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a  href="http://dashes.com/anil/2010/12/delivery-as-a-service.html">Delivery as a Service</a> and <a  href="http://en.wikipedia.org/wiki/Data_as_a_Service">Data as a Service</a> (both <strong>DaaS</strong>) are definitely going to be big in 2011. Things really kicked off in 2010 with the emergence of companies focusing on real-time data delivery and mobile. We also started to see really exciting services focused on delivering real-time client push notifications to web browsers. I would put <a  href="http://kwwika.com">Kwwika</a> in both of these categories.</p>
<p>As 2011 continues we might to see some of these companies either partner up or start to tread on each others toes as they look at delivering data to alternative platforms and clients. Ultimately we are going to see services offering real-time communication of any type to any web enabled device using the web as the network.</p>
<p><small>The following lists aren&#8217;t 100% comprehensive and as time goes by I&#8217;ll probably create some pages on my site dedicated to this information.</small></p>
<p>Here&#8217;s the list of services I&#8217;m aware of and the type of service they offer and technology they use.</p>
<ul>
<li><a  href="http://beaconpush.com">BeaconPush</a> - [Web browser]</li>
<li>Google Channel API (<a  href="http://code.google.com/appengine/docs/python/channel/">Python</a>/<a  href="http://code.google.com/appengine/docs/java/channel/">Java</a>) &#8211; Part of <a  href="http://code.google.com/appengine/">Google App Engine</a> &#8211; [Web browser]</li>
<li><a  href="http://datasift.net">DataSift</a> &#8211; [Server to server, WebSockets, HTTP Streaming]</li>
<li><a  href="http://kwwika.com">Kwwika</a> &#8211; [Web browser, mobile, server to server, Desktop]</li>
<li><a  href="http://hookbox.org">Hookbox</a> &#8211; [Web browser]</li>
<li><a  href="http://notifo.com/">Notifo</a> &#8211; [Mobile]</li>
<li><a  href="http://www.notify.io/">Notify.io</a> &#8211; [Desktop, IM, Email]</li>
<li><a  href="http://notify.me/">Notify.me</a> &#8211; [Mobile, Desktop, IM, Email, XMPP]</li>
<li><a  href="http://pubnub.com">PubNub</a> &#8211; [Web browser, mobile, server to server, Desktop]</li>
<li><a  href="http://pusherapp.com">Pusher</a> &#8211; [Web browser]</li>
<li><a  href="http://superfeedr.com">Superfeedr</a> &#8211; [Server to server, PubSubHubbub, WebSockets, HTTP Streaming]</li>
<li><a  href="http://www.twilio.com/">Twilio</a> &#8211; [Mobile]</li>
<li><a  href="http://urbanairship.com/">Urban Airship</a> &#8211; [Moblie]</li>
</ul>
<p>A quick not of the key technologies behind these types of service:</p>
<ul>
<li><a  href="http://en.wikipedia.org/w/index.php?title=Comet_(programming)&#038;oldid=212288242">Comet</a> (<strong>Note:</strong> this version by <a  href="http://en.wikipedia.org/wiki/User:Jacobolus">Jacobolus</a> (Jacob Rus) is by far the best description. The current wikipedia description, IMHO, is inaccurate and incomplete and was ruined by <a  href="http://en.wikipedia.org/wiki/User:Damiens.rf">Damiens.rf</a>. Damiens.rf even put <a  href="http://en.wikipedia.org/wiki/User:Gregwilkins">Greg Wilkins</a>, who contributes to <a  href="http://jetty.codehaus.org/jetty/">Jetty</a> and <a  href="http://cometd.org/">Cometd</a>, off contributing to Wikipedia all together.)</li>
<li><a  href="http://growl.info/">Growl</a></li>
<li><a  href="http://www.quora.com/HTTP-Streaming">HTTP Streaming</a></li>
<li><a  href="http://code.google.com/p/pubsubhubbub/">PubSubHubbub</a></li>
<li><a  href="http://xmpp.org/">XMPP</a></li>
<li><a  href="http://www.webhooks.org/">Webhooks</a></li>
<li><a  href="http://en.wikipedia.org/wiki/WebSockets">WebSockets</a></li>
</ul>
<p><small><strong>Note:</strong> I originally wrote this as a comment over on <a  href="http://dashes.com/anil/2010/12/delivery-as-a-service.html">Anil Dash&#8217;s post on Delivery as a Service</a> but I thought it was good content so it deserved a post of its own.</small></p>
<p>Related posts:<ol>
<li><a href='http://www.leggetter.co.uk/2011/01/07/real-time-data-delivery-http-streaming-versus-pubsubhubbub.html' rel='bookmark' title='Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub'>Real-time Data Delivery: HTTP Streaming Versus PubSubHubbub</a></li>
<li><a href='http://www.leggetter.co.uk/2011/01/20/the-real-time-web-techmeetup-aberdeen-19012011.html' rel='bookmark' title='The Real-Time Web: TechMeetup Aberdeen &#8211; 19/01/2011'>The Real-Time Web: TechMeetup Aberdeen &#8211; 19/01/2011</a></li>
<li><a href='http://www.leggetter.co.uk/2010/12/21/why-client-apis-are-an-important-part-of-any-real-time-service.html' rel='bookmark' title='Why client APIs are an important part of any real-time service'>Why client APIs are an important part of any real-time service</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.leggetter.co.uk/2011/01/08/delivery-as-a-service-and-data-as-a-service-in-2011.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced
Database Caching 25/117 queries in 0.085 seconds using disk: basic

Served from: www.leggetter.co.uk @ 2012-02-04 20:42:20 -->
