The difference between Facebook and Twitter

I just left the following comment at Shel Isreal’s latest blog post (read it first – the comment makes more sense in context):

I’d sign up for that.

Facebook is too unpredictable for my tastes. Even though i have people constantly asking me to friend them on it.

Twitter is a good example of balancing users and advertisers interests. Their private accounts are private. And advertising is only now becoming more of a piece of twitters strategy (@earlybird, promoted tweets etc). However, it is not being done at the users expense. Its an explicitly opt – in thing.

In other words, Twitter has respected its users, working its business model around them.

In the end, everybody wins.

I think it makes sense. Any thoughts?

Thoughts on Windows Azure Storage

I’m sitting here planning what to do with the re-write of the Feedreader I wrote for university. Naturally, the storage solution is always going to be a contentious issue. The NoSql versus SQl debate plays a lot into it.

But, for the most part, i used Windows Azure tables and blobs for its simplicity over SQL Azure. In saying that, SQL is not my favourite thing in the world, so make of that what you will. But also, for a demonstrator application, the use of something completely new played in my hands very well.

So the re-write is also meant to be a demonstrator application. so the Windows Azure storage is staying.

But, not so fast. because Windows Azure Storage  needs something. The way I used Tables and Blobs essentially was as a poor mans object database. Thus meant that there was a lot of leg work involved in this, not to mention tedious plumbing code. The fact is, I think that the is the most logical use case for Windows Azure Storage – where in metadata is stored in the tables and the object themselves are in the blobs.

What I would like to be added, then, is the ability to formalize this relationship in code. Some way of saying “hey, this value in this TableRow actually points to a blob in this container”. So I can call “getBlob()”, or something on a Row an get the blob back. Now, to be clear, I don’t mean this to be a foreign key relationship. I don’t want to cascade updates and deletes. And i certainly don’t want my hands tied by making the Blob Attribute column (or whatever) mandatory.

Now, this could be added right now. And in fact am considering doing that. But support for this in the Storage Client library would be nice. But weather backend support is needed, or in fact a good idea, is another question entirely. The implications of making such a fundamental change on the back end. For example, say you’ve exposed a table via OData. How do you expose the blob as well? And given the nature of the use case, the fact that it is needed on a table by table basis makes it much easier to limit any such functionality to the Tools library only.

I can hear you asking yourself why I’m asking for support in the Storage Client library if I can gin up and duct tape together some Extension Methods? I’m a big proponent of the idea that anything that we use in intact with software, be that actual applications or libraries we use in our code, has a Natural user interface. Think of it, the API methods that are exposed for us as developers to use are in fact a User Interface. so I’m asking for a better user interface that supports this functionality without me having to do the legwork for it. In so delivering support, it is perfectly possible, indeed likely, that the library code that Microsoft ships will be more efficient than whatever code I can write.

My final report on the project did call out VS Windows Azure Tools, mainly for not making my life easier. So I’m looking forward to the new version (1.3) and seeing how it goes, particularly with regard to storage.

Now performance-wise, the version I wrote last wasn’t exactly fast at retrieving data. I suspect that this was due to a) my own code in-efficiencies and b) the fact that my data wasn’t optimally (obviously) normalized. Its also probable that better use of MVC viewdata (actually, I think that should be “better use of MVC, period”) and caching will improve things a lot as well.

Oil Spill Live Feeds App 1.3 & Screencast

This is my attempt to kill 2 birds with one stone.

So, item number one is a new version of the Oil Spills application. New features added are:

  • ability to add and remove panels
  • ability to refresh feeds that have gone down
  • all panels now have the same size – the application will adjust this based on the number of panels and the size of the form
  • added some application icons

You can get the new release here: http://oilslickfeeds.codeplex.com/releases/view/47469

This may seem like a little, but its really a total re-write.

Being able to remove panels that you do not want to watch makes the application more memory efficient. Though there is more work that can be done in this area, there is only so much you can do when streaming 8 live feeds.

Item number 2 is the fact that I did a short, 6 minute screen cast discussing the innards of the application. Now, it may seem silly to do a screencast for something so trivial, but I wanted some practice. It turns out that its not as easy as it sounds. So this video is my 4th attempt (which I’m still not 100% happy with, mainly because of the overlay).

I did this with Expression Encoder 3 Screen Capture. I usually use Community Clips for this sort of stuff. But, its not a half bad screen capture program. Expression Encoder Screen capture will let you add an overlay from an external camera, in this case, my laptops integrated webcam. I’m not too sure about this for future screencasts – so do let me know what you think.

So here it is:

My RSSCloud Server: Thinking of doing some screencasts.

This year was my last at Uni ( actually, i still have an exam to write, so the past tense isn’t accurate). As is typical with Honours year undergraduates, a final year project was set.

If you are regular reader of this blog, you’ll probably know that what i picked was a RSSCloud server running on Windows Azure. However, as they say on the home shopping networks, THERES MORE! My project needed a little more body to it. So I added an online Feedreader, in other words a poor (dirt-simple) imitation of Google Reader.

Now, this app uses a number of technologies for which it would be a pretty cool demo project. Windows Azure itself (obviously), Windows Azure Tables and Blobs, LINQ, WCF, MVC2 and so on. This includes it being a demonstrator of the RSSCLoud specification itself.

Although its an academic submission, my lecturers are fine with me opensourceing it.

Given the rise of .Net 4, and the experience points gained writing the first version, I feel that everyone would be better served with a rewrite. Not to mention the fact that It’ll give me a chance to use the new Windows Azure Tools for Visual Studio.

As I re-write it, I think a screencast series is in order. All the code will be checked in to codeplex. This’ll give everyone a chance to double check my logic (particularly interested in what Dave Winer thinks of my implementation of RSSCloud).

So, firstly, What do you think?

And secondly, anyone know a good hosting provider? I don’t know about Youtube. But Vimeo looks pretty good. If their limit is 500Gbs/per week upload space, it’ll give me chance to do one video each week, more or less.

I have all the software required to pull this off. So thats not a problem. I actually did a screencast of a live coding session in class for one of my lectures (writing an interpreter turns out to be pretty fun, actually).

i think this would be a pretty good contribution to the community as a whole.

(AdMob)Comment of the Day

Not from here, but rather from Kara Swishers post on Apple barring AdMob.

David K makes this excellent point:

Really? I never realized how I was held hostage. I could swear that I am completely free to buy any smart phone I want if I don’t like the iPhone. I wasn’t aware that I Apple would come send its iPolice after me if I walked into a Verizon store tommorow and picked up a Droid…

Since basically the argument in the preceding comments was along the lines that iAd was yet another instance of the closed ecosystem.

By the same token, devs aren’t held hostage as regards to their choice of Ad provider. This is made clear by the language in the new ToS. They just can’t use AdMob.

Quite frankly, Jobs has every right to bar Admob. To do anything else would be like Microsoft selling Lotus Notes in their stores. Not gonna happen.

Theres an App for that: BP Oil spill live feeds

SpillFeeds

SpillFeeds2 SpillFeeds3 SpillFeeds4

Like that. Took me 30 minutes.

Head over to http://oilslickfeeds.codeplex.com/ to get it.

Note: These are live streams from the ROV’s monitoring the damaged riser. Please be aware, as these are live streams they may freeze or be unavailable from time to time.

(thanks to the Channel 4 TV guys for putting the original web page together)

Update 08/06/2010  There was a problem with the install files. I’ve uploaded a new version. Please do let me know if there are further problems.

Update 24/06/2010  Version 1.3 has been released. please see the details here: https://rbonini.wordpress.com/2010/06/24/oil-spill-app-1-3-screencast/

Web API’s have an Identity Problem (In response to and in support of @davewiner)

If you’ll remember, a while back I announced I was implementing RSSCloud on Windows Azure. By and large this is going well and I expect to have a demo up and running soon.

PS. what follows below is based on an email I sent to my Honours Year supervisor at University and some of this will make it into my thesis too.

The RSSCloud API relies on HTTP POST for messages in and out. And I initially thought Windows Communication Foundation was the way to go.

(bear with me, I’m using this to illustrate my point)

Up until now, WCF has been working. However, in order to actually test the RSS Cloud code, I’ve had to have it the WCF Operation Contracts written as a REST service. Its clearly HTTP POST, but its not in the RSSCloud specification. Though arguably, it should be. Why do i say this? Developers should be able to write code they are comfortable with. Whether than is REST or POST or SOAP or its against an WSDL generated API client.

Back to my little problem. So instead of:

[WebInvoke(Method = "POST", UriTemplate = "/ping?url={value}")]

        [OperationContract]

        String Ping(string value);

I had to use:

[WebInvoke(Method = "POST", UriTemplate = "/ping/url/{value}"/)]

        [OperationContract]

        String Ping(string value);

There is a subtle difference. HTTP post uses the query string, where as REST uses the url itself to transmit information.

Sending a HTTP POST to the first method (where the query string is of the form" ?url={value}&port={value}&…..") hangs the test client. The request is accepted, but it never returns. I can’t even debug the method. Using a pure REST url (the second method), things work perfectly.

In order for project as a whole to conform to the project specification (by which I mean the interoperability of the program and its compliance with the HTTP POST methods defined in the RSSCloud specification), being able to accept HTTP POST is paramount.

I spoke to one of my WCF savvy lecturers. Basically he said that there were two ways to doing this: either stick to using a REST. Or encode the url as part of the POST data. Neither of which solve the problem of sticking to the specification and using HTTP Post.

So, I was digging around ASP.Net MVC 2  yesterday. I was building the page that will actually display the posts in a feed on the page. I noticed that the Controller actions that handle the request  (i.e the feed id to get) have a [HttpPost] attribute above them. I’d never really given that much thought until yesterday.

After my little chat, I had a hunch. Using MVC, I simply added a controller action like so:

[HttpPost]

        public RedirectToRouteResult ThePing()

        {

            string url = (string) Request.QueryString["url"];

            url = url.ToLower();

            ……..

And it worked flawlessly. After all my wrestling with WCF configurations and what not, i was actually quite shocked that it worked first time. One of the problems with working with new frameworks is that you keep discovering new things, but only long after you shoud’ve known.

So, to hit the ThePing method above, the url is http://rsscloudproject/Cloud/ThePing?url=….... (obviously this isn’t deployed yet)

Why does this work?

The reason is quite simple: As I understand it, MVC exposes the Request object for you to use directly, while WCF hides this somewhere in the bowels of its inner workings. So, without getting a handle on the Request object, I can’t force WCF to process the query string differently. Hence, WCF was the wrong choice of framework for this.

So my code is now 100% in compliance with the HTTP POST methods defined in the RSSCloud Specification

Now, what does this mean for the WCF REST project?

I’m keeping it as part of the project. It gives a REST interface, and it gives WSDL that developers can use to build against my service.

Not so much the case with REST, but I personally think that the concept of a WSDL is under-represented when it comes to web based APIs. Adding these two additional interfaces to the RSSCloud specification will be one of my recommendations in the final report. I feel strongly that a web based API needs to give developers as many alternative interfaces as possible. Its no fun when you know one way of doing things, but this API is only provided in another.

For example. I wish Smugmug provided a WSDL that I could point Visual studio to and generate a client for.

Both of these situations illustrate a problem among Web API’s.

I wrote a while  back that Bill Buxton’s Mix 10 keynote about designing natural user interfaces, interfaces that respect the abilities and the skills acquired by the user also applies to designers of API’s.

Bill gives this wonderful example of a violin. The violin itself may be worth millions of dollars (if I remember correctly, Joshua Bell paid $4.5 million for his Stradivarius). The bow of the violin for any first violinist in any symphony orchestra is never less than $10,000. Remember these are musicians. They make a pittance. So as a proportion of income, it’s a fortune. But it’s worth it. Why? Because it’s worthy of the skills that those musicians been acquired over decades.

Dave Winer today published a post about Facebook not providing XML API responses. And bemoaning that Twitter is going to do the same. Dave does not want JSON. He wants XML. Why? He feels comfortable with it, and he has to tools to work with it. Clearly the new API changes do not respect Dave Winer and the abilities he has acquired of decades.

I left the following comment:

I totally understand where you are coming from.

On the other hand, tools will always be insufficent. I don’t think .Net, for example, has JSON support built in, either.

Technology moves so fast, as you say, that next week there will be something new and shiny. Developers find themselves in the curious position for having to write for today, but to prepare for next weeks new thing – they have to find a way to straddle that fence between the two. Open Source is not the complete answer to this problem ( its part of it tho).

  • So, API developers have the responsibility to provide for developers.
  • Tool developers (closed or open source) have a responsibility to provide the tools in a timely fashion.
  • And developers have the responsibility to have reasonable expectations for what they want supported.

This is a large and deep problem in the world of web API’s. They don’t have to be Just JSON or Just XML or Just HTTP POST or Just XML-RPC or Just SOAP or Just WSDL. This collection of formats and standards can co-exist.

And co-exist they should. An API should be available to the widest possible cross section of developers, to respect the individual skills that these developers have acquired of years and decades.

Because when you don’t do that, when you don’t respect that, you make people like Dave Winer stop coding against your API.

Re: 7 reasons why the Windows 7 Phone is THE iPhone Killer

I thought I’d repost my comment on this fascinating post: 7 reasons why the Windows 7 Phone is THE iPhone Killer – read the post first.

I must say that I am seriously tempted to get a Windows Phone 7 phone. For all the above reasons.

As a developer, the major enticement is the fact that I can write my own apps for the phone for free.

Having an iPhone and an AppleTv, I’m pretty heavily invested into iTunes store content. That is the big thing holding me back. If Microsoft could get their software to authenticate files with Apple’s DRM servers,t his would be the cherry on the top. The media hub is certainly indicative of Microsoft embracing content irrespective of its origin.

Finally, I assume that the phone syncs with Microsoft’s beautiful Zune software. iTunes as a software program is terrible and the Zune software out does it six ways to Sunday. Again, another big plus.

All the above having being said. I’m wondering what apple will do to respond to this. They clearly have a huge task ahead of them. Microsoft is cleverly tapping into the large install base of Windows and Xbox Live games, the large install base of Mesh, the huge install base of visual studio and Silverlight developers and finally, the huge install base of Exchange servers. These are four constituencies that Apple does not have any worthy alternative (unless one counts the pitiful Exchange support in the iPhone).

This is clearly Microsoft playing to its strengths and not its weaknesses. They are playing this on their own rules, on their terms and and on their own turf.

This is why competition works.

I’d thoroughly encourage everyone to go and watch the Mix 10 Keynote on-demand here: http://live.visitmix.com/MIX10/Sessions/KEY01

You’ll see why am so excited about this as a developer.

Finally, while I’m on the subject of Mix 10, go ahead and see UI designer Bill Buxton in the second half of the second keynote here for a truly inspiring speech: http://live.visitmix.com/MIX10/Sessions/KEY02 (he’s introduced at the 2:13 mark)

Scobles’ Molecules of Infomation

Devotion to Duty

Scobles’  molecules of information post reminded me of something. Blog posts are the original molecules of information. A blog post is a place to bring tweets, pics and youtube videos together. Since blogging took off, we have a host of new tools to add to the army knife. We have foursquare check-ins for example. they provide an awful lot of context to location sensitive tweets.

Thats why I’m sharing this here rather than going straight to Friendfeed and Twitter. 

I commented on Scobles’ post:

Er, Scoble. You can tag tweets. Its called hashtags. What we DON’T have is the ability to search and mine that information.
Friendfeed has hashtags as well. And FF has a far more power search engine for all these little atoms of information.
Friendfeed is way ahead of you. They show you related items.
The future is here, its just not evenly distributed yet.

To which Scoble replied (Disqus comments with replies are awsome, BTW)

Nice try. Hashtags are NOT tags. At least they aren’t anything like the tags that Flickr photos have. FriendFeed does NOT have tags. It has comments. Not the same again. Not even close. FriendFeed’s related items? They are to remove some duplication noise and that feature doesn’t work anywhere close to as well as a human curated system would. Try again.

To which I responded:

Robert, hashtags need a systematic engine for them to work as actual
tags. Twitter should add this.

But nonetheless they provide a way of categorising tweets. Tweetdecks
tweet filtering works primarily due to hashtags. For events, for
example, hashtags are brilliant.

Friendfeed related items link may primarily be for noise reduction,
but this functionaity could be greatly extended. Comments are content
as well, but quite often they provide context too. See Jesses’ FF3.0
FF posts this morning for an example. Where links between FF items are
posted in the comments.

If this were extended to solidify the relationtionship between items
beyond simply showing the items linking to the same page, we’d have
your information molecules.

The sum total of tweets, posts, videos, foursquare check ins, you name
it about something often ends up providing more context than any one
single service or method can provide.
Typically speaking blog posts have filled this need for creating
context, collateing all this related information together in a single
article. This tweet, that twitpic, this video. The first instance of
an information molecule.

As noted above we already have been manually adding in links between
related content. Geolocation services have always created information
molecules, combining tweets and google maps. In like manner, the
services concerned need to solidify these methods for other types of
information.

What do you think?

Why I Just Bought A Dell (instead of an iPad)

295 best_experience_20100127

Even with all the iPad hysteria in yonder interwebs, there is one fact that differentiates the iPad from a true, bad-to-the-bone laptop: the need to sync.

This above all else cripples the iPad (at least when one considers it against the backdrop of the average laptop hardware spec). Think of it. How are you going to get all those wonderful iPhone apps you’ve bought over the past three years onto your brand spanking new iPad?? You need to sync it. How are you going to get your music, tv shows and movies on top your iPad? You need to sync it. In fact, how are you going to get some swanky software update that Apple will surely release on to your iPad without syncing it??

I have that problem with my iPhones at the moment. My iTunes library  that i sync the iPhones to got borked a few weeks back. Now I have to erase and re-sync BOTH iPhones with my partially rebuild library (its a bit of a hit or miss process). Until I do that, I can get stuff off the devices, but not sync stuff to them. Bit of a pain, no?? Its going to be even worse with the iPad if I’m ever in this sticky situation with it.

Secondly, the iPad runs iPhone OS3.2, the laptop runs Windows 7 Professional. Which gives me the great freedom of applications?? It depends. I have no qualms about the app store. Its the type of application that is allowed on the iPad/iPhone thats the problem. Apple clearly prohibits running Virtual machines, or any kind of Just In Time compiliation on the device in question. So how do I write code on the thing?? (writing code is useless if you can’t compile in real time and debug). A Jailbreak is out of the question , and even then, Visual Studio is certainly not coming to a jailbroken iPad near you.

Second, the hardware itself limits what kind of applications you can run. If Adobe produces a stripped down version of Photoshop (likely – they already have a Photoshop iPhone app), Lightroom (possible, it depends on if the SDK allows access to the SD and USB port adaptors) or Illustrator (after Apple demonstrated the drawing capabilities of the iPad, why not?), you can bet your bottom dollar that they are not going to be anywhere as full featured and powerful as their desktop (and laptop) counterparts. The hardware is Apple’s very own custom silicon. The A4 system-on-a-chip made by PA Semi for its parent company runs at 1Ghz. Not exactly world class performance. And until we have industry standard bench marks, nobody can say for sure. Nevertheless, this nice Dell system runs a Intel® Core™2 T6670(2.2GHz,800MHz,2MB). A nice speed improvement, if I do say so myself. The current consensus is that the iPad has about a 1Gb of RAM. Compared to the 4Gbs in the Dell build.

Now I do a lot of typing on my laptop – whether thats for code or for taking notes or the occasional blog post. So the Keyboard is must for me. The iPad keyboard dock is an ingenious design, and would look good on just about any desktop (not to mention those nice display tables at the Apple Store). It goes along way to answering those critics who, after three years of using their iPhone virtual keyboards, still like their tactile feedback (not to mention the much improved ergonomics of writing volumes on the keyboard dock rather than just on your lap – there must be some ergonomically minded lobby that would blame apple for all the RSI around, right?). What i can’t imagine is lugging the dock all the way to uni, setting it up and then putting this tiny little iPad on it and then taking notes for three hours (mind you, after actually trying this I may change my mind, but thats months away). Equally, I can’t imagine turning up to a busness meeting armed with the keyboard dock and iPad – i’d be the laughing stock of any (Dell-dominated) conference table.

In saying that the iPhone virtual keyboard has been very good to me. If one had to graph the spelling mistakes I (inadvertently) tweet, there is a continual improvement ( a reverse hockey stick graph if you will). So I’m certainly not against the virtual keyboard on the iPad. How it will actually work, however, is another question altogether. I’m typeing this on the last Dell laptop i bought, and the keys give me firm, reassuring feedback. Not to mention the almost soothing sound the keys make as I type, the sound of success (if I an’t typing, I aint working).

Then there is battery. Now, if Apple is to be believed, the iPad has 10 hours of battery life and a month of standby. No idea if that’s 10 ours of general use, of video playback, of web browsing or music playback etc. Going by the iPhone’s track record I’m not so sure I’m always going to get 10 hours out of the thing. However, the 10 hours still far outlives the seven i had for two years with the current laptop’s 9 cell li-ion battery. And the 2 hours I’ve lived with for the past for months. And the zero hours that I’ve had for a week and a half now.

Now lets think of the gravy.

One, the laptop has no app store. On the minus side, this means that I have to source the applications I wish to run myself.  I have replacements for all the iPads built in applications. This, ironically enough, includes iBooks. Its called Kindle for PC. From Amazon. (Amazon’s actions over the weekend is a subject for another post, but read this brilliant article by the author John Scalazi). I have the Full Creative suite 3 from Adobe. I have Microsoft’s Expression Studio 3. I have Visual studio 2008 and 2010. I have SQL Server 2008. I have Office 2008 (soon to be 2010). I have a virtual swiss knife of utilities near and dear to my heart for everything from screen capture to April fools jokes.

Two, webcam. This laptop build has an integrated webcam. And the iPad does not. And yes, I’ve heard of those rumors of the camera cavity in the iPad’s frame. And yes there is every possibility that el Steveo will pull a One More Thing on launch day and announce the addition of a camera. But here we deal with certainties and absolutes, not obscure fantasies and wet dreams of fanboys. So we assume that there is no camera on the iPad version 1. But, again assuming that the SDK allows the access, the appearance of the third party webcam is almost assured. But still, I have a integrated webcam here and now.

Third, 64 bit. This is a 64 bit processor with a 64 bit OS. Need I say more?

Forth, DVD drive. For those movies I’d like to watch without going though the palava of syncing them. The benefits of having the DVD drive handy are still very much apparent, even in this age of the cloud and the on demand nature of the downloading programs off the web (legitimately, of course). The iPad is complete dependant on the internet for its software, music, and there is iTunes syncing for anything else.

The one question mark here, which I will require an actual iPad to answer, is the screen. The Dell screen is anti glare, and promises to be a significant improvement on the screen on my current laptop. The iPad screen is IPS and supposedly has a great viewing angle. According to Steve Jobs, that is. No-one has had it in direct sunlight yet, so we’ve no idea how well it handles the glare. The winner in this category will undoubtedly be Amazons Kindle (that pesky Company again).

So with out further ado, here are the specs:

Base
Vostro 1520 : Standard Base

Memory
4096MB 800 MHz Dual Channel DDR2 SDRAM (2x2GB)

Keyboard
Internal Keyboard – English (QWERTY)

Video Card
Integrated GMA X4500 HD Graphics

Hard Drive
320GB (7,200rpm) Serial ATA Hard Drive with Free Fall Sensor

Microsoft Operating System
English Genuine Windows® 7 Professional (64 BIT)

Optical Devices
8X DVD+/-RW Drive including software for WIN7

Wireless Networking
Dell Wireless 1397 Mini Card (802.11 b/g) European

Primary Battery
Primary 6-cell 56 WHr Lithium Ion battery

Processor
Intel® Core™2 T6670(2.2GHz,800MHz,2MB)

Camera
Integrated 1.3MP Camera

Colour Choice
Obsidian Black

LCD
15.4 inch WXGA+ CCFL Anti-Glare Display Anti-Glare