<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" gd:etag="W/&quot;CUICRXw6eyp7ImA9WhBbF00.&quot;"><id>tag:blogger.com,1999:blog-6220586</id><updated>2013-05-16T19:26:04.213+08:00</updated><category term="Python" /><category term="Innovation" /><category term="Laugh" /><category term="Product Management" /><category term="Microsoft" /><category term="TechRead" /><category term="SocialMedia" /><category term="Security" /><category term="Oracle" /><category term="ESM" /><category term="SOA" /><category term="RIA" /><category term="Ajax" /><category term="ebook" /><category term="OC4J" /><category term="openworld07" /><category term="JDeveloper" /><category term="Environment" /><category term="Scripting" /><category term="Code Generation" /><category term="Community" /><category term="SaaS" /><category term="RSS" /><category term="Singapore" /><category term="git" /><category term="Axis" /><category term="reddot" /><category term="KM" /><category term="DRM" /><category term="Software" /><category term="Flex" /><category term="PC Pimping" /><category term="Blog Action Day" /><category term="Cloud" /><category term="Identity Management" /><category term="FLOSS" /><category term="Mobile" /><category term="SCM" /><category term="WebCenter" /><category term="cvs" /><category term="OS/2" /><category term="Publishing" /><category term="Project Management" /><category term="Entrepreneur" /><category term="Javascript" /><category term="C/C++" /><category term="Rails" /><category term="Music" /><category term="Library" /><category term="XML" /><category term="Design" /><category term="RegEx" /><category term="Perl" /><category term="OracleAS" /><category term="Java" /><category term="GridControl" /><category term="Web 2.0" /><category term="BPEL" /><category term="Deep thoughts" /><category term="OpenID" /><category term="LDAP" /><category term="Cranky" /><category term="C#" /><category term="Business" /><category term="SOAP" /><category term="PHP" /><category term="Development" /><category term="iX2007" /><category term="Read" /><category term="Methods" /><category term="OTN" /><category term="Listen" /><category term="Ruby" /><category term="Fusion" /><category term="Database" /><category term="Linux" /><category term="Cocoon" /><category term="BI" /><category term="Eat" /><category term="REXX" /><category term="Bash" /><category term="OOW" /><category term="OVD" /><category term="WiFi" /><title>Tardate 11.2</title><subtitle type="html">My occasional technical diary of thoughts, tips, and tools from some of the more interesting things I'm playing around with at the time. That means all things Cloud, Open Source, Rails, BigData, Mobile, or just my latest rant.. who knows!</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>226</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/tardate" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="tardate" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;D0UNQHkzfip7ImA9WhBQFU4.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-4862285925361203366</id><published>2013-03-17T23:48:00.001+08:00</published><updated>2013-03-17T23:48:11.786+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-17T23:48:11.786+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Deep thoughts" /><title>Amplifying Human Emotion</title><content type="html">&lt;span style="font-style:italic;float:right;"&gt;(blogarhythm ~ &lt;a href="http://www.youtube.com/watch?v=ONvCoRS1wjs"&gt;Sweet Emotion&lt;/a&gt;  相川七瀬)&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
It all comes back to connectivity. Om Malik (TWiST #327 @00:37:30) has a brilliant characterization of the true impact of the internet: &lt;blockquote class="quote"&gt;human emotion amplified at network scale&lt;/blockquote&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/EWoGAN-syd8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/4862285925361203366/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=4862285925361203366" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/4862285925361203366?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/4862285925361203366?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2013/03/amplifying-human-emotion_17.html" title="Amplifying Human Emotion" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://img.youtube.com/vi/EWoGAN-syd8/default.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0QBQXc-eCp7ImA9WhBQFU4.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-7086160973812976297</id><published>2013-03-10T13:08:00.000+08:00</published><updated>2013-03-17T23:49:10.950+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-03-17T23:49:10.950+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Security" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><title>Rolling the Mega API with Ruby</title><content type="html">&lt;span style="font-style:italic;float:right;"&gt;(blogarhythm ~ &lt;a href="http://www.youtube.com/watch?v=AwQuXbae3N4"&gt;Can you keep a secret? - 宇多田ヒカル&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/tardate/megar"&gt;Megar&lt;/a&gt; (“megaargh!” in pirate-speak) is a Ruby wrapper and command-line client for the &lt;a href="https://mega.co.nz/#developers"&gt;Mega API&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
In the current release (gem version 0.0.3), it has coverage of the basic file/folder operations: connect, get file/folder listings and details, upload and download files. You can use it directly in Ruby with what I hope you'll find is a very sane API, but it also sports a basic command-line mode for simple listing, upload and download tasks.&lt;br /&gt;
&lt;br /&gt;
If you are interested in hacking around with Mega, and prefer to do it in Ruby, give it a go! Like this:&lt;br /&gt;
&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;# do a complete folder/file listing
session = Megar::Session.new(email: 'my@email.com', password: 'my_password')
session.folders.each do |folder|
  folder.files.each do |file|
    puts file.name
  end
end
# upload a file
file_handle = '../my_files/was_called_this.mp3'
session.files.create( name: 'First.mp3', body: file_handle )&lt;/pre&gt;Or from the command line:&lt;br /&gt;
&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;$ megar -e my@email.com -p my_password ls
$ megar -e my@email.com -p my_password put *.pdf&lt;/pre&gt;I would still call it "experimental" at this stage because it needs more widespread hammering, and of course the Mega API is not fully documented yet. There are many more features of the API that it would be good to support, and I'd love for others to pitch in and help - &lt;a href="https://github.com/tardate/megar"&gt;go fork it on github&lt;/a&gt;!&lt;br /&gt;
&lt;br /&gt;
I was keen to get a &lt;a href="https://mega.co.nz"&gt;Mega&lt;/a&gt; account and check it out when the launch publicity hit, and was immediately impressed by the web interface. Very slick. Notwithstanding some of the intense analysis and some criticism (for example by &lt;a href="https://spideroak.com/blog/20130123130638-spideroaks-analysis-and-recommendations-for-the-crypto-in-kim-dotcoms-mega-part-one"&gt;SpiderOak&lt;/a&gt; and &lt;a href="http://www.grc.com/sn/sn-390.htm"&gt;Security Now&lt;/a&gt;), the "trust no-one" design approach is very interesting to contemplate and hack around with. &lt;br /&gt;
&lt;br /&gt;
The Mega API is still evolving. The documentation is thin and the main resource we have to work with is the Javascript reference implementation that actually runs the Mega site. But there has been quite a bit of work in the community to hack on the API - particularly in Python (with &lt;a href="http://julien-marchand.fr/blog/using-mega-api-with-python-examples/"&gt;API analysis&lt;/a&gt; and projects like &lt;a href="https://github.com/richardasaurus/mega.py"&gt;mega.py&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
It didn't take me long to realise there was nothing much going on with Ruby. After a bit of messing around, I think the main reason for that is the pretty wretched state of cryptographic support in Ruby. Unlike Python (which has &lt;a href="https://www.dlitz.net/software/pycrypto/"&gt;PyCrypto&lt;/a&gt; amongst others I'm sure), in Ruby we still on the whole get by with thin wrappers on OpenSSL that look and smell distinctly C-dy. But that's a challenge for another day...&lt;br /&gt;
&lt;br /&gt;
For now I'm pretty happy that Megar has all the main crypto challenges solved (after a bit of low-level reverse engineering supported by a healthy dose of TDD). Now I wonder what I'm going to use it for?&lt;br /&gt;
</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/7086160973812976297/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=7086160973812976297" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7086160973812976297?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7086160973812976297?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2013/03/rolling-mega-api-with-ruby.html" title="Rolling the Mega API with Ruby" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DU8BQ3w4cSp7ImA9WhBTGUk.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-328789479972249249</id><published>2013-02-16T00:54:00.000+08:00</published><updated>2013-02-16T01:04:12.239+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-16T01:04:12.239+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Rails" /><title>Easy Mandrill inbound email and webhook handling with Rails</title><content type="html">&lt;span style="font-style:italic;float:right;"&gt;(blogarhythm ~ &lt;a href="http://youtu.be/mWwtJJ3bqhM" alt="Blogarhythm!" title="Blogarhythm!"&gt;Psycho Monkey - Joe Satriani&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://mandrill.com/"&gt;Mandrill&lt;/a&gt; is the transactional email service by the same folks who do MailChimp, and I've been pretty impressed with it. For SMTP mail delivery it just works great, but where it really shines is inbound mail handling and the range of event triggers you can feed into to your application as &lt;a href="http://en.wikipedia.org/wiki/Webhook"&gt;webhooks&lt;/a&gt; (for example, to notify on email link clicks or bounces).&lt;br /&gt;
&lt;br /&gt;
The API is very nice to use, but in a Rails application it's best to keep all the crufty details encapsulated and hidden away, right? That's what the &lt;a href="https://github.com/evendis/mandrill-rails"&gt;mandrill-rails&lt;/a&gt; gem aims to do - make supporting Mandrill web hooks and inbound email as easy and Rails-native as possible.&lt;br /&gt;
&lt;br /&gt;
I recently added some new methods to mandrill-rails to provide explicit support for inbound mail attachments (in the 0.0.3 version of the gem). &lt;br /&gt;
&lt;br /&gt;
With the mandrill-rails gem installed, we simply define the routes to our webhook receiver (in this example an 'inbox' controller):&lt;br /&gt;
&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;resource :inbox, :controller =&gt; 'inbox', :only =&gt; [:show,:create]
&lt;/pre&gt;And then in the controller we provide handler implementations for any of the 9 event types we wish to consume. Here's how we might get started handling inbound email, including pulling out the attachments: &lt;br /&gt;
&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;class InboxController &lt; ApplicationController
  include Mandrill::Rails::WebHookProcessor

  # Defines our handler for the "inbound" event type. 
  # This gets called for every inbound event sent from Mandrill.  
  def handle_inbound(event_payload)
    [... do something with the event_payload here, 
         or stuff it on a background queue for later ... ]
    if attachments = event_payload.attachments.presence
      # yes, we have at least 1 attachment. Let's examine the first:
      a1 = attachments.first
      a1.name # =&gt; e.g. 'sample.pdf'
      a1.type # =&gt; e.g. 'application/pdf'
      a1.content
      # =&gt; this is the raw content provided by Mandrill, 
      #    and will be base64-encoded if not plain text
      # e.g. 'JVBERi0xLjMKJcTl8uXrp/Og0MTGCjQgMCBvY ... (etc)'
      a1.decoded_content
      # =&gt; this is the content decoded by Mandrill::Rails, 
      #    ready to be written as a File or whatever
      # e.g. '%PDF-1.3\n%\xC4\xE5 ... (etc)'
    end
  end

end&lt;/pre&gt;That's nice and easy, yes? See the &lt;a href="https://github.com/evendis/mandrill-rails/blob/master/README.rdoc#the-mandrillrails-cookbook"&gt;Mandrill::Rails Cookbook&lt;/a&gt; for more tips.&lt;br /&gt;
&lt;br /&gt;
If you love playing with transactional mail and haven't tried Mandrill yet, it's well worth a look!&lt;br /&gt;
</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/328789479972249249/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=328789479972249249" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/328789479972249249?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/328789479972249249?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2013/02/easy-mandrill-inbound-email-and-webhook.html" title="Easy Mandrill inbound email and webhook handling with Rails" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DUMNR3k9eyp7ImA9WhBTGUk.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-3024895995952118953</id><published>2013-01-12T23:57:00.002+08:00</published><updated>2013-02-16T00:58:16.763+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-16T00:58:16.763+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RIA" /><category scheme="http://www.blogger.com/atom/ns#" term="Design" /><title>Designing for Interesting Moments</title><content type="html">&lt;span style="font-style:italic;float:right;"&gt;(blogarhythm ~ &lt;a href="http://www.youtube.com/watch?v=5njopP8Fmkg"&gt;Moments Not Words&lt;/a&gt; - F.I.B)&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
Some deep thinking and analysis of how to design for interesting and effective interactions.. &lt;br /&gt;
&lt;div style="width:425px;text-align:left" id="__ss_2019028"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/billwscott/designing-interesting-moments" title="Designing for Interesting Moments"&gt;Designing for Interesting Moments&lt;/a&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=designinginterestingmoments-090918130401-phpapp01&amp;stripped_title=designing-interesting-moments" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=designinginterestingmoments-090918130401-phpapp01&amp;stripped_title=designing-interesting-moments" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"&gt;View more &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/"&gt;documents&lt;/a&gt; from &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/billwscott"&gt;Bill Scott&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/3024895995952118953/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=3024895995952118953" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/3024895995952118953?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/3024895995952118953?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2013/01/designing-for-interesting-moments.html" title="Designing for Interesting Moments" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUIDSHozfSp7ImA9WhBTGUk.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-7725312030120731234</id><published>2013-01-12T21:41:00.001+08:00</published><updated>2013-02-16T00:59:39.485+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-16T00:59:39.485+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Development" /><category scheme="http://www.blogger.com/atom/ns#" term="Rails" /><category scheme="http://www.blogger.com/atom/ns#" term="Deep thoughts" /><title>2013: Time for web development to have its VB3 moment</title><content type="html">&lt;span style="font-style:italic;float:right;"&gt;(blogarhythm ~ &lt;a href="http://www.youtube.com/watch?v=pHRm2odvW-o"&gt;Come Around Again&lt;/a&gt; - JET)&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
And that's a compliment!&lt;br /&gt;
&lt;br /&gt;
Wow. This year we mark the 20th anniversary of the &lt;a href="http://en.wikipedia.org/wiki/Visual_Basic"&gt;Visual Basic 3.0&lt;/a&gt; launch way back in 1993.&lt;br /&gt;
&lt;br /&gt;
It's easy to forget the pivotal role it played in revolutionizing how we built software. No matter what you think of Microsoft, one can't deny the impact it had at the time. Along with other products such as &lt;a href="http://en.wikipedia.org/wiki/PowerBuilder"&gt;PowerBuilder&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Embarcadero_Delphi"&gt;Borland Delphi&lt;/a&gt;, we started to see long-promised advances in software development (as pioneered by &lt;a href="http://en.wikipedia.org/wiki/Smalltalk"&gt;Smalltalk&lt;/a&gt;) become mainstream reality:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;finally, &lt;a href="http://en.wikipedia.org/wiki/Rapid_application_development"&gt;Rapid Application Development&lt;/a&gt; that really was rapid&lt;/li&gt;
&lt;li&gt;simplicity that put the development of non-trivial applications within the realm of the average computer user. It made simple things simple and complex things possible (to borrow from &lt;a href="http://en.wikiquote.org/wiki/Alan_Kay"&gt;Alan Kay&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;development environments that finally did the obvious: want to build a graphical user interface? Then build it graphically (i.e. &lt;a href="http://en.wikipedia.org/wiki/WYSIWYG"&gt;WYSIWYG&lt;/a&gt;), and build a complete client or client-server app from a single IDE.&lt;/li&gt;
&lt;li&gt;an event-driven programming model that explicitly linked code to the user-facing triggers and views (like buttons and tables)&lt;/li&gt;
&lt;li&gt;perhaps the first mainstream example of a viable software component reuse mechanism (improved and rebranded many times over time: ActiveX, COM, .NET)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
In its day, Visual Basic 3.0 was variously lauded (by non-programmers who could finally make the app they always wanted) and loathed (by IT professionals shocked at the prospect of ceding control to the great unwashed). Interestingly, Visual Basic succeeded *despite* the language (BASIC, probably the most widely derided language of all time. Or perhaps it shares that crown with COBOL). &lt;br /&gt;
&lt;br /&gt;
The party didn't last long however, as by the late 90's the internet had fundamentally changed the rules of the game.&lt;br /&gt;
&lt;br /&gt;
VB, PowerBuilder and the like suffered from an implicit assumption of a client-server architecture, and were not prepared for a webified world. They didn't (all) disappear of course, with Visual Basic in particular finding a significant role as Microsoft's mainstream server-side language, and it lives on in Visual Studio. Yet it lost it's revolutionary edge, and had to be content to simply fit in as an "also can do in this language" alternative.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Web Development - a case of one step back and one step forward?&lt;/h3&gt;You would think that over the past 20 years, web development would have been able to leap far ahead of what was best practice in client-server computing at the time.&lt;br /&gt;
&lt;br /&gt;
We have certainly come a long way since then, and many advances in practice and technology have become de rigueur. Here are some examples that would not have been considered normal by any stretch in 1993:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Reliance on open standard protocols at every tier: from client to server, server to database and messaging systems&lt;/li&gt;
&lt;li&gt;Global, well-known repositories of shared, reusable code (&lt;a href="https://github.com"&gt;Github&lt;/a&gt;, &lt;a href="https://rubygems.org/"&gt;Rubygems&lt;/a&gt; .. and let's not forget grand-daddy &lt;a href="http://www.cpan.org/"&gt;CPAN&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Version control. There is no argument.&lt;/li&gt;
&lt;li&gt;Automated testing tools and continuous integration.&lt;/li&gt;
&lt;li&gt;Open source is mainstream, and even preferred in many contexts.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Yet it is also salutary to reflect on some of the great innovations we saw back in 1993 that have yet to be re-invented and re-imagined successfully for the web. &lt;br /&gt;
&lt;br /&gt;
I am thinking in particular of the radical productivity that was possible with the event-driven, WYSIWYG GUI programming model. It certainly hasn't gone away (take &lt;a href="https://developer.apple.com/technologies/tools/"&gt;xcode&lt;/a&gt; for example). But why is that not the leading way of building for the web today? After all, the web is graphical and event-driven. A perfect fit one would think.&lt;br /&gt;
&lt;br /&gt;
It has perhaps been the very success of the internet, and the rapid unconstrained innovation it has enabled, that has in turn inhibited major advances in web development. &lt;br /&gt;
&lt;br /&gt;
Those that have come close (such as Adobe Flash) have ultimately failed primarily because they did not embrace the open standards of the web. And others, like Microsoft Visual Studio and Oracle JDeveloper have remained locked in proprietary silos.&lt;br /&gt;
&lt;br /&gt;
On the whole, we still work at levels of abstraction that are no higher, and many times lower, than those embodied by the best tools of 1993. It is, after all, very difficult to build abstractions over a foundation that is in constant flux. And with highly productive languages and frameworks at our disposal (like Ruby/Rails), it makes complete sense for many - myself included - to actively spurn graphical IDEs for the immense flexibility we get in return for working at the coding coalface.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;The Tide is Turning&lt;/h3&gt;Once the wild west of hackety scripts and rampant browser incompatibilities, the building blocks of the web have been coalescing. HTML5, CSS3 and leading browser rendering engines are more stable, consistent and reliable than ever. Javascript is now considered a serious language, and the community has embraced higher-level APIs like jQuery and RIA frameworks such as &lt;a href="http://emberjs.com/"&gt;ember.js&lt;/a&gt; and &lt;a href="http://backbonejs.org/"&gt;backbone.js&lt;/a&gt;. Web design patterns are more widely understood than ever, with kits like &lt;a href="http://twitter.github.com/bootstrap/"&gt;bootstrap&lt;/a&gt; putting reusable good practice in the hands of novices.&lt;br /&gt;
&lt;br /&gt;
On the backend, our technology stacks are mature and battle-tested (&lt;a href="http://en.wikipedia.org/wiki/LAMP_%28software_bundle%29"&gt;LAMP&lt;/a&gt;, &lt;a href="http://rubyonrails.org/"&gt;Rails&lt;/a&gt;). And we have an array of cloud-ready, open source solutions for just about every back-end infrastructure need you can imagine: from BigData (&lt;a href="http://hadoop.apache.org/"&gt;Hadoop&lt;/a&gt;, &lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt; ..) to messaging (&lt;a href="http://www.rabbitmq.com/"&gt;RabbitMQ&lt;/a&gt;, &lt;a href="http://www.zeromq.org/"&gt;ØMQ&lt;/a&gt; ..) and more.&lt;br /&gt;
&lt;br /&gt;
My sense is that in the past couple of years we have been edging towards the next leap forward. Our current plateau is now well consolidated. Yet despite efforts such as &lt;a href="http://www.codecademy.com/"&gt;codecademy&lt;/a&gt; to open up software coding to all, web development remains as complex as ever. To do it well, you really need to master a dizzying array of technologies and standards.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Time for Web Development to Level Up&lt;/h3&gt;What does the next level offer? We don't know yet, but I'd suggest the following as some of the critical concerns for next gen web development:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;a unified development experience: the ability to build a full-stack application as one without the need for large conceptual and technological leaps from presentation, to business logic, to infrastructure concerns.&lt;/li&gt;
&lt;li&gt;implicit support for distributed event handling: a conventional mechanism for events raised on a client or server to be consumed by another client or server.&lt;/li&gt;
&lt;li&gt;event-driven GUI development: draw a web page as you want it to be presented, hook up events and data sources.&lt;/li&gt;
&lt;li&gt;it is mobile: more than just responsive web design. Explicit suport for presenting appropriately on the full range of desktop, tablet and mobile devices&lt;/li&gt;
&lt;li&gt;distributed data synchronisation: whether data is used live on a web page, stored for HTML5 offline, or synchronized with a native mobile application, our tools know how to distribute and synchronize updates.&lt;/li&gt;
&lt;li&gt;(ideally) let's not have to go back to square one and re-invent our immense investments in standard libraries and reusable code (like the extensive collection of &lt;a href="https://rubygems.org/"&gt;ruby gems&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Do we have the perfect solution yet? No. &lt;br /&gt;
&lt;br /&gt;
But we are starting to see enticing inklings of what the future may look like. Perhaps one of the most compelling and complete visions is that provided by the &lt;a href="http://www.meteor.com/"&gt;meteor&lt;/a&gt; project. It is very close.&lt;br /&gt;
&lt;br /&gt;
Will meteor streak ahead to gain massive mid-share and traction? Or will an established platform like Rails take another giant step forward? Or is there something else in the wings we don't know about yet?&lt;br /&gt;
&lt;br /&gt;
It will be an interesting year. And if the signs are to be trusted, I expect we'll look back on 2013 as a tipping point in web development - its &lt;b&gt;VB3 moment&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
Do you think we're in for such a radical shift? Or heading in a different direction altogether? Or will inertia simply carry the status quo... I'd love to hear what others think!&lt;br /&gt;
&lt;br /&gt;
</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/7725312030120731234/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=7725312030120731234" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7725312030120731234?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7725312030120731234?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2013/01/2013-time-for-web-development-to-have.html" title="2013: Time for web development to have its VB3 moment" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DUEHQX46cSp7ImA9WhBTGUk.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-7526548501498852172</id><published>2013-01-03T18:35:00.002+08:00</published><updated>2013-02-16T01:00:30.019+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-16T01:00:30.019+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Publishing" /><category scheme="http://www.blogger.com/atom/ns#" term="FLOSS" /><category scheme="http://www.blogger.com/atom/ns#" term="ebook" /><title>How to make an eBook</title><content type="html">&lt;span style="font-style:italic;float:right;"&gt;(blogarhythm ~ &lt;a href="http://www.youtube.com/watch?v=xW1aG0ng0nQ"&gt;Land of a Thousand Words&lt;/a&gt; - Scissor Sisters)&lt;/span&gt; &lt;br /&gt;
&lt;br /&gt;
So eBook sales have surpassed hardcover &lt;a href="http://mashable.com/2012/06/17/ebook-hardcover-sales/"&gt;for the first time&lt;/a&gt;, and it is no surprise that the rise of the tablets is the main driver.&lt;br /&gt;
&lt;br /&gt;
There's something quite comfortable about having a nice digital bundle of information at your fingertips, like warm buttered toast.&lt;br /&gt;
&lt;br /&gt;
With relatively open standards and the ubiquity of ereaders, the ebook has become ideal packaging for all manner of information, from training manuals to open source project documentation. Or even that book that apparently 81% of us believe we have inside.  &lt;br /&gt;
&lt;br /&gt;
So how do you make an ebook? My first thought on searching for options is that we are pretty spoiled for choice. But there are important caveats to note, like how Apple iBooks Author can only publish in full fidelity to iTunes Book Store. And we can't get far before needing to study up on the various formats out there: &lt;a href="http://en.wikipedia.org/wiki/EPUB"&gt;EPUB&lt;/a&gt; is widely used, but not without its criticisms and edge-cases especially when trying to push the boundaries with multimedia and social aspects; the Kindle and other ereaders expect &lt;a href="http://en.wikipedia.org/wiki/MOBI"&gt;Mobi&lt;/a&gt;; and Kindle Fire introduced the &lt;a href="https://kdp.amazon.com/self-publishing/help?topicId=200798080"&gt;KF8&lt;/a&gt; format.&lt;br /&gt;
&lt;br /&gt;
The good news is that producing pretty standard EPUB, Mobi, PDF and HTML variants of your book can be done very easily with a range of commercial and non-commercial tools. It's even possible to &lt;a href="http://www.jedisaber.com/eBooks/Introduction.shtml"&gt;build an EPUB by hand&lt;/a&gt; with just a text editor if you are game.&lt;br /&gt;
&lt;br /&gt;
I started to experiment with some open source toolchains to see just how well they work in practice. Personally, I'm liking the simplicity of using &lt;a href="http://johnmacfarlane.net/pandoc/"&gt;pandoc&lt;/a&gt; to build a range of output formats from &lt;a href="http://en.wikipedia.org/wiki/Markdown"&gt;markdown&lt;/a&gt; source files.&lt;br /&gt;
&lt;br /&gt;
My experiments are in the &lt;a href="https://github.com/tardate/ebook-toolchains"&gt;eBook Toolchains&lt;/a&gt; project on github if you'd like to examine the various approaches I've tried. Have you tried something that's not there? I'd love to hear about it - comment below or better yet, send me a pull-request on the github project with your examples added!   &lt;br /&gt;
</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/7526548501498852172/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=7526548501498852172" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7526548501498852172?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7526548501498852172?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2013/01/how-to-make-ebook.html" title="How to make an eBook" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DUAASX8yeSp7ImA9WhBTGUk.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-2479902694936125169</id><published>2012-12-14T10:43:00.002+08:00</published><updated>2013-02-16T01:02:28.191+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-16T01:02:28.191+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Listen" /><title>Vale Conversations Network</title><content type="html">&lt;span style="font-style:italic;float:right;"&gt;(blogarhythm ~ &lt;a href="http://www.youtube.com/watch?v=rAiq4v3epKM"&gt;end roll 浜崎あゆみ&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
So I just listened to the last IT Conversations podcast of all time &lt;a href="http://itc.conversationsnetwork.org/shows/detail5331.html"&gt;All's Well That Ends Well&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
I'll miss the curation they provided. Did you know that 8 out of 10 interesting facts I quote at dinner parties I learned on the network? ;-)&lt;br /&gt;
&lt;br /&gt;
And still learning: IT Conversations was the 2nd podcast ever? Apparently Doug Kaye uploaded a feed the day after &lt;a href="http://en.wikipedia.org/wiki/Dave_Winer"&gt;Dave Winer&lt;/a&gt; posted his first example of using the &lt;a href="http://en.wikipedia.org/wiki/RSS_enclosure"&gt;RSS enclosure&lt;/a&gt; tag.&lt;br /&gt;
&lt;br /&gt;
I'm not sure the Conversations Network couldn't have remained relevant and valuable for years to come, but it is an admirable decision to go out on a high and close down gracefully - importantly taking the time and care to ensure that the content archives remain available indefinitely.&lt;br /&gt;
</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/2479902694936125169/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=2479902694936125169" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/2479902694936125169?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/2479902694936125169?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2012/12/vale-conversations-network.html" title="Vale Conversations Network" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CUUMRHw_eCp7ImA9WhNTGUw.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-3395451458003350399</id><published>2012-10-22T21:41:00.000+08:00</published><updated>2012-10-22T21:41:25.240+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-22T21:41:25.240+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>Building C# on MacOSX with Sublime Text</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://mono-project.com/Main_Page" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img border="0" height="41" width="167" src="http://3.bp.blogspot.com/-3kIkEUdm9pI/UIU-Wqn19yI/AAAAAAAACUA/DGNH3z2puMQ/s320/mp-mono-logo.png" /&gt;&lt;/a&gt;&lt;/div&gt;It's been a while since I last cranked up &lt;a href="http://mono-project.com/Main_Page"&gt;mono&lt;/a&gt; to compile some &lt;a href="http://en.wikipedia.org/wiki/C_Sharp_(programming_language)"&gt;C#&lt;/a&gt;, and this time I'm on a Mac.&lt;br /&gt;
&lt;br /&gt;
Fortunately, no dramas. The mono team have made it a very smooth process. I simply &lt;a href="http://www.go-mono.com/mono-downloads/download.html"&gt;downloaded&lt;/a&gt; and installed the Mono SDK (it is packaged as a standard disk image [.dmg]). That's enough to compile and run simple projects. &lt;br /&gt;
&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;$ mcs hello_world.cs
$ mono hello_world.exe&lt;/pre&gt;&lt;br /&gt;
There's a whole cross-platform IDE available now called &lt;a href="http://monodevelop.com/"&gt;MonoDevelop&lt;/a&gt; and it looks great if you are doing serious C#. Right now though, I was happy enough to build from the command line .. or from my favourite editor of the moment, &lt;a href="http://www.sublimetext.com/"&gt;Sublime Text&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Setting up a C# &lt;a href="http://docs.sublimetext.info/en/latest/file_processing/build_systems.html"&gt;build system&lt;/a&gt; is trivial. From the "Tools | Build System" choose "New Build System..." option. My version simply associates with all .cs files and passes them to the mcs compiler:&lt;br /&gt;
&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;{
  "cmd": ["mcs","$file"],
  "selector": "source.cs"
}&lt;/pre&gt;Then when you are in a C# file you can simply &lt;strong&gt;&amp;#8984;B&lt;/strong&gt; to compile. Like this:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-ro9cjk-DARg/UIU92nlC_iI/AAAAAAAACTo/P1Z3f7IYhFQ/s1600/cs_build.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="271" width="400" src="http://4.bp.blogspot.com/-ro9cjk-DARg/UIU92nlC_iI/AAAAAAAACTo/P1Z3f7IYhFQ/s400/cs_build.png" /&gt;&lt;/a&gt;&lt;/div&gt;And you get a .exe that runs under mono from the bash prompt. Wild!&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-EFcuuPHU5ys/UIU96bdFtlI/AAAAAAAACT0/rVMt1iD12nU/s1600/cs_run.png" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="161" width="400" src="http://2.bp.blogspot.com/-EFcuuPHU5ys/UIU96bdFtlI/AAAAAAAACT0/rVMt1iD12nU/s400/cs_run.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://youtu.be/TgKB8zG5qP0"&gt;Because It's There&lt;/a&gt; - Michael Hedges #NP&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/3395451458003350399/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=3395451458003350399" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/3395451458003350399?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/3395451458003350399?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2012/10/building-c-on-macosx-with-sublime-text.html" title="Building C# on MacOSX with Sublime Text" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-3kIkEUdm9pI/UIU-Wqn19yI/AAAAAAAACUA/DGNH3z2puMQ/s72-c/mp-mono-logo.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEYAQHo_eSp7ImA9WhNTEU4.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-2604626117046459421</id><published>2012-10-13T20:42:00.000+08:00</published><updated>2012-10-13T20:42:21.441+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-10-13T20:42:21.441+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="FLOSS" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Python" /><title>The Full Monty - from Ruby to Python n00bie</title><content type="html">&lt;iframe src="http://rcm.amazon.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=itsaprli-20&amp;o=1&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=1849514666" style="width:120px;height:240px;float:right;margin-left:20px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"&gt;&lt;/iframe&gt; Ruby developers are a pretty spoilt bunch these days. The community has overall done a great job of rolling many of the advances in modern development practice into the tools and conventions we unconsciously put to work every day.&lt;br /&gt;
&lt;div class="separator" style="xclear: both; text-align: center;"&gt;&lt;a href="http://noobie2ruby.pp.ua" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="200" width="164" src="http://2.bp.blogspot.com/-JbHZI1FwFuw/UHlddjVAu-I/AAAAAAAACS4/v4gJP_Gt-f8/s200/pymatz.jpg" title="Matz! What are you doing?!"/&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;Now I wonder what life is like in the Python community?&lt;/b&gt; Like many Rubyists, I've played around with Python and Jython on and off. But nothing serious. And although you could get into a pedantic syntax war, I suspect for the most part the Python and Ruby communities don't overlap simply because once you dive into one camp, the only real reason you would switch to the other is because of some external driver (like a client's development standards).   &lt;br /&gt;
&lt;br /&gt;
It was a casual discussion about testing that re-ignited my interest in taking a peek over the fence. I picked up a copy of Greg L. Turnquist's &lt;strong&gt;Python Testing Cookbook&lt;/strong&gt; and enjoyed playing around with a couple of the Python testing tools. It's an excellent book for ramping up your testing skills with Python - eminently clear and practical. &lt;br /&gt;
&lt;br /&gt;
I was pretty sure that if any language community came close to matching Ruby's approach to development it would be Python. But is that true? &lt;br /&gt;
&lt;br /&gt;
Most comparisons of Ruby and Python (like &lt;a href="http://c2.com/cgi/wiki?PythonVsRuby"&gt;here&lt;/a&gt;, &lt;a href="http://danvk.org/josephus.html"&gt;here&lt;/a&gt; and &lt;a href="http://dev.pocoo.org/~mitsuhiko/pythonruby.html"&gt;here&lt;/a&gt;) focus on language syntax and features. Conclusion? &lt;br /&gt;
&lt;blockquote class="quote"&gt;same but different!&lt;br /&gt;
&lt;/blockquote&gt;What I find more interesting is a comparison of the fundamental productivity patterns used in each community, assuming your goal is to produce high-quality code that can be reliably distributed or deployed, and likely makes liberal use of other - probably open source - code components.&lt;br /&gt;
&lt;br /&gt;
So here is a rundown for some of the common patterns I could not do without when developing in Ruby, and what appear to be the leading Python equivalents - according to my research as of Oct-2012, but I welcome corrections and further information from any Python experts out there!&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Environment Partitioning&lt;/h3&gt;We don't like dependencies from other projects leaking over to contaminate and confound what we are trying to work on. While you could run up a separate VM for each project, it is much better if you have tools that can keep installed libraries and even the language distributions separate for each project.&lt;br /&gt;
&lt;br /&gt;
&lt;b style="color:red"&gt;The Ruby Way&lt;/b&gt;: &lt;a href="https://rvm.io/"&gt;rvm&lt;/a&gt; is the leading tool for creating isolated ruby and gemset environments. A less intrusive alternative is &lt;a href="https://github.com/sstephenson/rbenv"&gt;rbenv&lt;/a&gt; (compared &lt;a href="http://jonathan-jackson.net/rvm-and-rbenv"&gt;here&lt;/a&gt;).&lt;br /&gt;
&lt;b style="color:green"&gt;The Python Way&lt;/b&gt;: &lt;a href="http://pypi.python.org/pypi/virtualenv"&gt;virtualenv&lt;/a&gt; creates isolated Python environments. Ref: &lt;a href="http://stackoverflow.com/questions/2812471/is-there-a-python-equivalent-of-rubys-rvm"&gt;SO&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Dependency Management&lt;/h3&gt;It is likely our project will make use of other packages. We want automatic dependency management so that we can easy deploy predictable compositions of code packages.&lt;br /&gt;
 &lt;br /&gt;
&lt;b style="color:red"&gt;The Ruby Way&lt;/b&gt;: &lt;a href="http://gembundler.com/"&gt;bundler&lt;/a&gt;&lt;br /&gt;
&lt;b style="color:green"&gt;The Python Way&lt;/b&gt;: &lt;a href="http://pypi.python.org/pypi"&gt;pip&lt;/a&gt; with a requirements.txt file. Ref: &lt;a href="http://stackoverflow.com/questions/8726207/what-is-softwares-in-python-which-are-alternative-to-rubys-bundler-perls-car"&gt;SO&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Reusable Code Packaging&lt;/h3&gt;For anything more than trivial scripts, we probably want to package our project so that it can be reliably distributed or deployed.&lt;br /&gt;
 &lt;br /&gt;
&lt;b style="color:red"&gt;The Ruby Way&lt;/b&gt;: we use &lt;a href="http://guides.rubygems.org/specification-reference/"&gt;gems&lt;/a&gt;. Easily built by hand, or bootstrapped with a tool like &lt;a href="http://gembundler.com/rubygems.html"&gt;bundler&lt;/a&gt; or &lt;a href="http://rubygems.org/gems/jeweler"&gt;jeweler&lt;/a&gt;&lt;br /&gt;
&lt;b style="color:green"&gt;The Python Way&lt;/b&gt;: use &lt;a href="http://peak.telecommunity.com/DevCenter/setuptools"&gt;setuptools&lt;/a&gt; (enhancements to the Python distutils) to build and distribute &lt;a href="http://peak.telecommunity.com/DevCenter/PythonEggs"&gt;eggs&lt;/a&gt;. Ref: &lt;a href="http://stackoverflow.com/questions/2026395/how-to-create-python-egg-file"&gt;SO&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Reusable Code Distribution&lt;/h3&gt;Both Ruby and Python are very open-source oriented programming communities. Not only do we consume a great deal, but it's likely we'll often want to make our own contributions easily available to others.&lt;br /&gt;
&lt;br /&gt;
&lt;b style="color:red"&gt;The Ruby Way&lt;/b&gt;: &lt;a href="http://rubygems.org/"&gt;RubyGems&lt;/a&gt; for distribution, with source code most often found on &lt;a href="https://github.com"&gt;github&lt;/a&gt;. &lt;br /&gt;
&lt;b style="color:green"&gt;The Python Way&lt;/b&gt;: &lt;a href="http://pypi.python.org/pypi"&gt;pip&lt;/a&gt;. And source code also seems to be showing up more on &lt;a href="https://github.com"&gt;github&lt;/a&gt; than historical use of svn repositories. Ref: &lt;a href="http://www.quora.com/Is-there-a-Python-equivalent-for-Rubys-Gem-or-Perls-CPAN-system"&gt;quora&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Project Build Tool&lt;/h3&gt;We'd prefer a common approach to running project build, doc, install and test tasks rather than rolling our own for each project.&lt;br /&gt;
&lt;br /&gt;
&lt;b style="color:red"&gt;The Ruby Way&lt;/b&gt;: &lt;a href="http://rake.rubyforge.org/"&gt;rake&lt;/a&gt;. &lt;br /&gt;
&lt;b style="color:green"&gt;The Python Way&lt;/b&gt;: this one I'm not so sure of. It seems most projects simply provide a custom setup script using &lt;a href="http://docs.python.org/distutils/index.html"&gt;distutils&lt;/a&gt;, but there are a &lt;a href="http://stackoverflow.com/questions/1407837/is-there-an-rake-equivalent-in-python"&gt;variety of projects&lt;/a&gt; that support more complex build requirements. Ref: &lt;a href="http://stackoverflow.com/questions/1407837/is-there-an-rake-equivalent-in-python"&gt;SO&lt;/a&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Automated Testing&lt;/h3&gt;It's 2012 already, we know that automated testing is a cornerstone of quality software. Especially so for code that is going to be widely shared and reused. Whether you do TDD, BDD or simply unit test, we all have a good test framework or two on our toolbelt.&lt;br /&gt;
&lt;br /&gt;
&lt;b style="color:red"&gt;The Ruby Way&lt;/b&gt;: &lt;a href="http://test-unit.rubyforge.org/"&gt;Test::Unit&lt;/a&gt;, &lt;a href="https://www.relishapp.com/rspec"&gt;RSpec&lt;/a&gt;, &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt; amongst others. It is extremely rare to find a project these days that doesn't have tests of some flavour. &lt;br /&gt;
&lt;b style="color:green"&gt;The Python Way&lt;/b&gt;: &lt;a href="http://docs.python.org/library/unittest.html"&gt;unittest&lt;/a&gt; (sometimes called PyUnit) and &lt;a href="http://docs.python.org/library/doctest.html"&gt;doctest&lt;/a&gt; are common frameworks for unit testing and TDD. &lt;a href="https://github.com/nose-devs/nose"&gt;nose&lt;/a&gt; is a test runner, especially good for non-trivial projects. &lt;a href="https://github.com/gabrielfalcao/lettuce"&gt;Lettuce&lt;/a&gt; is the rough Python equivalent of Cucumber. Like Ruby, there are many other projects to assist testing such as mocking tools like &lt;a href="https://github.com/edgeware/mockito-python"&gt;Mockito&lt;/a&gt;.&lt;br /&gt;
&lt;b style="color:blue"&gt;Bonus&lt;/b&gt;: open source projects have been rapidly adopting &lt;a href="https://travis-ci.org/"&gt;Travis&lt;/a&gt; for automated continuous integration on the back of a &lt;a href="https://github.com"&gt;github&lt;/a&gt; commit. And it works for &lt;b style="color:red"&gt;Ruby&lt;/b&gt; and &lt;b style="color:green"&gt;Python&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-style: italic;"&gt;Blogarhythm: &lt;a href="http://youtu.be/SJUhlRoBL8M"&gt;Always Look On The Bright Side Of Life&lt;/a&gt; - Eric Idle/Monty Python&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/2604626117046459421/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=2604626117046459421" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/2604626117046459421?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/2604626117046459421?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2012/10/the-full-monty-from-ruby-to-python.html" title="The Full Monty - from Ruby to Python n00bie" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-JbHZI1FwFuw/UHlddjVAu-I/AAAAAAAACS4/v4gJP_Gt-f8/s72-c/pymatz.jpg" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CEAESXg6fSp7ImA9WhJSFEs.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-4230791482981442018</id><published>2012-07-04T19:27:00.000+08:00</published><updated>2012-07-05T12:31:48.615+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-07-05T12:31:48.615+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Entrepreneur" /><category scheme="http://www.blogger.com/atom/ns#" term="Deep thoughts" /><title>Are You Experienced?</title><content type="html">How many times have you seen a webdev job ad that asks for things like:&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class="quote"&gt;Minimum 5 years experience in Ruby on Rails, html5, JQuery, Mongo DB, and building andriod and iphone/ipad apps&lt;br /&gt;
&lt;/blockquote&gt;&lt;br /&gt;
So it just came up again on a mailing list, and we all had a good lol.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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! &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;When when specifying technical job roles, it comes back to the key question of how do we ask: "Are you experienced?"&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://www.dangerousminds.net/comments/jimi_hendrix_job_interview" imageanchor="1" style="clear:right; float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/div&gt;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.&lt;br /&gt;
&lt;br /&gt;
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).&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;I'm still learning new things every month - probably at an even faster rate than when I was a fresh grad&lt;/li&gt;
&lt;li&gt;Half of what I learned last year is now obsolete, probably never to be called on again&lt;/li&gt;
&lt;li&gt;I've lost count of the number of times I've developed mastery in something for 1 project, and never used it again&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
IMHO, the fundamental skill that great developers share is the ability to learn and assimilate. You don't want them stuck in a rut.&lt;br /&gt;
&lt;br /&gt;
So how do we measure it? Rather than years of service, we need indicators of applied learning, for example:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;A single significant project delivery (i.e. that goes live) is often enough to develop a good mastery of a technology&lt;/li&gt;
&lt;li&gt;Multiple project deliveries demonstrates the ability to hone and apply that knowledge in different scenarios&lt;/li&gt;
&lt;li&gt;Working with various technologies over time demonstrates flexibility and adaptability to the new&lt;/li&gt;
&lt;li&gt;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)&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
So when I write a job ad for a technical role, I'd suggest defining the technical requirements along these lines:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;5+ years professional web development experience &lt;br /&gt;
&lt;b&gt;[a guide to the level of seniority within the general professional discipline]&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Delivered multiple projects and current experience using: Rails 3.x, PostgreSQL 9.x, git &lt;br /&gt;
&lt;b&gt;[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;-)]&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Ideally, recent project experience using one of more of the following technologies: capistrano, redis, and MongoDb. &lt;br /&gt;
&lt;b&gt;[technologies you use or are planning to use, but it won't kill you to allow the person time to get up to speed]&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;Experience contributing to or founding open source projects &lt;br /&gt;
&lt;b&gt;[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]&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
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".&lt;br /&gt;
&lt;br /&gt;
Of course that still leaves a whole range of matters such as soft-skills and how you actually go about &lt;i&gt;selling&lt;/i&gt; your startup vacancy. You can find this and more in the most excellent &lt;a href="http://rtfm.jfdi.asia/hiring-and-firing/"&gt;JFDI Hiring &amp; Firing&lt;/a&gt; guide.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://youtu.be/zg2segLZoeA"&gt;Are You Experienced? - Jimi Hendrix&lt;/a&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/4230791482981442018/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=4230791482981442018" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/4230791482981442018?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/4230791482981442018?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2012/07/are-you-experienced.html" title="Are You Experienced?" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-ZJnGg3Bpz3c/T_QmfznxpXI/AAAAAAAACKk/Go_jU-2aaTA/s72-c/are_you_experienced.jpeg" height="72" width="72" /><thr:total>3</thr:total></entry><entry gd:etag="W/&quot;CUUCRHg7eip7ImA9WhVbEEU.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-6554592132723762913</id><published>2012-05-27T09:39:00.000+08:00</published><updated>2012-05-27T09:47:45.602+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-27T09:47:45.602+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Software" /><category scheme="http://www.blogger.com/atom/ns#" term="Design" /><category scheme="http://www.blogger.com/atom/ns#" term="Deep thoughts" /><title>gource - cool and not totally pointless</title><content type="html">Run &lt;a href="http://code.google.com/p/gource/"&gt;gource&lt;/a&gt; on a source code repository and it animates the code's evolution. I think I first saw it used to illustrate the &lt;a href="http://www.youtube.com/watch?v=aPk1BqK8zzI"&gt;history of Python development since 1990&lt;/a&gt;, and I must admit my first reaction was &lt;i&gt;cool but probably pointless&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Recently &lt;a href="https://twitter.com/#!/dmm6319"&gt;@dmm6319&lt;/a&gt; ran it over our own project, and inspired me to play around a bit with it too.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://youtu.be/6z_7VO3RPn8" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="228" width="400" src="http://3.bp.blogspot.com/-MTrOfKwgUfY/T8F_5yEQ4YI/AAAAAAAACJE/MsQpdoO0q8w/s400/babylish-04-May-2012.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
So after watching our animation a few times I'm sheepishly revising my opinion of gource.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.amazon.com/gp/product/B00168LEB4/ref=as_li_ss_tl?ie=UTF8&amp;tag=itsaprli-20&amp;linkCode=as2&amp;camp=1789&amp;creative=390957&amp;creativeASIN=B00168LEB4"&gt;Asik Veysel - Joe Satriani&lt;/a&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/6554592132723762913/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=6554592132723762913" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/6554592132723762913?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/6554592132723762913?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2012/05/gource-cool-and-not-totally-pointless.html" title="gource - cool and not totally pointless" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-MTrOfKwgUfY/T8F_5yEQ4YI/AAAAAAAACJE/MsQpdoO0q8w/s72-c/babylish-04-May-2012.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkIHR30-eSp7ImA9WhVREEQ.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-7538126952358722850</id><published>2012-03-19T01:00:00.001+08:00</published><updated>2012-03-19T01:08:56.351+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-19T01:08:56.351+08:00</app:edited><title>Rails + Ember + MongoDB + bootstrap</title><content type="html">&lt;div class="separator" style="float: right;"&gt;&lt;a href="https://github.com/evendis/rails-ember-mongo-bootstrap-demo" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="400" width="344" src="http://3.bp.blogspot.com/-O0Pk3vrcgF4/T2YRwayNMGI/AAAAAAAACCs/MobXBR8iSQQ/s400/rails-ember-mongo-bootstrap-demo.png" /&gt;&lt;/a&gt;&lt;/div&gt;I was fired up to try out &lt;a href="http://emberjs.com/"&gt;ember.js&lt;/a&gt; after seeing &lt;a href="https://github.com/cameronpriest"&gt;Cameron's&lt;/a&gt; presentation at the last &lt;a href="http://groups.google.com/group/singapore-rb"&gt;Singapore Ruby Brigade&lt;/a&gt; meetup.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;ruby 1.9.3 + rails 3.2.2 with &lt;a href="http://github.com/rspec/rspec-rails"&gt;rspec-rails&lt;/a&gt; and &lt;a href="https://github.com/thoughtbot/factory_girl_rails"&gt;factory_girl_rails&lt;/a&gt; for testing&lt;/li&gt;
&lt;li&gt;&lt;a href="http://haml-lang.com/"&gt;haml&lt;/a&gt; - templating for a pure rails alternative to compare with the ember app&lt;/li&gt;
&lt;li&gt;&lt;a href="http://github.com/mongoid/mongoid"&gt;mongoid&lt;/a&gt; - using MongoDB for server-side persistence, to see how this plays with ember&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/josevalim/inherited_resources"&gt;inherited_resources&lt;/a&gt; - for super thin controllers. Works beautifully with ember and Mongo (I literally wrote just a single line in the server-side controller&lt;/li&gt;
&lt;li&gt;&lt;a href="http://emberjs.com/"&gt;ember.js&lt;/a&gt; - the ember distribution...&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/emberjs/ember-rails"&gt;ember-rails&lt;/a&gt; - makes it easy to add ember to the project (gem installed with bundler)&lt;/li&gt;
&lt;li&gt;CoffeeScript - for the ember scripting&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cerebris/ember-rest"&gt;ember-rest&lt;/a&gt; - a simple RESTful resource adapter between ember and rails&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/seyhunak/twitter-bootstrap-rails"&gt;twitter-bootstrap-rails&lt;/a&gt; - a gem packaging of &lt;a href="http://twitter.github.com/bootstrap/index.html"&gt;twitter bootstrap&lt;/a&gt; (adds LESS to the asset pipeline)&lt;/li&gt;
&lt;/ul&gt;&lt;br /&gt;
Surprisingly, this all hangs together without too much fuss! You can see &amp; fork the demo at &lt;a href="https://github.com/evendis/rails-ember-mongo-bootstrap-demo"&gt;rails-ember-mongo-bootstrap-demo&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What's next? &lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;em&gt;Testing:&lt;/em&gt; 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.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Relations:&lt;/em&gt; perhaps switching to ember-data to test some non-trivial model associations&lt;/li&gt;
&lt;li&gt;&lt;em&gt;ember-bootstrap:&lt;/em&gt; adds bootstrap components to ember. Sounds promising but my initial attempts to use it weren't too successful&lt;/li&gt;
&lt;/ol&gt;&lt;br /&gt;
&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://youtu.be/YjRD4hHEdRE"&gt;Remember - Jimi Hendrix&lt;/a&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/7538126952358722850/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=7538126952358722850" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7538126952358722850?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7538126952358722850?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2012/03/rails-ember-mongodb-bootstrap.html" title="Rails + Ember + MongoDB + bootstrap" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-O0Pk3vrcgF4/T2YRwayNMGI/AAAAAAAACCs/MobXBR8iSQQ/s72-c/rails-ember-mongo-bootstrap-demo.png" height="72" width="72" /><thr:total>1</thr:total></entry><entry gd:etag="W/&quot;DEMDRXw_eip7ImA9WhRTFko.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-1142132667093820185</id><published>2011-11-07T22:34:00.000+08:00</published><updated>2011-11-07T22:34:34.242+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-07T22:34:34.242+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="Rails" /><title>Adding Mobile Support with Web 2.0 Touch to the NoAgenda Attack Vector Dashboard</title><content type="html">The 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). &lt;br /&gt;
&lt;br /&gt;
You might have got started (like me) with Jonathan Stark's excellent books &lt;a href="http://www.amazon.com/gp/product/0596805780/ref=as_li_ss_tl?ie=UTF8&amp;tag=itsaprli-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399369&amp;creativeASIN=0596805780"&gt;Building iPhone Apps with HTML, CSS, and JavaScript&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=itsaprli-20&amp;l=as2&amp;o=1&amp;a=0596805780&amp;camp=217145&amp;creative=399369" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; and &lt;a href="http://www.amazon.com/gp/product/1449383262/ref=as_li_ss_tl?ie=UTF8&amp;tag=itsaprli-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399369&amp;creativeASIN=1449383262"&gt;Building Android Apps with HTML, CSS, and JavaScript&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=itsaprli-20&amp;l=as2&amp;o=1&amp;a=1449383262&amp;camp=217145&amp;creative=399369" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;, and maybe tried the &lt;a href="http://www.jqtouch.com/"&gt;jQTouch&lt;/a&gt; framework that these spawned. Meanwhile, the official &lt;a href="http://jquerymobile.com/"&gt;jQuery mobile framework&lt;/a&gt; has slowly been moving to fruition.&lt;br /&gt;
&lt;br /&gt;
I recently discovered another project - &lt;a href="https://github.com/web20boom/Web-2.0-Touch"&gt;Web 2.0 Touch&lt;/a&gt; - 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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Now I'm not going to stop tracking the jQuery Mobile project or other solutions like &lt;a href="http://rhomobile.com/"&gt;Rhomobile&lt;/a&gt;, but if all you need is a quick, functional and good looking mobile view, then Web 2.0 Touch is well worth a look.&lt;br /&gt;
&lt;br /&gt;
The &lt;a href="http://noagendadashboard.com/"&gt;&lt;b&gt;NoAgenda Attack Vector Dashboard&lt;/b&gt;&lt;/a&gt; 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 &lt;br /&gt;
&lt;a href="https://github.com/tardate/noagenda_dashboard"&gt;GitHub&lt;/a&gt;. I'll just describe a couple of the features here...&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Differentiated Views&lt;/h3&gt;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.&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
 &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://noagendadashboard.com/" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="181" width="400" src="http://3.bp.blogspot.com/-oXmoFq77_Ag/TrfhnSY4QmI/AAAAAAAAB8U/sBN9TracXlE/s400/noagendadashboard_side-by-side.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
Rather than weigh down view code with lots of conditionals, I decided to use the MIME-type method of differentiation.&lt;br /&gt;
&lt;br /&gt;
If you haven't used this before, it essentially means registering a suitable MIME-type (I called it &lt;i&gt;mobile&lt;/i&gt;), 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.&lt;br /&gt;
&lt;br /&gt;
I've added the &lt;a href="https://github.com/fnando/browser"&gt;browser&lt;/a&gt; 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. &lt;br /&gt;
&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;# config/initializers/mime_types.rb:
Mime::Type.register_alias "text/html", :mobile

# application_controller.rb:
class ApplicationController &amp;lt; ActionController::Base
  before_filter { request.format = :mobile if (browser.iphone? || browser.android?) }
end
&lt;/pre&gt;With that in place, my *.mobile.haml view and layout files just need to focus on rendering the mobile site.&lt;br /&gt;
&lt;br /&gt;
&lt;h3&gt;Page Transitions&lt;/h3&gt;The jsTouch.loadPage method is used to load and navigate pages in the Web 2.0 Touch framework. &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;.toolbar
  %h1= t('.title')
  %a.button.back.touch_load{'data-url' =&amp;gt; menu_dashboard_path, 'data-transition' =&amp;gt; 'pop-out' }= t(:done)
.content
  = render :partial =&amp;gt; 'notes/table'&lt;/pre&gt;The &lt;i&gt;enableSmartphonePageLoad&lt;/i&gt; function runs during page load to setup the behaviour:&lt;br /&gt;
&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;  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;
    });
  },
&lt;/pre&gt;&lt;br /&gt;
&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://youtu.be/VNgcrXXgGfw"&gt;Touch - Noiseworks&lt;/a&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/1142132667093820185/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=1142132667093820185" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/1142132667093820185?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/1142132667093820185?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2011/11/adding-mobile-support-with-web-20-touch.html" title="Adding Mobile Support with Web 2.0 Touch to the NoAgenda Attack Vector Dashboard" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-oXmoFq77_Ag/TrfhnSY4QmI/AAAAAAAAB8U/sBN9TracXlE/s72-c/noagendadashboard_side-by-side.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkICQHk7fSp7ImA9WhdUFEg.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-1483541484400869029</id><published>2011-10-01T14:29:00.000+08:00</published><updated>2011-10-01T14:29:21.705+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-01T14:29:21.705+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>gitfall#1: Falling off a branch</title><content type="html">Ever had a merge fail with a &lt;b&gt;fatal: git write-tree failed to write a tree&lt;/b&gt; message out of the blue?&lt;br /&gt;
&lt;br /&gt;
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").&lt;br /&gt;
&lt;br /&gt;
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). &lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;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"&gt;&lt;img border="0" height="188" width="320" src="http://3.bp.blogspot.com/-6CecF1SzUIs/Toay9cKZndI/AAAAAAAAB7I/GngydK-K-dk/s320/gitfall01.png" /&gt;&lt;/a&gt;&lt;/div&gt;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 &lt;a href="https://github.com/tardate/gitfalls"&gt;gitfalls&lt;/a&gt; - in the expectation that there are many more git curiosities and idiosynchrasies worth a similar treatment. Enjoy!&lt;br /&gt;
&lt;br /&gt;
The script not only shows how to create the error, but two ways of resolving it and the "lost parent branch" issue:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Merge again after fixing the first failed commit. Duh!&lt;/li&gt;
&lt;li&gt;Going a bit deeper and using  git commit-tree to manufacture a new merge commit with the correct parentage&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;
Lessons learned form all of this? Perhaps:&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Avoid reorganising folder structures using folder names that once were used by files (or vice versa)&lt;/li&gt;
&lt;li&gt;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.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;
Hope you enjoy the script, and if you have any others to contribute please be my guest!&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://youtu.be/E42ZoFY8jdY"&gt;Fall Out - The Police&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/1483541484400869029/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=1483541484400869029" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/1483541484400869029?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/1483541484400869029?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2011/10/gitfall1-falling-off-branch.html" title="gitfall#1: Falling off a branch" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-6CecF1SzUIs/Toay9cKZndI/AAAAAAAAB7I/GngydK-K-dk/s72-c/gitfall01.png" height="72" width="72" /><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DE4HSXg8fip7ImA9WhdSEUg.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-3410678227482631830</id><published>2011-07-20T14:25:00.001+08:00</published><updated>2011-07-20T18:15:38.676+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-20T18:15:38.676+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Security" /><category scheme="http://www.blogger.com/atom/ns#" term="Deep thoughts" /><title>Mikko Hyppönen@TED</title><content type="html">Doing 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;-)&lt;br /&gt;&lt;br /&gt;Best served with sides of:&lt;ul&gt;&lt;li&gt;Daniel Suarez's &lt;a href="http://www.amazon.com/gp/product/0451228731/ref=as_li_ss_tl?ie=UTF8&amp;tag=itsaprli-20&amp;linkCode=as2&amp;camp=217145&amp;creative=399381&amp;creativeASIN=0451228731"&gt;Daemon&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=itsaprli-20&amp;l=as2&amp;o=1&amp;a=0451228731&amp;camp=217145&amp;creative=399381" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; - for the extreme version of how bad things can go wrong,&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ted.com/talks/rebecca_mackinnon_let_s_take_back_the_internet.html"&gt;Rebecca MacKinnon: Let's take back the Internet!&lt;/a&gt; - because maybe organised crime is the perfect distraction as we rush headlong to enslave ourselves to the Sovereigns of the Internet, and&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.twit.tv/sn291"&gt;Security Now! #291&lt;/a&gt; - for Steve Gibson's deconstruction of &lt;a href="http://en.wikipedia.org/wiki/Stuxnet"&gt;stuxnet&lt;/a&gt;, the most spohisticated Internet-borne &lt;span style="font-style:italic;"&gt;"weaponised payload"&lt;/span&gt; ever discovered... and perhaps a plausibly-deniable warning from Government(s) that "you call that a knife? THIS is a knife!"&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;!--copy and paste--&gt;&lt;object width="446" height="326"&gt;&lt;param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;param name="bgColor" value="#ffffff"&gt;&lt;/param&gt; &lt;param name="flashvars" value="vu=http://video.ted.com/talk/stream/2011G/Blank/MikkoHypponen_2011G-320k.mp4&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/MikkoHypponen-2011G.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=1192&amp;lang=eng&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;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;&amp;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /&gt;&lt;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&amp;su=http://images.ted.com/images/ted/tedindex/embed-posters/MikkoHypponen-2011G.embed_thumbnail.jpg&amp;vw=432&amp;vh=240&amp;ap=0&amp;ti=1192&amp;lang=eng&amp;introDuration=15330&amp;adDuration=4000&amp;postAdDuration=830&amp;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;"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;PS: &lt;a href="http://www.youtube.com/watch?v=cf3zxHuSM2Y"&gt;better quality vid&lt;/a&gt; on youtube. And yes, that is a 5 1/4" floppy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.youtube.com/watch?v=xp0TzDQ2oMc"&gt;Security&lt;/a&gt; - Jo Jo Zep &amp; The Falcons&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/3410678227482631830/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=3410678227482631830" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/3410678227482631830?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/3410678227482631830?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2011/07/mikko-hypponented.html" title="Mikko Hyppönen@TED" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;C0INQHo_fip7ImA9WhdTEkU.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-3958389955127098076</id><published>2011-07-10T14:36:00.008+08:00</published><updated>2011-07-10T15:06:31.446+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-10T15:06:31.446+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Scripting" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><title>It goes PING!</title><content type="html">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.&lt;br /&gt;&lt;br /&gt;Enough of that! &lt;span style="font-weight:bold;"&gt;&lt;a href="http://rubygems.org/gems/igp"&gt;igp&lt;/a&gt;&lt;/span&gt; (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. &lt;br /&gt;&lt;br /&gt;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 &lt;a href="https://github.com/djberg96/net-ping"&gt;net-ping library&lt;/a&gt; - igp really just provides a sleek command-line wrapper.&lt;br /&gt;&lt;br /&gt;The only dependency is ruby+rubygems. Just:&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;gem install igp&lt;/pre &gt;And then you are ready to capture traces, for example:&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;igp my.server.com&lt;br /&gt;#   ^ ICMP assumed by default. This is the same as:&lt;br /&gt;igp icmp://my.server.com&lt;br /&gt;&lt;br /&gt;igp http://my.insecure.server.com&lt;br /&gt;igp http://my.insecure.server-hiding-on-a-funny-port.com:8080/javascripts/all.js&lt;br /&gt;&lt;br /&gt;igp https://my.secure.server.com&lt;br /&gt;igp https://my.secure.server-hiding-on-a-funny-port.com:4443&lt;br /&gt;&lt;br /&gt;igp tcp://my.tcp-service.com:9091&lt;br /&gt;igp udp://my.udp-service.com:123&lt;br /&gt;&lt;br /&gt;igp ldap://my.insecure.ldap.server.com&lt;br /&gt;igp ldaps://my.secure.ldap.server.com&lt;/pre &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.youtube.com/watch?v=7Ev_1ctp_h8"&gt;Keep it Up&lt;/a&gt; - Snap!&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/3958389955127098076/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=3958389955127098076" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/3958389955127098076?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/3958389955127098076?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2011/07/it-goes-ping.html" title="It goes PING!" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;AkAHQXgzcSp7ImA9WhZQFk8.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-1740688119018410824</id><published>2011-04-24T14:25:00.006+08:00</published><updated>2011-04-24T15:05:30.689+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-04-24T15:05:30.689+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="reddot" /><category scheme="http://www.blogger.com/atom/ns#" term="Rails" /><title>Multi-tenancy with Rails</title><content type="html">&lt;a href="http://reddotrubyconf.com/"&gt;RedDotRubyConf 2011&lt;/a&gt; in Singapore is over. It was an amazing event (&lt;a href="http://twitter.com/ryanbigg"&gt;ryan&lt;/a&gt; takes notes so we don't have to - &lt;a href="http://ryanbigg.com/reddot-day-one"&gt;day#1&lt;/a&gt; &lt;a href="http://ryanbigg.com/reddot-day-two"&gt;day#2&lt;/a&gt;) &lt;br /&gt;&lt;br /&gt;Somehow I managed to cheat my way into a line-up of legendary speakers that included Matz himself. Here are the slides..&lt;br /&gt;&lt;div style="width:425px" id="__ss_7718621"&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/7718621" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;/div&gt;&lt;br /&gt;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'?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://youtu.be/ixl-jKLAjH4"&gt;So Many Ways&lt;/a&gt; POP DISASTER&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/1740688119018410824/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=1740688119018410824" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/1740688119018410824?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/1740688119018410824?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2011/04/multi-tenancy-with-rails.html" title="Multi-tenancy with Rails" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;C0IBQn0zcSp7ImA9WhZTFUQ.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-607053360908902374</id><published>2011-03-20T11:08:00.003+08:00</published><updated>2011-03-20T11:25:53.389+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-20T11:25:53.389+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="Web 2.0" /><title>jQuery UI AddToCalendar update</title><content type="html">Thanks to &lt;a href="https://github.com/nfarina"&gt;nfarina&lt;/a&gt; for a patch to improve compatibility with older IE versions.. &lt;a href="https://github.com/tardate/jquery.addtocalendar"&gt;jQuery UI AddToCal widget&lt;/a&gt; is stepped to 0.1.1 and now listed in the &lt;a href="http://plugins.jquery.com/project/addtocal"&gt;jQuery plugin store&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;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).&lt;br /&gt;&lt;br /&gt;See my &lt;a href="http://tardate.blogspot.com/2010/10/add-to-calendar-with-jquery-widget.html"&gt;previous post&lt;/a&gt; that describes how to use it in a bit more detail..&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.youtube.com/watch?v=69R_Uf57R0U"&gt;Birthday&lt;/a&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/607053360908902374/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=607053360908902374" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/607053360908902374?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/607053360908902374?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2011/03/jquery-ui-addtocalendar-update.html" title="jQuery UI AddToCalendar update" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;DkYBSXs4fCp7ImA9Wx9VE0o.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-5000091214207842589</id><published>2011-01-30T15:30:00.000+08:00</published><updated>2011-01-30T15:55:58.534+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-30T15:55:58.534+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Rails" /><title>Paranoid Yak Shaving</title><content type="html">So a few weeks ago I found myself wanting "soft-delete" in a Rails app. &lt;a href="http://ruby-toolbox.com/categories/activerecord_soft_delete.html"&gt;Ruby Toolbox&lt;/a&gt; is a little long in the tooth on the subject, but after a little more research I discovered xpond's &lt;a href="https://github.com/xspond/paranoid"&gt;paranoid&lt;/a&gt; project that was just what I wanted:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;packaged as a gem, not a plugin&lt;/li&gt;&lt;br /&gt;&lt;li&gt;built for Rails 3 (arel-aware in particular)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;can be selectively applied to your models&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;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).&lt;br /&gt;&lt;br /&gt;One of the beautiful things about &lt;a href="https://github.com"&gt;github&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;But that's also a great recipe for &lt;a href="http://sethgodin.typepad.com/seths_blog/2005/03/dont_shave_that.html"&gt;yak shaving&lt;/a&gt; ;-)&lt;br /&gt; &lt;br /&gt;The fixes are yet to make it into the released gem, but if you desparately need 3.0.3 support you can install from &lt;a href="https://github.com/tardate/paranoid"&gt;my repo&lt;/a&gt;. i.e. in your Gemfile:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;gem 'paranoid', '~&gt; 0.0.10', :require =&gt; 'paranoid', :git =&gt; 'git://github.com/tardate/paranoid'&lt;/pre &gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.youtube.com/watch?v=oaEjzIyB5NA"&gt;Paranoid&lt;/a&gt; (of course - but this is the bluegrass version!)&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/5000091214207842589/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=5000091214207842589" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/5000091214207842589?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/5000091214207842589?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2011/01/paranoid-yak-shaving.html" title="Paranoid Yak Shaving" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D0ACRX0-cSp7ImA9Wx9RE04.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-7077475557208301867</id><published>2010-12-14T00:41:00.006+08:00</published><updated>2010-12-14T22:09:24.359+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-14T22:09:24.359+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Rails" /><title>CruiseControlling Ruby 1.9.2 and Rails 3.0.2</title><content type="html">&lt;a href="http://cruisecontrolrb.thoughtworks.com/"&gt;CruiseControl for Ruby&lt;/a&gt; from &lt;a href="http://www.thoughtworks.com/"&gt;ThoughWorks&lt;/a&gt; has long been one of the easiest ways to your rails project under continuous integration.&lt;br /&gt;&lt;br /&gt;But there's still an issue that it &lt;a href="http://groups.google.com/group/cruisecontrolrb-rubyforge-mailing-list/browse_thread/thread/81892db289a9a360?pli=1"&gt;can't run under Ruby 1.9.x&lt;/a&gt;. That's not very good if you are targeting 1.9.2 for your project.&lt;br /&gt;&lt;br /&gt;Here's a quick recipe for how you &lt;span style="font-style:italic;"&gt;can&lt;/span&gt; build a 1.9.2 project with CC, using the wonders of &lt;a href="http://rvm.beginrescueend.com/"&gt;rvm&lt;/a&gt;..&lt;br /&gt;&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;# download and unpack CC to /usr/local/cruisecontrol-1.4.0 (or where you like)&lt;br /&gt;# for convenience, add .rvmrc in /usr/local/cruisecontrol-1.4.0 to have it run 1.8.7&lt;br /&gt;echo "rvm 1.8.7-p302" &gt; /usr/local/cruisecontrol-1.4.0/.rvmrc&lt;br /&gt;# configure CC:&lt;br /&gt;cd /usr/local/cruisecontrol-1.4.0&lt;br /&gt;./cruise add my_project_name --source-control git --repository git@github.com:myname/myproject.git&lt;br /&gt;# ^^ This will initialize the ~/.cruise/projects/my_project_name folder for a git-based project&lt;br /&gt;&lt;br /&gt;# if you have an .rvmrc file in your git repo, pre-emptively trust it to avoid clogging CC:&lt;br /&gt;mkdir ~/.cruise/projects/my_project_name&lt;br /&gt;rvm rvmrc trust ~/.cruise/projects/my_project_name&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;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):&lt;br /&gt;&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;Project.configure do |project|&lt;br /&gt;  # [.. other stuff ..]&lt;br /&gt;  project.build_command = './ccbuild.sh'&lt;br /&gt;  # [.. other stuff ..]&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;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 &amp; gemset. &lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Here's what I have in ccbuild.sh:&lt;br /&gt;&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;if [ "$(type rvm | head -1)" != "rvm is a function" ]&lt;br /&gt;then&lt;br /&gt;  source ~/.rvm/scripts/rvm || exit 1&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;if [ "$(type rvm | head -1)" != "rvm is a function" ]&lt;br /&gt;then&lt;br /&gt;  echo "rvm not properly installed and available"&lt;br /&gt;  exit 1&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;rvm use 1.9.2-p0@mygemsetname --create&lt;br /&gt;bundle check || bundle install || exit 1&lt;br /&gt;rake # setup to run all required tests by default&lt;/pre&gt;&lt;br /&gt;Once that's checked in and pushed to the repo, you can kick-off CC:&lt;br /&gt;&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;&lt;br /&gt;cd /usr/local/cruisecontrol-1.4.0&lt;br /&gt;./cruise start&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now my &lt;a href="http://ccmenu.sourceforge.net/"&gt;ccmenu&lt;/a&gt; is green, and CruiseControl is running my project under 1.9.2 and rails 3.0.2;-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.last.fm/music/ART-SCHOOL/_/Waiting+for+the+light"&gt;Waiting for the light&lt;/a&gt; ART-SCHOOL&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/7077475557208301867/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=7077475557208301867" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7077475557208301867?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7077475557208301867?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2010/12/cruisecontrolling-ruby-192-and-rails.html" title="CruiseControlling Ruby 1.9.2 and Rails 3.0.2" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;CkEDQXk9fCp7ImA9Wx5aEEs.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-726862732563185269</id><published>2010-11-06T22:14:00.012+08:00</published><updated>2010-11-07T00:24:30.764+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-07T00:24:30.764+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Entrepreneur" /><category scheme="http://www.blogger.com/atom/ns#" term="Cloud" /><category scheme="http://www.blogger.com/atom/ns#" term="Deep thoughts" /><title>Rock till you drop.io</title><content type="html">Bombshell announcement on 29-Oct: drop.io have .. &lt;a href="http://blog.drop.io/2010/10/29/an-important-update-on-the-future-of-drop-io/"&gt;struck a deal with Facebook.&lt;/a&gt;&lt;br /&gt;&lt;blockquote class="quote"&gt;What this means is that Facebook has bought most of drop.io’s technology and assets, and Sam Lessin is moving to Facebook.&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://drop.io"&gt;drop.io&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;But it doesn't work anymore.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Goodbye drop.io!&lt;/span&gt; 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.&lt;br /&gt;&lt;br /&gt;Unfortunately, that's not what I'll remember you for now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Instead, it will be for brewing a &lt;span style="font-weight:bold;"&gt;thunderstorm of concern over the very dependability of cloud services&lt;/span&gt;, as &lt;a href="http://www.pcmag.com/article2/0,2817,2372243,00.asp"&gt;John C. Dvorak&lt;/a&gt; went to town on in his column.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;And for teaching us that it's true - &lt;span style="font-weight:bold;"&gt;startup founders really don't give a toss for their customers&lt;/span&gt; if they can get a sweet deal and a plum job with one of the heavyweights instead.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;And for once again &lt;span style="font-weight:bold;"&gt;propelling Facebook into the privacy-conspiracy-theory limelight&lt;/span&gt;. 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?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, I guess drop.io does really deserve our thanks for that last point, if anyone cares to notice.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.dropbox.com/"&gt;&lt;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="" /&gt;&lt;/a&gt;&lt;span style="font-weight:bold;"&gt;The very best news&amp;mdash;for anyone who can't imagine life without drop.io&amp;mdash;is that there is another exceptional product out there called &lt;a href="http://www.dropbox.com"&gt;Dropbox&lt;/a&gt; that can handle most team sharing needs in addition to looking after your personal documents.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.youtube.com/watch?v=V5rKK3KuD8Y"&gt;Rock Rock (till you drop)&lt;/a&gt; .. Def Leppard&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/726862732563185269/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=726862732563185269" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/726862732563185269?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/726862732563185269?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2010/11/rock-till-you-dropio.html" title="Rock till you drop.io" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;D08MRXo8eyp7ImA9Wx5bFEg.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-7567381107630020256</id><published>2010-10-30T23:59:00.001+08:00</published><updated>2010-10-31T00:24:44.473+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-31T00:24:44.473+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Innovation" /><category scheme="http://www.blogger.com/atom/ns#" term="Deep thoughts" /><title>The Ultimate Steampunk Project needs $10</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.pledgebank.com/babbage"&gt;&lt;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" /&gt;&lt;/a&gt;I heard &lt;a href="http://en.wikipedia.org/wiki/John_Graham-Cumming"&gt;John Graham-Cumming&lt;/a&gt; on &lt;a href="http://twit.tv/269"&gt;TWiT #269&lt;/a&gt; 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).&lt;br /&gt;&lt;br /&gt;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 &lt;a href="http://www.steampunktribune.com/"&gt;steampunk&lt;/a&gt; project. It also has a serious educational and academic aspect (including to digitize all of Babbage's plans and notes).&lt;br /&gt;&lt;br /&gt;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. &lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align:center"&gt;&lt;a href="http://www.pledgebank.com/babbage"&gt;&lt;img border="0" src="http://www.pledgebank.com/flyers/babbage_A7_flyers1_live.png" alt="Sign my pledge at PledgeBank"&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.youtube.com/watch?v=Gv3vWR5MAFs"&gt;L.O.V.E. Machine&lt;/a&gt; WASP&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/7567381107630020256/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=7567381107630020256" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7567381107630020256?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7567381107630020256?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2010/10/ultimate-steampunk-project-needs-10.html" title="The Ultimate Steampunk Project needs $10" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_AZh6c1pzK1A/TMw61t-9BCI/AAAAAAAAB3Y/eJ6RC7zlUv8/s72-c/analytical_engine_fragment.JPG" height="72" width="72" /><thr:total>2</thr:total></entry><entry gd:etag="W/&quot;C04AQnY_fip7ImA9Wx5VEUw.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-4060966891767498225</id><published>2010-10-03T16:35:00.002+08:00</published><updated>2010-10-03T21:19:03.846+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-03T21:19:03.846+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="Rails" /><title>Add to Calendar with a jQuery Widget</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://github.com/tardate/jquery.addtocalendar"&gt;&lt;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" /&gt;&lt;/a&gt;If you deal with any kind of event-based information on your websites, you would probably really like an easy way of letting users &lt;span style="font-weight:bold;"&gt;add it to their calendar&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Unlike link sharing&amp;mdash;where there are some great drop-in solutions like &lt;a href="http://www.addtoany.com"&gt;AddToAny&lt;/a&gt; and &lt;a href="http://www.addthis.com"&gt;AddThis&lt;/a&gt;&amp;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.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://github.com/tardate/jquery.addtocalendar" style="font-weight:bold;"&gt;AddToCal&lt;/a&gt; is a &lt;span style="font-weight:bold;"&gt;jQuery UI Widget&lt;/span&gt; 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 &lt;a href="http://github.com/tardate/jquery.addtocalendar"&gt;github&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://github.com/tardate/jquery.addtocalendar/blob/master//addtocal.htm"&gt;example&lt;/a&gt; also demonstrates how to use AddToCal in conjunction with the &lt;a href="http://microformats.org/wiki/hcalendar"&gt;hCalendar microformat&lt;/a&gt; for event notation (try it out &lt;a href="http://tardate.com/addtocal/addtocal.htm"&gt;here&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;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&amp;mdash;including the iPad Calendar application;-)&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Serving iCal and vCalendar links&lt;/h3&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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 &lt;span style="font-weight:bold;"&gt;views/events/show.ics.erb&lt;/span&gt; along these lines:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;BEGIN:VCALENDAR&lt;br /&gt;PRODID:-//AddToCal Example//EN&lt;br /&gt;VERSION:2.0&lt;br /&gt;METHOD:PUBLISH&lt;br /&gt;BEGIN:VEVENT&lt;br /&gt;DTSTART:&lt;%= @event.start_time.rfc3339 %&gt;&lt;br /&gt;DTEND:&lt;%= @event.end_time.rfc3339 %&gt;&lt;br /&gt;LOCATION:&lt;%= event_url( @event ) %&gt;&lt;br /&gt;SEQUENCE:0&lt;br /&gt;UID:&lt;br /&gt;DTSTAMP:&lt;%= Time.zone.now.rfc3339 %&gt;&lt;br /&gt;DESCRIPTION:&lt;%= event_url( @event ) %&gt;\n&lt;%= @event.full_title %&gt;&lt;br /&gt;SUMMARY:&lt;%= @event.synopsis %&gt;&lt;br /&gt;PRIORITY:5&lt;br /&gt;CLASS:PUBLIC&lt;br /&gt;END:VEVENT&lt;br /&gt;END:VCALENDAR&lt;/pre&gt;&lt;br /&gt;Sharp eyes will note the unusual &lt;span style="font-style:italic;"&gt;rfc3339&lt;/span&gt; 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&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;class ActiveSupport::TimeWithZone&lt;br /&gt;  def rfc3339&lt;br /&gt;    utc.strftime("%Y%m%dT%H%M%SZ")&lt;br /&gt;  end&lt;br /&gt;end&lt;/pre&gt;&lt;br /&gt;To support vCalendar, we also implement &lt;span style="font-weight:bold;"&gt;views/events/show.vcs.erb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;BEGIN:VCALENDAR&lt;br /&gt;PRODID:-//AddToCal Example//EN&lt;br /&gt;VERSION:1.0&lt;br /&gt;BEGIN:VEVENT&lt;br /&gt;SUMMARY:&lt;%= @event.full_title %&gt;&lt;br /&gt;PRIORITY:0&lt;br /&gt;CATEGORIES:SHOW&lt;br /&gt;CLASS:PUBLIC&lt;br /&gt;DTSTART:&lt;%= @event.start_time.rfc3339 %&gt;&lt;br /&gt;DTEND:&lt;%= @event.end_time.rfc3339 %&gt;&lt;br /&gt;URL:&lt;%= event_url( @event ) %&gt;&lt;br /&gt;DESCRIPTION;ENCODING=QUOTED-PRINTABLE:&lt;%= event_url( @event ) %&gt; =0A&lt;%= @event.synopsis %&gt;&lt;br /&gt;LOCATION;ENCODING=QUOTED-PRINTABLE:&lt;%= event_url( @event ) %&gt;&lt;br /&gt;END:VEVENT&lt;br /&gt;END:VCALENDAR&lt;/pre&gt;&lt;br /&gt;Depending on your Rails version and web server, you may have to teach it about these MIME types e.g. add to &lt;span style="font-weight:bold;"&gt;config/initializers/mime_types.rb&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby:wraplines:nocontrols"&gt;Mime::Type.register "application/hbs-vcs, text/calendar, text/x-vcalendar", :vcs&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.youtube.com/watch?v=1N8BCbMqYLE"&gt;Remember - Jimi Hendrix&lt;/a&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/4060966891767498225/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=4060966891767498225" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/4060966891767498225?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/4060966891767498225?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2010/10/add-to-calendar-with-jquery-widget.html" title="Add to Calendar with a jQuery Widget" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_AZh6c1pzK1A/TKgx6nDJZyI/AAAAAAAAB28/D-bDM-wxMMo/s72-c/addtocal-example.jpg" height="72" width="72" /><thr:total>7</thr:total></entry><entry gd:etag="W/&quot;CkUNRHw-fyp7ImA9Wx5VEEQ.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-7985908155531140781</id><published>2010-10-03T15:10:00.000+08:00</published><updated>2010-10-03T15:18:15.257+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-03T15:18:15.257+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Methods" /><category scheme="http://www.blogger.com/atom/ns#" term="Deep thoughts" /><title>12 Things Every Programmer Should Know</title><content type="html">&lt;a href="http://tech.wowkhmer.com/2010/09/12-things-every-programmer-should-know/"&gt;Samnang Chhun&lt;/a&gt; posted his neat little presentation from BarCamp Phnom Penh 2010. It's a good summary of the leading memes of the moment..&lt;br /&gt;&lt;br /&gt;&lt;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" /&gt;&lt;div style="width:425px" id="__ss_5284200"&gt;&lt;object id="__sse5284200" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=12thingseveryprogrammer-100925065120-phpapp01&amp;stripped_title=12-things-every-programmer-should-know&amp;userName=samnang.chhun" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed name="__sse5284200" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=12thingseveryprogrammer-100925065120-phpapp01&amp;stripped_title=12-things-every-programmer-should-know&amp;userName=samnang.chhun" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.youtube.com/watch?v=PPc_xA3pNEA"&gt;everybody wants the same thing - scissor sisters&lt;/a&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/7985908155531140781/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=7985908155531140781" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7985908155531140781?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/7985908155531140781?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2010/10/12-things-every-programmer-should-know.html" title="12 Things Every Programmer Should Know" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry><entry gd:etag="W/&quot;DEENSX86eyp7ImA9Wx5VEEQ.&quot;"><id>tag:blogger.com,1999:blog-6220586.post-2039965347982216323</id><published>2010-10-03T14:42:00.004+08:00</published><updated>2010-10-03T17:04:58.113+08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-03T17:04:58.113+08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><title>RFC 3339 / ISO 8601 dates in javascript</title><content type="html">Many server-side languages (e.g. Ruby and Python JSON encoders) and encoding formats like &lt;a href="http://en.wikipedia.org/wiki/Atom_%28standard%29"&gt;ATOM&lt;/a&gt; send dates in &lt;a href="http://www.ietf.org/rfc/rfc3339.txt"&gt;RFC 3339&lt;/a&gt; / &lt;a href="http://en.wikipedia.org/wiki/ISO_8601"&gt;ISO 8601&lt;/a&gt; format. The standard Javascript Date object cannot parse these values, which can make client-side scripting involving dates a pain.&lt;br /&gt;&lt;br /&gt;There have been snippets of code floating around the net for ages, and various libraries that include necessary support. &lt;a href="http://github.com/tardate/rfc3339date.js"&gt;rfc3339date.js&lt;/a&gt; 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.&lt;br /&gt;&lt;br /&gt;It lets you do things like:&lt;br /&gt;&lt;pre name="code" class="sql:wraplines:nocontrols"&gt;var d = Date.parse( "2010-07-20T15:00:00.333Z" );&lt;br /&gt;&lt;br /&gt;d.toRFC3339UTCString();&lt;br /&gt;=&gt; "2010-07-20T15:00:00.333Z"&lt;br /&gt;&lt;br /&gt;d.toRFC3339UTCString(true);&lt;br /&gt;=&gt; "20100720T150000.333Z"&lt;br /&gt;&lt;br /&gt;d.toRFC3339LocaleString(true);&lt;br /&gt;=&gt; "20100720T230000.333+0800"  // assuming current timezone is GMT+8&lt;br /&gt;&lt;/pre &gt;&lt;br /&gt;The readme in the &lt;a href="http://github.com/tardate/rfc3339date.js"&gt;project repository on github&lt;/a&gt; has more information about the range of date formats supported and other methods available.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Blogarhythm: &lt;a href="http://www.youtube.com/watch?v=j_X3KmWUog4"&gt;Too Many Times - Mental as Anything&lt;/a&gt;&lt;/span&gt;</content><link rel="replies" type="application/atom+xml" href="http://tardate.blogspot.com/feeds/2039965347982216323/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6220586&amp;postID=2039965347982216323" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/2039965347982216323?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6220586/posts/default/2039965347982216323?v=2" /><link rel="alternate" type="text/html" href="http://tardate.blogspot.com/2010/10/rfc-3339-iso-8601-dates-in-javascript.html" title="RFC 3339 / ISO 8601 dates in javascript" /><author><name>Paul Gallagher</name><uri>https://plus.google.com/117145608649017960128</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh3.googleusercontent.com/-ZyktVRd0zs8/AAAAAAAAAAI/AAAAAAAAAAA/KqNXk82oY78/s512-c/photo.jpg" /></author><thr:total>0</thr:total></entry></feed>
