<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Johnny Halife &#187; Uncategorized</title>
	<atom:link href="http://blogs.southworks.net/jhalife/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.southworks.net/jhalife</link>
	<description></description>
	<lastBuildDate>Fri, 18 Nov 2011 15:32:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>HTTP 410 (Gone) &#8211; Johnny&#8217;s blog has moved&#8230;.</title>
		<link>http://blogs.southworks.net/jhalife/2011/11/18/http-410-gone-johnnys-blog-has-moved/</link>
		<comments>http://blogs.southworks.net/jhalife/2011/11/18/http-410-gone-johnnys-blog-has-moved/#comments</comments>
		<pubDate>Fri, 18 Nov 2011 15:32:22 +0000</pubDate>
		<dc:creator>johnny</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/jhalife/?p=197</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/jhalife/2011/11/18/http-410-gone-johnnys-blog-has-moved/" class="more-link">read more<img src="http://blogs.southworks.net/jhalife/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Hi Folks, </p>
<p>I&#8217;ve just moved my blog to a new location <a href="http://johnny.io">http://johnny.io</a>, you can see, how, why and when by reading my last post on <a href="http://johnny.io/2011/11/18/Jekyll-is-rocking-my-new-blog/">&#8220;Jekyll is rocking my new blog&#8221;</a></p>
<p>I won&#8217;t be posting here anymore, so if you want to keep reading me point your rss feed to http://feeds.feedburner.com/johnny-halife or bookmark http://johnny.io</p>
<p>bye,<br />
~johnny</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Iron Ruby @ Code Camp Buenos Aires, 2010</title>
		<link>http://blogs.southworks.net/jhalife/2010/09/05/iron-ruby-code-camp-buenos-aires-2010/</link>
		<comments>http://blogs.southworks.net/jhalife/2010/09/05/iron-ruby-code-camp-buenos-aires-2010/#comments</comments>
		<pubDate>Sun, 05 Sep 2010 19:06:38 +0000</pubDate>
		<dc:creator>johnny</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/jhalife/?p=165</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/jhalife/2010/09/05/iron-ruby-code-camp-buenos-aires-2010/" class="more-link">read more<img src="http://blogs.southworks.net/jhalife/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Hey folks, yesterday (Sept 3. 2010), I gave a talk on the<a href="http://codecamp.com.ar/"> Code Camp Buenos Aires 2010</a> as the title of this post states I spent some time talking about IronRuby. <strong>The primary focus of the talk was on showing how to get the better of both worlds and how to  work combining them (C# / Ruby).</strong></p>
<div style="text-align: center"><img src="https://files.me.com/johnny.halife/mqstdf" alt="" /></div>
<p>As I would expect people that attended the talk were senior geeks which engaged with the topic and (hopefully) enjoyed a from-scratch writing of a Testing Framework =).</p>
<p><strong>I want to thank everyone that assisted and <a href="http://twitter.com/msaez">Miguel Saez </a>for the organization of the Event which as usual was flawless.</strong></p>
<p>As promised here are the materials from the talk:</p>
<ul>
<li><img style="width: 60px;vertical-align: middle;border: 0px" src="https://files.me.com/johnny.halife/m3kqnw" alt="" /> <a href="https://files.me.com/johnny.halife/fqtjcz">Download the presentation from here</a></li>
<li><img style="width: 60px;vertical-align: middle;border: 0px" src="https://files.me.com/johnny.halife/t4rxi0" alt="" /> <a href="https://files.me.com/johnny.halife/iclc80">Download the samples from here</a> (same code I shown)</li>
</ul>
<div>Presentation is also available on SlideShare.net <strong><a title="Code Camp 2010 - Iron Ruby " href="http://www.slideshare.net/johnnyhalife/code-camp-2010-iron-ruby-paso-a-paso">Code Camp 2010 &#8211; Iron Ruby &#8220;Paso a Paso&#8221;</a></strong></p>
<p>thanks,<br />
~johnny</p>
</div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDC 09&#8242; &#8211; Tales from the Trenches</title>
		<link>http://blogs.southworks.net/jhalife/2009/11/19/pdc-09-tales-from-the-trenches/</link>
		<comments>http://blogs.southworks.net/jhalife/2009/11/19/pdc-09-tales-from-the-trenches/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 21:56:50 +0000</pubDate>
		<dc:creator>johnny</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/jhalife/?p=160</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/jhalife/2009/11/19/pdc-09-tales-from-the-trenches/" class="more-link">read more<img src="http://blogs.southworks.net/jhalife/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="float: right" src="http://files.me.com/johnny.halife/nkiu12" alt="Convergence Demo" width="357" height="274" /></p>
<p>About a month ago, I left my home in Buenos Aires to start working with James Conard and his team on the &#8220;Cloud Convergence&#8221; Demo and some other PDC 09&#8242; Stuff. Today since Ray Ozzie touched the stage we (backstage) were waiting for our demo to become true. Before that were a couple of demos, and specially (and I&#8217;ll talk about this later on this post) <strong>&#8220;Tailspin Travel&#8221;</strong>.</p>
<p>When we got to Redmond area, we met<a href="http://www.lostintangent.com"> Jonathan Carter (a.k.a JC)</a> who was working with PC (a fellow southy), they were working on the <a href="http://tailspin.codeplex.com">&#8220;Tailspin Travel&#8221; </a> demo for the keynote that was shown by <a href="http://blogs.msdn.com/camerons/">Cameron Skinner</a>. Tailpin&#8217;s demo represents most of the &#8220;best practices&#8221; that you should apply when doing an ASP.NET MVC Web Application that has features like back-end support with Workflow and other WCF Services, and integrates with your Enterprise Identity using WS-Federation Protocol.</p>
<p>Imagine how good the demo was, that we took that same application to do our work on the &#8220;Future of the Platform&#8221;.  Additionally, they are doing something great with the application that since the keynote was available for you to <a href="http://tailspintravel.codeplex.com/">download</a> it and learn the &#8220;goodies&#8221; of .NET 4/WIF/AppFabric development.</p>
<h2>Tailspin Travel</h2>
<p><img class="alignright" style="float: right" src="http://lostintangent.com/wp-content/uploads/2009/11/logo.png" alt="Tailspin Travel" /></p>
<p>The Tailspin Travel application covers a pretty substantial set of functionality, but ultimately seeks to provide a holistic perspective of how Visual Studio 2010, .NET Framework 4,</p>
<p>and the server platform can be used together. Among other technologies it leverages: Visual Studio 2010 (with the new fancy diagrams), .NET 4.0 (MVC2, WIF, WF, WCF, and so) andshow the hosting layer of your services using the brand-new &#8220;AppFabric&#8221;</p>
<p>I guess at this point of the post you should be rushing to <a href="http://tailspintravel.codeplex.com/">get the bits</a>, and if you don&#8217;t go new to get them at http://tailspintravel.codeplex.com/.</p>
<h2>Meet me at PDC</h2>
<p><img class="alignright" style="float: right;margin: 2px" src="http://microsoftpdc.com/content/images/creative/PDC09Bling_General_ThreadsConnected_136.jpg" alt="Meet me at PDC" width="136" height="186" /></p>
<p>I&#8217;m on PDC with other fellow <a href="http://southworks.net">Southies,</a> we are all the time around, and if you want to talk and share a coffee, just look for me or DM message at <a href="http://twitter.com/johnnyhalife">@johnnyhalife</a> on twitter and we will meet for sure.</p>
<p>Today I&#8217;ve been interviewed by Jean-Christophe Cimetiere about the work I&#8217;m doing with Ruby and Azure. You should stay tuned for more information that I&#8217;ll be announcing soon on these things, like Azure 2009-09-19 support of the API on the Ruby SDK.</p>
<h3>Acknowledments</h3>
<p>Although Matías , PC and I where backstage, there were lots of Southies that made these PDC events work great, I sincerely appreciate the work all the Southies were doing, and how do they helped us.</p>
<p>hope to see you around,</p>
<p>~johnny</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Issues running Windows Azure SDK (Ruby/C#) from Local Time when GMT -3 change didn&#8217;t happen</title>
		<link>http://blogs.southworks.net/jhalife/2009/10/19/issues-running-windows-azure-sdk-rubyc-from-local-time-when-gmt-3-change-didnt-happen/</link>
		<comments>http://blogs.southworks.net/jhalife/2009/10/19/issues-running-windows-azure-sdk-rubyc-from-local-time-when-gmt-3-change-didnt-happen/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 17:26:02 +0000</pubDate>
		<dc:creator>johnny</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/jhalife/?p=159</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/jhalife/2009/10/19/issues-running-windows-azure-sdk-rubyc-from-local-time-when-gmt-3-change-didnt-happen/" class="more-link">read more<img src="http://blogs.southworks.net/jhalife/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>I was working on the Ruby Windows Azure SDK and I started receiving HTTP/1.1 403 errors, I figured out which is the problem so here you can get a simple issue analysis</p>
<p><strong>Symptom</strong><br />
While trying to connect to Windows Azure (Storage at least) from Argentina, you get 403 errors even dough the message seems to be formatted correctly.</p>
<p><strong>Issue</strong><br />
Argentina was supposed to change the time by adjusting it to DTS (Daylight Time Saving), one day before that happens the Argentinean Government decided not to make that change, generating a lots of implications for computer systems adjusted to DTS. </p>
<p>Since Windows Azure relays on UTC Timestamp for making an assertion on the signature, the current time for GMT -3 isn&#8217;t what is expected from the server side causing the whole message to fail after the an assertion of the signature.</p>
<p><strong>Workaround</strong><br />
There&#8217;s no apparent solution yet, but there are a couple of workarounds in order to properly develop against Windows Azure from a not changed GMT -3 time zone.</p>
<ul>
<li><strong>Change your time zone to GMT -4</strong>. I switched my computer back to Halifax &#8211; Canada that has GMT -4 for an Windows Azure started accepting my requests
</li>
<li><strong> Keep your computer with the clock one hour ahead </strong>. Keep the current time zone without tweaking the Date/Time, but remember that you will be out of sync with the country</li>
</ul>
<p>Both of the workarounds listed above proved to be successfully working, I will stick with GMT -4 since I guide myself (eating, sleeping, and all that) in my computer clock.</p>
<p>Hope it helps,<br />
~johnny</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Contextual connection handling on Ruby WAZ-Storage</title>
		<link>http://blogs.southworks.net/jhalife/2009/10/18/contextual-connection-handling-on-ruby-waz-storage/</link>
		<comments>http://blogs.southworks.net/jhalife/2009/10/18/contextual-connection-handling-on-ruby-waz-storage/#comments</comments>
		<pubDate>Sun, 18 Oct 2009 17:49:07 +0000</pubDate>
		<dc:creator>johnny</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/jhalife/?p=158</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/jhalife/2009/10/18/contextual-connection-handling-on-ruby-waz-storage/" class="more-link">read more<img src="http://blogs.southworks.net/jhalife/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Today I was discussing with my friend<a href="http://twitter.com/jpgd"> Juampi Garcia</a> who is writing a nice sample application that leverages the <em><a href="http://github.com/johnnyhalife/waz-storage">waz-storage gem</a></em> and some other interesting things. While we were talking about his application, he asked me for some way of overriding the default connection for performing a bunch of operations as he needed it for his application.</p>
<p>I started thinking and looking around some samples from DataMapper and other ORM frameworks that have the ability to override the current context by calling a method or specifying connection name. I looked deeply into it, but end up thinking that it will be better to have a little stack of connections in order to handle different contexts.</p>
<p>I end up writing a new method to WAZ::Storage::Base that enables you to scope your code to some specific context and once that context is left you get back to the default connection.</p>
<p>Consider the following sample in order to better understand what I did</p>
<pre style="font-size: 12px">
  WAZ::Storage::Base.establish_connection!(:account_name =&gt; 'name', :access_key =&gt; 'key')

  # any operation performed here will be on the default context expressed above. e.g.
  container = WAZ::Blobs::Container.find('my-container')

  # So, now let's suppose that I need to perform an operation on another context,
  # but those are just a few, and very scoped that isn't worth switching the whole
  # context to that. Leveraging the new method, I'll just do:
  WAZ::Storage::Base.establish_connection(:account_name =&gt; 'another', :access_key =&gt; 'key') do
     # any operation that I perform here, will be on this new context. e.g.
     another_container = WAZ::Blobs::Container.find('my-container')
     # Note that the operation above is performing a look-up of the container on another
     # storage account.
  end

  # Now that I've left the block, I'm back to my original context.
</pre>
<p>This new feature has been added to project at <a href="http://github.com/johnnyhalife/waz-storage">github.com/johnnyhalife/waz-storage</a> and the new documentation is also available at <a href="http://waz-storage.heroku.com">waz-storage.heroku.com</a>.</p>
<p>You can upgrade your gem, in order to have this new feature or just using the bleeding edge by cloning the repository on github (<strong>git://github.com/johnnyhalife/waz-storage.git</strong>)</p>
<h4>Another small change</h4>
<p>If you are (or tried) using <em>waz-storage</em> on Heroku.com without rails, you will realize that some exceptions about &#8216;String.start_with?&#8217; being undefined may appear. I&#8217;ve added an snippet to implement this method, on the rails way, when loading the waz gem (if it was previously undefined).</p>
<p>thanks,<br />
~johnny</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Announcing Ruby Windows Azure Storage SDK &#8211; v.0.5 !!!</title>
		<link>http://blogs.southworks.net/jhalife/2009/10/16/announcing-ruby-windows-azure-storage-sdk-v05/</link>
		<comments>http://blogs.southworks.net/jhalife/2009/10/16/announcing-ruby-windows-azure-storage-sdk-v05/#comments</comments>
		<pubDate>Fri, 16 Oct 2009 21:02:11 +0000</pubDate>
		<dc:creator>johnny</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/jhalife/?p=156</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/jhalife/2009/10/16/announcing-ruby-windows-azure-storage-sdk-v05/" class="more-link">read more<img src="http://blogs.southworks.net/jhalife/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Hey, after talking, talking and talking about the possibilities of building a Windows Azure Storage SDK for Ruby, I finally got together a couple of ideas and develop the v.0.5. I&#8217;m still needing to write a decent sample application but now it has more resources that previous gems had.</p>
<p>For the <strong>project source code and pretty basic documentation</strong> go to <strong><a href="http://github.com/johnnyhalife/waz-storage">http://github.com/johnnyhalife/waz-storage</a></strong>.</p>
<p>For the whole <strong>API documentation</strong> refer to <strong><a href="http://waz-storage.heroku.com">http://waz-storage.heroku.com</a></strong>.</p>
<h2>What is Ruby Windows Azure Storage SDK (a.k.a waz-storage)?</h2>
<p>A simple implementation of Windows Azure Storage API for Ruby, inspired by the S3 gems and self experience of dealing with queues. The major goal of the whole gem is to enable ruby developers, like me =), to leverage Windows Azure Storage features and have another option for cloud storage.</p>
<p>The whole gem is implemented based on Microsoft’s specs from the communication and underlying service description and protocol (REST). The API is for Ruby developers built by a ruby developer. I’m trying to follow idioms, patterns and fluent type of doing APIs on Ruby.</p>
<p>This work isn’t related at all with StorageClient Sample shipped with Microsoft SDK and written in .NET, the whole API is based on my own understanding, experience and values of elegance and ruby development.</p>
<p>Full documentation for the gem is available at <a href="http://waz-storage.heroku.com">waz-storage.heroku.com</a></p>
<h2>Scenario Idea</h2>
<p>The gem was thought having <a href="http://heroku.com">heroku.com</a> in mind as it is my main Ruby hosting vendor. The basic idea can be expressed with the following diagram:</p>
<p><img src="http://files.me.com/johnny.halife/5j65mq" alt="Scenario Idea" /></p>
<p>As you can see there&#8217;s no need (and no personal desire) of hosting your application in Windows Azure or even writing it on .NET (or Windows needed at all).</p>
<h2>How does this differ from <em>waz-blobs</em> and <em>waz-queues</em>?</h2>
<p>Well, this is a sum up of the whole experience of writing those gems and getting them to work together to simplify end user experience. Although there’re some breaking changes, it’s pretty backward compatible with existing gems.</p>
<h2>Open Standards</h2>
<p>The <em>waz-storage</em> model is built upon the REST API published by Microsoft for Windows Azure Storage Services following the HTTP Standard. It&#8217;s basically a bunch of HTTP Requests with a special signature and some custom headers. The same API can be ported to any platform supporting a decent HTTP Stack.</p>
<h2>So, what?</h2>
<p>As in the latest posts, I won&#8217;t include too much detail here since it&#8217;s all explained at <a href="http://github.com/johnnyhalife/waz-storage">github.com/johnnyhalife/waz-storage</a> and the whole API is detailed (and documented) at <a href="http://waz-storage.heroku.com">waz-storage.heroku.com</a>.</p>
<p>The future is bright, I strongly appreciate all your feedback, your tweets and the time spent on (at least) reading the code. I really love this whole experience, but I won&#8217;t stop here, I&#8217;ll be relaxing from this SDK for a week or so (maybe less) until I come back for doing Tables support and fixing the issues that users may have encounter.</p>
<h3>TODOs&#8217;</h3>
<p>There should be some samples or at least one Reference Implementation of the API, probably I&#8217;ll be requesting help from other people in order to accomplish this, but I promise that some sample will be soon online so you can see the unveiled power of the Windows Azure Storage when running on Ruby.</p>
<p>Also there&#8217;s some support for Blocks that will be added, and some other sugar features for the application. </p>
<p>Time will tell, meanwhile you can comment, tweet or say whatever you want since I&#8217;ll be listening to your feedback.</p>
<h3>Acknowledgment</h3>
<p>This time I&#8217;ll make an special acknowledgment, besides my team, teammates, friends, and collegues at Southworks,  <a href="http://twitter.com/ezequielm">Ezequiel Morito</a> and <a href="http://twitter.com/jpdg">Juampi Garcia</a>. I want to thank and recognize that this work won&#8217;t be online today if I didn&#8217;t receive the advice from <a href="http://blogs.salias.com.ar">Martin Salias</a> who encouraged me to go further on spiking and publishing my spikes. </p>
<p>Thanks <a href="http://twitter.com/martinsalias">Martin</a>, I really appreciate your support and guidance.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>waz-queues + waz-blobs = Ruby WAZ Storage SDK (waz-storage)</title>
		<link>http://blogs.southworks.net/jhalife/2009/10/14/waz-queues-waz-blobs-ruby-waz-storage-sdk-waz-storage/</link>
		<comments>http://blogs.southworks.net/jhalife/2009/10/14/waz-queues-waz-blobs-ruby-waz-storage-sdk-waz-storage/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 17:59:09 +0000</pubDate>
		<dc:creator>johnny</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/jhalife/?p=153</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/jhalife/2009/10/14/waz-queues-waz-blobs-ruby-waz-storage-sdk-waz-storage/" class="more-link">read more<img src="http://blogs.southworks.net/jhalife/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Hey, after giving lots of thoughts of what am I going to do with the whole set of Ruby APIs for Windows Azure Storage, I figured out that might be better to have them merged, tested and refactored as a whole thing. I thought about lot&#8217;s of pro&#8217;s and con&#8217;s regarding whether to do this or not and I came out with a the following list:</p>
<h3>Pro&#8217;s</h3>
<ul>
<li>Blobs and Queues handle the same type of security, connection and headers. They share the core service called WAZ::Storage::SharedKeyCoreService</li>
<li>While I was doing some work on Queues I found some bugs on connection management and URI management on the CoreService, so those changes weren&#8217;t propagated to Blobs (yet).</li>
<li>99% use case of the gem is that people handle a single WAZ Account for everything (Queues, Blobs and Tables) so have to connect, configure and consume them from different gems seems lot of overhead.</li>
<li>Maintainability Index really drops on having them split.</li>
<li>This is a single man&#8217;s work and even worse is doing over my spare time (so I cannot keep them both up-to-date always).</li>
<li>Total gem size is 50KB compared to two gems of 30KB (so storage isn&#8217;t a problem here)</li>
</ul>
<h3>Con&#8217;s</h3>
<ul>
<li>At some point seemed cool and very aligned with YAGNI that you need to install only what you need (queues or blobs)</li>
<li>Shared behavior could be inherited from a third gem called &#8216;waz-storage-core&#8217; but that will require more maintainability work.</li>
</ul>
<p>Those are the things that came to my mind while working on this, so I decided to glue them together, refactor them and generate a consisten API for both services (and the tables soon enough).</p>
<h2>Towards the SDK</h2>
<p>Ruby devs aren&#8217;t usually required to have SDKs that&#8217;s more of the Windows World. SDK is the name I decided the whole thing will have: documentation, sample, gems and source code (Yes! I&#8217;ll do more docs). I&#8217;m looking for a consumable way for Ruby Devs to get involved on Windows Azure (since it&#8217;s worth doing it) but also there&#8217;re a lot of .NET Developers that may want to have a look at Ruby&#8217;s features and opportunities outside Windows World.</p>
<h2>This is work in progress</h2>
<p><img class="alignright" style="float: right" src="http://files.me.com/johnny.halife/nu6rch" alt="Tests running together" width="355" height="204" /></p>
<p>Although I didn&#8217;t officially released anything related to this new SDK, I started my own work towards completing the API, <strong>so every piece of valuable feedback you might have will be really appreciated!</strong> I really enjoy while doing this and probably will do better as time goes by but as you can see on the pictures, I already started, merged and have a pretty decent TODO&#8217;s to apply to this thing and probably after that I&#8217;ll be releasing another version.</p>
<p>From the picture on the right you can infer, that I&#8217;ve already merged the test suite, and the TODO&#8217;s. The whole project is now a single thing. These are the things that I&#8217;m considering for next version</p>
<p><img src="http://files.me.com/johnny.halife/fd3y88" alt="TODO's" width="684" height="512" /></p>
<p>As you can see, there are things that still need to be figured out, but with time (no much) , they will emerge and I&#8217;ll be releasing as soon as I have them.</p>
<h2>Help wanted!</h2>
<p>As I mentioned now and on the previous posts, <strong>this is a one man&#8217;s work but you can change it =).</strong> I&#8217;m looking for Developers (juniors, amateurs, pro&#8217;s, whatever) to contribute on the project as they wish. If you want to test the code base, write a sample, write some docs, or whatever you&#8217;re invited! Drop me a message at <a href="http://twitter.com/johnnyhalife">@johnnyhalife</a> and we should get going soon.</p>
<p>that&#8217;s it, stay tuned for more! (very soon)</p>
<p>thanks,<br />
~johnny</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows Azure Queues exposed directly to pure Ruby!</title>
		<link>http://blogs.southworks.net/jhalife/2009/10/09/windows-azure-queues-exposed-directly-to-pure-ruby/</link>
		<comments>http://blogs.southworks.net/jhalife/2009/10/09/windows-azure-queues-exposed-directly-to-pure-ruby/#comments</comments>
		<pubDate>Fri, 09 Oct 2009 18:02:37 +0000</pubDate>
		<dc:creator>johnny</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/jhalife/?p=152</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/jhalife/2009/10/09/windows-azure-queues-exposed-directly-to-pure-ruby/" class="more-link">read more<img src="http://blogs.southworks.net/jhalife/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Hey Pals! As you might recall two days ago <a href="blogs.southworks.net/jhalife/2009/10/06/consuming-windows-azure-blob-storage-from-ruby/">I&#8217;ve published an API called &#8220;waz-blobs&#8221; that enabled Ruby Developers to get the best from Windows Azure storage</a> straight from their pure ruby code. I told you I won&#8217;t stop there, so now I&#8217;m proud to announce that I&#8217;ve created <a href="http://github.com/johnnyhalife/waz-queues/">waz-queues</a>. As you can imagine and given the fact that I wasn&#8217;t creative at the time I named this things (If I had a dog I&#8217;d name it dog), this API exposes Windows Azure Queues to Ruby Developers (and IronRuby Devs too!).</p>
<p>Like the previous API, it&#8217;s 100% pure ruby, relays on <a href="http://github.com/adamwiggins/rest-client/">RestClient written by Adam Wiggins</a> and was written and tested on Mac and Ubuntu.</p>
<p>As on the <a href="http://blogs.southworks.net/jhalife/2009/10/06/consuming-windows-azure-blob-storage-from-ruby/">previous post</a> I wrote about the Blobs API,  this post isn&#8217;t about API documentation. It&#8217;s about all those things that forced me to write the API and some other random thoughts about where this whole thing is going.</p>
<h2>Oh, you did it again!</h2>
<p>Yes! I love it, interoperability is my passion, I love to write things to demonstrate that they can work with other very different things, and given the fact that Microsoft did a great job when they <a href="http://msdn.microsoft.com/en-us/library/dd179363.aspx">published the Windows Azure Storage Queue API on line</a>, I decided I&#8217;ll spend some time building this. Queues are great, async programming is cool and REST is something that people do not believe until they see it (for those skeptical devs this is fully implemented over HTTP Stack on pure Ruby)</p>
<h2>There&#8217;s nothing worse than waiting inline. Bummer!</h2>
<p>Welcome to the twentieth one century, we live surrounded by the buzz and the current one is called &#8220;Cloud Computing&#8221;. Although I won&#8217;t discuss the topic here, it relays on a very simple principle <em>&#8220;pay-to-play&#8221;</em>. If you want to handle more requests just increase the number of workers and decrease the number of money you&#8217;ve got on your pockets.</p>
<p>Not all the operations on a System need to be always consistent, Amazon cart is an example of that. When you don&#8217;t want to pay more just get a queue, do some work async, and voila! your problems are solved.</p>
<p>Some hosting platforms like <a href="http://heroku.com">Heroku</a> o <a href="http://lx.azure.microsoft.com">Windows Azure</a> have a limited number of requests that they can handle with a single machine/worker/dyno/you_name_it, when the backlog becomes to big they start to deflect request with HTTP 500 messages. If you relay on a queue you will also have a way to increase responsiveness on your app, sites like <a href="http://digg.com">digg</a> and<a href="http://twitter.com"> twitter.com </a>already do something similar.</p>
<h2>Why do I need Azure Queues?</h2>
<p>It&#8217;s an extremely powerful alternative to having a File System Queue or archaic Queue Systems like MSMQ, it&#8217;s on the cloud, it&#8217;s unlimited storage growth and can be used from either your current hosting or Windows Azure.</p>
<p>The whole Queue Service provided by Windows Azure it&#8217;s really simple but not least powerful. Possibilities are endless, and you can do whatever you want and create a multi-party system that has your web app hosted on Heroku written in pure ruby, a back end service running on Windows Azure written on C# and a python app hosted on Google Apps engine that uses Windows Azure Queues to communicate with each other. There&#8217;s no limit! (Even your mainframe can handle WAZ-Queues with some C HTTP Lib + playing nice with sockets).</p>
<h2>Ok, I buy it, now show me your magic</h2>
<p>The API is pretty simple, simpler than anything I&#8217;ve written before. Here&#8217;s a snippet that illustrates basic API interaction (or in other words, everything you need from a queue)</p>
<h3>Getting started</h3>
<pre style="font-size: 16px;padding: 2px;color: #333">sudo gem install waz-queues --source http://gemcutter.org</pre>
<h3>Reference Code</h3>
<pre style="font-size: 12px;padding: 2px;color: #333;border: 1px solid">  require 'waz-queues'

        service = WAZ::Queues::Base.establish_connection!(:account_name =&gt; account_name,
                                                          :access_key =&gt; access_key)

        # excepts that the metadata for the queue changes this method behaves as PUT
        # remarks: it performs a validation whether metadata changed or not (HTTP 409 conflict)
        queue = WAZ::Queues::Queue.create('my-queue')

        10.times do |m|
          # enqueue a receives string. Message content can be anything up to 8KB
          # you can serialize and send anything that serializes to UTF-8 string (JSON, XML, etc)
          queue.enqueue!("message##{m}")
        end

        while(queue.size &gt; 0) do
          # Since WAZ implements the peek lock pattern we are locking messages (not dequeuing)
          # it has two parameters how many messages and for how long they are locked
          messages = queue.lock(10)

          puts "dequeued message: #{messages.size}"

          # deletes the message from the queue so other clients do not pick it after
          # visibility time out expires
          messages.each {|m| m.destroy!}
        end</pre>
<h2>What&#8217;s next</h2>
<p>While doing this I figured out that there&#8217;s a common behavior shared across blobs and queues, you can see it on the code that I started doing some merging while creating a ruby module called <strong>WAZ::Storage::SharedKeyCoreService</strong> that handles everything related to connections, requests, headers and signing messages. I&#8217;ll be merging the whole thing into &#8216;waz-storage&#8217; gem that I&#8217;m planning to start over the weekend and create a small reference application to illustrate better what does this do? (if you wanna join ping me via <a href="http://twitter.com/johnnyhalife">twitter @johnnnyhalife</a>)</p>
<p>That&#8217;s it, I won&#8217;t say I&#8217;ll do tables API too, I guess that after this week you can figure it out by yourselves (although it might take more time)</p>
<h3>Special Thanks</h3>
<p>I&#8217;d like to thank the following people that help me with something more important and painful than designing the API or writing the code that this time was an individual experiment. The following people are listening to me in every spare time I have at work, talking about why I design something like I did, how cool it is, or how do I enjoy this, which can be even hard than putting this code together!</p>
<p>These people are: <a href="http://blogs.southworks.net/mwoloski">Matias Woloski</a>, <a href="http://blogs.southworks.net/ejadib">Ezequiel Jadib</a>, <a href="http://blogs.southworks.net/fboerr">Federico Boerr</a>, <a href="http://twitter.com/ezequielm">Ezequiel Morito</a>, <a href="http://twitter.com/srenzi">Sebastian Renzi</a>, <a href="http://blog.salias.com.ar">Martín Salias</a> and Pablo Costantini.</p>
<p>That&#8217;s all folks. Thanks,<br />
~johnny</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Consuming Windows Azure Blob Storage from Ruby</title>
		<link>http://blogs.southworks.net/jhalife/2009/10/06/consuming-windows-azure-blob-storage-from-ruby/</link>
		<comments>http://blogs.southworks.net/jhalife/2009/10/06/consuming-windows-azure-blob-storage-from-ruby/#comments</comments>
		<pubDate>Tue, 06 Oct 2009 10:55:00 +0000</pubDate>
		<dc:creator>johnny</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/jhalife/?p=151</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/jhalife/2009/10/06/consuming-windows-azure-blob-storage-from-ruby/" class="more-link">read more<img src="http://blogs.southworks.net/jhalife/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>Hey Folks, today I&#8217;m proud to announce my first release of the <strong>waz-blobs</strong> <strong><a href="http://docs.rubygems.org/read/book/3">ruby gem</a></strong>, for interacting with <strong><a href="http://www.microsoft.com/azure/windowsazure.mspx">Windows Azure Blob Storage</a></strong><strong> </strong>from Ruby programming language.</p>
<p>Yes, it&#8217;s 100% organic Ruby code, there&#8217;s no strange Microsoft library that you need to consume and even better it was written and tested on Mac OS X and Ubuntu 8.10.  This post is about the motivation, and design process I&#8217;ve taken. Here you will find a minimal reference to the code, if you&#8217;re looking for the bits go straight to <a href="http://github.com/johnnyhalife/waz-blobs/">http://github.com/johnnyhalife/waz-blobs/</a> that includes the whole API documentation.</p>
<h2>Motivation</h2>
<p>Interoperability, fun and inspiration! Those three words are the base of this whole experience, from those OSS Fan thinking <em>&#8220;why would I go for Windows Azure Storage? I&#8217;ve have my App written 100% ruby and runs on my custom built linux distro!&#8221;</em>, here is the summary of the thinking I&#8217;ve been doing when I was trying to understand whether to write the API or not:</p>
<ul>
<li><strong>It&#8217;s solid. </strong>Although it&#8217;s on CTP, it has been out for almost a year and during the different version it has demonstrated some basic fundamentals covered on <em>Distributed Storage</em> and the speed it&#8217;s really good.</li>
</ul>
<ul>
<li><strong>Ruby&#8217;s alternatives for serving static files isn&#8217;t great.</strong> I love Ruby, it has slowly became the language of my preference on the last year, but we have to admit that serving static files it&#8217;s better when outside our Ruby App server.</li>
</ul>
<ul>
<li><strong>It&#8217;s interoperable. </strong>As I started this post, the code available at <a href="http://github.com/johnnyhalife/waz-blobs/">http://github.com/johnnyhalife/waz-blobs/</a> is <strong>100% organic ruby code</strong>, it&#8217;s <strong>based on the RestClient API written by Addam Wiggins</strong> from <a href="http://heroku.com">Heroku</a> that can be found on <a href="http://github.com/adamwiggins/rest-client">http://github.com/adamwiggins/rest-client</a>/. The code is based on the WAZ Rest API available at <a href="http://msdn.microsoft.com/en-us/library/dd135733.aspx">http://msdn.microsoft.com/en-us/library/dd135733.aspx</a></li>
</ul>
<ul>
<li><strong>It works great from Heroku. </strong>I spend my spare time hacking on pure Ruby and most of my project end up on <strong>Heroku (by far the best Ruby Hosting Platform on the Clouds).</strong> As you can see on<strong> <a href="http://docs.heroku.com">Heroku Docs</a></strong><strong>, </strong>their recommendation is to go for AWS-S3, and I don&#8217;t like when my choices are limited, I wrote the gem just to have an alternative for S3 when hosting on Heroku.</li>
</ul>
<div>I loved the experience, and I&#8217;m loving each moment I spend hacking on this code, it&#8217;s probably one of the most fun projects I&#8217;ve ever faced. As a .NET Developer, I figured out that even the Storage Client shipped with Azure SDK isn&#8217;t great (it&#8217;s not even fully implemented agains the API Spec), so instead of complaining I developed my own.</div>
<p></p>
<div>As summary: I did it<strong> for fun,</strong> I did it because<strong> I like having choices</strong> <strong>(not only S3)</strong> and because <strong>I wanted to see how real is Microsoft statement about interoperability for WAZ Services, </strong>which end up being completely true this time.</div>
<p></p>
<h2>Getting started with the <em>waz-blobs</em> API</h2>
<p>First of all, if you just want to use it just get it from the gems repository like the following:</p>
<pre style="font-size: 16px;padding: 2px;color: #333">gem install waz-blobs --source http://gemcutter.org</pre>
<p>And here&#8217;s some basics</p>
<pre style="font-size: 12px;padding: 2px;color: #333;border: 1px solid">
  require 'waz-blobs'

  # Save your configuration info
  WAZ::Blobs::Base.establish_connection!(:account_name =&gt; "name", :account_key =&gt; "key")

  # creates a container
  container = WAZ::Blobs::Container.create('my-container')

  # stores a blob with custom properties (metadata)
  blob = container.store('my-blob.txt',  'this is the content of my blob', 'plain/text')

  # return a specific blob from a container
  blob = container['my-blob.txt']

  # retrieves a blob value
  blob.value
</pre>
<p>The complete API reference and source code can be found at <a href="http://github.com/johnnyhalife/waz-blobs/">http://github.com/johnnyhalife/waz-blobs/</a>, feel free to download, fork it, and submit patches.<br />
</p>
<h2>Next Steps</h2>
<p>During the next days, I&#8217;ll continue using this and probably refactoring or bug fixing. In the near future (don&#8217;t know how quick yet), I&#8217;ll get the WAZ Queues API too.<br />
<br />
While I work on Queues,  <strong>fork me</strong> on GitHub and consider yourself invited to submit as many patches as you want.<br />
<br />
thanks and read you soon,<br />
~johnny </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>And there was a time when we just built applications&#8230;</title>
		<link>http://blogs.southworks.net/jhalife/2009/09/14/and-there-was-a-time-when-we-just-built-applications/</link>
		<comments>http://blogs.southworks.net/jhalife/2009/09/14/and-there-was-a-time-when-we-just-built-applications/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 15:29:55 +0000</pubDate>
		<dc:creator>johnny</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blogs.southworks.net/jhalife/?p=150</guid>
		<description><![CDATA[... <a href="http://blogs.southworks.net/jhalife/2009/09/14/and-there-was-a-time-when-we-just-built-applications/" class="more-link">read more<img src="http://blogs.southworks.net/jhalife/wp-content/themes/southworks/assets/img/arrow-blue.png" width="12" height="12" alt="" /></a>]]></description>
			<content:encoded><![CDATA[<p>The 90&#8242;s, beginning of the Internet as mainstream as we know it right now. Those were times where just a few of us knew what computers were about, you won&#8217;t hear people on the metro talking about Gigas, Teras, iPods or DivX. It was quiet, and computers were just for Information Workers and lived on offices, although some people have their own at home, it wasn&#8217;t that common as today.</p>
<p>Software Development was also different then, it was a pretty streamlined process where a <em>Requirements Engineer </em>went to an office, analyzed how people behave on their daily basis, and then some programmer put together a couple of lines of code just to ease those proceseses.</p>
<p>That was an application, people thought about computer programs as a bunch of CRUD screens, that eased their daily work by cutting the clutter of working with papers. But, of course, it had problems since people was limited on what they can do with it, and innovation did not come from that side.</p>
<p>Not everything was bad, since it was the beginning of a new era, what we call today &#8220;Emergent Behavior&#8221; started then not as we look at it today but those fixed forms application made people find a workaround for fulfilling their on business needs.</p>
<h2>Emergent Behavior</h2>
<p>Let&#8217;s start easy by defining it, according to <a href="http://en.wikipedia.org">wikipedia</a>:</p>
<blockquote><p>An emergent behavior or emergent property can appear when a number of simple entities (agents) operate in an environment, forming more complex behaviors as a collective. If emergence happens over disparate size scales, then the reason is usually a causal relation across different scales. In other words there is often a form of top-down feedback in systems with emergent properties. The processes from which emergent properties result may occur in either the observed or observing system, and can commonly be identified by their patterns of accumulating change, most generally called &#8216;growth&#8217;.</p></blockquote>
<p>Now let&#8217;s analyze the definition by applying it to Software Engineering:</p>
<blockquote><p>Peter and Sally work on a company, both of them are sales team. They have a system that let&#8217;s them load their sales and then have a report of sales or a subgroup of them by just making a search and pressing the report button.</p>
<p>One day, Sally decides that it would be great if they can have the same sales report they do daily but independently for each distribution hub of their company. Their system doesn&#8217;t have that ability but they figured out that if they label each sale with tag like &#8220;<em>[phone-sale]</em>&#8221; or &#8220;<em>[store-pickup]</em>&#8221; they will be able to easily perform that report leveraging the search + export functionality (previously mentioned).</p>
<p>From now on, they have enhanced their process, added value to the business by just innovating with the existing features of the application, thew will simply label sales, search for that label and make their report.</p></blockquote>
<p>On the previous sample, we have seen how people may react to a system and how they can outperform by just using whatever is already on the system.</p>
<p>We as software people (architects, developers, managers, whatever) tend to think that our system is complete and has 1:1 mapping with the real business. But that&#8217;s often (if not always) misleading. If we were the architects of the system on the sample, what we would do? 80% (just an estimation) will say: &#8220;Oh that&#8217;s something that the sales team didn&#8217;t tell us we should probably go and build that feature into the software so we ease their life&#8221;. In my opinion that&#8217;s terribly wrong.</p>
<p>Nowadays the rate of change of the equation of people + business + information moves faster than never, <strong>we sometimes confuse the domain of the problem with a particular problem of an application</strong>. In the case above we should be probably look for a solution that helps people to manage their data in an unstructured way as they want (like tagging). Instead of adding a new layer of complexity to the system, we will just enable people to adapt the system to their needs.</p>
<h2>Enabling people and that&#8217;s what this is all about</h2>
<p><img class="alignright" style="float: right;margin-right: 20px" src="http://files.me.com/johnny.halife/04dozk" alt="" width="252" height="172" /></p>
<p>It started on the early days with the Apple II and the VisiCalc, a piece of software the enabled people to read and write tabular data, then it was Microsoft Excel that enables people like my father to run their own software to run his own business. And the star of this is twitter, enabling communications that are valid (or at least important for a short period of time).</p>
<h3>Why twitter has become so important?</h3>
<p>It was the early days of the Web 2.0 when the creators of twitter published it, it didn&#8217;t have lot of sense to have an online application that enable people to write up 140 characters and select people that will be able to read it and also having the ability to read others tweets.</p>
<p style="text-align: center"><img class="aligncenter" style="vertical-align: middle" src="http://files.me.com/johnny.halife/lwc7sg" alt="" width="672" height="376" /></p>
<p>It did not make sense until the iPhone came out, and that was a boom, that 140 characters enable people to say where they were, what they were looking at, or how they were feeling. Lots and lots of services came out like posting pictures or geo-location references, +100 of clients were written for it, and twitter stayed the same.</p>
<p>Twitter pals started looking at what people were doing, at the results of the collective intelligence, for example the hash-tagging for trending topics or people looking for those trends on the web. And they just worked out those parts.</p>
<p>Now twitter also servers as the #1 Information Delivery Mechanism for people all over the worlds, digital media is into twitter and even stock prices are notified via twitter.</p>
<p>What did twitter do? They just enhanced application aspects like performance, searching and API tweaks not modifying their core functionality for sake of having more functionality,  just changed anything needed to enable more for end-users.</p>
<h2>So what?</h2>
<p><strong>We live on the era where information flows too fast and too furious for us, more than we can manage and more than we can imagine.</strong> Back on the 90&#8242;s as I said on the beginning of this post probably projects like twitter might end up having a &#8220;Twitter Finance&#8221; or &#8220;Twitter Media&#8221; feature.</p>
<p>What&#8217;s wrong on adding features based on what people do? There&#8217;s nothing wrong about it, but what is often confused is what people is doing. For example, what do I, Twitter Stock Exchange and NY Times Publishing on twitter have in common?</p>
<p>From a 90&#8242;s Requirements Engineering point of view absolutely nothing. From a collective intelligence point of view, everything we are all trying to put information that has value for a short period of time and that sometimes falls under an specific trend or category. If I were twitter&#8217;s architect I will probably look into making twitter easy for the general use case (sharing information) instead of looking for adding an specific feature built-in to the system.</p>
<h3>Getting started with Emergent Behaviors Design</h3>
<p><strong>&#8220;We are what we do&#8221;, and that&#8217;s it</strong>. No matter what we thought for the application intend it will end up being what people are doing with it. <strong>A system is only the result of what their users do.</strong></p>
<p>Having the previous paragraph, let&#8217;s create a small list of things that you have to consider when designing for emergent behaviors aware applications:</p>
<ol>
<li><strong>Know your domain.</strong> Excel knows that it&#8217;s domain is cells and columns and everything must be optimized for working on that domain and keep it as small as possible.</li>
<li><strong>Do not confuse domain with features.</strong> If you looking into something, and trying to solve a problem try to differentiate what people is looking forward doing with it instead of solving the actual problem.</li>
<li><strong>Do not map features and use cases 1:1. </strong> Try to enable more and do less, invest on what is worth and what will keep your system alive, there&#8217;s one principle that we cannot avoid when thinking of a software product &#8220;whatever becomes useless end up on the trash can&#8221;.</li>
<li><strong>Define what you wanna do.</strong> Software lifespan is really reduced nowadays, enable the more for the time being &#8220;alive&#8221; and know that at some point in time will be better to back off and come back with a new product.</li>
<li><strong>Constraints, constraints, constraints. </strong>Define a model, define a language, and define operations over the model. The rest will be open for end users but have definitions, everything isn&#8217;t a plain text (or formatted text file) business value comes from this constraints, and this is what will difference you from having your whole enterprise using Microsoft Excel for every application.</li>
<li><strong>Be open minded. </strong>Once you set up your system constraints, do not try to interfere with how people interact with your application telling them &#8220;oh that wasn&#8217;t supposed to be that way&#8221;.</li>
<li><strong>Open your API.</strong> Having people accessing your model will constraint it even more, and the result will be people leveraging your model, your language and the operations you defined in a whole different way, and that what generates business values (and evolves your business).</li>
<li><strong>Keep a consistent interface to your data. </strong>Learned from Gmail&#8217;s label operator where you can search for email that is unread or fall under an specific category.</li>
<li><strong>Have logging and tracing mechanisms. </strong>Understand how do your users interact with the system is what will help you make it better.</li>
<li><strong>Plant a seed and watch them grow. </strong>Have an agile process, get your system on the field as soon as you can and start watching it, people may not realized that they have changed the requirements but your job will be to understand those behaviors and combined with the previous point will let you enhance your product as whole, sticking always to the reality.</li>
</ol>
<p>Remember, <strong>there&#8217;s no silver bullet on software design, there&#8217;s no one-size-fits-all, and there&#8217;s no product that can last forever</strong>. When facing your next development challenge think in terms of what may people end up doing with this, which is my domain, or how will I enable people to restructure the data. Then just work on</p>
<p>Read you soon,<br />
~johnny</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
