tag:blogger.com,1999:blog-62205862012-09-19T23:50:25.620+08:00Tardate 11.2Welcome to my occasional technical diary of thoughts, tips, and tools. It's where I leave my internet breadcrumbs for the more interesting and diverse things I'm playing around with - all things Cloud, Open Source, Rails, Oracle, perl, ad infinitum .. and if I accidentally manage to help anyone along the way I hope we get the chance to meet some day to chat about it!Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.comBlogger217125tag:blogger.com,1999:blog-6220586.post-42307914829814420182012-07-04T19:27:00.000+08:002012-07-05T12:31:48.615+08:002012-07-05T12:31:48.615+08:00Are You Experienced?How many times have you seen a webdev job ad that asks for things like:<br /> <br /> <blockquote class="quote">Minimum 5 years experience in Ruby on Rails, html5, JQuery, Mongo DB, and building andriod and iphone/ipad apps<br /> </blockquote><br /> So it just came up again on a mailing list, and we all had a good lol.<br /> <br /> When people ask for more years experience than the technology has even existed, at one level the incongruity simply tickles our geeky funny bone like a classic joke setup.<br /> <br /> At another level however - and one that HR professionals the world over still struggle with - specifying job requirements in terms of many years experience with a certain technology betrays a fundamental lack of understanding for what developers do. Like advertising for doctors "with 5 years experience prescribing naltrexone" - I don't think I want to be treated by one who was selected on that basis! <br /> <br /> <b>When when specifying technical job roles, it comes back to the key question of how do we ask: "Are you experienced?"</b><br /> <br /> <div class="separator" style="clear: both; text-align: center;"><a href="http://www.dangerousminds.net/comments/jimi_hendrix_job_interview" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"><img border="0" height="241" width="241" src="http://3.bp.blogspot.com/-ZJnGg3Bpz3c/T_QmfznxpXI/AAAAAAAACKk/Go_jU-2aaTA/s400/are_you_experienced.jpeg" /></a></div>For some jobs, length of service with a technology is a useful indicator for hiring purposes. If we are seeking deep skills with a relatively stable body of knowledge: we want evidence that candidates have had enough time to get their green horns knocked off, learned to swim in the deep end, and pick up all those heuristic tricks they don't teach in school.<br /> <br /> In the IT realm, these jobs tend to be those involved with more stable back-end technologies (e.g. relation databases), or developers doing application maintenance on legacy systems (e.g. 6 year old java applications used by a bank).<br /> <br /> However, the closer you get to front-end technologies and the more dynamic your needs (read: startups), the more irrelevant - and often misleading - the "judge experience by years with a technology" rule becomes. The rate at which technologies change is just too fast. I've been doing this for many years (more than I'll admit here!), but:<br /> <br /> <ul><li>I'm still learning new things every month - probably at an even faster rate than when I was a fresh grad</li> <li>Half of what I learned last year is now obsolete, probably never to be called on again</li> <li>I've lost count of the number of times I've developed mastery in something for 1 project, and never used it again</li> </ul><br /> IMHO, the fundamental skill that great developers share is the ability to learn and assimilate. You don't want them stuck in a rut.<br /> <br /> So how do we measure it? Rather than years of service, we need indicators of applied learning, for example:<br /> <br /> <ul><li>A single significant project delivery (i.e. that goes live) is often enough to develop a good mastery of a technology</li> <li>Multiple project deliveries demonstrates the ability to hone and apply that knowledge in different scenarios</li> <li>Working with various technologies over time demonstrates flexibility and adaptability to the new</li> <li>Founding an open source project shows that the individual not only has the creativity and inspiration to create something new, but has the tenacity to get it done (without a boss looking over their shoulder)</li> <li>Contributing to an open source project demonstrates that the individual has pounded it enough to identify something that needs fixing, has had the mental firepower to figure out the root cause and how to fix it, and the collaborative skills to get the contribution merged.</li> </ul><br /> So when I write a job ad for a technical role, I'd suggest defining the technical requirements along these lines:<br /> <br /> <ul><li>5+ years professional web development experience <br /> <b>[a guide to the level of seniority within the general professional discipline]</b><br /> <br /> </li> <li>Delivered multiple projects and current experience using: Rails 3.x, PostgreSQL 9.x, git <br /> <b>[the specific technical skills you expect people to have on day 1. Reference major version numbers where they represent significant evolutions of the technology, and make sure you use the correct nomenclature to avoid more lolz;-)]</b><br /> <br /> </li> <li>Ideally, recent project experience using one of more of the following technologies: capistrano, redis, and MongoDb. <br /> <b>[technologies you use or are planning to use, but it won't kill you to allow the person time to get up to speed]</b><br /> <br /> </li> <li>Experience contributing to or founding open source projects <br /> <b>[it's almost getting to the stage where developers really have to be quite uninterested in their career to avoid some involvement with open source projects - see comments above]</b></li> </ul><br /> I haven't asked for all the technologies they've used in the past - assuming that this will come out when they explain exactly what they've been doing during those "5+ years professional web development".<br /> <br /> Of course that still leaves a whole range of matters such as soft-skills and how you actually go about <i>selling</i> your startup vacancy. You can find this and more in the most excellent <a href="http://rtfm.jfdi.asia/hiring-and-firing/">JFDI Hiring & Firing</a> guide.<br /> <br /> <span style="font-style:italic;">Blogarhythm: <a href="http://youtu.be/zg2segLZoeA">Are You Experienced? - Jimi Hendrix</a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-4230791482981442018?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com3tag:blogger.com,1999:blog-6220586.post-65545921327237629132012-05-27T09:39:00.000+08:002012-05-27T09:47:45.602+08:002012-05-27T09:47:45.602+08:00gource - cool and not totally pointlessRun <a href="http://code.google.com/p/gource/">gource</a> on a source code repository and it animates the code's evolution. I think I first saw it used to illustrate the <a href="http://www.youtube.com/watch?v=aPk1BqK8zzI">history of Python development since 1990</a>, and I must admit my first reaction was <i>cool but probably pointless</i>.<br /> <br /> Recently <a href="https://twitter.com/#!/dmm6319">@dmm6319</a> ran it over our own project, and inspired me to play around a bit with it too.<br /> <br /> <div class="separator" style="clear: both; text-align: center;"><a href="http://youtu.be/6z_7VO3RPn8" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="228" width="400" src="http://3.bp.blogspot.com/-MTrOfKwgUfY/T8F_5yEQ4YI/AAAAAAAACJE/MsQpdoO0q8w/s400/babylish-04-May-2012.png" /></a></div><br /> So after watching our animation a few times I'm sheepishly revising my opinion of gource.<br /> <br /> Yes, you probably need to have something invested in the particular code-base to care, and it certainly helps if you avoid the obvious cliche of using an "atmospheric" soundtrack.<br /> <br /> But there are some real, big-picture insights that come through very clearly in the animation that you wouldn't necessarily get if you just looked at the source - for example, the shift from Cucumber to RSpec as our primary testing framework. <br /> <br /> <span style="font-style:italic;">Blogarhythm: <a href="http://www.amazon.com/gp/product/B00168LEB4/ref=as_li_ss_tl?ie=UTF8&tag=itsaprli-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=B00168LEB4">Asik Veysel - Joe Satriani</a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-6554592132723762913?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-75381269523587228502012-03-19T01:00:00.001+08:002012-03-19T01:08:56.351+08:002012-03-19T01:08:56.351+08:00Rails + Ember + MongoDB + bootstrap<div class="separator" style="float: right;"><a href="https://github.com/evendis/rails-ember-mongo-bootstrap-demo" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="400" width="344" src="http://3.bp.blogspot.com/-O0Pk3vrcgF4/T2YRwayNMGI/AAAAAAAACCs/MobXBR8iSQQ/s400/rails-ember-mongo-bootstrap-demo.png" /></a></div>I was fired up to try out <a href="http://emberjs.com/">ember.js</a> after seeing <a href="https://github.com/cameronpriest">Cameron's</a> presentation at the last <a href="http://groups.google.com/group/singapore-rb">Singapore Ruby Brigade</a> meetup.<br /> <br /> Ember is one of the many javascript MVC frameworks that have been sprouting up over the past year, and it seems to offer a nice level of abstraction. I was quite interested to see how it might fit for a Rails/MongoDB application we're currently working on, so a few tests were in order.<br /> <br /> I hosted some tests on a Rails 3.2.2 base, and threw in a whole bunch of technologies to see how well they play together. The story so far:<br /> <ul><li>ruby 1.9.3 + rails 3.2.2 with <a href="http://github.com/rspec/rspec-rails">rspec-rails</a> and <a href="https://github.com/thoughtbot/factory_girl_rails">factory_girl_rails</a> for testing</li> <li><a href="http://haml-lang.com/">haml</a> - templating for a pure rails alternative to compare with the ember app</li> <li><a href="http://github.com/mongoid/mongoid">mongoid</a> - using MongoDB for server-side persistence, to see how this plays with ember</li> <li><a href="https://github.com/josevalim/inherited_resources">inherited_resources</a> - for super thin controllers. Works beautifully with ember and Mongo (I literally wrote just a single line in the server-side controller</li> <li><a href="http://emberjs.com/">ember.js</a> - the ember distribution...</li> <li><a href="https://github.com/emberjs/ember-rails">ember-rails</a> - makes it easy to add ember to the project (gem installed with bundler)</li> <li>CoffeeScript - for the ember scripting</li> <li><a href="https://github.com/cerebris/ember-rest">ember-rest</a> - a simple RESTful resource adapter between ember and rails</li> <li><a href="https://github.com/seyhunak/twitter-bootstrap-rails">twitter-bootstrap-rails</a> - a gem packaging of <a href="http://twitter.github.com/bootstrap/index.html">twitter bootstrap</a> (adds LESS to the asset pipeline)</li> </ul><br /> Surprisingly, this all hangs together without too much fuss! You can see & fork the demo at <a href="https://github.com/evendis/rails-ember-mongo-bootstrap-demo">rails-ember-mongo-bootstrap-demo</a>.<br /> <br /> <br /> <br /> What's next? <br /> <ol><li><em>Testing:</em> I've got RSpec in the project for conventional testing, but I haven't investigated the best ways to test the ember app itself yet.</li> <li><em>Relations:</em> perhaps switching to ember-data to test some non-trivial model associations</li> <li><em>ember-bootstrap:</em> adds bootstrap components to ember. Sounds promising but my initial attempts to use it weren't too successful</li> </ol><br /> <span style="font-style:italic;">Blogarhythm: <a href="http://youtu.be/YjRD4hHEdRE">Remember - Jimi Hendrix</a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-7538126952358722850?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com1tag:blogger.com,1999:blog-6220586.post-11421326670938201852011-11-07T22:34:00.000+08:002011-11-07T22:34:34.242+08:002011-11-07T22:34:34.242+08:00Adding Mobile Support with Web 2.0 Touch to the NoAgenda Attack Vector DashboardThe quest for an ideal javascript framework for mobile web applications has been a bit of a work-in-progress for some time (at least if you cared about cross-platform). <br /> <br /> You might have got started (like me) with Jonathan Stark's excellent books <a href="http://www.amazon.com/gp/product/0596805780/ref=as_li_ss_tl?ie=UTF8&tag=itsaprli-20&linkCode=as2&camp=217145&creative=399369&creativeASIN=0596805780">Building iPhone Apps with HTML, CSS, and JavaScript</a><img src="http://www.assoc-amazon.com/e/ir?t=itsaprli-20&l=as2&o=1&a=0596805780&camp=217145&creative=399369" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> and <a href="http://www.amazon.com/gp/product/1449383262/ref=as_li_ss_tl?ie=UTF8&tag=itsaprli-20&linkCode=as2&camp=217145&creative=399369&creativeASIN=1449383262">Building Android Apps with HTML, CSS, and JavaScript</a><img src="http://www.assoc-amazon.com/e/ir?t=itsaprli-20&l=as2&o=1&a=1449383262&camp=217145&creative=399369" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />, and maybe tried the <a href="http://www.jqtouch.com/">jQTouch</a> framework that these spawned. Meanwhile, the official <a href="http://jquerymobile.com/">jQuery mobile framework</a> has slowly been moving to fruition.<br /> <br /> I recently discovered another project - <a href="https://github.com/web20boom/Web-2.0-Touch">Web 2.0 Touch</a> - that is pitched as a mini framework with better features and more ease of use than jQTouch. Since I had a little side-project underway that could benefit from mobile support, I thought I'd give it a test drive.<br /> <br /> And I was duly impressed. In just a few hours, I had a full and distinct mobile version of the site. Better yet, I didn't run into any weird behaviours that can plague mobile development. It just worked.<br /> <br /> Now I'm not going to stop tracking the jQuery Mobile project or other solutions like <a href="http://rhomobile.com/">Rhomobile</a>, but if all you need is a quick, functional and good looking mobile view, then Web 2.0 Touch is well worth a look.<br /> <br /> The <a href="http://noagendadashboard.com/"><b>NoAgenda Attack Vector Dashboard</b></a> is the project I used Web 2.0 Touch for, and if you want to see all the intricate details of how I made the site mobile-friendly - you can! The entire site is open sourced and available on <br /> <a href="https://github.com/tardate/noagenda_dashboard">GitHub</a>. I'll just describe a couple of the features here...<br /> <br /> <h3>Differentiated Views</h3>The first has not much to do with Web 2.0 Touch per se, and is more just a demonstration of how easy it is to work with a range of view technologies in Rails.<br /> <br /> Since the application has a very specific and rich desktop presentation, I knew the mobile version was going to be very different. Here are the desktop and mobile "home pages" side-by-side:<br /> <br /> <div class="separator" style="clear: both; text-align: center;"><a href="http://noagendadashboard.com/" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="181" width="400" src="http://3.bp.blogspot.com/-oXmoFq77_Ag/TrfhnSY4QmI/AAAAAAAAB8U/sBN9TracXlE/s400/noagendadashboard_side-by-side.png" /></a></div><br /> Rather than weigh down view code with lots of conditionals, I decided to use the MIME-type method of differentiation.<br /> <br /> If you haven't used this before, it essentially means registering a suitable MIME-type (I called it <i>mobile</i>), and in the main ApplicationController, the request.format is set to this type if the client is detected to require the special mobile view. Now a request to an :index page will render with index.mobile.erb (or index.mobile.haml as is my preference), while the non-mobile view will render with index.html.erb / index.html.haml.<br /> <br /> I've added the <a href="https://github.com/fnando/browser">browser</a> gem to the project for device identification, and for this app I've decided to only specifically handle iPhone and Android. I also don't give these phones a desktop view alternative, since I know it is not going to be nice. <br /> <pre name="code" class="ruby:wraplines:nocontrols"># config/initializers/mime_types.rb: Mime::Type.register_alias "text/html", :mobile # application_controller.rb: class ApplicationController &lt; ActionController::Base before_filter { request.format = :mobile if (browser.iphone? || browser.android?) } end </pre>With that in place, my *.mobile.haml view and layout files just need to focus on rendering the mobile site.<br /> <br /> <h3>Page Transitions</h3>The jsTouch.loadPage method is used to load and navigate pages in the Web 2.0 Touch framework. <br /> <br /> In the application, I've made this 'unobtrusive' so it might be worth pointing out what is going on. The .touch_load class is used to tag items that should initiate a page transition. The data-url and data-transition attributes tell it where to go and what transition animation to use.<br /> <pre name="code" class="ruby:wraplines:nocontrols">.toolbar %h1= t('.title') %a.button.back.touch_load{'data-url' =&gt; menu_dashboard_path, 'data-transition' =&gt; 'pop-out' }= t(:done) .content = render :partial =&gt; 'notes/table'</pre>The <i>enableSmartphonePageLoad</i> function runs during page load to setup the behaviour:<br /> <pre name="code" class="ruby:wraplines:nocontrols"> enableSmartphonePageLoad: function() { $('.touch_load').live('click', function() { var url = $(this).data('url') || $(this).attr('href'); var transition = $(this).data('transition') || 'slide-left'; if (url != "") { jsTouch.loadPage(url, { transition: transition }); } return false; }); }, </pre><br /> <span style="font-style:italic;">Blogarhythm: <a href="http://youtu.be/VNgcrXXgGfw">Touch - Noiseworks</a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-1142132667093820185?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-14835414844008690292011-10-01T14:29:00.000+08:002011-10-01T14:29:21.705+08:002011-10-01T14:29:21.705+08:00gitfall#1: Falling off a branchEver had a merge fail with a <b>fatal: git write-tree failed to write a tree</b> message out of the blue?<br /> <br /> It sounds terrifying, but when I got the root cause is quite mundane: file name conflicts in the merging commits that git is not smart enough to figure out without help. And when you fixup your merge, you are left with a commit that's lost one of its parents ("falling off a branch").<br /> <br /> If you do much file reorganisation in a project with branches, it turns out this can be quite common (had it a few times on a recent project). <br /> <br /> <div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-6CecF1SzUIs/Toay9cKZndI/AAAAAAAAB7I/GngydK-K-dk/s1600/gitfall01.png" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"><img border="0" height="188" width="320" src="http://3.bp.blogspot.com/-6CecF1SzUIs/Toay9cKZndI/AAAAAAAAB7I/GngydK-K-dk/s320/gitfall01.png" /></a></div>In an attempt to understand exactly what was going on, I put together the steps needed to reproduce and recover from the error. I've tidied these up and made it a full "tutorial/demo" script. You can find it in a repo called <a href="https://github.com/tardate/gitfalls">gitfalls</a> - in the expectation that there are many more git curiosities and idiosynchrasies worth a similar treatment. Enjoy!<br /> <br /> The script not only shows how to create the error, but two ways of resolving it and the "lost parent branch" issue:<br /> <ol><li>Merge again after fixing the first failed commit. Duh!</li> <li>Going a bit deeper and using git commit-tree to manufacture a new merge commit with the correct parentage</li></ol><br /> Lessons learned form all of this? Perhaps:<br /> <ol><li>Avoid reorganising folder structures using folder names that once were used by files (or vice versa)</li> <li>If you must do such a reorganisation, immediately merge or cherry-pick to other active branches if you can. This avoids laying a trap for a co-worker to hit later on.</li></ol><br /> Hope you enjoy the script, and if you have any others to contribute please be my guest!<br /> <br /> <span style="font-style:italic;">Blogarhythm: <a href="http://youtu.be/E42ZoFY8jdY">Fall Out - The Police</a></span><br /> <br /> <br /> <br /> <div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-1483541484400869029?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-34106782274826318302011-07-20T14:25:00.001+08:002011-07-20T18:15:38.676+08:002011-07-20T18:15:38.676+08:00Mikko Hyppönen@TEDDoing more than just talking about viruses: he fires up a few classics in a DOS box and pokes around with a binary editor before looking at current threats and live infection data. Very cool and entertaining. Not many are brave enough to do live demos, but if you watch to the end you'll get to see how prepared he was for failure;-)<br /><br />Best served with sides of:<ul><li>Daniel Suarez's <a href="http://www.amazon.com/gp/product/0451228731/ref=as_li_ss_tl?ie=UTF8&tag=itsaprli-20&linkCode=as2&camp=217145&creative=399381&creativeASIN=0451228731">Daemon</a><img src="http://www.assoc-amazon.com/e/ir?t=itsaprli-20&l=as2&o=1&a=0451228731&camp=217145&creative=399381" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> - for the extreme version of how bad things can go wrong,</li><li><a href="http://www.ted.com/talks/rebecca_mackinnon_let_s_take_back_the_internet.html">Rebecca MacKinnon: Let's take back the Internet!</a> - because maybe organised crime is the perfect distraction as we rush headlong to enslave ourselves to the Sovereigns of the Internet, and</li><li><a href="http://www.twit.tv/sn291">Security Now! #291</a> - for Steve Gibson's deconstruction of <a href="http://en.wikipedia.org/wiki/Stuxnet">stuxnet</a>, the most spohisticated Internet-borne <span style="font-style:italic;">"weaponised payload"</span> ever discovered... and perhaps a plausibly-deniable warning from Government(s) that "you call that a knife? THIS is a knife!"</li></ul><br /><br /><!--copy and paste--><object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param> <param name="flashvars" value="vu=http://video.ted.com/talk/stream/2011G/Blank/MikkoHypponen_2011G-320k.mp4&su=http://images.ted.com/images/ted/tedindex/embed-posters/MikkoHypponen-2011G.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=1192&lang=eng&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=mikko_hypponen_fighting_viruses_defending_the_net;year=2011;theme=a_taste_of_tedglobal_2011;theme=bold_predictions_stern_warnings;theme=new_on_ted_com;theme=what_s_next_in_tech;event=TEDGlobal+2011;tag=Global+Issues;tag=Technology;tag=computers;tag=crime;tag=internet;tag=virus;&preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talk/stream/2011G/Blank/MikkoHypponen_2011G-320k.mp4&su=http://images.ted.com/images/ted/tedindex/embed-posters/MikkoHypponen-2011G.embed_thumbnail.jpg&vw=432&vh=240&ap=0&ti=1192&lang=eng&introDuration=15330&adDuration=4000&postAdDuration=830&adKeys=talk=mikko_hypponen_fighting_viruses_defending_the_net;year=2011;theme=a_taste_of_tedglobal_2011;theme=bold_predictions_stern_warnings;theme=new_on_ted_com;theme=what_s_next_in_tech;event=TEDGlobal+2011;tag=Global+Issues;tag=Technology;tag=computers;tag=crime;tag=internet;tag=virus;"></embed></object><br />PS: <a href="http://www.youtube.com/watch?v=cf3zxHuSM2Y">better quality vid</a> on youtube. And yes, that is a 5 1/4" floppy.<br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.youtube.com/watch?v=xp0TzDQ2oMc">Security</a> - Jo Jo Zep & The Falcons</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-3410678227482631830?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-39583899551270980762011-07-10T14:36:00.008+08:002011-07-10T15:06:31.446+08:002011-07-10T15:06:31.446+08:00It goes PING!If you're like me, you have a bunch of trusty (and rusty) shell scripts that you reach for when doing things like testing a new load balancer.<br /><br />Enough of that! <span style="font-weight:bold;"><a href="http://rubygems.org/gems/igp">igp</a></span> (It goes PING!) is a simple command line utility for testing services with a range of common protocols: ICMP, UDP, TCP, HTTP/S, LDAP/S and so on. <br /><br />This is nothing earth shattering I know, but it's nice to have simple cross-platform (since it's ruby) tool that does all the common protocols in one. Thankfully, most of the work has already been done by the <a href="https://github.com/djberg96/net-ping">net-ping library</a> - igp really just provides a sleek command-line wrapper.<br /><br />The only dependency is ruby+rubygems. Just:<pre name="code" class="ruby:wraplines:nocontrols">gem install igp</pre >And then you are ready to capture traces, for example:<pre name="code" class="ruby:wraplines:nocontrols">igp my.server.com<br /># ^ ICMP assumed by default. This is the same as:<br />igp icmp://my.server.com<br /><br />igp http://my.insecure.server.com<br />igp http://my.insecure.server-hiding-on-a-funny-port.com:8080/javascripts/all.js<br /><br />igp https://my.secure.server.com<br />igp https://my.secure.server-hiding-on-a-funny-port.com:4443<br /><br />igp tcp://my.tcp-service.com:9091<br />igp udp://my.udp-service.com:123<br /><br />igp ldap://my.insecure.ldap.server.com<br />igp ldaps://my.secure.ldap.server.com</pre ><br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.youtube.com/watch?v=7Ev_1ctp_h8">Keep it Up</a> - Snap!</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-3958389955127098076?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-17406881190184108242011-04-24T14:25:00.006+08:002011-04-24T15:05:30.689+08:002011-04-24T15:05:30.689+08:00Multi-tenancy with Rails<a href="http://reddotrubyconf.com/">RedDotRubyConf 2011</a> in Singapore is over. It was an amazing event (<a href="http://twitter.com/ryanbigg">ryan</a> takes notes so we don't have to - <a href="http://ryanbigg.com/reddot-day-one">day#1</a> <a href="http://ryanbigg.com/reddot-day-two">day#2</a>) <br /><br />Somehow I managed to cheat my way into a line-up of legendary speakers that included Matz himself. Here are the slides..<br /><div style="width:425px" id="__ss_7718621"> <iframe src="http://www.slideshare.net/slideshow/embed_code/7718621" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> </div><br />I spoke about multi-tenancy - what it is and why it's increasingly relevant for Rails development. It dives a little into four of the many approaches and ends with the challenge: Isn't it about time there was a 'Rails Way'?<br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://youtu.be/ixl-jKLAjH4">So Many Ways</a> POP DISASTER</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-1740688119018410824?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com2tag:blogger.com,1999:blog-6220586.post-6070533609089023742011-03-20T11:08:00.003+08:002011-03-20T11:25:53.389+08:002011-03-20T11:25:53.389+08:00jQuery UI AddToCalendar updateThanks to <a href="https://github.com/nfarina">nfarina</a> for a patch to improve compatibility with older IE versions.. <a href="https://github.com/tardate/jquery.addtocalendar">jQuery UI AddToCal widget</a> is stepped to 0.1.1 and now listed in the <a href="http://plugins.jquery.com/project/addtocal">jQuery plugin store</a>.<br /><br />To recap .. use AddToCal if you want to offer your website visitors the ability to add any events you list or present on your site to their own calendar. It supports Google Calendar, Microsoft Live Calendar, Yahoo! Calendar, 30boxes, any iCal or vCalendar compatible desktop application (and you can extend it to support any special calendar software you might be dealing with).<br /><br />See my <a href="http://tardate.blogspot.com/2010/10/add-to-calendar-with-jquery-widget.html">previous post</a> that describes how to use it in a bit more detail..<br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.youtube.com/watch?v=69R_Uf57R0U">Birthday</a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-607053360908902374?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com2tag:blogger.com,1999:blog-6220586.post-50000912142078425892011-01-30T15:30:00.000+08:002011-01-30T15:55:58.534+08:002011-01-30T15:55:58.534+08:00Paranoid Yak ShavingSo a few weeks ago I found myself wanting "soft-delete" in a Rails app. <a href="http://ruby-toolbox.com/categories/activerecord_soft_delete.html">Ruby Toolbox</a> is a little long in the tooth on the subject, but after a little more research I discovered xpond's <a href="https://github.com/xspond/paranoid">paranoid</a> project that was just what I wanted:<br /><ul><li>packaged as a gem, not a plugin</li><br /><li>built for Rails 3 (arel-aware in particular)</li><br /><li>can be selectively applied to your models</li></ul><br />All was cool, except at about the same time we updated to Rails 3.0.3 and it broke (as it turned out, due to changes in AREL 2.0.6 internals).<br /><br />One of the beautiful things about <a href="https://github.com">github</a> and the way it's been adopted by the ruby/rails community in particular is that it makes it so damn easy to just dive in and help update code originally contributed by other people. So paranoid needs updating for Rails 3.0.3? No problem - fork it, diagnose the issue and push your fixes back up to github.<br /><br />But that's also a great recipe for <a href="http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html">yak shaving</a> ;-)<br /> <br />The fixes are yet to make it into the released gem, but if you desparately need 3.0.3 support you can install from <a href="https://github.com/tardate/paranoid">my repo</a>. i.e. in your Gemfile:<br /><br /><pre name="code" class="ruby:wraplines:nocontrols">gem 'paranoid', '~> 0.0.10', :require => 'paranoid', :git => 'git://github.com/tardate/paranoid'</pre ><br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.youtube.com/watch?v=oaEjzIyB5NA">Paranoid</a> (of course - but this is the bluegrass version!)</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-5000091214207842589?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-70774755572083018672010-12-14T00:41:00.006+08:002010-12-14T22:09:24.359+08:002010-12-14T22:09:24.359+08:00CruiseControlling Ruby 1.9.2 and Rails 3.0.2<a href="http://cruisecontrolrb.thoughtworks.com/">CruiseControl for Ruby</a> from <a href="http://www.thoughtworks.com/">ThoughWorks</a> has long been one of the easiest ways to your rails project under continuous integration.<br /><br />But there's still an issue that it <a href="http://groups.google.com/group/cruisecontrolrb-rubyforge-mailing-list/browse_thread/thread/81892db289a9a360?pli=1">can't run under Ruby 1.9.x</a>. That's not very good if you are targeting 1.9.2 for your project.<br /><br />Here's a quick recipe for how you <span style="font-style:italic;">can</span> build a 1.9.2 project with CC, using the wonders of <a href="http://rvm.beginrescueend.com/">rvm</a>..<br /><pre name="code" class="ruby:wraplines:nocontrols"># download and unpack CC to /usr/local/cruisecontrol-1.4.0 (or where you like)<br /># for convenience, add .rvmrc in /usr/local/cruisecontrol-1.4.0 to have it run 1.8.7<br />echo "rvm 1.8.7-p302" > /usr/local/cruisecontrol-1.4.0/.rvmrc<br /># configure CC:<br />cd /usr/local/cruisecontrol-1.4.0<br />./cruise add my_project_name --source-control git --repository git@github.com:myname/myproject.git<br /># ^^ This will initialize the ~/.cruise/projects/my_project_name folder for a git-based project<br /><br /># if you have an .rvmrc file in your git repo, pre-emptively trust it to avoid clogging CC:<br />mkdir ~/.cruise/projects/my_project_name<br />rvm rvmrc trust ~/.cruise/projects/my_project_name<br /></pre><br />In ~/.cruise/projects/my_project_name, edit cruise_config.rb to run a shell script instead of the standard build task (I'm calling it ccbuild.sh and it will be in the root of my git repo):<br /><pre name="code" class="ruby:wraplines:nocontrols">Project.configure do |project|<br /> # [.. other stuff ..]<br /> project.build_command = './ccbuild.sh'<br /> # [.. other stuff ..]<br />end</pre><br />Add ccbuild.sh to your repository (don't forget to chmod u+x it). It needs to ensure rvm script is loaded and activate the correct ruby & gemset. <br /><br />The script initialization is necessary because it seems the way CC spawns the shell script it doesn't pick up the rvm initialization you might already have in .bash_profile. Without rvm script initialization, "rvm" will invoke the binary which can't make the direct environment mods it needs to do.<br /><br />Here's what I have in ccbuild.sh:<br /><pre name="code" class="ruby:wraplines:nocontrols">#!/bin/bash<br /><br />if [ "$(type rvm | head -1)" != "rvm is a function" ]<br />then<br /> source ~/.rvm/scripts/rvm || exit 1<br />fi<br /><br />if [ "$(type rvm | head -1)" != "rvm is a function" ]<br />then<br /> echo "rvm not properly installed and available"<br /> exit 1<br />fi<br /><br />rvm use 1.9.2-p0@mygemsetname --create<br />bundle check || bundle install || exit 1<br />rake # setup to run all required tests by default</pre><br />Once that's checked in and pushed to the repo, you can kick-off CC:<br /><pre name="code" class="ruby:wraplines:nocontrols"><br />cd /usr/local/cruisecontrol-1.4.0<br />./cruise start<br /></pre><br />Now my <a href="http://ccmenu.sourceforge.net/">ccmenu</a> is green, and CruiseControl is running my project under 1.9.2 and rails 3.0.2;-)<br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.last.fm/music/ART-SCHOOL/_/Waiting+for+the+light">Waiting for the light</a> ART-SCHOOL</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-7077475557208301867?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-7268627325631852692010-11-06T22:14:00.012+08:002010-11-07T00:24:30.764+08:002010-11-07T00:24:30.764+08:00Rock till you drop.ioBombshell announcement on 29-Oct: drop.io have .. <a href="http://blog.drop.io/2010/10/29/an-important-update-on-the-future-of-drop-io/">struck a deal with Facebook.</a><br /><blockquote class="quote">What this means is that Facebook has bought most of drop.io’s technology and assets, and Sam Lessin is moving to Facebook.</blockquote><br /><a href="http://drop.io">drop.io</a> was widely acclaimed as the simple file sharing mechanisms we all needed. It resolutely solved the problem that everyone with a computer and a network connection has known at one time or another: how to share files too cumbersome for email, without resorting to techno-geekery like ftp and such. And it worked. Beautifully.<br /><br />But it doesn't work anymore.<br /><br /><span style="font-weight:bold;">Goodbye drop.io!</span> You were an amazing service. One of the best and brightest of the Class of Web 2.0. You made things simple. You solved a real, pressing problem.<br /><br />Unfortunately, that's not what I'll remember you for now.<br /><br /><span style="font-style:italic;">Instead, it will be for brewing a <span style="font-weight:bold;">thunderstorm of concern over the very dependability of cloud services</span>, as <a href="http://www.pcmag.com/article2/0,2817,2372243,00.asp">John C. Dvorak</a> went to town on in his column.</span><br /><br /><span style="font-style:italic;">And for teaching us that it's true - <span style="font-weight:bold;">startup founders really don't give a toss for their customers</span> if they can get a sweet deal and a plum job with one of the heavyweights instead.</span><br /><br /><span style="font-style:italic;">And for once again <span style="font-weight:bold;">propelling Facebook into the privacy-conspiracy-theory limelight</span>. Sure, "no data will be transferred to Facebook", but they put you out of business and bought "most of [your] technology and assets", right? So will we be surprised when Facebook takes aim to lure it's unsuspecting users into sharing pretty much anything and everything - private, commercially confidential, and otherwise - using Facebook?</span><br /><br />Well, I guess drop.io does really deserve our thanks for that last point, if anyone cares to notice.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dropbox.com/"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 290px; height: 75px;" src="https://www.dropbox.com/static/images/dropbox_logo_home.png" border="0" alt="" /></a><span style="font-weight:bold;">The very best news&mdash;for anyone who can't imagine life without drop.io&mdash;is that there is another exceptional product out there called <a href="http://www.dropbox.com">Dropbox</a> that can handle most team sharing needs in addition to looking after your personal documents.</span><br /><br />That's not a paid advertisement or anything. I simply use Dropbox everyday and just love it. I wouldn't be exaggerating to say it's probably improved the way I work more than anything even the folks in Redmond or Cupertino have shipped in recent memory.<br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.youtube.com/watch?v=V5rKK3KuD8Y">Rock Rock (till you drop)</a> .. Def Leppard</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-726862732563185269?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-75673811076300202562010-10-30T23:59:00.001+08:002010-10-31T00:24:44.473+08:002010-10-31T00:24:44.473+08:00The Ultimate Steampunk Project needs $10<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.pledgebank.com/babbage"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 170px;" src="http://2.bp.blogspot.com/_AZh6c1pzK1A/TMw61t-9BCI/AAAAAAAAB3Y/eJ6RC7zlUv8/s200/analytical_engine_fragment.JPG" border="0" title="the mill, or computing portion, of Babbage's engine" alt=""id="BLOGGER_PHOTO_ID_5533862736682615842" /></a>I heard <a href="http://en.wikipedia.org/wiki/John_Graham-Cumming">John Graham-Cumming</a> on <a href="http://twit.tv/269">TWiT #269</a> talk about the project he has started to build - 173 years later - a full scale realization of Charles Babbage's Analytical Engine. Amazingly, it's never been done (only partial models exist).<br /><br />Now, we are talking about a truck-sized, steam-powered machine that is Turing-complete and features (without silicon or electricity) "modern" ideas like instruction pipelining. The ultimate <a href="http://www.steampunktribune.com/">steampunk</a> project. It also has a serious educational and academic aspect (including to digitize all of Babbage's plans and notes).<br /><br />Due to significant private support coming forth, the pledge target has apparently been reduced from 50,000 to just 10,000 signatories. At the time of writing, John only needed another 6358 pledges of $10/£10/€10 each to get the project moving. <br /><br />Now I don't often get behind fundraisers and campaigns, but this strikes me as one of those once-in-a-lifetime follies you cannot help but support. And all for about the price of the cheapest bottle of wine in the shop around the corner.<br /><br /><div style="text-align:center"><a href="http://www.pledgebank.com/babbage"><img border="0" src="http://www.pledgebank.com/flyers/babbage_A7_flyers1_live.png" alt="Sign my pledge at PledgeBank"></a></div><br /><br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.youtube.com/watch?v=Gv3vWR5MAFs">L.O.V.E. Machine</a> WASP</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-7567381107630020256?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com2tag:blogger.com,1999:blog-6220586.post-40609668917674982252010-10-03T16:35:00.002+08:002010-10-03T21:19:03.846+08:002010-10-03T21:19:03.846+08:00Add to Calendar with a jQuery Widget<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://github.com/tardate/jquery.addtocalendar"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 242px;" src="http://2.bp.blogspot.com/_AZh6c1pzK1A/TKgx6nDJZyI/AAAAAAAAB28/D-bDM-wxMMo/s400/addtocal-example.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5523719825954268962" /></a>If you deal with any kind of event-based information on your websites, you would probably really like an easy way of letting users <span style="font-weight:bold;">add it to their calendar</span>.<br /><br />Unlike link sharing&mdash;where there are some great drop-in solutions like <a href="http://www.addtoany.com">AddToAny</a> and <a href="http://www.addthis.com">AddThis</a>&mdash;calendar integration unfortunately remains a bit rough around the edges. Varying standards with varying degrees of adoption; consideration for desktop and web-based calendar clients; and the complicating factor of timezones make it all a bit harder than it really should be.<br /><br /><a href="http://github.com/tardate/jquery.addtocalendar" style="font-weight:bold;">AddToCal</a> is a <span style="font-weight:bold;">jQuery UI Widget</span> that I put together to help me solve the problem and do things like you see in the screen clip on the right. It's freely shared and available on <a href="http://github.com/tardate/jquery.addtocalendar">github</a>.<br /><br />Using it on a web page is as simple as including the js links, binding it to the DOM elements or classes on your page that contain "events", and provide an implementation of the getEventDetails method that knows how to extract the event details from your particular DOM structure.<br /><br />The <a href="http://github.com/tardate/jquery.addtocalendar/blob/master//addtocal.htm">example</a> also demonstrates how to use AddToCal in conjunction with the <a href="http://microformats.org/wiki/hcalendar">hCalendar microformat</a> for event notation (try it out <a href="http://tardate.com/addtocal/addtocal.htm">here</a>).<br /><br />I've currently included support for the web-based calendars by Google, Yahoo!, and Microsoft Live. If you can serve iCal or vCalendar format event links then AddToCal also links to 30boxes and iCal/vCalendar desktop software&mdash;including the iPad Calendar application;-)<br /><br /><h3>Serving iCal and vCalendar links</h3><br />What about iCal and vCalendar formats? These are complicated a little because we need a URL to the respective iCal and vCalendar format resources .. so we need to be able to serve them before AddToCal can link to them.<br /><br />Thankfully, this can be relatively trivial once you get a handle on the file formats. Here's an example of how to implement with Ruby on Rails.<br /><br />Say we have an Events controller and associated Event model that represents an activity people may like to add to their calendars. A simple iCal implementation with ERB means creating a <span style="font-weight:bold;">views/events/show.ics.erb</span> along these lines:<br /><br /><pre name="code" class="ruby:wraplines:nocontrols">BEGIN:VCALENDAR<br />PRODID:-//AddToCal Example//EN<br />VERSION:2.0<br />METHOD:PUBLISH<br />BEGIN:VEVENT<br />DTSTART:<%= @event.start_time.rfc3339 %><br />DTEND:<%= @event.end_time.rfc3339 %><br />LOCATION:<%= event_url( @event ) %><br />SEQUENCE:0<br />UID:<br />DTSTAMP:<%= Time.zone.now.rfc3339 %><br />DESCRIPTION:<%= event_url( @event ) %>\n<%= @event.full_title %><br />SUMMARY:<%= @event.synopsis %><br />PRIORITY:5<br />CLASS:PUBLIC<br />END:VEVENT<br />END:VCALENDAR</pre><br />Sharp eyes will note the unusual <span style="font-style:italic;">rfc3339</span> helper method I've provided to make it easy to get date/times in RFC3339 format as required by the iCal and vCal standards. You could extend Time::DATE_FORMATS, but here I've simply added the method to ActiveSupport::TimeWithZone<br /><br /><pre name="code" class="ruby:wraplines:nocontrols">class ActiveSupport::TimeWithZone<br /> def rfc3339<br /> utc.strftime("%Y%m%dT%H%M%SZ")<br /> end<br />end</pre><br />To support vCalendar, we also implement <span style="font-weight:bold;">views/events/show.vcs.erb</span><br /><br /><pre name="code" class="ruby:wraplines:nocontrols">BEGIN:VCALENDAR<br />PRODID:-//AddToCal Example//EN<br />VERSION:1.0<br />BEGIN:VEVENT<br />SUMMARY:<%= @event.full_title %><br />PRIORITY:0<br />CATEGORIES:SHOW<br />CLASS:PUBLIC<br />DTSTART:<%= @event.start_time.rfc3339 %><br />DTEND:<%= @event.end_time.rfc3339 %><br />URL:<%= event_url( @event ) %><br />DESCRIPTION;ENCODING=QUOTED-PRINTABLE:<%= event_url( @event ) %> =0A<%= @event.synopsis %><br />LOCATION;ENCODING=QUOTED-PRINTABLE:<%= event_url( @event ) %><br />END:VEVENT<br />END:VCALENDAR</pre><br />Depending on your Rails version and web server, you may have to teach it about these MIME types e.g. add to <span style="font-weight:bold;">config/initializers/mime_types.rb</span>:<br /><br /><pre name="code" class="ruby:wraplines:nocontrols">Mime::Type.register "application/hbs-vcs, text/calendar, text/x-vcalendar", :vcs</pre><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.youtube.com/watch?v=1N8BCbMqYLE">Remember - Jimi Hendrix</a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-4060966891767498225?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com7tag:blogger.com,1999:blog-6220586.post-79859081555311407812010-10-03T15:10:00.000+08:002010-10-03T15:18:15.257+08:002010-10-03T15:18:15.257+08:0012 Things Every Programmer Should Know<a href="http://tech.wowkhmer.com/2010/09/12-things-every-programmer-should-know/">Samnang Chhun</a> posted his neat little presentation from BarCamp Phnom Penh 2010. It's a good summary of the leading memes of the moment..<br /><br /><img style="visibility:hidden;width:0px;height:0px;" border=0 width=0 height=0 src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyODYwODk2MjgzNDMmcHQ9MTI4NjA4OTYzMzY3MSZwPTEwMTkxJmQ9c3NfZW1iZWQmZz*yJm89YzM1YzRiOWE4NWY1/NDI3MTk2YzQzNTdjMmI*NDA1NmUmb2Y9MA==.gif" /><div style="width:425px" id="__ss_5284200"><object id="__sse5284200" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=12thingseveryprogrammer-100925065120-phpapp01&stripped_title=12-things-every-programmer-should-know&userName=samnang.chhun" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse5284200" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=12thingseveryprogrammer-100925065120-phpapp01&stripped_title=12-things-every-programmer-should-know&userName=samnang.chhun" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div><br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.youtube.com/watch?v=PPc_xA3pNEA">everybody wants the same thing - scissor sisters</a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-7985908155531140781?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-20399653479822163232010-10-03T14:42:00.004+08:002010-10-03T17:04:58.113+08:002010-10-03T17:04:58.113+08:00RFC 3339 / ISO 8601 dates in javascriptMany server-side languages (e.g. Ruby and Python JSON encoders) and encoding formats like <a href="http://en.wikipedia.org/wiki/Atom_%28standard%29">ATOM</a> send dates in <a href="http://www.ietf.org/rfc/rfc3339.txt">RFC 3339</a> / <a href="http://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> format. The standard Javascript Date object cannot parse these values, which can make client-side scripting involving dates a pain.<br /><br />There have been snippets of code floating around the net for ages, and various libraries that include necessary support. <a href="http://github.com/tardate/rfc3339date.js">rfc3339date.js</a> is my attempt at rolling the best into an standalone, unobtrusive, and open-sourced Date extension that plays well with other libraries that also extend the Date class.<br /><br />It lets you do things like:<br /><pre name="code" class="sql:wraplines:nocontrols">var d = Date.parse( "2010-07-20T15:00:00.333Z" );<br /><br />d.toRFC3339UTCString();<br />=> "2010-07-20T15:00:00.333Z"<br /><br />d.toRFC3339UTCString(true);<br />=> "20100720T150000.333Z"<br /><br />d.toRFC3339LocaleString(true);<br />=> "20100720T230000.333+0800" // assuming current timezone is GMT+8<br /></pre ><br />The readme in the <a href="http://github.com/tardate/rfc3339date.js">project repository on github</a> has more information about the range of date formats supported and other methods available.<br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.youtube.com/watch?v=j_X3KmWUog4">Too Many Times - Mental as Anything</a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-2039965347982216323?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-70746619897170946562010-07-25T04:05:00.006+08:002010-10-03T17:01:12.882+08:002010-10-03T17:01:12.882+08:00DHH, Lars, and the Quality of WaterJust for the record:<br /><ul><li><a href="http://en.wikipedia.org/wiki/David_Heinemeier_Hansson">David Heinemeier Hansson</a>: born in Denmark 1979. Partner at <a href="http://37signals.com/">37signals</a></li><br /><li><a href="http://en.wikipedia.org/wiki/Lars_Ulrich">Lars Ulrich</a>: born in Denmark 1963. Drummer for <a href="http://www.metallica.com/">Metallica</a></li><br /><li>DHH: outspoken proponent for <a href="http://37signals.com/svn/posts/1864-rework-unveiling-the-cover">building businesses from revenue</a>.</li><br /><li>Lars: outspoken proponent for <a href="http://findarticles.com/p/articles/mi_m0EIN/is_2000_May_10/ai_62007930/">exploiting copyright for money</a>.</li></ul>I wonder what they added to the drinking water in Denmark back in the 70's?<br /><br /><span style="font-style:italic;">Blogarhythm: <a href="http://www.youtube.com/watch?v=cvGAYm0quTw">Smoke on the Water - Metallica</a> covering Deep Purple.</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-7074661989717094656?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-14283839039008570792010-07-24T23:50:00.006+08:002010-07-25T00:17:19.911+08:002010-07-25T00:17:19.911+08:00DBS, Intuit: Doing the Hard Yards for Transparency in a SaaS EraI arrived back from Tokyo to the news of a major <a href="http://www.todayonline.com/Singapore/EDC100714-0000108/DBS-Group-CEO-apologises">DBS snafu</a>, involving the loss of the entire ATM network, Internet and mobile banking services for 7 hours on the 5th July.<br /><br /><span style="font-weight:bold;">That's bad.</span><br /> <br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_AZh6c1pzK1A/TEsO_MYO-vI/AAAAAAAABzw/iSNvq4tuIJk/s1600/dbs-Piyush+Gupta.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 180px;" src="http://4.bp.blogspot.com/_AZh6c1pzK1A/TEsO_MYO-vI/AAAAAAAABzw/iSNvq4tuIJk/s320/dbs-Piyush+Gupta.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5497504248953240306" /></a>However, the <a href="http://www.todayonline.com/Singapore/EDC100714-0000108/DBS-Group-CEO-apologises">unqualified apology by DBS' CEO, Mr Piyush Gupta,</a> was truly a breath of fresh air. Not only was it devoid of the typical corporate hedging, but I believe it was the most frank and technically detailed account of a failure that I have ever read in the press.<br /><br />Mr Gupta's response has actually increased my confidence and loyalty in the bank. Which is a rather unusual outcome for a screw-up. <br /><br /><span style="font-style:italic;">NB: .. to the extent that I actually thought it rather mean-spirited and self-serving for the Monetary Authority of Singapore (MAS) to step forward and emphasize the fact that it was actually the MAS who ".. instructed DBS to give a full account of the incident to the public, including the actions it will take to prevent future recurrence".</span><br /><br />I can't help but compare and contrast this to <a href="http://blog.hubspot.com/blog/tabid/6307/bid/6101/Responding-to-a-Social-Media-Crisis-Intuit-Outage-Takeaways.aspx">Intuit's woes of late</a>. On 15th June, Intuit experienced catastrophic failures of their <a href="http://www.intuit.com/">Intuit.com</a>, <a href="http://www.quickenonline.intuit.com/">Quicken</a>, <a href="http://www.quickbooks.intuit.com/">QuickBooks</a>, and <a href="http://www.turbotax.com/">TurboTax</a> services. Services were only restored more than a day later, and it wasn't until 7pm on the 16th of June that customers had any kind of <a href="http://smallbusiness.intuit.com/blog/where-small-is-now/2010/06/intuit-service-update.html">detailed explanation</a>.<br /><br />In both cases, the organisations concerned were caught out in the short-term. Customers were affected and actively seeking answers within minutes. But the corporate responses can be measured in hours and days.<br /><br />It is also worrisome that in both cases, the reported investigations point to failures in standard maintenance procedures: ".. during a routine maintenance procedure.." (Intuit) and ".. IT vendor IBM [..] had used an 'outdated procedure' to carry out the repair.." (DBS).<br /><br /><span style="font-weight:bold;">SaaS providers should take note! Better to learn the lessons from others rather than make our own mistakes. Two take-aways:</span><br /><blockquote><span style="font-weight:bold;">What is your realistic response time to a service issue?</span> Can you identify a problem and open a communication channel with customers within minutes or the hour? And does this only really work during normal business hours, or is it 24x7? Prompt and open communication can avert a tsunami of customer complaints in a serious situation. Do you have that insurance in place?<br /><br /><span style="font-weight:bold;">Do you really have production change management under control?</span> My natural assumption is that neither DBS nor Intuit have (a) the staging systems available, or (b) the procedures in place, to exactly and incontrovertibly test production changes. The nett of my years in enterprise computing: "never, ever, make a change in production that you haven't first tested <span style="font-weight:bold;">and practised</span> elsewhere". What is your situation, honestly?</blockquote><br />Of course, reality bites. Notwithstanding any and all preventative measures you put in place, there's a good chance that one day you will find yourself in a situation as dire as DBS or Intuit <span style="font-style:italic;">(let's not even mention BP, which is a whole different ballpark).</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_AZh6c1pzK1A/TEsI1rsaQDI/AAAAAAAABzo/n9sq5VJD5zY/s1600/transparent-dice.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px;" src="http://2.bp.blogspot.com/_AZh6c1pzK1A/TEsI1rsaQDI/AAAAAAAABzo/n9sq5VJD5zY/s320/transparent-dice.jpg" border="0" alt="transparency is not a gamble" title="transparency is not a gamble"/></a>It may not be easy, but the DBS case in particular demonstrates that no matter how bad things are in the short-term, full and frank disclosure - <span style="font-weight:bold;">and the balls to take unequivocal responsibility</span> - are essential to getting you back on track. <span style="font-weight:bold;">Transparency is not a gamble.</span><br /><br /><span style="font-style:italic;">Blogarhythm: I think I must have written this post purely for the excuse of linking to <a href="http://youtu.be/1qAc_eCrfZQ">Tell me, Tell me</a> by <a href="http://en.wikipedia.org/wiki/Sharp_%28Korean_band%29">S#arp</a>, who are responsible for saving my sanity during a singular .com project back in the day.</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-1428383903900857079?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-29992623765554898492010-07-20T15:15:00.006+08:002010-07-20T15:42:54.307+08:002010-07-20T15:42:54.307+08:00iPad Singapore - nice price, no telcosI was <span style="font-style:italic;">so-o</span> tempted to buy one <a href="http://pratalife.blogspot.com/2010/07/yokoso-tokyo.html">in Japan last week</a>, so I'm happy that <a href="http://bit.ly/af6nHV">TODAY reports</a> the Apple iPad will go on sale here in Singapore on Friday (23rd Jul 2010, with iPhone 4 expected on the 30th).<br /><br />The biggest surprise for me was that it's only selling through Apple and authorised resellers. None of the local telcos will be offering it directly at this point. <br /><br />Now, I definitely prefer not to have an operator or service provider involved in any of my device purchases, but I'd still be intrigued to know the inside story (<span style="font-style:italic;">Apple asking too much? Apple not interested in a deal for such a small market? Telcos don't see any real benefit without exclusivity?</span> TODAY - go investigate and report on that, not just the pricing press release maybe?)<br /><br />Secondly, and not so surprising: the pricing is real nice. Probably one of the lowest worldwide, and not encumbered by contracts.<br /><blockquote class="quote">The WiFi-only models will retail for $728, $878 and $1,028 for the 16GB, 32GB and 64GB models, respectively. iPads with WiFi and 3G connectivity will retail for $928, $1,078 and $1,228 for the 16GB, 32GB and 64GB models, respectively.</blockquote>I was in Japan last week and checked out the iPad (of course). <span style="font-weight:bold;">I now know it's true: once you touch it you must have it.</span> It is just so responsive and smooth to use, and the size and weight are just right for casual browsing and apps. <br /><br />Remember the <a href="http://www.telegraph.co.uk/technology/technology-video/7777042/iPad-queues-in-Japan-nearly-1km-long.html">reports of 1km queues for the iPad in Japan back in May?</a>. Well, now of course you just walk in and there are more demo units and helpful sales people than customers. <br /><br /><span style="font-style:italic;">btw, I don't know where all the Japanese iPads went .. traveling all over Tokyo for a week and I only saw one being used in the wild (and the owner appeared to be American), with everyone else still glued to their flip phones. I wonder if it's just not private enough to be used on crowded public transport?</span><br /><br />I didn't have the SG prices at the time, but as a general rule Singapore tends to be cheaper for tech. I [just barely] managed to resist temptation, and it turned out the right bet - at least from a financial standpoint. <br /><br /><span style="font-weight:bold;">Now I can go queue for an iPad in Singapore;-)</span><br />&lt;brain style="state:on;fanboy:off;"&gt;..or maybe just wait a few more days&lt;/brain&gt; <br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_AZh6c1pzK1A/TEVAU-dwszI/AAAAAAAABy0/tjOmCn8dPZU/s1600/iPad+in+Shinjuku.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 308px;" src="http://3.bp.blogspot.com/_AZh6c1pzK1A/TEVAU-dwszI/AAAAAAAABy0/tjOmCn8dPZU/s400/iPad+in+Shinjuku.jpg" border="0" title="Softbank iPad sales in Shinjuku" alt=""id="BLOGGER_PHOTO_ID_5495869649384944434" /></a><br /><span style="font-style:italic;">Blogarhythm for this post: <a href="http://www.amazon.com/gp/product/B003LWVGS4?ie=UTF8&tag=itsaprli-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=B003LWVGS4">Bachelor Pad - Fantastic Plastic Machine</a><img src="http://www.assoc-amazon.com/e/ir?t=itsaprli-20&l=as2&o=1&a=B003LWVGS4" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-2999262376555489849?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-78492390580913277582010-06-29T15:50:00.001+08:002010-06-29T17:53:09.274+08:002010-06-29T17:53:09.274+08:00kalinka: Google Calendar Link-maker and Any+Time jQuery demo<a href="http://www.ama3.com/anytime/">Any+Time</a> was one of the more interesting options I covered in my <a href="http://tardate.blogspot.com/2010/06/quick-survey-of-jquery-datetime-widgets.html">Quick Review of jQuery Date/Time Widgets</a> the other day.<br /><br /><span style="font-weight:bold;">Any+Time</span> had a lot more functionality than I got to investigate at the time, and there were some specific features I wanted to checkout in more detail - in particular timezone handling - so I built another little demo called <span style="font-weight:bold;">kalinka</span>.<br /><br /><a href="http://tardate.com/tools/kalinka.htm">kalinka</a> is a simple tool to construct <a href="http://www.google.com/googlecalendar/event_publisher_guide_detail.html">Google Calendar Event URLs</a> without needing to publish an event in your own calendar. You can then put the link in an email or a website. Other people can then use the link to create the event in their own Google Calendar.<br /><br />kalinka mimics the basic functionality of the Google Calendar <a href="http://www.google.com/googlecalendar/event_publisher_guide.html#individual">Event Publisher</a>, except that it also demonstrates using Any+Time to offer specific control of the timezone.<br /><br />Try out <a href="http://tardate.com/tools/kalinka.htm">kalinka here</a>, and feel free to pillage the scripts.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tardate.com/tools/kalinka.htm"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 254px;" src="http://2.bp.blogspot.com/_AZh6c1pzK1A/TCmdIMxy-kI/AAAAAAAABJk/AncbW-_RAuY/s400/kalinka.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5488090385122261570" /></a><br /><br /><span style="font-style:italic;">Blogarhythm for this post: <a href="http://www.youtube.com/watch?v=cL_ZgMqDv30">kalinka malinka - The Red Army Choir</a> (a.k.a. Alexandrov Ensemble or Дважды краснознаменный академический ансамбль песни и пляски Российской армии имени А. В. Александрова)</span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-7849239058091327758?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com1tag:blogger.com,1999:blog-6220586.post-86983290838990454332010-06-22T16:15:00.003+08:002010-06-29T16:03:22.993+08:002010-06-29T16:03:22.993+08:00The third-party authentication dilemma: does Facebook pwn my site?I've <a href="http://tardate.blogspot.com/2009/10/rails-authentication-with-authlogic-and.html">argued for some time</a> that it is <span style="font-weight:bold;font-style:italic;">crazy</span> for most websites to have their own authentication (username/password) system these days.<br /><ul><li>We the users have no patience for <span style="font-weight:bold;">yet another registration process, validation email flow, and password to remember</span></li><br /><li>Security is too easy to get wrong, unless you truly have security professionals on staff</li><br /><li>Designing sites with a registration process, issuing credentials etc is a legacy holdover from the days when we had no choice. <a href="http://openid.net">OpenID</a>, <a href="http://oauth.net">OAuth</a> (in particular) have long since changed the game.</li></ul><br />And the shift is well underway. More sites these days are offering the ability to authenticate using twitter, facebook, google or other credentials. Janrain chief executive <a href="http://social.venturebeat.com/2010/06/16/janrain-la-times-openid/">Brian Kissel</a> has said that<blockquote class="quote">..publishers are jumping on-board as they realize it’s valuable to know who their readers are and that it’s much easier to convince them to sign in with an existing account than to create a new one</blockquote><br /><img style="float:right; margin:0 0 10px 10px;width: 213px; height: 75px;" src="http://3.bp.blogspot.com/_AZh6c1pzK1A/TCBKzueCI6I/AAAAAAAABJA/HDCb8ERR56s/s400/sign-up-fb-connect2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5485466598645048226" />Perhaps like many sites, you integrated with <a href="http://developers.facebook.com/docs/authentication/">Facebook Connect</a> to let users sign into your site with their Facebook account. Which all sounds great, until you wake up one day, and are caught you off guard by two bits of news:<br /><ul><li>Facebook Connect brand will be deprecated as part of the <a href="http://mashable.com/2010/04/21/facebook-kills-facebook-connect/">launch of Open Graph</a></li><br /><li>There's a movement of disaffected Facebook users concerned with privacy and trust <a href="http://www.quitfacebookday.com/">threatening to quit</a></li></ul><br /><a href="http://twitter.com/jason">Jason Calacanis</a> was one of the high-profile <a href="http://www.quitfacebookday.com/">Facebook quitters</a> who got "caught" <a href="http://techcrunch.com/2010/06/11/calacanis-facebook-profile/">sneaking back in</a>. He explained the reason on a <a href="http://thisweekin.com/thisweekin-startups/">This Week in Startups</a> .. to (temporarily) <span style="font-weight:bold;">regain control over all the third-party applications he'd forgotten were using his Facebook account for authentication</span>. <br /><br />Suddenly, you are feeling the downside of depending on a third-party authentication service:<br /><ul><li>The amount of engineering required to "keep up" with the evolving identity management space is unpredicatable since someone else is calling the shots</li><br /><li>Your site and brand is totally exposed to a user backlash over something that you have have no control over and has nothing to do with you</li></ul><br /><br /><span style="font-weight:bold;">So is there better way?</span><br /><br />If your site is directly linked to the third-party service (e.g. a tool for twitter, or a Facebook application) then the answer is no, and the question doesn't even make sense.<br /><br />But for most cases, we are basically outsourcing the identity management and authentication, and want to avoid getting caught down a blind alley.<br /><br />Pure OpenID is one approach: it is not controlled by any single vendor, and there are capabilities such as <a href="http://www.windley.com/archives/2007/02/using_openid_delegation.shtml">delegation</a> which allow users to pick and choose their provider. The unfortunate fact is that OpenID is far from mainstream, and will likely remain a mystery for most users (even if it is hard at work under the covers of their Google or Yahoo! sign in).<br /><br />Personally, I think the best approach is to disentangle ourselves from directly dealing with identity providers. By outsourcing the identity management and authentication process to an intermediary that aggregates the services of many identity providers we get a nice compromise:<br /><ul><br /><li>Someone else to take on the burden of securing the system and keeping up to date with the improvements made by the various identity providers</li><br /><li>We get to offer the convenience to our users of signing in with a wide range of identity providers</li><br /><li>And I am making my site directly dependent on only one service provider, and one that specializes in identity not other business interests which may potentially bring us into conflict</li></ul><br />The best solution I have found so far is <a href="http://www.janrain.com/products/engage">Janrain Engage</a> (formerly RPX). I've used this on a number of sites (e.g. <a href="http://cloudjetty.com">CloudJetty</a> - my directory of cloud/SaaS applications), and released a gem (<a href="http://github.com/tardate/authlogic_rpx">authlogic_rpx</a>) for easily using the service with Ruby on Rails.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.janrain.com/products/engage"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 137px;" src="http://2.bp.blogspot.com/_AZh6c1pzK1A/TCBsCfDqliI/AAAAAAAABJI/Tuv8msHxqg4/s400/engage-horizontal.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5485503136089675298" /></a><br />If you are concerned about your website getting locked in to a particular authentication provider (whether it is Facebook, twitter or anything else) then I would certainly recommend you check out <a href="http://www.janrain.com/products/engage">Janrain Engage</a>. <br /><br />Now I realise this may come across as an unabashed plug for Janrain, but the truth of the matter is that (a) it works, and (b) I haven't really been able to find any fully baked alternatives. If you do know of other similar services or ways of approaching this problem I'd be really interested to hear about them. <br /><br /><span style="font-style:italic;">Blogarhythm for this post: <a href="http://www.youtube.com/watch?v=n55HUlFCEQc">IDentity - 玉置成実 Tamaki Nami</a></span><blockquote class="quote">The light will shine on me allowing me to make progress and start on the road to my identity</blockquote><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-8698329083899045433?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com2tag:blogger.com,1999:blog-6220586.post-46038136090202129432010-06-21T00:39:00.005+08:002010-06-29T16:04:32.620+08:002010-06-29T16:04:32.620+08:00The CSS Zen BangerEver need to try some simple CSS tweaks on an existing website? I needed to do something like that again recently, and a little hack I used to do the job just turned into the <span style="font-weight:bold;"><a href="http://csszenbanger.tardate.com/">CSSZenBanger</a></span>.<br /><br />CSSZenBanger is a simple tool for previewing style modifications on an existing web site&mdash;mainly intended for web designers who want a quick way to review stylesheet changes without the trouble of setting up a project environment. <br /><br />This is certainly not a new idea, but I googled in vain for something similar. And while it's pretty easy to make on-the-fly changes with tools like <a href="http://getfirebug.com/">Firebug</a>, sharing the results with others is tricky. <br /><br />So here it is... if you ever need to test some css fiddles, maybe it can help you too.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://csszenbanger.tardate.com/"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 322px;" src="http://2.bp.blogspot.com/_AZh6c1pzK1A/TB5JJjD73YI/AAAAAAAABIw/yhtHgjIltJc/s400/czb2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5484901824563240322" /></a><br /><span style="font-style:italic;">Blogarhythm for this post: <a href="http://www.youtube.com/watch?v=1zVECruSI3k">Cobrastyle</a> - <a href="http://www.amazon.com/gp/product/B0013PVGJ0?ie=UTF8&tag=itsaprli-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=B0013PVGJ0">Robyn</a><img src="http://www.assoc-amazon.com/e/ir?t=itsaprli-20&l=as2&o=1&a=B0013PVGJ0" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-4603813609020212943?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-5789281224394414022010-06-17T22:50:00.006+08:002010-06-29T16:04:58.765+08:002010-06-29T16:04:58.765+08:00jQuery EssentialsOn a jQuery binge today and saw a tweet fly by with this excellent overview by <a href="http://www.slideshare.net/1Marc">Marc Grabanski</a> (via <a href="http://twitter.com/elijahmanor/status/16307532551">@elijahmanor</a>) <br /> <br /><div style="width:425px" id="__ss_1254680"><object id="__sse1254680" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jquery-essentials-090406094627-phpapp01&stripped_title=jquery-essentials" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse1254680" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=jquery-essentials-090406094627-phpapp01&stripped_title=jquery-essentials" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div><br />Motivated me to finally toss out my old jQuery wallpaper. There's a great selection over at <a href="http://devcheatsheet.com/tag/jquery/">devcheatsheet</a> (I'm going with <a href="http://www.futurecolors.ru/jquery/">Future Colors</a> for now).<br /><br /><span style="font-weight:bold;">Update</span> (via <a href="http://twitter.com/mahemoff/status/16400355286">@mahemoff</a>): Rebecca Murphey has just released the <a href="http://blog.rebeccamurphey.com/2010/06/17/open-source-jquery-training/">"jQuery Fundamentals" Open-Source jQuery Training Curriculum</a> under Creative Commons. <span style="font-weight:bold;">Some kind of awesome!</span><br /><br /><span style="font-style:italic;">Blogarhythm for this post: <a href="http://www.amazon.com/gp/product/B000W1NBNU?ie=UTF8&tag=itsaprli-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=B000W1NBNU">Run with the $</a><img src="http://www.assoc-amazon.com/e/ir?t=itsaprli-20&l=as2&o=1&a=B000W1NBNU" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> - Lita Ford </span><br /><br /><span style="font-style:italic;font-size:small;">LOLs: ..and some dumb script at amazon translated $ to dollar, when she actually sings "money";-)<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.amazon.com/gp/product/B000W1NBNU?ie=UTF8&tag=itsaprli-20&linkCode=as2&camp=1789&creative=390957&creativeASIN=B000W1NBNU"><img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 60px;" src="http://3.bp.blogspot.com/_AZh6c1pzK1A/TBo0biJAknI/AAAAAAAABIM/SvTnuimZLao/s320/run-with-the-dollar.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5483753143902704242" /></a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-578928122439441402?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com0tag:blogger.com,1999:blog-6220586.post-57984430879884940032010-06-17T18:40:00.010+08:002010-06-29T16:05:16.978+08:002010-06-29T16:05:16.978+08:00Quick Review of jQuery Date/Time WidgetsOnce again I find myself browsing around for a <span style="font-style:italic;">better</span> javascript calendar tool. I'm particularly looking for jQuery support, the ability to handle both date and time entry, and &mdash; being post-iPhone/Android/iPad 2010 &mdash; I'm concerned about making sure it is <a href="http://andycroll.com/writing/the-end-of-hover">finger friendly</a> (i.e. it works on a touch screen).<br /><br />The table below summarises my findings at this point (<a href="http://tardate.com/jQueryDateTime/index.htm">see here for my full survey results</a>). The ranking is just my personal view, and this list is certainly not all inclusive (if you know of other/better options I'd be really interested to hear from you). Each tool links to a test page where I've tried to cut everything back to the bare essentials needed to run a demo. Feel free to pinch the source if it helps. <br /><br /><span style="font-weight:bold;">Conclusions?</span> There are some reasonably effective tools here for quickly dropping in date <span style="font-weight:bold;">and</span> time editing support, but at the end of the day I'm not sure that Google haven't already got it right with the simple combo-box time selectors in <a href="http://calendar.google.com">Google Calendar</a> <span style="font-style:italic;">(is there a widget that includes something similar? Haven't found it yet)</span>.<br /><h2>The Field</h2><span style="font-style:italic;">* indicates the latest versions that I have been able to successfully test</span><br /><br /><span style="font-weight:bold;"><a href="http://tardate.com/jQueryDateTime/datePicker.htm">jQuery Datepicker</a> [Rank: B]</span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tardate.com/jQueryDateTime/datePicker.htm"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; " src="http://tardate.com/jQueryDateTime/images/jquery.datetime.jpg" border="0" alt="" /></a><ul><li><span style="font-weight:bold;">jQuery*:</span> 1.4.2 </li><br /><li><span style="font-weight:bold;">jQuery UI*:</span> 1.8.2,1.7.3</li><br /><li><span style="font-weight:bold;">Dates:</span> Yes <span style="font-weight:bold;">Times:</span> No</li><br /><li><span style="font-weight:bold;">Finger Friendly:</span>Yes </li><br /><li><span style="font-weight:bold;">Comments:</span>The standard widget </li></ul><br /><br /><span style="font-weight:bold;"><a href="http://tardate.com/jQueryDateTime/anytime.htm">Any+Time</a> [Rank: A]</span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tardate.com/jQueryDateTime/anytime.htm"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; height: 180px;" src="http://tardate.com/jQueryDateTime/images/anytime.jpg" border="0" alt="" /></a><ul><li><span style="font-weight:bold;">jQuery*:</span> 1.4.2 </li><br /><li><span style="font-weight:bold;">jQuery UI*:</span> n/a</li><br /><li><span style="font-weight:bold;">Dates:</span> Yes <span style="font-weight:bold;">Times:</span> Yes</li><br /><li><span style="font-weight:bold;">Finger Friendly:</span>Yes </li><br /><li><span style="font-weight:bold;">Comments:</span> Extensively customisable and scriptable. Supports jQuery UI themes. Also works with prototype instead of jQuery. Cannot edit the bound field while the widget is active <span style="font-style:italic;">[Update 18-Jun-2010: fixed incorrect statement that jQuery themes not supported]</span></li></ul><br /><br /><span style="font-weight:bold;"><a href="http://tardate.com/jQueryDateTime/MartinMilesich-timepicker.htm">Martin Milesich's Timepicker</a> [Rank: A-]</span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tardate.com/jQueryDateTime/MartinMilesich-timepicker.htm"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; " src="http://tardate.com/jQueryDateTime/images/mm-timepicker.jpg" border="0" alt="" /></a><ul><li><span style="font-weight:bold;">jQuery*:</span> 1.4.2, 1.3.2 </li><br /><li><span style="font-weight:bold;">jQuery UI*:</span> 1.8.2, 1.7.2</li><br /><li><span style="font-weight:bold;">Dates:</span> Yes <span style="font-weight:bold;">Times:</span> Yes</li><br /><li><span style="font-weight:bold;">Finger Friendly:</span> Cannot use the time slider with finger, but you can select a point on the slider with finger OK. </li><br /><li><span style="font-weight:bold;">Comments:</span> Generally neat extension of the standard datepicker. Supports alternate fields to split out date/time component for easier processing. </li></ul><br /><br /><span style="font-weight:bold;"><a href="http://tardate.com/jQueryDateTime/timepicker.htm">Trent Richardson's Timepicker</a> [Rank: B+]</span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tardate.com/jQueryDateTime/timepicker.htm"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; " src="http://tardate.com/jQueryDateTime/images/tr-timepicker.jpg" border="0" alt="" /></a><ul><li><span style="font-weight:bold;">jQuery*:</span> 1.4.2 </li><br /><li><span style="font-weight:bold;">jQuery UI*:</span> 1.8.2 </li><br /><li><span style="font-weight:bold;">Dates:</span> Yes <span style="font-weight:bold;">Times:</span> Yes</li><br /><li><span style="font-weight:bold;">Finger Friendly:</span> Cannot use the time slider with finger. You can select a point on the slider with finger, but there is a minor bug meaning you need to select twice. You can also edit the bound field while the widget is active. </li><br /><li><span style="font-weight:bold;">Comments:</span> Generally a very neat extension of the standard datepicker. Doesn't support all features however e.g. alternate fields </li></ul><br /><br /><span style="font-weight:bold;"><a href="http://blog.w3visions.com/2009/04/date-time-picker-with-jquery-ui-datepicker/">W3VISIONS Date-Time-Picker</a> [Rank: B-]</span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://blog.w3visions.com/2009/04/date-time-picker-with-jquery-ui-datepicker/"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; " src="http://tardate.com/jQueryDateTime/images/w3v-datetimepicker.jpg" border="0" alt="" /></a><ul><li><span style="font-weight:bold;">jQuery*:</span> 1.3.2 </li><br /><li><span style="font-weight:bold;">jQuery UI*:</span> n/a </li><br /><li><span style="font-weight:bold;">Dates:</span> Yes <span style="font-weight:bold;">Times:</span> Yes</li><br /><li><span style="font-weight:bold;">Finger Friendly:</span> Yes. Slider button doesn't work with the finger, but can select positions on the slider OK </li><br /><li><span style="font-weight:bold;">Comments:</span> The UI is a bit klunky and no themes support so I didn't bother with a demo page for this </li></ul><br /><br /><span style="font-weight:bold;"><a href="http://tardate.com/jQueryDateTime/timepickr.htm">timepickr</a> [Rank: C]</span><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tardate.com/jQueryDateTime/timepickr.htm"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 240px; " src="http://tardate.com/jQueryDateTime/images/timepickr.jpg" border="0" alt="" /></a><ul><li><span style="font-weight:bold;">jQuery*:</span> 1.4.2 </li><br /><li><span style="font-weight:bold;">jQuery UI*:</span> 1.7.3 </li><br /><li><span style="font-weight:bold;">Dates:</span> No<span style="font-weight:bold;">Times:</span> Yes</li><br /><li><span style="font-weight:bold;">Finger Friendly:</span> No fingers, no play (unless the device has a trackball you can fallback on) </li><br /><li><span style="font-weight:bold;">Comments:</span> A different take on time entry. Maybe too different. </li></ul><br /><h2>Additional Resources</h2><ul><li><a href="http://jquery.com/">jQuery Home</a></li><br /><li><a href="http://www.datejs.com">Datejs</a> extends javascript Date parsing capabilities and adds nice syntactic sugar</li><br /><li><a href="http://blog.stevenlevithan.com/archives/date-time-format">Date Format</a> extends javascript Date formating capabilities</li></ul><br /><h2>Alternative Frameworks</h2><p>jQuery is not the only game in town of course. Here are some others...</p><ul><li>Dojo <a href="http://dojocampus.org/explorer/#Dijit_Form%20Controls_Text%20Boxes_Date">Date Controls</a> and<br /><a href="http://dojocampus.org/explorer/#Dojox_Widgets_TimeSpinner">TimeSpinner</a></li><br /><li>MooTools <a href="http://www.monkeyphysics.com/mootools/script/2/datepicker">Datepicker</a> </li><br /><li>YUI <a href="http://developer.yahoo.com/yui/calendar/">Calendar</a>, <a href="http://yuilibrary.com/gallery/show/timepicker">timepicker</a></li><br /><li><a href="http://code.google.com/p/calendardateselect/">Calendar Date Select</a> Prototype-based Rails plugin</li><br /><li>In <a href="http://railscasts.com/episodes/213-calendars">Railscast 213</a> Ryan Bates provides some great coverage of date/calendar plugins with Rails</li><br /></ul><br /><br /><span style="font-style:italic;"><a href="http://www.youtube.com/watch?v=ntm1YfehK7U">Blogarhythm for this post: Time - Pink Floyd</a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-5798443087988494003?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com4tag:blogger.com,1999:blog-6220586.post-76596347922792572822010-06-01T20:41:00.010+08:002010-06-29T16:05:32.731+08:002010-06-29T16:05:32.731+08:0010 Tips to boost SaaS customer conversion<a href="http://twitter.com/DaveMcClure">@DaveMcClure</a> gave a great keynote this morning at <a href="http://www.amiando.com/echelon2010.html">#echelon2010</a>, and he emphasized a selective focus on critical metrics to drive your business.<br /><br /><img style="float:right; margin:0 0 10px 10px;width: 214px; height: 320px;" src="http://3.bp.blogspot.com/_AZh6c1pzK1A/TAT3TMZ8r1I/AAAAAAAABHk/ojdZmWnvtOM/s320/activation.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477774955909001042" />This post is all about improving conversion (customer activation) rates for SaaS companies, suggesting <span style="font-weight:bold;">10 areas where things often go wrong</span>. If you are a SaaS company, I expect this is one of your key metrics and I hope the article provides some hints on where to look for your next round of improvements. <br /><br />Last year I started <a href="http://cloudjetty.com">CloudJetty</a>, which is a directory of cloud/SaaS products. Since then I've researched almost 1000 different product offerings for potential listing. Aside from being a tremendous learning experience and really opening my eyes to the incredible range of products available, I guess it was inevitable that I'd develop a critical eye for how SaaS products are presented on the web. <br /><br />I started making notes; patterns appeared; and when Dave mentioned <span style="font-weight:bold;">activation</span> today I thought it was about time I bullied my thoughts into an actionable top 10 that I could share.<br /><br />My main observation was that after getting users to your site, <span style="font-weight:bold;">many SaaS companies seemed to slip up in relatively trivial ways in the quest to convert</span>. It points to a few simple interventions that could have a marked impact on your activation rates. After a good shuffle, my top 10 stands like this: <br /><ol><br /><li>What does it do?!? Be clear about what you are selling</li><br /><li>Help me tell others what you sell</li><br /><li>Products, Editions, Features - Be clear about what I can buy</li><br /><li>Let me buy it!</li><br /><li>Can I sign-up now?</li><br /><li>Be clear about future costs</li><br /><li>Who are you?</li><br /><li>Do your Corporate and SaaS sites agree?</li><br /><li>Can I get my data?</li><br /><li>You have mobile support of course?</li><br /><li>Bonus #11: Watch the evolution of Application Marketplaces</li><br /></ol>Some relate to technical capabilities, but the majority may be classed as failures in clear communication, or areas where silence is not a great idea.<br /><br />Most of these are also not exclusively issues for SaaS companies, but I couch this specifically for SaaS because I believe they face particular challenges.<br /><br />Cloud Computing is one of the most significant trends in IT, and 2010 is likely to be remembered as the year the cloud went mainstream. While many established vendors have been busy cloud-washing their products, we've also seen an incredible number of new products hit the market - in part because cloud infrastructure has itself drammatically reduced the cost of entry of delivering applications in the cloud (Software-as-a-Service / SaaS).<br /><br />If you are in the business of building and providing a SaaS product, this is a mixed blessing. Yes, a rising tide floats all boats. But at the same time, the market is getting very crowded, very quickly. Standing out from the competition, and getting users to at least try your service is as tough as it's ever been. <span style="font-weight:bold;">You don't want to make it any harder for yourself than it has to be.</span><br /><br />Before we dive into the Top 10, I should be clear that this is based purely on my personal research and evaluation. There's no science or measurement to back this up. <br /><br />If you have a Cloud/SaaS product, I'd simply encourage you take a fresh look at your website and use this as a quick checklist. <span style="font-weight:bold;">If you "fail" any points, take these as areas you might want to review in more detail with you team to decide if you need to take action.</span><br /><br />In short, forgive me if this sounds a bit preachy, and take it in the spirit it is offered: observations from a bloke who has looked at many SaaS sites and is offering some suggestions for the benefit of us all. I sincerely look forward to any feedback and additional suggestions you may have.<br /><br />That said, here we go...<br /><br /><h2>1. What does it do?!?</h2><br /><img style="float:right; margin:0 0 10px 10px;width: 150px; height: 100px;" src="http://4.bp.blogspot.com/_AZh6c1pzK1A/TAT3329-0yI/AAAAAAAABHs/ua0OP1hlvtM/s320/mousetrap.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477775585809716002" />Figuring out what you are offering should not require the skills of an investigative journalist. Anything less than bleeding obvious then your chances of activating a new user take an immediate nose dive.<br /><br />This is easier said than done, but it is still surprising how many SaaS sites fail to get this right. The three most common problems I've seen:<br /><ol><li>Omit a meaningful description altogether(!)</li><br /> <li>Provide a description, but one that is so grandiose, conceptual and all-encompassing that it doesn't help at all</li><br /> <li>There is a good description, but it is burried somewhere in an About page or other secondary page</li></ol><br />While this is a well-known web design challenge, it is particularly critical for SaaS. The product may not only be inherently complex or conceptual (e.g. subscription billing, sales force automation), but you also need to engage customers who are new to the whole cloud distribution channel.<br /><br />How to fix this? First, you need good copy. Hire a skilled writer if needed to capture the essence of your product in concise, straight-forward language. Don't confuse this with writing a tag line or motto. It is about delivering the 5 bullet points or 20 word description that gets people past the <span style="font-style:italic;">"Ahah, I understand what you do"</span> moment. <br /><br />Next, you need a place to put it, which may require a review of your home page / landing page web design. Don't hide it on an About page; make sure it is up front and cannot be missed. If you do a good enough job, you may find your About page becomes redundant or can be relegated to a more detailed backgrounder.<br /><br /><h2>2. Help me tell others what you do</h2><br />One of the benefits of having a wonderfully succinct product description is that you make it so much easier for people to tell other people about what you offer.<br />This is particularly important for business software, where a bit of internal lobbying may be required to get the ball rolling.<br /><br />Why make it difficult for people to write the email:<br /><blockquote class="quote">Hi Boss,<br /> We've being talking about improving our project invoicing for ages. Well, I found this site <span style="font-weight:bold;">{paste URL here}</span> that seems a perfect fit. <br /> It offers <span style="font-weight:bold;">{paste wonderfully succint description here}</span>. <br /> Certainly seems to address all the problems we've identifed - can we add it to the weekly meeting for a demo and decision on trying it out?</blockquote><br />Many sites make this so difficult, the poor person who is trying to be your champion literally has to rewrite or reinvent the way to describe your product in order to tell other people about it. <br /><br />These people are trying to sell your product for you, so it's probably a good idea to make their life as easy as possible! Consider helping them out.. <br /><ol> <li>Don't lock up key product descriptions in images. Make sure the important stuff is text that can be copied</li><br /> <li>Avoid relying too heavily on customer quotations for the bulk of your site copy. These may convince me, but re-quoting a quote doesn't usually help me convince others</li><br /> <li>Provide graded levels of detail in your product information. Many sites have high level taglines, a very detailed technical data sheet, but not much in between</li></ol><br /><h2>3. Products, Editions, Features - so, what exactly do I buy?</h2><br /><img style="float:right; margin:0 0 10px 10px;width: 218px; height: 320px;" src="http://1.bp.blogspot.com/_AZh6c1pzK1A/TAT47i50OXI/AAAAAAAABH0/dXmC70Valcw/s320/architecture.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477776748654639474" />There are quite a few SaaS companies that do a great job of communicating what they sell, but then totally lose the plot when it comes to being clear about what I can buy.<br /><br />The distinction may be subtle, but it is critical for making it easy for me to hand over my money. <br /><br />I may immediately grasp that you sell small business accounting solutions, but then get completely lost trying to understand whether I need the premium edition or the SOHO suite, with or without the active ledger integrator pack or advanced payments option. And does option mean I pay extra, or just that it may or may not work depending on my bank?<br /><br />Some of the more mature SaaS offerings also fall into the "platform trap". You will recognise these by the tiered architecture diagrams. The confusion arises when trying to understand whether platform layers and vertical modules are just part of the product's logical design, or whether these represent separately licensed components.<br /><br />Basically I want to buy, but I can't - because I'm confused or paralysed by too many options.<br /><br />The most common solution these days tends to be the simple tiered payment plans, with a matrix of features available in each plan.<br /><br /><h2>4. Let me buy it!</h2><br /><img style="float:right; margin:0 0 10px 10px;width: 112px; height: 112px;" src="http://2.bp.blogspot.com/_AZh6c1pzK1A/TAT1mtYtXjI/AAAAAAAABHU/_ciCS6Mo7dw/s320/brochureware.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477773092156431922" />No kidding, I've seen too many sites that sell me a great product story but for the life of me I cannot discover how to register or purchase. These tend to be the brochureware-gone-wild type sites. <br /><br />Some I suspect are companies that don't support a direct sales channel, but if this is the case I don't know why I'm not directed to a distribution partner.<br /><br />If you are still pre-launch, there's no excuse for not providing at least a mailing list, guest book, facebook or twitter account that I can connect to.<br /><br /><h2>5. Can I sign-up now?</h2><br /><img style="float:left; margin:0 10px 10px 0;width: 59px; height: 52px;" src="http://2.bp.blogspot.com/_AZh6c1pzK1A/TAT2nJvTW9I/AAAAAAAABHc/k3eukkZnTkY/s320/sign-up-now.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477774199279016914" />True SaaS products have a huge advantage over traditional software: there is no shipping, distribution, installation or configuration phase to get in the way of instant gratification. <br /><br />Which makes it baffling why so many purportedly cloud players do not capitalize on the opportunity for the impulse buy and immediate activation.<br /><br />If you do not offer immediate sign-up, my first thoughts are frankly:<br /><ol><li>You are not a true SaaS/cloud player. Cloud-washing alert!</li><br /><li>You have let your bureaucratic and legal processes overwhelm common sense. You are obviously not the agile, customer-focused company that I'd like to do business with</li></ol><br />Neither reaction is beneficial for your business. If you can't already offer immediate registration, why is that? Is it a legal issue, engineering challenge or side-effect of your sales commission and distribution channel agreements? <br /><br />The most common and apparently successful pattern is to enable immediate sign-up for a time-limited trial or basic free plan (the <a href="http://en.wikipedia.org/wiki/Freemium">freemium</a> model). Your foot is in the door, and the chances of coverting these users to paid plans just took a big leap forward.<br /><br /><img style="float:left; margin:0 10px 10px 0;width: 125px; height: 97px;" src="http://1.bp.blogspot.com/_AZh6c1pzK1A/TAT7VzmHj0I/AAAAAAAABH8/dWvbWep6Zn0/s320/30-Day-Free-Trial.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477779398835277634" /><span style="font-weight:bold;">I'd suggest that a free trial has already become a standard customer expectation. You seriously risk being passed over without a thought if you do not offer a free trial.</span> <br /> <br />Whether you offer a freemium model is a trickier decision. Many are finding it hard to make fremium work in practice (such as <a href="http://www.ning.com/">Ning</a> who recently switched to the free trial/paid model after years of trying to make fremium pay). The catch is that you must provide an incredibly compelling differentiation between free and paid, while at the same time not making your free plan so brain dead that it turns people away before they even consider paying. Not an easy feat.<br /><br />I think there is still a valid place for freemium offerings in the business applications space, specifically because it is easy to define free/paid thresholds that make sense e.g. free to invoice up to 3 customers, but 4+ become paid services.<br /><br /><h2>6. Be clear about future costs</h2><br />Quite a number of SaaS sites offer a free trial or demo account without disclosing the pricing details for the real thing.<br /><br />People aren't stupid, and I suspect most are immediately on the lookout for the bait and switch. Even if everything is above board, I am disinclined to waste my time signing up for a trial in the first place if I have no way of knowing whether the eventual costs will even be close to my budget.<br /><br />It seems to have become the industry norm for SaaS companies to openly publish their pricing (usually a prominent "Plans / Pricing" link). If you can't or won't do the same, it will inevitably turn some people away. <br /><br />There is a special problem of course if your service is in beta and the pricing of monetization plan hasn't been finalised. I think the best you can do is just be transparent and avoid giving your users any nasty surprises.<br /><br /><h2>7. Who are you?</h2><br /><img style="float:right; margin:0 0 10px 10px;width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_AZh6c1pzK1A/TAT9JwshKpI/AAAAAAAABIE/fOl3Wi-EOGg/s320/who-are-you.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477781390921640594" />It is surprising the number of sites that make it difficult or impossible to identify who is really behind the site. Doing so just creates additional buyer resistance, which you don't need.<br /><br />If you are offering applications for business, trust will be a significant factor in the decision to start using your product. The more sensitive and critical the information and processes involved, the higher the trust threshold will be. <br /><br />In the consumer space, it may be sufficient to identify yourself simply as a web address (with perhaps an associated company). But smart businesses will want to know a little more about who you are before committing to a relationship.<br /><br />That doesn't mean you need the brand recognition of Google or Salesforce, but you should be more than just an IP address.<br /><ol><li>Get the advice and make the effort to ensure your SaaS business is appropriately incorporated.</li><br /> <li>Clearly state the company name in your web footer/copyright notice and link it to the company contact or information page</li><br /> <li>Include your real-world contact details and physical office address (if you have one)</li><br /> <li>Quote your business registration number, and make sure the country or legal jurisdiction is clear.</li></ol><br />The objective is to present your company as a tangible entity that exists in the real world and is able to entertain a serious business relationship. Admittedly, geography can be a double-edged sword. There's a big difference between having a business address in Prague or Palo Alto. But play to your strengths and don't be unnecessarily silent about where you operate in the real world.<br /><br /><h2>8. Do your Corporate and SaaS sites agree?</h2><br />You can find quite a number of SaaS sites that do the right thing and identify the corporate entity behind the operation, but when you visit the corporate site, there's no return link or mention of the SaaS product offering.<br /><br />This is quite common with SaaS offerings that have spun out of a web design or development company, or have been obtained as part of merger and acquisition activity.<br /><br />When you discover this as a potential customer, the impact is hugely negative. It raises questions about the degree of corporate support, and the prospect that the SaaS site may be on the verge of being cut lose or wound up. <br /><br />Mostly I suspect this is an oversight, or just content management problems where web properties are under the control of unrelated groups. Eminently fixable. Do it!<br /><br /><h2>9. Can I get my data?</h2><br />SaaS is still in its early days, and so adopters are clearly taking a risk when compared to "traditional" approaches, especially in a business context. That risk equation is significantly rebalanced if there's a clear way for users to recover their data if things go pear shape. <br /><br />Google made one of the boldest steps to address this issue when it established the <a href="http://www.dataliberation.org/">Data Liberation Front</a>.<br /><blockquote class="quote">Users should be able to control the data they store in any of Google's products. Our team's goal is to make it easier to move data in and out.</blockquote><br />The large majority of SaaS sites are completely silent on the ability for users to extract their data from the service in a usable format. You can remove this as a barrier to adoption by providing a suitable data interface and being clear about this in your product documentation.<br /><br />Better yet is to have an full open API, and support for data/integration standards that are relevant in your domain. But getting the data out is fundamental.<br /><br /><h2>10. You have mobile support of course?</h2><br />Smartphones - iPhone, Blackberry, Android and so on - are becoming the norm in business. And now we are looking at a new wave of tablet devices lead by the iPad (already <a href="http://techcrunch.com/2010/05/31/apple-sold-2-million-ipads-in-59-days/">2 million units shipped</a>) and a mob of <a href="http://www.electricpig.co.uk/2010/03/11/ipad-inspires-avalanche-arm-predicts-50-tablets-this-year/">android-based tablets</a> on the way.<br /><br />Increasingly, business functions are migrating from traditional computing platforms to these devices. CRM, contact management and social networking are already there. <br /><br />So expect the questions like: <span style="font-style:italic;">"do you work on mobile? Do you have a native iPhone/iPad/Android application?"</span> <br /><br />Again, many SaaS sites are silent on the topic. Your web site may already be optimized for mobile browsers. Make sure we know it. Do you have plans for mobile applications? Make sure it is clear it is in the roadmap. <br /><br />It is not a topic you should be silent about (unless you truly have nothing to offer).<br /><br /><h2>Bonus #11. Watch the evolution of Application Marketplaces</h2><br />We are all becoming familiar with marketplaces for mobile applications, digital books and videos. It is likely only a matter of time before marketplaces are to become significant distribution channels for SaaS applications. <br /><br />Already we see the rise of platform-specific marketplaces such as <a href="http://www.google.com/enterprise/marketplace/">Google Apps Marketplace</a>, <a href="http://sites.force.com/appexchange/home">Salesforce AppXchange</a>, <a href="http://marketplace.intuit.com/">Intuit Marketplace</a> and others. And we have emerging platform-neutral marketplaces such as <a href=" http://cloudomatic.com/">Cloudomatic</a> and my own <a href="http://cloudjetty.com/">CloudJetty</a>.<br /><br />Smart SaaS providers will be watching closely to see how they can leverage the marketplaces to garner new users.<br /><br /><h2>How to Do It Right</h2><br />I've avoided citing examples of how to do it badly, mainly because these are such common problems it seems unfair to pick on one or two unlucky puppies.<br /><br />But here's a pretty random example of a site that does a decent job of it. <br /><br /><span style="font-style:italic;"><a href="http://chargify.com/">Chargify</a> simplifies recurring billing for Web 2.0 and SaaS companies. They have a tiered pricing based on the number of customers processed, with a free plan that will get you up to 50 customers. I can sign up now and immediately create a hosted payment page and start doing business. </span><br /><br />It took me all of 5 seconds to figure that out. <span style="font-weight:bold;">Brilliant!</span><br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://chargify.com/"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 242px;" src="http://3.bp.blogspot.com/_AZh6c1pzK1A/TATM-8CVdOI/AAAAAAAABHM/EUTQF6N6plg/s400/chargify.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5477728428429243618" /></a><br /><br /><span style="font-style:italic;">Blogarhythm for this post: <a href="http://www.youtube.com/watch?v=ajgLJknabHU">Why don't you do right - Peggy Lee (2010 remix)</a></span><div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6220586-7659634792279257282?l=tardate.blogspot.com' alt='' /></div>Paulhttp://www.blogger.com/profile/14028723940654655284noreply@blogger.com2