<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Technical Dev Blog</title>
    <description>Technical development blog of Arthur Maltson. Covers many topics from Java  to Ruby to DevOps.
</description>
    <link>http://devblog.maltson.com/</link>
    <atom:link href="http://devblog.maltson.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Fri, 10 Jul 2015 02:16:08 +0000</pubDate>
    <lastBuildDate>Fri, 10 Jul 2015 02:16:08 +0000</lastBuildDate>
    <generator>Jekyll v2.4.0</generator>
    
      <item>
        <title>A tale of tmux, a bell and the perpetuity of time</title>
        <description>&lt;p&gt;&lt;img src=&quot;http://upload.wikimedia.org/wikipedia/en/d/dd/The_Persistence_of_Memory.jpg&quot; alt=&quot;perpetuity of time&quot;&gt;&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve been using &lt;a href=&quot;http://tmux.sourceforge.net/&quot;&gt;tmux&lt;/a&gt; for a while and love it.
I had heard of tmux on various podcasts and through Twitter, but I was finally
convinced to try it in early 2012 after listening to the &lt;a href=&quot;http://thechangelog.com/73/&quot;&gt;tmux episode on the Changelog&lt;/a&gt;
(excellent podcast by-the-way). &lt;a href=&quot;http://pragprog.com/book/bhtmux/tmux&quot;&gt;tmux: Productive Mouse-Free Development&lt;/a&gt;,
which was the topic of the podcast, is an excellent book for getting started
with tmux. In the books short 88 pages it takes you from basics to advanced
features to kick start your tmux development.&lt;/p&gt;

&lt;p&gt;After some experimentation, I got into a good workflow with tmux. I particularly
like using tmux with &lt;a href=&quot;https://github.com/aziz/tmuxinator&quot;&gt;tmuxinator&lt;/a&gt; to set up
projects and easily launch a full tmux environment with all my panes and windows
running the applications I configured in the tmuxinator YAML file.&lt;/p&gt;

&lt;p&gt;As much as I loved tmux, one thing really bugged me. If I had several tmux
sessions open, which I was prone to do as I&amp;#39;d have several things on the go, the
terminal bell kept going off. It would go off regardless of whether something was
happening in that tmux session or not. I use iTerm and Growl, so bell events 
manifest themselves through Growl. This is actually surprisingly useful
because when I have a long running task in a tab I&amp;#39;m not looking at,
when the task completes and the shell becomes idle, I get a nice Growl alert.
Unfortunately, this feature is not so useful when it happens all the time and
nothing actually happens in the tab.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/tmux-bell.png&quot; alt=&quot;tmux-bell&quot;&gt;&lt;/p&gt;

&lt;p&gt;I searched around extensively trying to figure out the issue thinking it
might be a tmux bug, or an iTerm bug. I came up with nothing, so I forgot about
it and just ignored the Growl notifications. Then, all the sudden, one day I
noticed that all the tabs ring their bell at the same time. Strange... what
could it be? And then I looked at the corner of my tmux window and there
was the answer.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/tmux-time.png&quot; alt=&quot;tmux-time&quot;&gt;&lt;/p&gt;

&lt;p&gt;The corner of the tmux window holds the tmux status bar. As it turns out,
the default tmux configuration holds the date and &lt;strong&gt;time&lt;/strong&gt;, in &lt;strong&gt;minutes&lt;/strong&gt;.
Every minute, each tab that&amp;#39;s running tmux updates to display the current time.
Time is ever perpetual, always marching forward, and always setting off bells in
tmux sessions.&lt;/p&gt;

&lt;p&gt;The solution was easy enough, change the default status bar to only show the day
and month.&lt;/p&gt;
&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;set -g status-right &amp;quot;#T %d %b&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;/images/tmux-date-no-time.png&quot; alt=&quot;tmux-date-no-time&quot;&gt;&lt;/p&gt;

&lt;p&gt;Voila! Now my bells and Growl notifications are useful again.&lt;/p&gt;
</description>
        <pubDate>Fri, 31 Jan 2014 14:03:00 +0000</pubDate>
        <link>http://devblog.maltson.com/tmux/2014/01/31/a-tale-of-tmux-a-bell-and-the-perpetuity-of-time.html</link>
        <guid isPermaLink="true">http://devblog.maltson.com/tmux/2014/01/31/a-tale-of-tmux-a-bell-and-the-perpetuity-of-time.html</guid>
        
        
        <category>tmux</category>
        
      </item>
    
      <item>
        <title>Being Productive on OS X</title>
        <description>&lt;p&gt;I&amp;rsquo;ve been a Mac OS X user for about 3 years now, and a Linux user before that. I
was originally attracted to the Mac not for the hardware (although it&amp;rsquo;s
nice), but for the software. My first taste came from a home made Hackintosh,
but I fell in love and wanted the real thing.&lt;/p&gt;

&lt;p&gt;Recently, a coworker bought her first Mac (with perhaps a bit of
evangelizing by me) and asked if I had any
suggestions for good applications. I decided to compile the entire list
of apps that I use on a more or less regular basis, and, admittedly, was shocked at
the number.&lt;/p&gt;

&lt;p&gt;But then again, I guess it comes as no surprise. All these little tools
here and there are the reason why more and more developers are flocking
to OS X. It&amp;rsquo;s evident in any conference or in any picture of a start up.
Developers just seem to be more productive on a Mac.&lt;/p&gt;

&lt;p&gt;After I finished compiling the list of applications, I thought it made sense to share
the list with everyone. I hope that you will find something useful for
yourself in the list. There&amp;rsquo;s a ton of applications out there that I
didn&amp;rsquo;t list here, so share your favourites in the comments. Oh, and
don&amp;rsquo;t forget to follow me on
Twitter, &lt;a href=&quot;https://twitter.com/arthurkalm&quot;&gt;@arthurkalm&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;Developer Tools&lt;/h1&gt;

&lt;p&gt;This being a developer blog, I&amp;rsquo;ll start with developer specific apps and
tools.&lt;/p&gt;

&lt;h2&gt;Programming&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.eclipse.org/downloads/&quot;&gt;Eclipse&lt;/a&gt; &amp;ndash; Java IDE. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/macvim/&quot;&gt;MacVim&lt;/a&gt; &amp;ndash; native Vim UI for the Mac. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.barebones.com/products/textwrangler/&quot;&gt;TextWrangler&lt;/a&gt; &amp;ndash; simple text editor. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mac.github.com/&quot;&gt;Github&lt;/a&gt; for Mac &amp;ndash; Git and Github UI for the Mac. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://itunes.apple.com/ca/app/xcode/id448457090?mt=12&quot;&gt;XCode&lt;/a&gt; &amp;ndash; native Mac development, also needed for GCC (when installing brew, but you might get away with this: &lt;a href=&quot;https://github.com/kennethreitz/osx-gcc-installer)&quot;&gt;https://github.com/kennethreitz/osx-gcc-installer)&lt;/a&gt;, Mac App Store. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.sequelpro.com/&quot;&gt;Sequel Pro&lt;/a&gt; &amp;ndash; a SQL client for MySQL (others coming). &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fuelcollective.com/snippet&quot;&gt;snippet&lt;/a&gt; &amp;ndash; code snippet manager. &lt;em&gt;paid&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Command Line&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.iterm2.com/#/section/home&quot;&gt;iTerm2&lt;/a&gt; &amp;ndash; terminal application that has more features than Terminal.app. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mxcl.github.com/homebrew/&quot;&gt;brew&lt;/a&gt; &amp;ndash; the missing package manager for OS X, use to install just about anything. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/robbyrussell/oh-my-zsh&quot;&gt;oh-my-zsh&lt;/a&gt; &amp;ndash; great default configuration for zsh, the best shell :). &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/carlhuda/janus&quot;&gt;janus&lt;/a&gt; &amp;ndash; spruce up your Vim with great default configurations. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://ethanschoonover.com/solarized&quot;&gt;solarized&lt;/a&gt; &amp;ndash; amazing color scheme for your terminal, vim, IDEs, etc. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joelthelion/autojump/wiki&quot;&gt;autojump&lt;/a&gt; &amp;ndash; a cd command that learns. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Design&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://skitch.com/&quot;&gt;Skitch&lt;/a&gt; &amp;ndash; a free screenshot taking app, really kicks butt. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://balsamiq.com/products/mockups&quot;&gt;Balsamiq Mockups&lt;/a&gt; &amp;ndash; great tool for creating wireframes. &lt;em&gt;paid&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://colorsnapper.com/&quot;&gt;ColorSnapper&lt;/a&gt; &amp;ndash; is the missing color picker for OS X. What I like is
it picks colors in HEX, rgb, hsl, etc. &lt;em&gt;paid&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wonderwarp.com/phonefinger&quot;&gt;phone finger&lt;/a&gt; &amp;ndash; giant finger for touch screen images. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;Everything Else&lt;/h1&gt;

&lt;p&gt;Aside from all the developer tools, I use a number of productivity
tools that help through my workflow. I also do some amateur
photography, so there are some applications for that. The rest are the
rest of the apps I use.&lt;/p&gt;

&lt;h2&gt;Productivity&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://growl.info&quot;&gt;Growl&lt;/a&gt; &amp;ndash; notification system, has plugins for tons of apps. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.alfredapp.com&quot;&gt;Alfred&lt;/a&gt; &amp;ndash; use it to quickly launch apps. &lt;em&gt;free + pro&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mperham/lunchy&quot;&gt;Launchy&lt;/a&gt; &amp;ndash; Simplifies OS X&amp;rsquo;s launchctl tool for daemons on OS X. Great for starting and stopping services set up by Homebrew. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lightheadsw.com/caffeine/&quot;&gt;Caffeine&lt;/a&gt; &amp;ndash; keeps your monitor from sleeping or decreasing brightness. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://irradiatedsoftware.com/sizeup/&quot;&gt;SizeUp&lt;/a&gt; &amp;ndash; quickly resize and move windows around your desktop. &lt;em&gt;paid&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.boastr.net/&quot;&gt;BetterTouchTool&lt;/a&gt; &amp;ndash; custom touch gestures for your trackpad and magic mouse. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jumpcut.sourceforge.net/&quot;&gt;Jumpcut&lt;/a&gt; &amp;ndash; an awesome clipboard buffer, great for copying/pasting stuff. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.evernote.com/&quot;&gt;Evernote&lt;/a&gt; &amp;ndash; note taking application, works across a whole bunch of platforms. &lt;em&gt;free + pro&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Chat&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://adium.im/&quot;&gt;Adium&lt;/a&gt; &amp;ndash; universal chat client, use for MSN, etc. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://colloquy.info/&quot;&gt;Colloquy&lt;/a&gt; &amp;ndash; IRC client. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Configuration&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com/p/gmask/&quot;&gt;Gmask&lt;/a&gt; &amp;ndash; Editing host files in OS X, profiles and everything like that. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://appzapper.com/&quot;&gt;App Zapper&lt;/a&gt; &amp;ndash; removes extra cruft when deleting an application (uninstall). &lt;em&gt;free + pro&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.macupdate.com/app/mac/28468/bootchamp&quot;&gt;BootChamp&lt;/a&gt; &amp;ndash; lets you easily reboot into your Boot Camp Windows partition. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Benchmarking&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.xbench.com/&quot;&gt;Xbench&lt;/a&gt; &amp;ndash; standard benchmarking tool. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://kelleycomputing.net/rember/&quot;&gt;rember&lt;/a&gt; &amp;ndash; RAM benchmarking tool. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.aja.com/products/software/&quot;&gt;AJA System Test&lt;/a&gt; &amp;ndash; hard drive benchmarker. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Other&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.aja.com/products/software/&quot;&gt;Keynote&lt;/a&gt; &amp;ndash; Apple&amp;rsquo;s presentation software, best out there, Mac App Store. &lt;em&gt;paid&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wakaba.c3.cx/s/apps/unarchiver.html&quot;&gt;Twitter&lt;/a&gt; &amp;ndash; the official twitter app, Mac App Store. freeThe Unarchiver &amp;ndash; Unzip tool. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.transmissionbt.com/&quot;&gt;Transmission&lt;/a&gt; &amp;ndash; bit torrent client. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.clamxav.com/&quot;&gt;ClamXav&lt;/a&gt; &amp;ndash; anti-virus for OS X. I use it
sparingly for downloaded file. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;Photo/Video&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.adobe.com/ap/products/photoshoplightroom/&quot;&gt;Lightroom&lt;/a&gt; &amp;ndash; Adobe photo editor. &lt;em&gt;paid&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://picasa.google.com/mac/&quot;&gt;Picasa&lt;/a&gt; &amp;ndash; Google&amp;rsquo;s photo organizer. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.gimp.org/macintosh/&quot;&gt;Gimp&lt;/a&gt; &amp;ndash; open source Photoshop competitor. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hugin.sourceforge.net/&quot;&gt;Hugin&lt;/a&gt; &amp;ndash; photo stitching for panoramas. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.creaceed.com/hydra/&quot;&gt;Hydra&lt;/a&gt; &amp;ndash; I&amp;rsquo;m starting to get into HDR
photography, and this has been the best app I&amp;rsquo;ve found so far. &lt;em&gt;paid&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://audacity.sourceforge.net/&quot;&gt;Audacity&lt;/a&gt; &amp;ndash; sound recording application. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://handbrake.fr/&quot;&gt;Handbrake&lt;/a&gt; &amp;ndash; video transcoder for ripping DVDs, etc. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.macupdate.com/app/mac/19769/isquint&quot;&gt;iSquint&lt;/a&gt; &amp;ndash; convert videos for ipods, iphones, etc. &lt;em&gt;free&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.getmiro.com/&quot;&gt;Miro&lt;/a&gt; &amp;ndash; aggregates music and video from the web. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.videolan.org/vlc/download-macosx.html&quot;&gt;VLC&lt;/a&gt; &amp;ndash; video player. &lt;em&gt;free/OSS&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 12 Sep 2011 00:00:00 +0000</pubDate>
        <link>http://devblog.maltson.com/2011/09/12/being-productive-on-os-x.html</link>
        <guid isPermaLink="true">http://devblog.maltson.com/2011/09/12/being-productive-on-os-x.html</guid>
        
        
      </item>
    
      <item>
        <title>Getting into Node</title>
        <description>&lt;p&gt;&lt;strong&gt;Updated 2011-04-27:&lt;/strong&gt; forgot to add Backbone.js&lt;/p&gt;

&lt;p&gt;Most of the net is &lt;a href=&quot;http://mashable.com/2011/03/10/node-js/&quot;&gt;abuzz&lt;/a&gt; about &lt;a href=&quot;http://nodejs.org/&quot;&gt;Node&lt;/a&gt;,
so it&amp;rsquo;s hard to miss it. I&amp;rsquo;ve been sitting on the sidelines for several months now, but after
attending a &lt;a href=&quot;http://techtalksto.com/post/4087265108/the-video-from-techtalksto-episode-3-with-james&quot;&gt;TechTalksTO talk on Node&lt;/a&gt;
given by James Duncan of Joyent, I&amp;rsquo;m convinced I should dive in.&lt;/p&gt;

&lt;h2&gt;tl;dr version&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Like C, Javascript is here to stay.&lt;/li&gt;
&lt;li&gt;Asynchronous (everywhere) is the future.&lt;/li&gt;
&lt;li&gt;Node is an exciting platform you have to check out.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;What is Node?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/joyent/node&quot;&gt;Node&lt;/a&gt; is a server side Javascript
implementation. As James put it, Node is the Google Chrome V8 Javascript
engine and libev glued together. V8 provides the super fast Javascript
virtual machine while libev contributes the
&lt;a href=&quot;http://en.wikipedia.org/wiki/Event_loop&quot;&gt;event loop&lt;/a&gt;. Of course, it&amp;rsquo;s
more complicated than that, but those are the basics.&lt;/p&gt;

&lt;p&gt;To make full use of this fast underpinning, Node follows a non-blocking,
fully asynchronous programming mode, and encourages libraries to follow
its example.&lt;/p&gt;

&lt;h2&gt;Why Node and Not Another Server Side Javascript?&lt;/h2&gt;

&lt;p&gt;The best known server side Javascript implementation is Rhino. However,
as Dhanji Prasanna asked &lt;a href=&quot;https://twitter.com/#!/dhanji/status/45307909709627393&quot;&gt;on Twitter&lt;/a&gt;,&lt;/p&gt;

&lt;blockquote class=&quot;posterous_short_quote&quot;&gt;&lt;p&gt;Are there any fast alternatives to Rhino on JVM?&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Most of the server side Javascript implementations didn&amp;rsquo;t
grasp the importance of non-blocking, asynchronous I/O.&lt;/p&gt;

&lt;h2&gt;Why Asynchronous?&lt;/h2&gt;

&lt;p&gt;Asynchronous programming is usually associated with GUI development
where everything is event driven and asynchronous. Why would you bring this to
the server? Well, for one, blocking sucks. James made this point very potent
by showing the amount of CPU cycles spent accessing each layer in a computer.
Starting from L1 cache, L2 cache, RAM, disk and finally the network, each
layer adds many orders of magnitude to the amount of time the CPU sits
blocked, waiting for the call to return.&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s why you want non-blocking I/O. As the Mashable
article (above) said about the history of Node, Ryan Dhal tried the
Node approach on a number of languages, in all cases failing, because of the
culture of synchronous, blocking programming. But Javascript, being a
front end language, has always been event driven and asynchronous.&lt;/p&gt;

&lt;h2&gt;How Much Does This Buy You? (Easy C10K)&lt;/h2&gt;

&lt;p&gt;What does this approach really buy you? As James pointed out, it buys
you easy &lt;em&gt;C10K&lt;/em&gt;. What&amp;rsquo;s that you ask? 10 thousand concurrent
connections. In fact, Node seems to be able to handle &lt;a href=&quot;http://news.ycombinator.com/item?id=1088699&quot;&gt;100K concurrent
connections&lt;/a&gt; on a single,
mildly beefy server. In benchmarks, Node competes at the level of Nginx,
a C based web framework built around the same principles. This is a
testament to the power of V8.&lt;/p&gt;

&lt;p&gt;Asynchronous programming has been around for a long time, but has started
to gain popularity recently. The benefits are evident, take the recent
&lt;a href=&quot;http://engineering.twitter.com/2011/04/twitter-search-is-now-3x-faster_1656.html&quot;&gt;search speed increase at Twitter&lt;/a&gt;
after they adopted Netty and an asynchronous model.&lt;/p&gt;

&lt;h2&gt;Alright, I&amp;rsquo;m sold. Now what?&lt;/h2&gt;

&lt;p&gt;Getting started with Node is easy, if you&amp;rsquo;re on a Mac, I highly
recommend installing it through &lt;a href=&quot;http://mxcl.github.com/homebrew/&quot;&gt;Homebrew&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;brew install node&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Now try out Node&amp;rsquo;s obligatory &amp;ldquo;Hello, World!&amp;rdquo;. Create &lt;em&gt;server.js&lt;/em&gt;,&lt;/p&gt;

&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;var http = require(&#39;http&#39;);

http.createServer(function (req, res) {
  res.writeHead(200, {&#39;Content-Type&#39;: &#39;text/plain&#39;});
  res.end(&#39;Hello World\n&#39;);
}).listen(8080, &amp;quot;127.0.0.1&amp;quot;);

console.log(&#39;Server running at http://127.0.0.1:8080/&#39;);&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Then run&lt;/p&gt;

&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;node server.js&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;And voilà! Your first node app.&lt;/p&gt;

&lt;h2&gt;Great&amp;hellip; Anything Else?&lt;/h2&gt;

&lt;p&gt;Tons. One of Node&amp;rsquo;s biggest strengths is the huge community that&amp;rsquo;s
sprouted around it. As RedMonk discussed in their recent &lt;a href=&quot;http://redmonk.com/sogrady/2011/03/17/framework-traction-on-hacker-news/&quot;&gt;Programming
Language Framework Traction on Hacker News&lt;/a&gt;,
&amp;ldquo;What’s interesting is that the much younger Node.js is beginning to approach Django both in growth rate and visibility.&amp;rdquo;
This is evident by the number of new libraries and the speed at which
they are being developed.&lt;/p&gt;

&lt;p&gt;The best way to install plugins is to use &lt;a href=&quot;http://npmjs.org/&quot;&gt;npm&lt;/a&gt;. Some
of the more popular plugins are,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/visionmedia/express&quot;&gt;express&lt;/a&gt; &amp;ndash; a Sinatra inspired
framework.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/learnboost/Socket.IO-node&quot;&gt;socket.io&lt;/a&gt; &amp;ndash; server
push support.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://documentcloud.github.com/backbone/&quot;&gt;backbone.js&lt;/a&gt; &amp;ndash; a popular
MVC framework for Javascript, works with Node as well.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tmpvar/jsdom&quot;&gt;jsdom&lt;/a&gt; &amp;ndash; web scraping 2.0, powered
by Node.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/chriso/node.io&quot;&gt;node.io&lt;/a&gt; &amp;ndash; another scraping
library, this looks even better then jsdom.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/raycmorgan/Mu&quot;&gt;Mustache&lt;/a&gt; &amp;ndash; template engine, used
by Twitter (the JS version).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/visionmedia/jade&quot;&gt;Jade&lt;/a&gt; &amp;ndash; another template engine,
inspired by HAML.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/LearnBoost/stylus&quot;&gt;stylus&lt;/a&gt; &amp;ndash; a SCSS or LESS
inspired CSS engine.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/LearnBoost/mongoose&quot;&gt;mongoose&lt;/a&gt; &amp;ndash; MongoDB ORM
layer.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;A Look at Express&lt;/h2&gt;

&lt;p&gt;The Node ecosystem is growing by leaps and bounds, but I wanted to
highlight one of the more popular libraries. Making web application
development in Node easier, Express has become a trademark in most Node web apps.
Let&amp;rsquo;s see how easy it is to use.&lt;/p&gt;

&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;var app = express.createServer();

app.get(&#39;/&#39;, function(req, res){
    res.send(&#39;Hello World&#39;);
});

app.listen(8080);&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;Hosting&lt;/h2&gt;

&lt;p&gt;You&amp;rsquo;re all excited to get started on Node, but you&amp;rsquo;re wondering where to host
your new Node application. There is a great
&lt;a href=&quot;http://stackoverflow.com/questions/3648993/where-can-i-host-a-node-js-app&quot;&gt;stackoverflow question&lt;/a&gt;
that has a lot of options. Another recent contender in hosting Node applications is VMware with
&lt;a href=&quot;http://www.cloudfoundry.com/&quot;&gt;Cloud Foundry&lt;/a&gt;. I&amp;rsquo;ve tried both Joyent&amp;rsquo;s &lt;a href=&quot;http://no.de&quot;&gt;http://no.de&lt;/a&gt;
and Cloud Foundry.&lt;/p&gt;

&lt;p&gt;Node is an exciting platform that&amp;rsquo;s experiencing explosive growth. If
you&amp;rsquo;ve been sitting on the fence, now is a great time to jump in.&lt;/p&gt;

&lt;h2&gt;More Resources&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joyent/node&quot;&gt;Node Github project&lt;/a&gt;, &lt;a href=&quot;http://nodejs.org/&quot;&gt;web page&lt;/a&gt; and &lt;a href=&quot;http://www.youtube.com/watch?v=jo_B4LTHi3I&quot;&gt;Ryan Dahl&amp;rsquo;s intro video&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://howtonode.org/&quot;&gt;How To Node&lt;/a&gt; &amp;ndash; lots of great how-to articles&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.readwriteweb.com/hack/2011/04/6-free-e-books-on-nodejs.php&quot;&gt;6 free ebooks on Node&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/articles/nodejs-frameworks&quot;&gt;InfoQ covers Node ecosystem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://oreilly.com/catalog/9780596517748&quot;&gt;Javascript the Good Parts&lt;/a&gt; &amp;ndash; a great resource for learning the intricacies of Javascript&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 27 Apr 2011 00:00:00 +0000</pubDate>
        <link>http://devblog.maltson.com/2011/04/27/getting-into-node.html</link>
        <guid isPermaLink="true">http://devblog.maltson.com/2011/04/27/getting-into-node.html</guid>
        
        
      </item>
    
      <item>
        <title>Proposals for Google I/O 2012</title>
        <description>&lt;p&gt;I&amp;rsquo;ll preempt this post by saying I wasn&amp;rsquo;t able to register for Google I/O. Like many other people, I was caught up in the server crashes that happened the minute the tickets were announced. I have a feeling our corporate firewall had to do something with my inability to reach the website, and when I tried it on my Nexus One, I got the message that it was sold out (I&amp;rsquo;ve looked for that PK session token, but I didn&amp;rsquo;t get one because I wasn&amp;rsquo;t able to get far enough in the registration). I&amp;rsquo;ve been trying to go to Google I/O for 3 years now, and this year was the year I had everything in order for registration. I was very disappointed.&lt;/p&gt;

&lt;h1&gt;The Stampede&lt;/h1&gt;

&lt;p&gt;From &lt;em&gt;@googleio&lt;/em&gt;&lt;a href=&quot;http://twitter.com/#!/googleio/status/34681566059827200&quot;&gt;RT @VicGundotra &amp;ndash; Google I/O &amp;lsquo;09 sold out in 90 days, &#39;10 in 50 days&amp;hellip; #io2011: 59 minutes. Holy moly.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s a drastic change from the previous years. Even Apple&amp;rsquo;s WWDC sold out in 8 days last year. This might not come as a surprise, &lt;a href=&quot;http://twitter.com/#!/googleio&quot;&gt;@googleio&lt;/a&gt; has 50K+ followers. At least 10% of those followers must be interested in coming to the conference. When the tweet went out that registration was open, the stampede of developers crushed the server. That might sounds strange, how can Google&amp;rsquo;s servers not handle the load? Turns out that Google used a third party service called &lt;a href=&quot;http://www.webeventsglobal.com/&quot;&gt;WB Events Global&lt;/a&gt; for their registration. The service was built using &lt;em&gt;Cold Fusion&lt;/em&gt; on top of an IIS server. Not surprisingly, the server instantly crashed under the load.&lt;/p&gt;

&lt;h1&gt;The Reasons&lt;/h1&gt;

&lt;p&gt;Like most things in life, I don&amp;rsquo;t think there is any one reason why Google I/O sold out so quickly.&lt;/p&gt;

&lt;h2&gt;Freebies help&lt;/h2&gt;

&lt;p&gt;In previous years Google has given out free phones during and before the conference. Like many people, I believe this is one of the main reasons behind many&amp;rsquo;s choice. If the conference is paid for by one&amp;rsquo;s employer, a free phone/tablet is even more attractive. However, if that&amp;rsquo;s the case, it&amp;rsquo;s kind of sad. Tech conferences are about learning and meeting people, not about parties and freebies.&lt;/p&gt;

&lt;h2&gt;Price is attractive&lt;/h2&gt;

&lt;p&gt;It&amp;rsquo;s true that for those not living in the Bay Area, the flight and hotel expenses usually outweigh the conference price. But at $450, Google I/O is a bargain. Most tech conferences are $1-1.5K.&lt;/p&gt;

&lt;h2&gt;Android rising&lt;/h2&gt;

&lt;p&gt;Finally, I&amp;rsquo;m starting to believe that Android&amp;rsquo;s exponential is a big draw. Many developers no doubt want to get a head start developing the next great Android app, or help their employer navigate the mobile world.&lt;/p&gt;

&lt;h1&gt;The Proposals&lt;/h1&gt;

&lt;h2&gt;Have a separate Android event&lt;/h2&gt;

&lt;p&gt;I think it might make sense to have a separate Android event instead of rolling everything up into one giant conference. Maybe have one &lt;em&gt;everything&lt;/em&gt; Android conference and one &lt;em&gt;everything else&lt;/em&gt; conference (GWT, AppEngine, OpenSocial, etc). I guess depending on how full the Android sessions will be would drive this.&lt;/p&gt;

&lt;h2&gt;Rent all of Moscone&lt;/h2&gt;

&lt;p&gt;You could have Google I/O in all the Moscone buildings like JavaOne used to be. But I&amp;rsquo;ve read good reasons why a 15K developer conference just isn&amp;rsquo;t the same. Having large auditoriums for 300+ people doesn&amp;rsquo;t give you the intimacy you normally get from a conference.&lt;/p&gt;

&lt;h2&gt;Dealing with Freebies&lt;/h2&gt;

&lt;p&gt;To discourage those that register for the conference just to get a freebie, I love &lt;a href=&quot;http://justinsb.posterous.com/why-google-shouldnt-give-away-anything-this-y&quot;&gt;Justin&amp;rsquo;s idea&lt;/a&gt; of not giving out a freebie and letting everyone who wants a refund get one. Google I/O brings more then enough to the table, a free phone shouldn&amp;rsquo;t be your main deciding factor.&lt;/p&gt;
</description>
        <pubDate>Wed, 09 Feb 2011 00:00:00 +0000</pubDate>
        <link>http://devblog.maltson.com/2011/02/09/proposals-for-google-i-o-2012.html</link>
        <guid isPermaLink="true">http://devblog.maltson.com/2011/02/09/proposals-for-google-i-o-2012.html</guid>
        
        
      </item>
    
      <item>
        <title>Why is my LayoutPanel invisible?!</title>
        <description>&lt;p&gt;This is just a quick post in the hope that I can help others avoid &lt;em&gt;hours&lt;/em&gt; debugging an &amp;ldquo;issue&amp;rdquo; I recently had. I was working through a new application that I&amp;rsquo;m building using the new MVP framework in GWT 2.1, and for the life in me couldn&amp;rsquo;t understand why the &lt;code&gt;LayoutPanel&lt;/code&gt; I was adding to the page was not invisible. The code could be as simple as this.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/789106.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;I could clearly see it was added to the DOM when I poked around with Web Inspector, but it just wasn&amp;rsquo;t visible. I made sure my HTML doctype was set to standards mode. Dumbfounded, I went to the &lt;a href=&quot;http://code.google.com/webtoolkit/doc/latest/DevGuideUiPanels.html&quot;&gt;GWT documentation on Panels&lt;/a&gt;, and sure enough, found the &lt;code&gt;RootLayoutPanel&lt;/code&gt;. &lt;code&gt;*LayoutPanel&lt;/code&gt;s need to be added to the &lt;code&gt;RootLayoutPanel&lt;/code&gt;, not the &lt;code&gt;RootPanel&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/789112.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;Works perfectly.&lt;/p&gt;

&lt;p&gt;I found this hidden/invisible issue comes up with most &lt;code&gt;*LayoutPanel&lt;/code&gt; panels added to &lt;code&gt;RootPanel&lt;/code&gt;. The same effect is experienced when you stick these panels into an &lt;code&gt;HTMLPanel&lt;/code&gt;, as is customary when writing UiBinder code.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/789201.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;Of course, the previously mentioned &lt;a href=&quot;http://code.google.com/webtoolkit/doc/latest/DevGuideUiPanels.html&quot;&gt;GWT documentation&lt;/a&gt; clearly states at the end.&lt;/p&gt;

&lt;blockquote class=&quot;posterous_medium_quote&quot;&gt;&lt;p&gt;&lt;em&gt;When should I not use layout panels?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The panels described above are best used for defining your application&amp;rsquo;s outer structure — that is, the parts that are the least &amp;ldquo;document-like&amp;rdquo;. You should continue to use basic widgets and HTML structure for those parts for which the HTML/CSS layout algorithm works well. In particular, consider using UiBinder templates to directly use HTML wherever that makes sense.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;The documentation points out the misuse of &lt;code&gt;*LayoutPanel&lt;/code&gt;. However, I was thinking a good usability feature would be to display a warning that the &lt;code&gt;*LayoutPanel&lt;/code&gt; is being abused. This warning should probably be in Development Mode. If you&amp;rsquo;d like to see something along those lines, please &lt;a href=&quot;http://code.google.com/p/google-web-toolkit/issues/detail?id=5874&quot;&gt;star the issue I created&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 21 Jan 2011 00:00:00 +0000</pubDate>
        <link>http://devblog.maltson.com/2011/01/21/why-is-my-layoutpanel-invisible-.html</link>
        <guid isPermaLink="true">http://devblog.maltson.com/2011/01/21/why-is-my-layoutpanel-invisible-.html</guid>
        
        
      </item>
    
      <item>
        <title>GWT Data Bindings Part 1 - First Look</title>
        <description>&lt;p&gt;With the &lt;a href=&quot;http://googlewebtoolkit.blogspot.com/2010/10/announcing-final-release-of-gwt-21.html&quot;&gt;release of GWT 2.1&lt;/a&gt;, I&amp;rsquo;m going to try to put together a blog post about each of the new features. We&amp;rsquo;ll start off with my favourite addition, the data binding framework. If you are interested in GWT 2.1 coverage, make sure to check out &lt;a href=&quot;http://tbroyer.posterous.com/&quot;&gt;Thomas Broyer&amp;rsquo;s blog&lt;/a&gt;, which covers &lt;a href=&quot;http://tbroyer.posterous.com/gwt-21-places&quot;&gt;Places&lt;/a&gt; &lt;a href=&quot;http://tbroyer.posterous.com/gwt-21-places-part-ii&quot;&gt;extensively&lt;/a&gt; and &lt;a href=&quot;http://tbroyer.posterous.com/gwt-21-activities&quot;&gt;Activities&lt;/a&gt; with &lt;a href=&quot;http://tbroyer.posterous.com/gwt-21-places-activities-what-changed-between&quot;&gt;nesting&lt;/a&gt;. Last, but certainly not least, the excellent &lt;a href=&quot;http://code.google.com/webtoolkit/doc/latest/DevGuide.html&quot;&gt;GWT documentation&lt;/a&gt; has been updated to include 2.1 features.&lt;/p&gt;

&lt;p&gt;One of the killer features in GWT 2.1 is data bindings. The GWT blog put it best.&lt;/p&gt;

&lt;blockquote class=&quot;posterous_medium_quote&quot;&gt;&lt;p&gt;Data bound views &amp;ndash; An app that doesn’t allow end users to view or edit data isn’t terribly useful, now, is it? With GWT 2.1’s Data Editors, developers can create views that are generated from their app’s data model. These views are completely customizable, and handle all of the nasty work of syncing change sets between the client and server.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;While data bindings are not new by any means, you usually find them in more traditional web frameworks like Seam, Spring Web Flow, etc. Now, this powerful paradigm has found it&amp;rsquo;s way into the best (IMHO) RIA framework.&lt;/p&gt;

&lt;h2&gt;Single Binding&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s cover the simplest case, data binding a single Java bean. For example, a simple &lt;code&gt;Email&lt;/code&gt; POJO.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/656826.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;Serializable&lt;/code&gt; implementation is only required for GWT-RPC calls, not the Editors framework. Also note that these objects do need getters and setters, you can&amp;rsquo;t modify immutable objects. Immutable objects can only be used for display.&lt;/p&gt;

&lt;p&gt;Now you need a GWT widget to represent the &lt;code&gt;Email&lt;/code&gt; object.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/660486.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;EmailEditor&lt;/code&gt; is a standard GWT widget, the only new piece is the &lt;code&gt;Editor&amp;lt;Email&amp;gt;&lt;/code&gt; bit. This is the cue telling GWT that it is indeed a data bindable widget. If the field in the widget is named the same as the corresponding POJO field, the binding is automagic. Otherwise, you can use the &lt;code&gt;@Path(&quot;&quot;)&lt;/code&gt; annotation to indicate the name of the field (or reach into nested values).&lt;/p&gt;

&lt;p&gt;The final piece in the data binding story is the interface that will be GWT generated with the GWT.create() call. This does the required code generation to do automatic data binding.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/660479.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;This code could either go in some new class, or could be stuffed into the Presenter component if you follow the MVP pattern. Regardless, that&amp;rsquo;s all you need to bind to a single object.&lt;/p&gt;

&lt;p&gt;Of course, in most cases, you have an entire object graph, so lets move on to binding a whole object graph.&lt;/p&gt;

&lt;h2&gt;Nested Binding&lt;/h2&gt;

&lt;p&gt;It turns out that data binding an object graph is as easy as binding to a single object. Take the &lt;code&gt;Customer&lt;/code&gt; object.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/665651.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;Again, a regular POJO like we&amp;rsquo;ve seen before, but this time it has an nested &lt;code&gt;Email&lt;/code&gt; and &lt;code&gt;Address&lt;/code&gt;. Let&amp;rsquo;s take a look at what the &lt;code&gt;Editor&lt;/code&gt; looks like.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/665655.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;As you would expect, editing the nested objects only requires including the editors for those nested objects. Finally, instead of having a &lt;code&gt;Driver&lt;/code&gt; for each &lt;code&gt;Editor&lt;/code&gt;, you create one &lt;code&gt;Driver&lt;/code&gt; for the top-level &lt;code&gt;Editor&lt;/code&gt;. In this case we define the driver in the entry point.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/665656.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;That&amp;rsquo;s about it. All your existing boilerplate that does data binding evaporates with some GWT generator magic.&lt;/p&gt;

&lt;p&gt;We&amp;rsquo;re done for now. Part 2 will dive deeper into &lt;code&gt;Editors&lt;/code&gt; and explain using interfaces, integration with GIN and using &lt;code&gt;Editors&lt;/code&gt; with the new MVP framework.&lt;/p&gt;

&lt;h2&gt;More Information&lt;/h2&gt;

&lt;p&gt;Some additional documentation to check out for now.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://code.google.com/webtoolkit/doc/latest/DevGuideUiEditors.html&quot;&gt;GWT editor documentation&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href=&quot;http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/com/google/gwt/editor/client/package-summary.html&quot;&gt;GWT editor Javadoc&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 08 Nov 2010 00:00:00 +0000</pubDate>
        <link>http://devblog.maltson.com/2010/11/08/gwt-data-bindings-part-1-first-look.html</link>
        <guid isPermaLink="true">http://devblog.maltson.com/2010/11/08/gwt-data-bindings-part-1-first-look.html</guid>
        
        
      </item>
    
      <item>
        <title>Mocking your GWT widgets, without GWTTestCase</title>
        <description>&lt;p&gt;When unit testing, mocking out your dependencies is standard practice. GWT is no exception. However, as you will discover, mocking your UI in GWT doesn&amp;rsquo;t work as you might expect.&lt;/p&gt;

&lt;p&gt;Before we start with a sample, I just wanted to mention some best practices around GWT. It&amp;rsquo;s generally considered a best practice to use the Model-View-Presenter pattern (&lt;a href=&quot;http://code.google.com/webtoolkit/articles/mvp-architecture.html&quot;&gt;Part I&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/webtoolkit/articles/mvp-architecture-2.html&quot;&gt;Part II&lt;/a&gt;, &lt;a href=&quot;http://code.google.com/webtoolkit/doc/trunk/DevGuideMvpActivitiesAndPlaces.html&quot;&gt;GWT 2.1 method&lt;/a&gt;). When you use this pattern, you avoid writing tests for your Views because they don&amp;rsquo;t contain any logic.&lt;/p&gt;

&lt;p&gt;However, if you&amp;rsquo;re not following this pattern for whatever reason (existing code base, legacy, etc), you&amp;rsquo;ll want to unit test your UI logic. Furthermore, if you read the GWT 2.1 way of implementing MVP using Activities, you&amp;rsquo;ll find that some logic, like event handling, may creep into your Views for convenience sake. Therefore, I hope you find this useful in general.&lt;/p&gt;

&lt;p&gt;Let&amp;rsquo;s build a simple example view.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/634307.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;With the class in place, we&amp;rsquo;d like to unit test the &lt;code&gt;validUsernameAndPassword&lt;/code&gt; method. Using my favourite unit testing framework &lt;a href=&quot;http://testng.org/doc/index.html&quot;&gt;TestNG&lt;/a&gt; and mocking framework &lt;a href=&quot;http://mockito.org/&quot;&gt;Mockito&lt;/a&gt;, we&amp;rsquo;d come up with something like the following.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/634324.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;Seems simple enough. But if you try to run this test, you&amp;rsquo;ll be greeted with the following error.&lt;/p&gt;

&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;java.lang.ExceptionInInitializerError
    at sun.reflect.GeneratedSerializationConstructorAccessor1.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

...

Caused by: java.lang.UnsupportedOperationException: ERROR: GWT.create() is only usable in client code!  It cannot be called, for example, from server code.  If you are running a unit test, check that your test case extends GWTTestCase and that GWT.create() is not called from within an initializer or constructor.
    at com.google.gwt.core.client.GWT.create(GWT.java:92)
    at com.google.gwt.user.client.ui.UIObject.(UIObject.java:179)
    ... 42 more&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;What this is telling you is that you have to run these tests in a &lt;code&gt;GWTTestCase&lt;/code&gt;, not a standard TestNG test. If you&amp;rsquo;ve had experience with &lt;code&gt;GWTTestCase&lt;/code&gt;, you know it&amp;rsquo;s very slow to initialize and not something you want to use for unit tests. To get around this, we have to use a secret class that&amp;rsquo;s not even documented in the Java doc, &lt;code&gt;GWTMockUtilities&lt;/code&gt;. The test class now looks like this.&lt;/p&gt;

&lt;p&gt;&lt;script src=&quot;https://gist.github.com/634326.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;Viola! Your tests pass as you expect them to. Hope that helps anyone doing UI unit testing in GWT.&lt;/p&gt;
</description>
        <pubDate>Tue, 19 Oct 2010 00:00:00 +0000</pubDate>
        <link>http://devblog.maltson.com/2010/10/19/mocking-your-gwt-widgets-without-gwttestcase.html</link>
        <guid isPermaLink="true">http://devblog.maltson.com/2010/10/19/mocking-your-gwt-widgets-without-gwttestcase.html</guid>
        
        
      </item>
    
      <item>
        <title>GWT: Defacto for Creating Rich Web Applications?</title>
        <description>Last year there was some fervent discussion on the GWT contributor mailing list on &lt;a href=&quot;http://groups.google.com/group/google-web-toolkit-contributors/browse_thread/thread/6d4339fb17803e/114aecb2d910846f&quot; target=&quot;_blank&quot;&gt;supporting Scala&lt;/a&gt; as a language alternative for writing GWT applications. The discussion was interesting, but I hadn&amp;#39;t heard anything since and had assumed nothing happened. Turns out, I was &lt;a href=&quot;http://scalagwt.gogoego.com/index.html&quot; target=&quot;_blank&quot;&gt;wrong&lt;/a&gt;. While I can&amp;#39;t claim to know much about Scala, the idea of writing GWT based applications in another language sounded really interesting. Reading on, I found an even more exciting idea, in Jribble. As put on the GWT Scala site.&lt;br /&gt; &lt;p /&gt;&lt;div&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;&quot;&gt; &lt;i&gt; Java source code does not want to be a target language.  It has restrictions against logically sound constructs that would be bad Java practice to write by hand.  Lex Spoon proposed a plan for an intermediate step, &amp;quot;Loose Java,&amp;quot; which we have christened Jribble (pronounced &amp;quot;Dribble&amp;quot;).&lt;/i&gt;&lt;/blockquote&gt; &lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;&quot;&gt; &lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;&quot;&gt; &lt;i&gt; Jribble is essentially Java with the interfering restrictions removed.  Lex: &amp;quot;It&amp;#39;s like a puddle of Java. It&amp;#39;s also like drivel, which is appropriate enough for a language no one writes and no one reads. Computers can entertain themselves with it well enough.&amp;quot;&lt;/i&gt;&lt;/blockquote&gt; &lt;p /&gt;&lt;div&gt;And what it could eventually lead to.&lt;/div&gt;&lt;p /&gt;&lt;blockquote class=&quot;gmail_quote&quot; style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;&quot;&gt; &lt;i&gt; The Jribble concept is interesting as a target language, because it&amp;#39;s likely to be an effective target for other JVM languages, not only Scala.  Any language that easily produces valid JVM bytecodes, but struggles to produce valid Java, might take advantage of Jribble as a bridge to GWT Javascript compilation.&lt;/i&gt;&lt;/blockquote&gt; &lt;p /&gt;&lt;div&gt;&lt;i&gt;Other JVM languages?&lt;/i&gt; Groovy, JRuby, Clojure anyone?&lt;/div&gt;&lt;p /&gt;&lt;div&gt;GWT is becoming the platform of choice for Java developers*. More so with the &lt;a href=&quot;http://googlewebtoolkit.blogspot.com/2010/09/google-relaunches-instantiations.html&quot; target=&quot;_blank&quot;&gt;Instantiation purchase&lt;/a&gt; and collaboration with &lt;a href=&quot;http://code.google.com/webtoolkit/business.html&quot; target=&quot;_blank&quot;&gt;VMware/SpringSource&lt;/a&gt;. But the future could be even brighter. GWT could be the default compiler for writing rich web applications in any language of your choice. I&amp;#39;ll be very excited to see how this evolves.&lt;/div&gt; &lt;p /&gt;&lt;div&gt;* I&amp;#39;m just guessing here based on the 23000+ mailing list subscriptions and 2000+ tags on Stackoverflow (when compared with other frameworks).&lt;/div&gt; &lt;/div&gt;
</description>
        <pubDate>Mon, 27 Sep 2010 00:00:00 +0000</pubDate>
        <link>http://devblog.maltson.com/2010/09/27/gwt-defacto-for-creating-rich-web-applications-.html</link>
        <guid isPermaLink="true">http://devblog.maltson.com/2010/09/27/gwt-defacto-for-creating-rich-web-applications-.html</guid>
        
        
      </item>
    
      <item>
        <title>Obligatory Introduction</title>
        <description>&lt;h1&gt;On Java&lt;/h1&gt;

&lt;p&gt;As the name suggests, I&amp;rsquo;m mainly a Java developer. I like Java. I know, it&amp;rsquo;s falling out of fashion with today&amp;rsquo;s web hipsters, but there&amp;rsquo;s a lot to like about the language and its environment. For one, I find the static typing bit to be very helpful in a larger team environment, especially when you&amp;rsquo;re trying to piece together how someone else&amp;rsquo;s application works. But I think Java really wins out in the ecosystem. The sheer amount of active, high quality, tools and libraries available, is often overwhelming. One could argue that this can be a disadvantage, but I believe that the more choice a developer has, the better.&lt;/p&gt;

&lt;h1&gt;On the Web&lt;/h1&gt;

&lt;p&gt;I&amp;rsquo;m also passionate about everything happening on the web. I believe that web vs desktop is analogous to Steve Job&amp;rsquo;s truck vs sedan analogy. You&amp;rsquo;ll always need desktop applications (trucks), but for the majority of users, the web (already?) provides everything they need (sedans). But when it comes to developing rich web applications, I think the best tool out there is Google Web Toolkit. More on that later.&lt;/p&gt;

&lt;h1&gt;On Google&lt;/h1&gt;

&lt;p&gt;As mentioned, I love GWT. After my initial taste of GWT, I wanted more of that excellent Google stuff. So I found Guice, Google App Engine, Page Speed, Speed Tracer, Sitebricks, the plethora of Google APIs and much more. While I always liked Google services in general, I had no idea (until a few years ago), how awesome they are to developers.&lt;/p&gt;

&lt;h1&gt;On not just Java&lt;/h1&gt;

&lt;p&gt;The JVM might be great at running Java, but many new languages have started calling the JVM home. Aside from existing languages like JRuby, Clojure (Lisp), Jython, and others, cool new languages like Groovy and Scala have found their way to the JVM. More on those as I get to them.&lt;/p&gt;

&lt;h1&gt;On what&amp;rsquo;s the point already?&lt;/h1&gt;

&lt;p&gt;Ah, the point&amp;hellip; right. The point is, I&amp;rsquo;m really into the tech world. I love programming. I love gadgets. So what you&amp;rsquo;ll find on this blog is a lot about the web, Google Web Toolkit and other Google technologies, Spring and Hibernate, new languages that I explore, perhaps some gadget reviews and who knows what else. It&amp;rsquo;s definitely an exciting time to be on the JVM. Stay tuned!&lt;/p&gt;
</description>
        <pubDate>Thu, 17 Jun 2010 00:00:00 +0000</pubDate>
        <link>http://devblog.maltson.com/2010/06/17/obligatory-introduction.html</link>
        <guid isPermaLink="true">http://devblog.maltson.com/2010/06/17/obligatory-introduction.html</guid>
        
        
      </item>
    
  </channel>
</rss>
