<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-10409743</id><updated>2012-01-17T05:52:12.909-08:00</updated><category term='wcf'/><category term='ruby'/><category term='portuguese'/><category term='technology'/><category term='business'/><category term='mysql'/><category term='english'/><category term='silverlight'/><category term='security'/><category term='politics'/><category term='culture'/><category term='hbr'/><category term='language'/><category term='philosophy'/><category term='book'/><category term='distributed systems'/><category term='visual studio'/><category term='rest'/><category term='regex'/><category term='photo'/><category term='dns'/><category term='microsoft'/><category term='design'/><category term='quotes'/><category term='nosql'/><category term='quality'/><category term='career'/><category term='network'/><category term='aws'/><title type='text'>Rodrigo De Castro</title><subtitle type='html'>This is a personal web page. Things said here do not represent the position of my employer.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default?start-index=101&amp;max-results=100'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>309</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-10409743.post-4793957157964653697</id><published>2012-01-16T21:24:00.000-08:00</published><updated>2012-01-16T21:24:42.069-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='distributed systems'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Absolute Consistency</title><content type='html'>Very often I have a hard time explaining to people not very familiar with distributed systems how hard it is to provide consistency guarantees in face of node failures and network partitions.&lt;br /&gt;&lt;br /&gt;Today I read an emails posted to Riak users list that gives good examples on why this is a non-trivial problem:&lt;br /&gt;&lt;a href="http://lists.basho.com/pipermail/riak-users_lists.basho.com/2012-January/007157.html"&gt;http://lists.basho.com/pipermail/riak-users_lists.basho.com/2012-January/007157.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Definitely worth reading if you're into distributed systems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-4793957157964653697?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/4793957157964653697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=4793957157964653697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4793957157964653697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4793957157964653697'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2012/01/absolute-consistency.html' title='Absolute Consistency'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-4967744812830143871</id><published>2011-12-28T19:53:00.000-08:00</published><updated>2011-12-28T20:04:20.678-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='hbr'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>The parable of the sadhu</title><content type='html'>Yesterday I read this Harvard Business Review called &lt;a href="http://hbr.org/1997/05/the-parable-of-the-sadhu/ar/1"&gt;"The parable of the sadhu"&lt;/a&gt;, by Bowen McCoy.&lt;br /&gt;&lt;br /&gt;This is a very popular HBR article where the author faces a moral dilemma in Nepal. When climbing the mountains, his group finds an Indian holy man - a sadhu - lying on the ice, suffering from hypothermia. The dilemma between taking or not care of the man and their own needs ends when they give him some aid and comfort, but carry and leave him close to a hut, not knowing for sure whether he makes to the hut and, for that matter, if he lived after that.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-NjwBzRfRGBU/TvvmcL4fFgI/AAAAAAAAABU/W21DC5iiq40/s1600/6511371407_c44ecf48a5.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-NjwBzRfRGBU/TvvmcL4fFgI/AAAAAAAAABU/W21DC5iiq40/s320/6511371407_c44ecf48a5.jpg" width="240" /&gt;&lt;/a&gt;&lt;/div&gt;The discussion that comes up after that is what is limit of their responsibility in a situation like that.&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;"&gt;"'Where, inyour opinion', I asked, 'is the limit of our responsibility in a situation likethis? We had our own well-being to worry about.'"&lt;/div&gt;&lt;/blockquote&gt;And after&amp;nbsp;analyzing the situation, the author understand that...&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt;"&lt;/span&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; font-family: Calibri; font-size: 11pt;"&gt;One of our problems was that asa group we had no process for developing a consensus. We had no sense ofpurpose or plan.&lt;span style="font-family: Calibri; font-size: 11pt;"&gt; […] &lt;/span&gt;&lt;span style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; font-family: Calibri; font-size: 11pt;"&gt;Becausethe group did not have a set of preconditions that could guide its action to anacceptable resolution, we reacted instinctively as individuals.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Calibri; font-size: 11pt;"&gt; […] Wehad no leader with whom we could all identify and in whose purpose webelieved."&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;I don't to give away the entire article, but I must quote these paragraphs that summarize the lesson:&lt;br /&gt;&lt;blockquote class="tr_bq"&gt;&lt;div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;"&gt;"Individualswho operate from a thoughtful set of personal values provide the foundation fora corporate culture. A corporate tradition that encourages freedom of inquiry,supports personal values, and reinforces a focused sense of direction can fulfillthe need to combine individuality with the prosperity and success of the group.Without such corporate support, the individual is lost."&lt;/div&gt;&lt;div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;"&gt;"That is thelesson of the sadhu. In a complex corporate situation, the individual requiresand deserves the support of the group. When people cannot find such support intheir organizations, they don't know how to act. If such support is forthcoming,a person has a stake in the success of the group and can add much to theprocess of establishing and maintaining a corporate culture. Management'schallenge is to be sensitive to individual needs, to shape them, and to directand focus them for the benefit of the group as a whole."&lt;/div&gt;&lt;/blockquote&gt;It is interesting to analyze our own corporations and if we provide the foundation for a corporate culture, if any. Do we encourage freedom of inquiry? Do we support personal values? Do we have a focused sense of direction? Oftentimes I think that "the individual is lost" in many corporate environments, like the author says above. And this is harmful to the company.&lt;br /&gt;&lt;br /&gt;PS: Photo from &lt;a href="http://www.flickr.com/photos/travelwyse/6511371407/sizes/m/in/photostream/"&gt;Flickr &lt;/a&gt;(Creative Commons).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-4967744812830143871?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/4967744812830143871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=4967744812830143871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4967744812830143871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4967744812830143871'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/12/parable-of-sadhu.html' title='The parable of the sadhu'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-NjwBzRfRGBU/TvvmcL4fFgI/AAAAAAAAABU/W21DC5iiq40/s72-c/6511371407_c44ecf48a5.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-8952348821966180466</id><published>2011-12-28T14:55:00.000-08:00</published><updated>2011-12-28T15:05:33.302-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Java: how can a 1Gbit/s attack keep up to 100K i7 CPUs busy?</title><content type='html'>&lt;p&gt;This is a hash table vulnerability found in many web application platforms, like PHP, ASP.NET, Ruby, and Java (but not only Java). In one of the cases, 1Gbit/s can keep up to 1 million CPUs busy!&lt;/p&gt;&lt;p&gt;Microsoft has already posted an &lt;a href="http://technet.microsoft.com/en-us/security/advisory/2659883"&gt;advisory&lt;/a&gt; on this issue. The video has more information about other platforms.&lt;/p&gt;&lt;p&gt;The video below was published today and contains more details on the vulnerability. It is quite interesting, especially if you're into security.&lt;/p&gt;&lt;iframe width="560" height="315" src="http://www.youtube.com/embed/R2Cq3CLI6H8" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;p&gt;And here you can find a blog post with more details on the talk:&lt;/p&gt;&lt;a href="http://cryptanalysis.eu/blog/2011/12/28/effective-dos-attacks-against-web-application-plattforms-hashdos/"&gt;http://cryptanalysis.eu/blog/2011/12/28/effective-dos-attacks-against-web-application-plattforms-hashdos/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-8952348821966180466?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/8952348821966180466/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=8952348821966180466' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8952348821966180466'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8952348821966180466'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/12/java-how-can-1gbits-attack-keep-up-to.html' title='Java: how can a 1Gbit/s attack keep up to 100K i7 CPUs busy?'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/R2Cq3CLI6H8/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5495039706196637828</id><published>2011-12-19T21:07:00.000-08:00</published><updated>2011-12-19T21:10:29.622-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='nosql'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>StackOverflow clone with RavenDB</title><content type='html'>Today I watched the video below on how to build a StackOverflow with RavenDB. This was my first video on a document store database, and it was amazing to show show interesting and easy it is to use it for a site like StackOverflow. &lt;br/&gt;I was surprised to know that RavenDB supports transactions and by its integration with Linq. Although it's a .NET solution only and requires a commercial license if you're not working on an open source project, it was good to start learning the benefits of a document store.&lt;br/&gt;It also supports full text search, which is implemented under the hood using Lucene.NET.&lt;br/&gt;&lt;br/&gt;&lt;div style="clear:both"&gt;&lt;object style="height: 390px; width: 640px"&gt;&lt;param name="movie" value="http://www.youtube.com/v/d4Fx-_7S9pU?version=3&amp;feature=player_detailpage"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/d4Fx-_7S9pU?version=3&amp;feature=player_detailpage" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="360"&gt;&lt;/object&gt;&lt;/div&gt;&lt;br/&gt;If you're interested in getting your StackOverflow running, do the following:&lt;ul&gt;&lt;li&gt;Download RavenDB from &lt;a href="http://ravendb.net"&gt;RavenDB website&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Extract RavenDB into a directory and run Server\Raven.Server.exe&lt;/li&gt;&lt;li&gt;Download RavenOverflow from &lt;a href="https://github.com/PureKrome/RavenOverflow"&gt;its GitHub repository&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Extract RavenOverflow in a directory and open RavenOverflow.sln in Visual Studio&lt;/li&gt;&lt;li&gt;Right-click on "RavenOverflow.Web" and click on "Set as StartUp Project"&lt;/li&gt;&lt;li&gt;Hit F5 in Visual Studio&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-2_9K-cdPUEw/TvAXrgOz4rI/AAAAAAAAABI/z66c6sSm_s8/s1600/ravenoverflow.JPG" imageanchor="1" style="margin-left:1em; margin-right:1em"&gt;&lt;img border="0" height="267" width="400" src="http://4.bp.blogspot.com/-2_9K-cdPUEw/TvAXrgOz4rI/AAAAAAAAABI/z66c6sSm_s8/s400/ravenoverflow.JPG" /&gt;&lt;/a&gt;&lt;/div&gt;The original post by the presenter can be found &lt;a href="http://ayende.com/blog/115713/ravenoverflow-building-a-stackoverflow-clone-with-ravendb"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5495039706196637828?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5495039706196637828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5495039706196637828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5495039706196637828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5495039706196637828'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/12/stackoverflow-clone-with-ravendb.html' title='StackOverflow clone with RavenDB'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-2_9K-cdPUEw/TvAXrgOz4rI/AAAAAAAAABI/z66c6sSm_s8/s72-c/ravenoverflow.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5298683296537061407</id><published>2011-12-09T17:55:00.001-08:00</published><updated>2011-12-09T18:33:56.891-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dns'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>DNS domain names: 253 or 255 bytes/octets?</title><content type='html'>The question of whether DNS domain names are 253 or 255 is something that is hard to find a good confirmation on, but I hope to be able to provide the answer here in this post.&lt;br /&gt;&lt;br /&gt;Let's start taking a look at some RFCs:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i&gt;"&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;Host software MUST handle host names of up to 63 characters and &lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;SHOULD handle host names of up to 255 characters." &lt;/span&gt;&lt;/i&gt;&lt;a href="http://www.ietf.org/rfc/rfc1123.txt"&gt;http://www.ietf.org/rfc/rfc1123.txt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;i&gt;"&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;To simplify implementations, the total length of a domain name (i.e., &lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;label octets and label length octets) is restricted to 255 octets or &lt;/span&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;less." &lt;/span&gt;&lt;/i&gt;&lt;a href="http://www.ietf.org/rfc/rfc1035.txt"&gt;http://www.ietf.org/rfc/rfc1035.txt&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;i style="white-space: pre-wrap;"&gt;"A full domain name is limited to 255 octets (including the separators)." &lt;/i&gt;&lt;a href="http://tools.ietf.org/rfc/rfc2181.txt" style="white-space: pre-wrap;"&gt;http://tools.ietf.org/rfc/rfc2181.txt&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;So it seems that the domain names should be up to 255 octets, right? That is not what Wikipedia says:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;i&gt;"The full domain name may not exceed a total length of 253 characters" &lt;/i&gt;&lt;/span&gt;&lt;a href="http://en.wikipedia.org/wiki/Domain_name" style="font-family: inherit;"&gt;http://en.wikipedia.org/wiki/Domain_name&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;There is even a long discussion on Wikipedia about the right value &lt;a href="http://en.wikipedia.org/wiki/Talk:Domain_Name_System#Length_-_253_or_255.3F"&gt;here&lt;/a&gt;.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;And even an RFC mentions 253 octets:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;i style="white-space: pre-wrap;"&gt;"When the result of macro expansion is used in a domain name query, if the expanded domain name exceeds 253 characters (the maximum length of a domain name) [...]" &lt;/i&gt;&lt;a href="http://www.ietf.org/rfc/rfc4408.txt" style="font-family: inherit; white-space: pre-wrap;"&gt;http://www.ietf.org/rfc/rfc4408.txt&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;Then you start playing with Microsoft DNS or BIND, and tools on both Windows and Linux and see some interesting behaviors. For instance, nslookup on Windows times out when domain name is 255 characters against a BIND server. The version on Linux, however, you get an explicit error for anything longer than 253 characters (ASCII, hence 253 octets):&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;    host &amp;lt;255-char domain name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;    &amp;lt;255-char domain name&amp;gt; is not a legal name (ran out of space)&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;span class="Apple-style-span" style="white-space: pre-wrap;"&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;The answer lies actually in the good old RFC 1035 - thanks to a colleague for finding this definitive answer:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;i&gt;"Each label is represented as a one octet length field followed by that number of octets.  Since every domain name ends with the null label of the root, a domain name is terminated by a length byte of zero." &lt;/i&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: inherit; white-space: normal;"&gt;&lt;a href="http://www.ietf.org/rfc/rfc1035.txt"&gt;http://www.ietf.org/rfc/rfc1035.txt&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;The answer is that,&lt;span class="Apple-style-span" style="color: #444444;"&gt; &lt;span class="Apple-style-span" style="background-color: white;"&gt;over the wire&lt;/span&gt;&lt;/span&gt;, the domain name uses &lt;span class="Apple-style-span" style="background-color: white; color: #444444;"&gt;255 octets&lt;/span&gt;. The first one is used to indicate the length, and there's a last byte that is a terminator. So what is left for the &lt;span class="Apple-style-span" style="color: #444444;"&gt;&lt;b style="background-color: white;"&gt;actual domain name is 253 octets&lt;/b&gt;&lt;/span&gt; - which can represent different numbers of characters depending on your domain.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5298683296537061407?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5298683296537061407/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5298683296537061407' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5298683296537061407'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5298683296537061407'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/12/dns-domain-names-253-or-255-bytesoctets.html' title='DNS domain names: 253 or 255 bytes/octets?'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6184984695160910079</id><published>2011-12-04T21:46:00.001-08:00</published><updated>2011-12-04T21:50:10.490-08:00</updated><title type='text'>Microsoft Visual Studio Tips and Tricks</title><content type='html'>As I am trying to become more productive using Visual Studio - even after some months at Microsoft, I still think I am more productive with Eclipse, I came across this good TechEd talk on Channel 9 on tips and tricks that taught me a bunch of nice things about Visual Studio:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/DEV305"&gt;http://channel9.msdn.com/Events/TechEd/NorthAmerica/2011/DEV305&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I hope it helps you too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6184984695160910079?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6184984695160910079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6184984695160910079' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6184984695160910079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6184984695160910079'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/12/microsoft-visual-studio-tips-and-tricks.html' title='Microsoft Visual Studio Tips and Tricks'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-141944019785512690</id><published>2011-12-03T16:16:00.001-08:00</published><updated>2011-12-03T16:22:05.416-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Visual Studio add-ins for pasting XML</title><content type='html'>&lt;br /&gt;&lt;div class="MsoNormal"&gt;I compiled and installed a couple of Visual Studio add-insthat I thought quite useful for those dealing with XML, in particular pasting them into VS.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;SmartPaster 2010&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;/div&gt;Allow you to past XML as comments, strings, and as StringBuilder – escaping the text as necessary!&lt;o:p&gt;&lt;/o:p&gt;&lt;br /&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-Jsl88pr2row/Ttq8MO5uxqI/AAAAAAAAAAo/QsAPohFfZu0/s1600/smarterpaster2010.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-Jsl88pr2row/Ttq8MO5uxqI/AAAAAAAAAAo/QsAPohFfZu0/s1600/smarterpaster2010.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;In my case, I had to paste a long XML from my API document and did not want to escape everything.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;This is the source site: &lt;a href="http://smartpaster2010.codeplex.com/"&gt;http://smartpaster2010.codeplex.com/&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraph" style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;"&gt;&lt;span style="font-family: 'Courier New';"&gt;o&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Binaryversion did not load in Visual Studio 2010 64-bit (exception was thrown), so I recompiled it and it worked just fine.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;b&gt;Paste XML&amp;nbsp; as Type&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;This add-in is really cool for REST APIs. Youcopy a XML (like from our MSDN documentation) and it paste it as a serializabletype. All classes are automatically generated.&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-XC-wY-Ix39g/Ttq8ep61rxI/AAAAAAAAAAw/IjAFioChWss/s1600/pastexmlastype.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-XC-wY-Ix39g/Ttq8ep61rxI/AAAAAAAAAAw/IjAFioChWss/s1600/pastexmlastype.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoListParagraph" style="mso-list: l0 level1 lfo1; text-indent: -.25in;"&gt;&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;It was included in Microsoft WCF REST Starter Kit Preview2: &lt;a href="http://aspnet.codeplex.com/releases/view/24644"&gt;http://aspnet.codeplex.com/releases/view/24644&lt;/a&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="MsoListParagraph" style="margin-left: 1.0in; mso-list: l0 level2 lfo1; text-indent: -.25in;"&gt;&lt;span style="font-family: 'Courier New';"&gt;o&lt;span style="font: normal normal normal 7pt/normal 'Times New Roman';"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;Itdoesn’t have a binary version, so I compiled this add-in and made it availabletoo&lt;o:p&gt;&lt;/o:p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-141944019785512690?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/141944019785512690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=141944019785512690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/141944019785512690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/141944019785512690'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/12/visual-studio-add-ins-for-pasting-xml.html' title='Visual Studio add-ins for pasting XML'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-Jsl88pr2row/Ttq8MO5uxqI/AAAAAAAAAAo/QsAPohFfZu0/s72-c/smarterpaster2010.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-86162030949743827</id><published>2011-11-20T13:18:00.001-08:00</published><updated>2011-11-20T13:38:44.614-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Silverlight, cross-domain issues, and self-signed certificates</title><content type='html'>I've been meaning to post this for quite sometime now as I haven't seen others with exactly the same issue.First, some context: when running a Silverlight application, it has some special security measures in place to avoid &lt;a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery"&gt;Cross-Site Request Forgery (CSRF)&lt;/a&gt;. By default, Silverlight only allows site-of-origin communication - for instance, "http://blog.sacaluta.com/test.aspx" will be able to access "http://blog.sacaluta.com/myservice.svc", but not "http://www.example.com". In order to allow more than site-of-origin communication, a service owner must have a clientaccesspolicy.xml file in the root configuring which domains are allowed to access that service. If you're interested, this is explained in greater detail on &lt;a href="http://msdn.microsoft.com/en-us/library/cc197955(v=vs.95).aspx"&gt;this MSDN site&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The issue I ran into is that I had a Silverlight application and also a service, both running locally. My service had a proper clientaccesspolicy.xml configured to allow access from anywhere. And still my Silverlight would fail with the message:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;"An error occurred while trying to make a request to URI 'https://MYDOMAIN/MYSERVICE.svc'. This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute. Please see the inner exception for more details. ---&amp;gt; System.Security.SecurityException ---&amp;gt; System.Security.SecurityException: Security error..."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;After debugging the issue further, the problem was that my service had only a secure endpoint (SSL) and its certificate was self-signed (or did not match the domain, can't remember now). In that case, my Silverlight application would not download the service's clientaccesspolicy.xml and therefore declined access to it. Since I was running code within another larger application that I did not have control of, I did not investigate further whether one can configure to allow self-signed or mismatched certificates to be accepted during development. (In case you know if these are possible, please let me know!)&lt;br /&gt;&lt;br /&gt;How did I get it solved? If you're running in Internet Explorer:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Before loading your Silverlight application, first access the clientaccesspolicy.xml file. IE will alert about being self-signed or mismatched cert, but you can opt to proceed with it.&lt;/li&gt;&lt;li&gt;In the same tab, access then your Silverlight application. It will be able to access your clientaccesspolicy.xml at that point, and the call will go through.&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Simple trick, and effective. I'd love to know if other browsers work the same. By the way, this was tested in Internet Explorer 9.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-86162030949743827?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/86162030949743827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=86162030949743827' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/86162030949743827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/86162030949743827'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/silverlight-cross-domain-issues-and.html' title='Silverlight, cross-domain issues, and self-signed certificates'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-3955749959113496436</id><published>2011-11-20T12:55:00.000-08:00</published><updated>2011-11-20T13:11:38.516-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>ReadyNas, WebDav, and "Method Not Allowed"</title><content type='html'>I have a ReadyNas Duo network-attached storage, which I access via WebDAV only due to some permission conflicts if I use different protocols to write files to it. Given that Windows does not support WebDav properly in my case, I installed a WebDav client called &lt;a href="http://www.bitkinex.com/"&gt;BitKinex&lt;/a&gt;. I configured it to point to my share and guess what: "HTTP: Method Not Allowed (/)" error. This is the dialog:&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/-xBNeyeH7hcU/TslqmiHfJrI/AAAAAAAAAAQ/H5sdytnA_3k/s1600/bitkinex.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 136px;" src="http://1.bp.blogspot.com/-xBNeyeH7hcU/TslqmiHfJrI/AAAAAAAAAAQ/H5sdytnA_3k/s320/bitkinex.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5677186015503001266" /&gt;&lt;/a&gt;The problem is that BitKinex, by default, points to the root of your server. In ReadyNas case, it has different shares, and you must point to the right share to get it fixed. In order to do that, right click on the WebDav connection and select "Properties". Go to "Site Map" and update "/" with your share name (in my case, "/documents").&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/-V9BBq2dFLmo/TslrX_FDzDI/AAAAAAAAAAc/I9inMmRw-b4/s1600/bitkinex-share.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 210px;" src="http://2.bp.blogspot.com/-V9BBq2dFLmo/TslrX_FDzDI/AAAAAAAAAAc/I9inMmRw-b4/s320/bitkinex-share.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5677186865091038258" /&gt;&lt;/a&gt;Then it works fine.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-3955749959113496436?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/3955749959113496436/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=3955749959113496436' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3955749959113496436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3955749959113496436'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/readynas-webdav-and-method-not-allowed.html' title='ReadyNas, WebDav, and &quot;Method Not Allowed&quot;'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-xBNeyeH7hcU/TslqmiHfJrI/AAAAAAAAAAQ/H5sdytnA_3k/s72-c/bitkinex.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-8745994985521305550</id><published>2011-11-17T22:04:00.000-08:00</published><updated>2011-11-17T22:30:45.788-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>.NET: do not use System.Uri for domain validation</title><content type='html'>Last time I talked about &lt;a href="http://blog.sacaluta.com/2011/11/uri-segments-dots-rest-and-net-bug.html"&gt;System.Uri&lt;/a&gt;, I was talking about a bug that prevents trailing dots from being used for REST resources. Now the issue is different: how about relying on System.Uri for domain validation?&lt;br /&gt;&lt;br /&gt;It's not uncommon to see System.Uri being used to validate an input that is supposed to be a domain name. I've seen code like this trying to validate domains:&lt;pre name="code" class="c-sharp"&gt;public static bool IsDomainValid(string name)&lt;br /&gt;{&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        new Uri("http://" + name);&lt;br /&gt;    }&lt;br /&gt;    catch (UriFormatException)&lt;br /&gt;    {&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;Or, besides relying on UriFormatException or on the the Host property, something like this:&lt;pre name="code" class="c-sharp"&gt;public static bool IsDomainValid(string domainName)&lt;br /&gt;{&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        if (StringComparer.OrdinalIgnoreCase.Equals(new Uri("http://" + domainName).Host, domainName))&lt;br /&gt;        {&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;    catch (UriFormatException)&lt;br /&gt;    {&lt;br /&gt;        return false;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;Preliminary tests with this code shows that completely wrong domains (like 3@#@@.com) are rejected, so it seems to be a great code. And the best is that we don't have to write any domain validation ourselves.&lt;br /&gt;&lt;br /&gt;Now, what about the following domains?&lt;br /&gt;&lt;br /&gt;--------.com&lt;br /&gt;-test.com &lt;br /&gt;test-.com&lt;br /&gt;&lt;br /&gt;They are all considered valid according to System.Uri(). However, according &lt;a href="http://www.ietf.org/rfc/rfc1035.txt"&gt;RFC 1035&lt;/a&gt; or &lt;a href="http://www.ietf.org/rfc/rfc1123.txt"&gt;RFC 1123&lt;/a&gt;, they are not. According to RFC 1035, not even a digit only domain (like 999.com) is valid, but System.Uri() is fine with all of them.&lt;br /&gt;&lt;br /&gt;I played with some of the internal flags and it seems that, if you use E_HostNotCanonical (256), it starts rejecting some of these invalid domain names, but I really couldn't understand the rules it follows. And since there are different RFCs and different interpretations, it would be really hard for System.Uri() to do a precise validation unless one passed the type RFC that the domain is expected to be compliant with.&lt;br /&gt;&lt;br /&gt;At the end of the day, you're better off understanding the RFC you want to comply with and implementing the proper regular expression for that. In my case, I wanted it to be compatible with RFC 1123, so this is the regular expression I started with:&lt;br /&gt;&lt;br /&gt;"^(?![0-9]+$)(?!-)[a-zA-Z0-9-]{1,63}(?&amp;lt;!-)$&lt;br /&gt;&lt;br /&gt;And then relaxed it to the following after learning that digits only domains were accepted by RFC 1123 (there are multiple interpretations, but I read the RFC and was convinced that it was fine).&lt;br /&gt;&lt;br /&gt;"^(?!-)[a-zA-Z0-9-]{1,63}(?&amp;lt;!-)$"&lt;br /&gt;&lt;br /&gt;This is the regular expression per domain label (text between the dots). It does not apply to the rightmost label as it must not start with a digit - in order to differentiate a domain name from an IP address.&lt;br /&gt;&lt;br /&gt;Also, this regular expression requires an explicit check that the entire domain is less or equal to 255 characters.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-8745994985521305550?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/8745994985521305550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=8745994985521305550' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8745994985521305550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8745994985521305550'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/net-do-not-use-systemuri-for-domain.html' title='.NET: do not use System.Uri for domain validation'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6302305233709061962</id><published>2011-11-16T20:56:00.000-08:00</published><updated>2011-11-16T21:11:58.168-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Regular expressions: backtracking can kill your performance</title><content type='html'>Or why you should learn atomic grouping...&lt;br /&gt;&lt;br /&gt;After &lt;a href="http://blog.sacaluta.com/2011/11/regular-expressions-turning-off-useless.html"&gt;last post&lt;/a&gt; on turning off useless backtracking by using atomic grouping, I kept on reading the &lt;a href="http://www.amazon.com/Regular-Expressions-Cookbook-Jan-Goyvaerts/dp/0596520689"&gt;Regular Expressions Cookbook&lt;/a&gt; and ran another experiment to validate the performance difference. Let's start with the results:&lt;br /&gt;&lt;br /&gt;Normal Regex - # of loops: 1000, # of matches: 0, time (ms): 66149&lt;br /&gt;Atomic Grouping - # of loops: 1000, # of matches: 0, time (ms): 11196&lt;br /&gt;&lt;br /&gt;Note that a normal regex was 6 times slower than atomic grouping to fail to match.&lt;br /&gt;&lt;br /&gt;The example from the book is a regex to match a well-formed html page. I saved a Wikipedia page, made a few adjustments to the program used in the last post (e.g. to read the html contents from file), and ran the tests.&lt;br /&gt;&lt;br /&gt;The regular expression used is:&lt;pre name="code" class="c-sharp"&gt;&amp;lt;html&amp;gt;(?&amp;gt;.*?&amp;lt;head&amp;gt;)(?&amp;gt;.*?&amp;lt;title&amp;gt;)(?&amp;gt;.*?&amp;lt;/title&amp;gt;)(?&amp;gt;.*?&amp;lt;/head&amp;gt;)(?&amp;gt;.*?&amp;lt;body[^&amp;gt;]*&amp;gt;)(?&amp;gt;.*?&amp;lt;/body&amp;gt;).*?&amp;lt;/html&amp;gt;&lt;/pre&gt;Every test I ran with this regex and with the version without atomic grouping, I can see the normal regex being 6 times slower. If you want to know more about using atomic grouping or a regular regex, please read my &lt;a href="http://blog.sacaluta.com/2011/11/regular-expressions-turning-off-useless.html"&gt;last post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And this difference was found without setting the regex to be compiled. After setting this flag, these are the values I get:&lt;br /&gt;&lt;br /&gt;Normal Regex - # of loops: 1000, # of matches: 0, time (ms): 49319&lt;br /&gt;Atomic Grouping - # of loops: 1000, # of matches: 0, time (ms): 9471&lt;br /&gt;&lt;br /&gt;Still a pretty significant change between normal regex and atomic grouping.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6302305233709061962?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6302305233709061962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6302305233709061962' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6302305233709061962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6302305233709061962'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/regular-expressions-backtracking-can.html' title='Regular expressions: backtracking can kill your performance'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2885882748586046479</id><published>2011-11-15T17:55:00.000-08:00</published><updated>2011-11-16T19:41:14.714-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Regular expressions: turning off useless backtracking</title><content type='html'>&lt;a href="http://blog.sacaluta.com/2011/11/regular-expression-greedy-vs-lazy.html"&gt;Last time&lt;/a&gt; I mentioned the nice feature on how to change quantifier to be greedy or lazy, and then help you match what you really want. This time, it is how to make your regular expression more efficient. First, we need to remember last post where greedy or lazy quantifier change how backtracking works. Sometimes backtracking just doesn’t make sense. Look at this example:&lt;pre name="code" class="c-sharp"&gt;\b\d+\b&lt;/pre&gt;It is supposed to match integers at word boundaries (\b means boundaries).  At first, it may be a bit hard to understand, but backtracking is unnecessary here.  For instance, try to run this regular expression on an example: .&lt;pre name="code" class="c-sharp"&gt;789abcdef654 123&lt;/pre&gt;At the point when the regular expression fails (when it checks that “a” is a word boundary), it doesn’t make sense to start backtracking to see if 9 is a word boundary (or 8, for that matter). We should just go ahead and move on to the next token. &lt;br /&gt;&lt;br /&gt;This is where it pays off to know well the tool you’re using. Different flavors of regular expressions offer ways to avoid keep backtracking positions, so when a match fails, it just moves on. In case of Java and .NET, both support atomic grouping. .&lt;pre name="code" class="c-sharp"&gt;\b(?&gt;\d+)\b&lt;/pre&gt;Atomic grouping here is represented by “(?&gt;)”. When the regular expression engine leaves the group, all backtracking positions are lost, so a failed match will not have any recourse other than moving on to the next characters to find further matches. It will give up on the current context. &lt;br /&gt;&lt;br /&gt;In the example above, when it matches 789, it will leave the atomic group, so when \b fails to be matched there are no backtracking positions to be tried. From this quick analysis, we see that we avoid a lot of extra computation by avoid these useless backtracking.&lt;br /&gt;&lt;br /&gt;The question about saving time is how much we actually save here. I wrote a test code to benchmark these different options and verify whether we are talking about any substantial savings or not.&lt;pre name="code" class="c-sharp"&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;    TestAtomicGrouping(1000);&lt;br /&gt;    TestAtomicGrouping(10000);&lt;br /&gt;    TestAtomicGrouping(100000);&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;static void TestAtomicGrouping(int numLoops)&lt;br /&gt;{&lt;br /&gt;    Regex regex1 = new Regex(@"\b\d+\b", RegexOptions.Compiled);&lt;br /&gt;    Regex regex2 = new Regex(@"\b(?&gt;\d+)\b", RegexOptions.Compiled);&lt;br /&gt; &lt;br /&gt;    StringBuilder sb = new StringBuilder();&lt;br /&gt;    for (int i = 0; i &lt; 100; i++)&lt;br /&gt;        sb.Append('1');&lt;br /&gt;    sb.Append('a');&lt;br /&gt;    sb.Append(' ');&lt;br /&gt;    for (int i = 0; i &lt; 100; i++)&lt;br /&gt;        sb.Append('1');&lt;br /&gt; &lt;br /&gt;    string testString = sb.ToString();&lt;br /&gt;    int firstMatchCount = 0;&lt;br /&gt;    DateTime start = DateTime.Now;&lt;br /&gt;    for (int i = 0; i &lt; numLoops; i++)&lt;br /&gt;    {&lt;br /&gt;        if (regex1.IsMatch(testString))&lt;br /&gt;            firstMatchCount++;&lt;br /&gt;    }&lt;br /&gt;    TimeSpan firstTest = DateTime.Now - start;&lt;br /&gt; &lt;br /&gt;    start = DateTime.Now;&lt;br /&gt;    int secondMatchCount = 0;&lt;br /&gt;    for (int i = 0; i &lt; numLoops; i++)&lt;br /&gt;    {&lt;br /&gt;        if (regex2.IsMatch(testString))&lt;br /&gt;            secondMatchCount++;&lt;br /&gt;    }&lt;br /&gt;    TimeSpan secondTest = DateTime.Now - start;&lt;br /&gt; &lt;br /&gt;    Console.WriteLine("Normal Regex - # of loops: {0}, # of matches: {1}, time (ms): {2}", &lt;br /&gt;        numLoops, firstMatchCount, firstTest.TotalMilliseconds);&lt;br /&gt;    Console.WriteLine("Atomic Grouping - # of loops: {0}, # of matches: {1}, time (ms): {2}", &lt;br /&gt;        numLoops, secondMatchCount, secondTest.TotalMilliseconds);&lt;br /&gt;}&lt;/pre&gt;Now we need to see results:&lt;br /&gt;&lt;br /&gt;Normal Regex - # of loops: 1000, # of matches: 1000, time (ms): 48.0028&lt;br /&gt;Atomic Grouping - # of loops: 1000, # of matches: 1000, time (ms): 30.0017&lt;br /&gt;&lt;br /&gt;Normal Regex - # of loops: 10000, # of matches: 10000, time (ms): 386.0221&lt;br /&gt;Atomic Grouping - # of loops: 10000, # of matches: 10000, time (ms): 239.0137&lt;br /&gt;&lt;br /&gt;Normal Regex - # of loops: 100000, # of matches: 100000, time (ms): 3145.1799&lt;br /&gt;Atomic Grouping - # of loops: 100000, # of matches: 100000, time (ms): 2079.1189&lt;br /&gt;&lt;br /&gt;So, at the end of the day, getting rid of backtracking can be quite significant if you’re matching this regular expression quite often. In this test, we could save 32% or more of the matching time just by “turning off” backtracking with atomic grouping.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2885882748586046479?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2885882748586046479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2885882748586046479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2885882748586046479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2885882748586046479'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/regular-expressions-turning-off-useless.html' title='Regular expressions: turning off useless backtracking'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6744212745795013625</id><published>2011-11-14T21:15:00.001-08:00</published><updated>2011-11-14T21:38:19.097-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='regex'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Regular expressions: greedy vs. lazy quantifier</title><content type='html'>I am reading the great book &lt;a href="http://www.amazon.com/Regular-Expressions-Cookbook-Jan-Goyvaerts/dp/0596520689"&gt;Regular Expressions Cookbook&lt;/a&gt; after seeing today a few things that I did not about regular expressions. I will get to the interesting regular expression I had to work on in a future post, but for now I will share something I found quite interesting: greedy and lazy quantifiers.&lt;br /&gt;&lt;br /&gt;Let's start by trying to match a paragraph in HTML. A paragraph is typically surrounded by &amp;lt;p&amp;gt; and &amp;lt;/p&amp;gt;. So, I would write regular expression as:&lt;pre name="code" class="c-sharp"&gt;&lt;br /&gt;&amp;lt;p&amp;gt;.*&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/pre&gt;This should take care of matching the paragraph, right? Partially right. If you have a long HTML, with multiple paragraphs, this will match from the &lt;span style="font-weight:bold;"&gt;first paragraph start&lt;/span&gt; (&amp;lt;p&amp;gt;) to the &lt;span style="font-weight:bold;"&gt;very last paragraph end&lt;/span&gt; (&amp;lt;/p&amp;gt;). This "*" is actually called a &lt;span style="font-style:italic;"&gt;greedy quantifier&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;If you want to make it behave differently, you will want to use what is called &lt;span style="font-style:italic;"&gt;lazy quantifier&lt;/span&gt;. This is just the regular question mark placed after another quantifier. Note that, if question mark is placed after a regex token, it means "zero or once". This is not what we are talking about here - question mark here after a quantifier means that it changes the quantifier behavior.&lt;pre name="code" class="c-sharp"&gt;&lt;br /&gt;&amp;lt;p&amp;gt;.*?&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/pre&gt;In the example above, it matches the first paragraph only, not the entire text.&lt;br /&gt;&lt;br /&gt;Under the covers, the regular expression engine uses backtracking to match the expression. For a greedy quantifier, it eats up all the content that matches the current regular expression and then moves to the next token. In the case of the paragraph matching example, it reads the entire text until the very end. Then it moves on to the next token (in this case &amp;lt;) - and since it fails as the document finished, it back tracks, and tries to match &amp;lt; again. It keeps going back each character until it matches.&lt;br /&gt;&lt;br /&gt;For the lazy quantifier, it repeats as few times as it can, moving to the next regex token (here &amp;lt;). If the token is not matched, then it back tracks and moves forward another time, seeing if the token is matched.&lt;br /&gt;&lt;br /&gt;I was happy to learn this, as I had always asked myself how to control this behavior. And quite interesting to understand the regular expression engine behavior, what can come in handy. Just be careful when using the question mark. As said above, it can serve two purposes depending on where it's placed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6744212745795013625?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6744212745795013625/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6744212745795013625' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6744212745795013625'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6744212745795013625'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/regular-expression-greedy-vs-lazy.html' title='Regular expressions: greedy vs. lazy quantifier'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2331821995187187297</id><published>2011-11-13T18:22:00.000-08:00</published><updated>2011-11-13T18:42:11.718-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Moving Channel 9 to Azure: good design principles</title><content type='html'>Today I read a great article on Microsoft Channel 9 moving to Azure talking about  the sound design principles in place and lessons the Channel 9 team shares about how to move a web site to run in the cloud.&lt;br /&gt;&lt;br /&gt;One of the things that caught my attention is to see a Microsoft project using a distributed cache fleet running &lt;a href="http://memcached.org/"&gt;Memcache&lt;/a&gt;. Using a caching layer is definitely the right thing to do in many cases to make the site more scalable. I wonder why they haven't used &lt;a href="http://msdn.microsoft.com/en-us/library/windowsazure/gg278356.aspx"&gt;Windows Azure AppFabric Caching&lt;/a&gt;. And also, after working on &lt;a href="http://aws.amazon.com/elasticache/"&gt;Amazon Elasticache&lt;/a&gt; before joining Azure, I'd be curious how they monitor their Memcache instances.&lt;br /&gt;&lt;br /&gt;I was very glad to see modular code, coding to interfaces, and mostly dependency injection being used. While dependency injection is pretty popular in the Java world, it's still not as popular for many Microsoft developer. They mention dependency injection being used "for testing purposes but also to isolate you from very specific platform details". Very well done.&lt;br /&gt;&lt;br /&gt;Division of labor is a right principle for environments where machines are not reliable. This is proper mindset about machines in the cloud: "In practice they tend to run a very long time, but you can’t depend on that fact." And breaking down the tasks and using worker roles to pick them up, connecting them via queues, seems a smart strategy (assuming you have proper monitoring on these queue depths in place). In particular, I like the fact that the Channel 9 did not just thought that instances run for a long time and released an architecture based on that, so potential problems could be addressed in the future. Unfortunately I've seen a lot of people with this mindset, and Channel 9 did very well here.&lt;br /&gt;&lt;br /&gt;From the article, though, the only thing that could have been done better was to think about database sharding. Although SQL Azure will provide &lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/2281.aspx"&gt;Federation&lt;/a&gt;, there are many things that service owners need to think about: what the database partition key will be, what queries will need to go over partition and impact potential scalability, what queries will need to be federated, etc. I am not very familiar with SQL Azure Federations and don't know if it will repartition automatically hot partitions, but if it doesn't, that's another task service owners need to prepare for. With all that said, you don't need to shard right away, but you need to think of that before you service version 1 goes out, otherwise scaling can be a major headache - and if you can't afford downtime, then that can be an almost impossible task to accomplish in some cases.&lt;br /&gt;&lt;br /&gt;All that said, I was very glad to read about their work and their sharing the architecture and lessons publicly.&lt;br /&gt;&lt;br /&gt;Link to the InfoQ article:&lt;br /&gt;&lt;a href="http://www.infoq.com/articles/Channel-9-Azure"&gt;http://www.infoq.com/articles/Channel-9-Azure&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2331821995187187297?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2331821995187187297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2331821995187187297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2331821995187187297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2331821995187187297'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/moving-channel-9-to-azure-good-design.html' title='Moving Channel 9 to Azure: good design principles'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-4151228138099872408</id><published>2011-11-12T14:50:00.000-08:00</published><updated>2011-11-12T15:01:53.666-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quality'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Why high code coverage is not enough</title><content type='html'>Managers typically like high "code coverage", and oftentimes think that this means that the code quality is good. I agree that low code coverage definitely means that one doesn't have enough unit tests, but high code coverage may not mean much either. It's required but not sufficient. To prove this, let's take a look at one example.&lt;br /&gt;&lt;br /&gt;Once upon a time, I saw the following regular expression in a production code. I will write it in C#, but the language or platform doesn't mean much.&lt;pre name="code" class="c-sharp"&gt;&lt;br /&gt;public static bool IsValidIp(string ipAddress)&lt;br /&gt;{&lt;br /&gt;    return new Regex(@"^([0-2]?[0-5]?[0-5]\.){3}[0-2]?[0-5]?[0-5]$").IsMatch(ipAddress);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Let's say now that you have one unit test to make sure that your "boundary case" is accepted.&lt;pre name="code" class="c-sharp"&gt;&lt;br /&gt;Assert.IsTrue(IsValidIp("255.255.255.255"));&lt;br /&gt;&lt;/pre&gt;Now you are happy, get the code checked in, and brag that you have 100% code coverage for that IsValidIp method. And so what? A simple "192.168.1.1" IP address is not considered a valid address. Completely buggy code, but 100% code coverage.&lt;br /&gt;&lt;br /&gt;That is why managers that really understand what is being developed and have the chance to spend time looking at the code can make a total difference in the final product's quality.&lt;br /&gt;&lt;br /&gt;Note: on the case above, it's amazing that the developer did not Google'd for the right regular expression for Ip validation, did not write data-driven unit tests to make sure different Ips are being written, and that code reviewers did not review it properly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-4151228138099872408?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/4151228138099872408/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=4151228138099872408' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4151228138099872408'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4151228138099872408'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/why-high-code-coverage-is-not-enough.html' title='Why high code coverage is not enough'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6316719607376760844</id><published>2011-11-12T13:33:00.000-08:00</published><updated>2011-11-12T13:50:46.070-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>On Zynga and its "give back stock or get fired" story</title><content type='html'>This week it's been all over the place the news about Zynga CEO and its executives demanding that you either &lt;a href="http://www.blogger.com/Thoughts%20on%20Zynga%20and%20its%20recent%20give%20back%20stock%20or%20get%20fired"&gt;give back the not-yet vested stocks or face termination&lt;/a&gt;. One of the ways that startup companies have to lure employees into taking the risk is to offer equity - that's the currency for startups for the risk taking as well as for offering lower salaries and demanding long hours. Once you offer this equity, I think companies must honor their contracts. At the same time, this can tell you a lot about the company, its value, and whether other people will want to join them in the future.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, Zynga is correct in trying to be meritocratic. Those who contributed more should have a bigger piece than those who are around but did not contribute much to the company's success. A good compromise would be to have policies stating that the stock grants are dependent on your performance evaluation. Some sort of multiplier would be applied in this case - if you reach the expectations, you will get 1x your stock grants, if you're a rock star, you could get up to Nx (e.g. 2x), and if you're an underperformer, you may get nothing at all. That is much more fair than just demanding stocks back or threat with termination. Of course no system is entirely fair, as it can subjective and politics always play a part there, but it's better than lure people into thinking that they will get their stocks if they stick around long nothing and then fire them primarily for this reason.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;On other hand, though, how many other companies may be contemplating or actually firing people with unvested stocks to accomplish the same goal? At least one can say that Zynga was transparent on the reason why they would fire its employees. But this is the kind of transparency that one doesn't see quite often because it lowers all employee's morale and the company's moral values are questioned. A company that does the same, but not that openly, seems to be much better off as employees tend to still believe that the company abide by its moral principles and its worth putting in all the effort to make the company grow.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6316719607376760844?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6316719607376760844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6316719607376760844' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6316719607376760844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6316719607376760844'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/on-zynga-and-its-give-back-stock-or-get.html' title='On Zynga and its &quot;give back stock or get fired&quot; story'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1772429202328954439</id><published>2011-11-10T21:02:00.000-08:00</published><updated>2011-11-12T14:05:35.982-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Coding guidelines and readability</title><content type='html'>&lt;div&gt;The more experience I get in the industry, more and more I value great developers that know how to distinguish great from good code. And I am glad that I had a fantastic experience reading and working with the Linux kernel - most of the code I had seen at the time falls into the category of great code. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There are many aspects of a great developer that one can think of, but I'd like to focus here on code readability and maintainability. First, one quite important distinction, especially for those used to following strict "code guidelines". Code readability is not so much about where you place the brackets, or any style that can be verified by a static analysis tool. These are usually what don't really matter much in my opinion.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The real readability is about the art in writing your code, not its science. Things like how to properly break your code into methods, how to name variables, classes, and methods, how to use spaces properly, how to make proper use of the fixed-width characters or align/indent code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In my opinion, great engineers know that the code must not just work, but it must be a work of art. Something that you and others can read in the future and maintain. It is NOT just about getting it work. A lot of code I read works, but they are not readable, not elegant, and oftentimes not efficient at all. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Digressing a bit, I miss systems where you actually need to get the max performance out of a system. That seemed to require better engineers than nowadays. Now, with web services and cloud computing, oftentimes one doesn't care much about performance as you can always get a faster box to run your code. After working for two cloud providers, I see that this can specially happen with those providing these cloud services. I wonder whether these engineers who just throw more CPU power or memory at a problem actually ever thought of the cost of running a service and that this is one of the things factored in that will make the difference between being profitable or not. Or, on a more philosophical side, if they really feel pride of the engineering in the code they write.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But back to coding guidelines, I really recommend that you read the article below (published in the ACM Queue magazine) if you want to get better at that. It has a few tables that you should print out and put it up on the wall where you can peek when writing your code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;Coding Guidelines: Finding the Art in the Science&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;a href="http://queue.acm.org/detail.cfm?id=2063168"&gt;http://queue.acm.org/detail.cfm?id=2063168&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today I also came across a new O'Reilly book on the topic called "The Art of Readable Code", which seems to be quite interesting and probably delve into this topic in much greater detail.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;The Art of Readable Code&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;a href="http://shop.oreilly.com/product/9780596802301.do"&gt;http://shop.oreilly.com/product/9780596802301.do&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1772429202328954439?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1772429202328954439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1772429202328954439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1772429202328954439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1772429202328954439'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/coding-guidelines-and-readability.html' title='Coding guidelines and readability'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6765425246251991824</id><published>2011-11-10T19:57:00.000-08:00</published><updated>2011-11-10T20:52:09.929-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>URI segments, dots, REST, and .NET bug</title><content type='html'>These days I learned about a bug in the System.Uri() class that would strip leading dots from URI segments. See an example:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;http://host/&lt;b&gt;test...&lt;/b&gt;/abc&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;becomes&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;http://host/&lt;b&gt;test&lt;/b&gt;/abc&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That happens if your client or your server is .NET. If your client believes you support the URL RFC correctly, it may send the request with trailing dots, and when it gets to your code, these dots are gone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The implication is that, if this URI segment is actually a resource name, you may be in trouble. Let me show you a concrete example:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Resource is created by posting to URL: http://host/addresses. At this point, the resource name is passed in the payload and your service will correctly accept these trailing dots. For example, let's say we create an address named "home." So far, so good.&lt;/li&gt;&lt;li&gt;User tries to perform a REST operation on this resource. It could be something as simple as a GET on http://host/addresses/home. (dot included)&lt;/li&gt;&lt;li&gt;In the case you have a .NET client, the request will go out as http://host/addresses/home (no dot). Of course your server will return the wrong data or an error (like 404 - not found)&lt;/li&gt;&lt;li&gt;In case you have a non-.NET client, the request will go out correctly, but if your server is .NET-based, then you may have an issue. For instance, a WCF REST service will have this resource name parsed as "home" (no dots), which will also return the wrong data or an error.&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;The consequence is that, because of that, your .NET REST service should not allow dots. At least trailing dots. However, allowing dots everywhere but at the end is not desirable and quite possibly you will forbid dots altogether.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's a workaround for this issue if you control both client and server code. However, in case  your customers are generating client proxies, then you must document what they need to do.&lt;/div&gt;&lt;pre name="code" class="c-sharp"&gt;MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);&lt;br /&gt;FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);&lt;br /&gt;if (getSyntax != null &amp;amp;&amp;amp; flagsField != null)&lt;br /&gt;{&lt;br /&gt;  foreach (string scheme in new[] { "http", "https" })&lt;br /&gt;  {&lt;br /&gt;      UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme });&lt;br /&gt;      if (parser != null)&lt;br /&gt;      {&lt;br /&gt;          int flagsValue = (int)flagsField.GetValue(parser);&lt;br /&gt;          // Clear the CanonicalizeAsFilePath attribute&lt;br /&gt;          if ((flagsValue &amp;amp; 0x1000000) != 0)&lt;br /&gt;              flagsField.SetValue(parser, flagsValue &amp;amp; ~0x1000000);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;div&gt;The code above clears a flag that is set to canonicalize an URL as a file path. Yes, all URLs are thought to be Windows file locations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Unfortunately this bug is known since 2008, but has never made into a .NET release. It is marked as fixed, but as of .NET 4 we are still waiting for the fix to be released.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here you can find more details about this issue:&lt;/div&gt;&lt;div&gt;&lt;a href="https://connect.microsoft.com/VisualStudio/feedback/details/386695/system-ur"&gt;https://connect.microsoft.com/VisualStudio/feedback/details/386695/system-ur&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6765425246251991824?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6765425246251991824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6765425246251991824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6765425246251991824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6765425246251991824'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/uri-segments-dots-rest-and-net-bug.html' title='URI segments, dots, REST, and .NET bug'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6284387873390107826</id><published>2011-11-10T19:44:00.000-08:00</published><updated>2011-11-10T19:56:24.589-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Internet Explorer vs. Chrome: Recover Session</title><content type='html'>Working at Microsoft, I use Internet Explorer, but when I want to separate some sessions, I run Chrome at the same time. And I wanted to tell you about an experience I had last week.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Last weekend, after plugging in my Garmin heart monitor to download my bike run, my PC just rebooted (that happened more than once with this monitor). After coming back up, I was expecting that Chrome would recover my session, but not Internet Explorer (from what I recall, IE hasn't been very good at this). And guess what? Chrome &lt;b&gt;did not recover&lt;/b&gt; one single of my tabs, while IE &lt;b&gt;recovered the entire session correctly&lt;/b&gt;. That was clearly unexpected and a glad surprise.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the end, I had to go over Chrome's history to recover some tabs that I hadn't read it, what I could avoid with IE.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6284387873390107826?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6284387873390107826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6284387873390107826' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6284387873390107826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6284387873390107826'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/11/internet-explorer-vs-chrome-recover.html' title='Internet Explorer vs. Chrome: Recover Session'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5179399311123846985</id><published>2011-09-26T19:19:00.001-07:00</published><updated>2011-09-26T19:32:34.073-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rest'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>WCF + REST + PUT/DELETE = 405 (Method not allowed)</title><content type='html'>&lt;div&gt;In short: uninstall WebDAV module from IIS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;If you are getting an 405 (Method not allowed) error back when hitting your WCF REST endpoint, you should check your IIS configuration to make sure you don't have &lt;b&gt;WebDAV&lt;/b&gt;. In my case, WebDAV was intercepting requests and returning 405 for PUT and DELETE requests. Note, though, that it is not enough to disable WebDAV, you have to uninstall it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5179399311123846985?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5179399311123846985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5179399311123846985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5179399311123846985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5179399311123846985'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/09/wcf-rest-putdelete-405-method-not.html' title='WCF + REST + PUT/DELETE = 405 (Method not allowed)'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2276626631625702991</id><published>2011-09-25T20:33:00.000-07:00</published><updated>2011-09-25T20:34:27.256-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dns'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>The design of the Domain Name System</title><content type='html'>&lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;Good posts on DNS, potential issues and limitations with it, and how to design applications to use DNS.&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;The design of the Domain Name System (Part I)&lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;&lt;a href="http://jl.ly/Internet/dnsdesign1.html"&gt;http://jl.ly/Internet/dnsdesign1.html&lt;/a&gt; &lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;The design of the Domain Name System (Part II) - Exact and approximate name matching&lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;&lt;a href="http://jl.ly/Internet/dnsdesign2.html"&gt;http://jl.ly/Internet/dnsdesign2.html&lt;/a&gt; &lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;The design of the Domain Name System (Part III) - Name structure and delegation&lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;&lt;a href="http://jl.ly/Internet/dnsdesign3.html"&gt;http://jl.ly/Internet/dnsdesign3.html&lt;/a&gt; &lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;The design of the Domain Name System (Part IV) - Global consistency&lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;&lt;a href="http://jl.ly/Internet/dnsdesign3.html"&gt;http://jl.ly/Internet/dnsdesign4.html&lt;/a&gt; &lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;The design of the Domain Name System (Part V) - Large data&lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;&lt;a href="http://jl.ly/Internet/dnsdesign5.html"&gt;http://jl.ly/Internet/dnsdesign5.html&lt;/a&gt; &lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;The design of the Domain Name System (Part VI) - Overloaded record types&lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;&lt;a href="http://jl.ly/Internet/dnsdesign6.html"&gt;http://jl.ly/Internet/dnsdesign6.html&lt;/a&gt; &lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;The design of the Domain Name System (Part VII) - Related names are not related&lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;&lt;a href="http://jl.ly/Internet/dnsdesign7.html"&gt;http://jl.ly/Internet/dnsdesign7.html&lt;/a&gt; &lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;The design of the Domain Name System (Part VIII) - Names Outside the DNS&lt;/p&gt;  &lt;p style="margin:0in;font-family:Calibri;font-size:11.0pt"&gt;&lt;a href="http://jl.ly/Internet/dnsdesign8.html"&gt;http://jl.ly/Internet/dnsdesign8.html&lt;/a&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2276626631625702991?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2276626631625702991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2276626631625702991' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2276626631625702991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2276626631625702991'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/09/design-of-domain-name-system.html' title='The design of the Domain Name System'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6218965359762635824</id><published>2011-08-06T15:24:00.001-07:00</published><updated>2011-08-06T15:26:37.585-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Flickr interestingness downloader in Ruby</title><content type='html'>And this time this is the Ruby code using Flickraw gem to download large size versions of Flickr interesting photos.&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;require 'flickraw'&lt;br /&gt;&lt;br /&gt;FlickRaw.api_key="api_key"&lt;br /&gt;FlickRaw.shared_secret="shared_secret"&lt;br /&gt;&lt;br /&gt;photos = flickr.interestingness.getList( :per_page =&gt; 500 ) &lt;br /&gt;&lt;br /&gt;frob = flickr.auth.getFrob&lt;br /&gt;auth_url = FlickRaw.auth_url :frob =&gt; frob, :perms =&gt; 'read'&lt;br /&gt;  &lt;br /&gt;photos.each do |pic| &lt;br /&gt;   photo_info = flickr.photos.getInfo(:photo_id =&gt; pic.id) &lt;br /&gt;   photo_url = FlickRaw.url_b(photo_info) &lt;br /&gt;  &lt;br /&gt;   puts "Downloading #{photo_url}"&lt;br /&gt;   &lt;br /&gt;   open("flickr/" + pic.id + ".jpg", "wb") { |file|&lt;br /&gt;    file.write(Net::HTTP.get_response(URI.parse(photo_url)).body)&lt;br /&gt;   }&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6218965359762635824?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6218965359762635824/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6218965359762635824' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6218965359762635824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6218965359762635824'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/08/flickr-interestingness-downloader-in.html' title='Flickr interestingness downloader in Ruby'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6292707601026799385</id><published>2011-08-06T13:27:00.000-07:00</published><updated>2011-08-06T13:40:56.398-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='aws'/><title type='text'>S3 file bucket downloader in Ruby</title><content type='html'>Today I wanted to download files from a website that I happened to find out that stored all files in S3. By accessing the website root, I realized that it was just the response of a &lt;a href="http://awsdocs.s3.amazonaws.com/S3/latest/s3-api.pdf"&gt;S3 ListBucket API call&lt;/a&gt;. For instance:&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&amp;lt;ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/"&amp;gt;&lt;br /&gt;   &amp;lt;Name&amp;gt;foo.com&amp;lt;/Name&amp;gt;&lt;br /&gt;   &amp;lt;Prefix/&amp;gt;&lt;br /&gt;   &amp;lt;Marker/&amp;gt;&lt;br /&gt;   &amp;lt;MaxKeys&amp;gt;1000&amp;lt;/MaxKeys&amp;gt;&lt;br /&gt;   &amp;lt;IsTruncated&amp;gt;true&amp;lt;/IsTruncated&amp;gt;&lt;br /&gt;   &amp;lt;Contents&amp;gt;&lt;br /&gt;      &amp;lt;Key&amp;gt;file/1&amp;lt;/Key&amp;gt;&lt;br /&gt;      &amp;lt;LastModified&amp;gt;2011-06-09T06:29:02.000Z&amp;lt;/LastModified&amp;gt;&lt;br /&gt;      &amp;lt;ETag&amp;gt;"5cb3930839817ff4a5c1ddf08e3fea1e"&amp;lt;/ETag&amp;gt;&lt;br /&gt;      &amp;lt;Size&amp;gt;1440231&amp;lt;/Size&amp;gt;&lt;br /&gt;      &amp;lt;StorageClass&amp;gt;STANDARD&amp;lt;/StorageClass&amp;gt;&lt;br /&gt;   &amp;lt;/Contents&amp;gt;&lt;br /&gt;   &amp;lt;Contents&amp;gt;&lt;br /&gt;      &amp;lt;Key&amp;gt;file/2&amp;lt;/Key&amp;gt;&lt;br /&gt;      &amp;lt;LastModified&amp;gt;2011-06-09T06:29:18.000Z&amp;lt;/LastModified&amp;gt;&lt;br /&gt;      &amp;lt;ETag&amp;gt;"96fdc94d14b6d9817f80ac1e9e2049b4"&amp;lt;/ETag&amp;gt;&lt;br /&gt;      &amp;lt;Size&amp;gt;1310&amp;lt;/Size&amp;gt;&lt;br /&gt;      &amp;lt;StorageClass&amp;gt;STANDARD&amp;lt;/StorageClass&amp;gt;&lt;br /&gt;   &amp;lt;/Contents&amp;gt;&lt;br /&gt;&amp;lt;/ListBucketResult&amp;gt;&lt;/pre&gt;&lt;br /&gt;In order to download all files more quickly, I wrote the following Ruby program that downloads all files from this website, and I hope it can be useful for others:&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;require 'net/http'&lt;br /&gt;require 'rexml/document'&lt;br /&gt;&lt;br /&gt;baseurl = 'foo.com'&lt;br /&gt;&lt;br /&gt;# get the XML data as a string&lt;br /&gt;xml_data = Net::HTTP.get_response(URI.parse("http://" + baseurl)).body&lt;br /&gt;&lt;br /&gt;# extract event information&lt;br /&gt;doc = REXML::Document.new(xml_data)&lt;br /&gt;titles = []&lt;br /&gt;links = []&lt;br /&gt;Net::HTTP.start(baseurl) do |http|&lt;br /&gt;  doc.elements.each('ListBucketResult/Contents/Key') do |ele|&lt;br /&gt;    puts "Downloading " + ele.text&lt;br /&gt;    resp = http.get("/" + ele.text)&lt;br /&gt;    open("images/" + ele.text.gsub("/", "_") + ".jpg", "wb") { |file|&lt;br /&gt;      file.write(resp.body)&lt;br /&gt;    }&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;puts "Done"&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6292707601026799385?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6292707601026799385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6292707601026799385' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6292707601026799385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6292707601026799385'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/08/s3-file-bucket-downloader-in-ruby.html' title='S3 file bucket downloader in Ruby'/><author><name>Rodrigo De Castro</name><uri>http://www.blogger.com/profile/02877103835865244238</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6820790755928188628</id><published>2011-07-26T08:14:00.000-07:00</published><updated>2011-07-26T08:14:08.040-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>link_to data-method delete not working in IE9?</title><content type='html'>I was testing a Ruby on Rails 3 application with &lt;a href="https://github.com/plataformatec/devise"&gt;devise&lt;/a&gt; authentication library&amp;nbsp;and to my surprise, link_to with data-method was not working in Internet Explorer 9 (IE9). In that case, the method was set to delete. It works perfectly in Chrome, though.&lt;br /&gt;&lt;br /&gt;There are some bugs reported on that, but the solution I found was&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Make my application depend on jquery&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Edit your Gemfile and add:&lt;/li&gt;&lt;ul&gt;&lt;li&gt;gem 'jquery-rails', '&amp;gt;= 1.0.12'&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;Run rails generate to install jquery and get rid of other .js files (like prototype.js)&lt;/li&gt;&lt;ul&gt;&lt;li&gt;rails generate jquery:install&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Run application&lt;/li&gt;&lt;/ol&gt;I did not see these instructions anywhere, just decided to follow what I had done in another project to test Ajax support for Ruby and it just worked. I hope it works for you.&lt;br /&gt;&lt;br /&gt;By the way, I've seen several mentions of this, but since my Rails 3 already had it, I did not bother much. In your case, also make sure that your application.html.erb has these tags in your :&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: white; color: black; font-family: inherit;"&gt;&lt;div align="LEFT"&gt;&amp;lt;%= javascript_include_tag :defaults %&amp;gt;&lt;/div&gt;&lt;/span&gt;&lt;div align="LEFT"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span style="background-color: white; color: black; font-family: inherit; font-size: small;"&gt;&amp;lt;%= csrf_meta_tag %&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6820790755928188628?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6820790755928188628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6820790755928188628' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6820790755928188628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6820790755928188628'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/07/linkto-data-method-delete-not-working.html' title='link_to data-method delete not working in IE9?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1900935666849198867</id><published>2011-07-23T20:15:00.000-07:00</published><updated>2011-07-23T20:15:59.629-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='career'/><title type='text'>Thoughts on "growing as a developer"</title><content type='html'>&lt;div style="font-family: Calibri; margin: 0in;"&gt;I just read the following blog post written by Robert Bowen:&lt;/div&gt;&lt;div style="font-family: Calibri; margin: 0in;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.noupe.com/how-tos/how-to-grow-as-a-designer-or-developer.html"&gt;How to Grow as a Designer or Developer&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: Calibri; margin: 0in;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Calibri; margin: 0in;"&gt;These are the highlights:&lt;/div&gt;&lt;div style="margin-bottom: 0in; margin-left: 0in; margin-right: 0in; margin-top: 0in;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;We should always be moving forward, reaching for the next plateau&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Find a way to grow, actively pursing opportunities of growth&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Make sure:&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Your schedule allows for that&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;You don't think you mastered the field&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;You think outside of your day-to-day job world that may have become stagnant and monotonous&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Ways to grow:&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Step outside of our comfort zones to try something new and experiment to guarantee to learn something new and push our skills to new heights&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Study the work of those you admire&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Keep up with the field and how it is evolving&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Reach out to others for feedback&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Collaborate on projects with others that will push you to challenge yourself&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Be active in the community, like running a blog, contributing to blogs and discussions&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;b&gt;Pay-off&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;This is a great post and reflects my motto of always keep getting better and pushing myself. I believe that, by getting better, you will grow in your field and, no matter what the current circumstances are, over time that will pay off.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;b&gt;Is it worthwhile?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;I've started challenging myself in this regard by asking: is my motto actually something worth living by? &amp;nbsp;This pay-off will definitely be worth in terms of personal satisfaction. Like one that has hobbies and personal projects, oftentimes these are for personal satisfaction more than for some special reward in the future.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;b&gt;Provided value&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Other than personal projects, when you are &amp;nbsp;an employee or a freelancer, or even an entrepreneur, this growth pays off to the extent that it provides value to those paying for your time, service, or product. And that is very important to realize sooner than later.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;b&gt;Multiplying effect&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Even getting better technically, typically you hit a ceiling at some point, because no matter how much you can accomplish, you can accomplish only so much as an individual contributor. Unless you have a multiplying effect in the organization.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Not that multiplying effect is something easy to define, and can be subject to politics and subjectivity, but the general idea is that on can make&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&amp;nbsp;the entire organization better. Only doing that you can grown as an individual contributor, otherwise you will not grow beyond a certain point in your career.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;b&gt;Is getting better valued?&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Besides that, another very important point is how much getting better is actually valued by the organization you are part of. If you are surrounded by people that do not see value in getting better - they may think that the current level is good enough, or just don't value improvement as long as things get done - you will grow frustrated as your growth will not be recognized and you may not even be potentially be rewarded at all by it. In some cases, you can be even penalized by that. This all can lead to potential stagnation and will require a major effort for one to keep sanity in such an environment.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Notice that, if you are dealing with customers (as a freelancer or&amp;nbsp;entrepreneur), it can be the same.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;b&gt;Address actual needs&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;The key is how you can leverage your getting better to provide more value - and find or create the environment that nurtures that mindset. You can make your program/code/design more efficient, more resilient, more secure, etc, and that is where your growth will manifest itself. In reality, the trick is to find the right set of people that really want more efficient, more resilient, more secure, etc, as oftentimes they think the current state of affairs is good enough. It just could be that the challenges faced by the company cannot be fixed or substantially improved by your skills, in which case the relationship can grow sour over time.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;b&gt;Being ahead of the curve&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;Eventually, if one keeps getting better, it becomes increasingly more difficult to find the right opportunities to leverage this knowledge, and this can be incredibly frustrating for the individual. The personal satisfaction is still there, but as we say that some people are much ahead of their times, some people are just ahead of the curve and must find how to apply their knowledge. Taken to the extreme, only a few places and few people in world may actually value these people, and spending their days doing the "wrong" thing or in the "wrong" place may prove to be a complete waste of time.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;&lt;b&gt;More than technical skills&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Calibri;"&gt;As part of growing as developer, everybody should work on their interpersonal skills if these can be their weaknesses. I don't think that weaknesses must be necessarily completely fixed. One should build on their strengths with the following rule: don't let the weaknesses get in the way. In our field in particular, these weaknesses are typically related to soft skills, and bright people often can work on them. By doing that, nobody will dismiss great ideas or contributions on the basis of soft skills. As part of finding the right environment and right set of people to work with, improving on soft skills can be quite beneficial.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1900935666849198867?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1900935666849198867/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1900935666849198867' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1900935666849198867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1900935666849198867'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/07/thoughts-on-growing-as-developer.html' title='Thoughts on &quot;growing as a developer&quot;'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-8172727952040620929</id><published>2011-07-23T14:26:00.000-07:00</published><updated>2011-07-23T14:26:24.356-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Steps to install MySQL2 GEM (Ruby on Rails) on Windows 7 (64 bit)</title><content type='html'>I ran into many issues trying to get it compiled and installed on Windows 7 64-bit and wished I had an "apt-get" that would have fixed all these issues.&lt;br /&gt;&lt;br /&gt;The trick here is: you need MySQL 32-bit to have Ruby on Rails MySQL2 gem compiling on Windows 7 64-bit. In short, this is what I had to do:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Install Ruby Development Kit in order to be able to compile C-bindings for Ruby&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Error:&amp;nbsp;The 'mysql2' native gem requires installed build tools.&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Install MySQL Server 64-bit&lt;/li&gt;&lt;li&gt;Download MySQL Server 32-bit .zip file&lt;/li&gt;&lt;li&gt;Add MySQL &lt;b&gt;32-bit&lt;/b&gt; lib directory to PATH (or copy libmysql.dll to %RUBY_HOME%\bin)&lt;/li&gt;&lt;li&gt;Install MySQL2 2.0.6 GEM specifying&amp;nbsp;--with-mysql-lib and&amp;nbsp;--with-mysql-include options pointing to the &lt;b&gt;32-bit lib and include directories&lt;/b&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;gem install mysql2 -- '--with-mysql-lib="c:\Development\MySQL Server  5.5\lib\opt" --with-mysql-include="c:\Development\MySQL\MySQL Server  5.5\include"'&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;Install Rake 0.9.2&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Error:&amp;nbsp;&lt;span class="pln"&gt;uninitialized constant &lt;/span&gt;&lt;span class="typ"&gt;Rake&lt;/span&gt;&lt;span class="pun"&gt;::&lt;/span&gt;&lt;span class="pln"&gt;DSL&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ol&gt;&lt;div&gt;References:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://rorguide.blogspot.com/2011/03/installing-mysql2-gem-on-ruby-192-and.html?spref=tw"&gt;http://rorguide.blogspot.com/2011/03/installing-mysql2-gem-on-ruby-192-and.html?spref=tw&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.alibutt.com/2011/02/i-receive-the-error-the-program-cant-start-because-libmysql-dll-is-missing-from-your-computer/"&gt;http://www.alibutt.com/2011/02/i-receive-the-error-the-program-cant-start-because-libmysql-dll-is-missing-from-your-computer/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/6085610/rails-rake-problems-uninitialized-constant-rakedsl"&gt;http://stackoverflow.com/questions/6085610/rails-rake-problems-uninitialized-constant-rakedsl&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-8172727952040620929?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/8172727952040620929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=8172727952040620929' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8172727952040620929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8172727952040620929'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/07/steps-to-install-mysql2-gem-ruby-on.html' title='Steps to install MySQL2 GEM (Ruby on Rails) on Windows 7 (64 bit)'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6907562157171223439</id><published>2011-07-22T12:40:00.000-07:00</published><updated>2011-07-22T12:40:47.215-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Why use regular expression?</title><content type='html'>I never posted code I've come across, but reading a random code today, I started wondering why one couldn't use regular expressions below to accomplish the same result - maybe I am just missing some good reason for that, but I thought it might be amusing to share:&lt;br /&gt;&lt;br /&gt;string[] stringArray = str.Replace("Jan, ", "Jan ").Replace("Feb, ", "Feb ").Replace("Mar, ", "Mar ").Replace("Apr, ", "Apr ").Replace("May, ", "May ").Replace("Jun, ", "Jun ").Replace("Jul, ", "Jul ").Replace("Aug, ", "Aug ").Replace("Sep, ", "Sep ").Replace("Oct, ", "Oct ").Replace("Nov, ", "Nov ").Replace("Dec, ", "Dec ").Split(new[] { ',' });&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6907562157171223439?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6907562157171223439/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6907562157171223439' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6907562157171223439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6907562157171223439'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/07/why-use-regular-expression.html' title='Why use regular expression?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6423564215284819273</id><published>2011-07-18T08:40:00.000-07:00</published><updated>2011-07-18T08:40:48.939-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>The top 9+7 things every programmer or architect should know</title><content type='html'>Great&amp;nbsp;list of things programmer and architects should know:&lt;br /&gt;&lt;a href="http://www.javacodegeeks.com/2011/07/top-97-things-every-programmer-or.html"&gt;http://www.javacodegeeks.com/2011/07/top-97-things-every-programmer-or.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;About learning to estimate, I recommend the following book:&lt;br /&gt;&lt;a href="http://www.amazon.com/How-Measure-Anything-Intangibles-Business/dp/0470539399/ref=sr_1_3?ie=UTF8&amp;amp;qid=1311003181&amp;amp;sr=8-3"&gt;http://www.amazon.com/How-Measure-Anything-Intangibles-Business/dp/0470539399/ref=sr_1_3?ie=UTF8&amp;amp;qid=1311003181&amp;amp;sr=8-3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These are three top things for me:&lt;br /&gt;&lt;strong&gt;1. The Boy Scout Rule - Robert C. Martin (Uncle Bob)&lt;/strong&gt;&lt;i&gt;"You don’t  have to make every module perfect before you check it in. You simply have to  make it a little bit better than when you checked it out."&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;To be  honest this is not something I have followed throughout my career, and although  I certainly try improve code where I can, I never did it per check-in. I do  however feel that it is an awesome principle and should be something that is  actually part of a code review process. It is all to easy to just say: &lt;br /&gt;"It  was like that already" &lt;br /&gt;"that nasty code was there for years, I am not going  to touch it."&lt;br /&gt;"It never had any tests"&lt;br /&gt;&lt;br /&gt;I work in a corporate  environment were applications often last for 4-10 years. If part of the process  is always to just make something a little better, everything from deleting  unused code to writing a single extra unit test, year after year... it will end  up with saving a lot of people a lot of time and money.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: orange;"&gt;This seems obvious, but not always we make it better when checking in. It takes a lot of diligence to do that - and agreement in a team environment on what better actually means.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;4. Continuous Learning - Clint Shank&lt;/strong&gt;This is a very important topic,  we are in a industry that is constantly growing, changing, shifting and as a  programmer you need to be learning and improving yourself wherever you can. It's  very easy to get into a comfort zone and just rest on your laurels, I did that  for a couple years, and I do regret it now. &lt;br /&gt;Things I am trying to do to keep  up and would recommend:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Get a Kindle... then buy &amp;amp; read books.  &lt;/li&gt;&lt;li&gt;Use &lt;a href="http://www.google.com/reader/"&gt;&lt;span style="color: #3d59b7;"&gt;Google Reader&lt;/span&gt;&lt;/a&gt; add the  popular blogs and website RSS feeds for your specific field as well as a couple  outside your field that interest you.  &lt;/li&gt;&lt;li&gt;Start a blog, by putting my code and thoughts out there, I put in more  effort knowing that it's going to visible than if I just wrote the code/article  for myself. I also force myself to do 1 - 2 posts a week, ensuring that I must  always find new content to learn about.  &lt;/li&gt;&lt;li&gt;Join an open source community, we generally don't get to do enough  "technical" development in our corporate environments.&lt;/li&gt;&lt;/ol&gt;&lt;span style="color: orange;"&gt;Related to the first one: keep getting better - nothing will stop you. Build on your strengths, but don't let your weaknesses get in the way.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;5. Record your rationale - Timothy High&lt;/strong&gt;This is something that I feel  is often neglected. Quite recently a project that I had been involved in for a  long time hit the spotlight for all the wrong reasons: customer, user and  management dissatisfaction. The first thing to be questioned was not the  analysis, requirements, testing, management or expectations, but rather the  architecture. Documentation discussing all the decisions, options looked at and  reason for options taken would have been valuable. When things go fine, no one  will even know about the document, but when things turn bad as they sometimes do  having justification and documentation for all the major decisions will be a  lifesaver.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: orange;"&gt;That happened a lot in my experience. People will disagree, or some people will not have been involved in some discussions, and then you need to be able to articulate why some decisions were made. Most of the times new arguments and ideas were considered, but without recording your rationale, you may not be able to discuss them, especially in public forums like large meetings. I'd say that one should write the rationale and make sure it's in your head when the subject comes up - and obviously this assumes that you communicate effectively.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6423564215284819273?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6423564215284819273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6423564215284819273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6423564215284819273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6423564215284819273'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/07/top-97-things-every-programmer-or.html' title='The top 9+7 things every programmer or architect should know'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-7214307792359388731</id><published>2011-07-16T11:08:00.000-07:00</published><updated>2011-07-16T11:08:01.250-07:00</updated><title type='text'>Publishing to Blogger from Microsoft OneNote</title><content type='html'>I was trying to post something today and was wondering how it can be still so complicated to post and format something to a blog nowadays. One of the integration that I wanted is from OneNote, where I've been keeping many of my notes for quite sometime, to Blogger. And looking it up on the web, I found that it's already a reality and works very well - you may need to go over the formatting to remove some additional spaces, but it reduces the work substantially compared to a regular copy and paste.&lt;br /&gt;&lt;br /&gt;For more info, this is the link:&lt;br /&gt;&lt;a href="http://www.fanhow.com/knowhow:Use_OneNote_2010_to_Create_Blog_Post_41815125"&gt;http://www.fanhow.com/knowhow:Use_OneNote_2010_to_Create_Blog_Post_41815125&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-7214307792359388731?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/7214307792359388731/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=7214307792359388731' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7214307792359388731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7214307792359388731'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/07/publishing-to-blogger-from-microsoft.html' title='Publishing to Blogger from Microsoft OneNote'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-26667485304404660</id><published>2011-07-16T10:50:00.001-07:00</published><updated>2011-07-16T10:55:03.702-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Design Principles and Design Patterns</title><content type='html'>&lt;span xmlns=""&gt;&lt;a href="http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf"&gt;http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span xmlns=""&gt; &lt;span style="color: #366092; font-size: 13pt;"&gt;&lt;strong&gt;Object Oriented Class Design&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;&lt;span xmlns=""&gt;Open-Closed Principle (OCP)&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span xmlns=""&gt;We should write our modules so that they can be extended, without requiring them to be modified. &lt;/span&gt;&lt;/li&gt;&lt;span xmlns=""&gt;&lt;li&gt;&lt;div&gt;Techniques:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Dynamic polymorphism &lt;/li&gt;&lt;li&gt;Static polymorphism (templates or generics) &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;/li&gt;&lt;span xmlns=""&gt;&lt;li&gt;&lt;div&gt;Liskov Substitution Principle (LSP)&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Derived classes should be substitutable for their base classes. &lt;/li&gt;&lt;li&gt;Derives from concept of Design by Contract &lt;/li&gt;&lt;li&gt;&lt;div&gt;In terms of contracts, a derived class is substitutable for its base class if:&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Its preconditions are not stronger than the base class method. &lt;/li&gt;&lt;li&gt;Its postconditions are no weaker than the base class method. &lt;/li&gt;&lt;li&gt;(In other words, derived methods should expect no more and provide no less) &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;There are subtleties: canonical example is the Circle/Ellipse dilemma &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Dependency Inversion Principle (DIP)&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Strategy of depending upon interfaces or abstract functions and classes, rather than upon concrete functions and classes. &lt;/li&gt;&lt;li&gt;Motivation behind DIP is to prevent you from depending upon volatile modules. The DIP makes the assumption that anything concrete is volatile. &lt;/li&gt;&lt;li&gt;Object creation: abstract factory &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Interface Segregation Principle (ISP)&lt;/div&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Many client specific interfaces are better than one general purpose interface &lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span xmlns=""&gt;&lt;span style="color: #366092; font-size: 13pt;"&gt;&lt;strong&gt;Package Architecture&lt;/strong&gt; &lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;Release Reuse Equivalency Principle (REP)&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;One criterion for grouping classes into packages is reuse &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Common Closure Principle (CCP)&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Group together classes that we think will change together &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Common Reuse Principle (CRP)&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Classes that aren't reused together should not be grouped together &lt;/li&gt;&lt;li&gt;"Changes to a class that I don't care about will still force a new release of the package, and still cause me to go through the effort of upgrading and revalidating." &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Acyclic Dependencies Principle (ADP)&lt;/div&gt;&lt;ul&gt;&lt;li&gt;The dependencies between packages must not form cycles. &lt;/li&gt;&lt;li&gt;&lt;div&gt;Breaking cycles&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Creating a new package &lt;/li&gt;&lt;li&gt;Make use of DIP and ISP &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Stable Dependencies Principle (SDP)&lt;span style="font-family: 'Times New Roman'; font-size: 12pt;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;Depend in the direction of stability &lt;/li&gt;&lt;li&gt;Stability is related to the amount of work required to make a change &lt;/li&gt;&lt;li&gt;Should all software be stable? We greatly desire that portions of our software be instable. We want certain modules to be easy to change so that when requirements drift, the design can respond with ease. &lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Stable Abstractions Principle (SAP)&lt;/div&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Stable packages should be abstract packages &lt;/li&gt;&lt;li&gt;The more packages that are hard to change, the less flexible our overall design will be. Highly stable packages at the bottom of the dependency network may be very difficult to change, but according to the OCP they do not have to be difficult to extend! &lt;/li&gt;&lt;li&gt;SAP is just a restatement of the DIP - it states the packages that are the most depended upon (i.e. stable) should also be the most abstract&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-26667485304404660?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/26667485304404660/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=26667485304404660' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/26667485304404660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/26667485304404660'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/07/design-principles-and-design-patterns.html' title='Design Principles and Design Patterns'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2250545847392798876</id><published>2011-02-28T20:42:00.000-08:00</published><updated>2011-02-28T21:04:41.892-08:00</updated><title type='text'>Hacker's Delight: reversing bits</title><content type='html'>From "Hacker's Delight" book, how to reverse bits elegantly:&lt;br /&gt;&lt;pre name="code" class="c"&gt;x = (x &amp; 0x55555555) &lt;&lt;  1 | (x &amp; 0xAAAAAAAA) &gt;&gt;  1;&lt;br /&gt;x = (x &amp; 0x33333333) &lt;&lt;  2 | (x &amp; 0xCCCCCCCC) &gt;&gt;  2;&lt;br /&gt;x = (x &amp; 0x0F0F0F0F) &lt;&lt;  4 | (x &amp; 0xF0F0F0F0) &gt;&gt;  4;&lt;br /&gt;x = (x &amp; 0x00FF00FF) &lt;&lt;  8 | (x &amp; 0xFF00FF00) &gt;&gt;  8;&lt;br /&gt;x = (x &amp; 0x0000FFFF) &lt;&lt; 16 | (x &amp; 0xFFFF0000) &gt;&gt; 16;&lt;/pre&gt;&lt;br /&gt;An slightly more efficient version:&lt;br /&gt;&lt;pre name="code" class="c"&gt;x = (x &amp; 0x55555555) &lt;&lt;  1 | (x &amp; 0xAAAAAAAA) &gt;&gt;  1;&lt;br /&gt;x = (x &amp; 0x33333333) &lt;&lt;  2 | (x &amp; 0xCCCCCCCC) &gt;&gt;  2;&lt;br /&gt;x = (x &amp; 0x0F0F0F0F) &lt;&lt;  4 | (x &amp; 0xF0F0F0F0) &gt;&gt;  4;&lt;br /&gt;x = (x &lt;&lt; 24) | ((x &amp; 0xFF00) &lt;&lt; 8) | &lt;br /&gt;      ((x &gt;&gt; 8) &amp; 0xFF00) | (x &gt;&gt; 24);&lt;/pre&gt;&lt;br /&gt;And this last line gives you byte reversal:&lt;br /&gt;&lt;pre name="code" class="c"&gt;x = (x &lt;&lt; 24) | ((x &amp; 0xFF00) &lt;&lt; 8) |&lt;br /&gt;      ((x &gt;&gt; 8) &amp; 0xFF00) | (x &gt;&gt; 24);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2250545847392798876?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2250545847392798876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2250545847392798876' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2250545847392798876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2250545847392798876'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/02/hackers-delight-reversing-bits.html' title='Hacker&apos;s Delight: reversing bits'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5141196630247777182</id><published>2011-02-20T14:23:00.000-08:00</published><updated>2011-02-20T14:26:26.339-08:00</updated><title type='text'>SEDA architecture</title><content type='html'>Not long ago, I worked on system that, in a way, resembled SEDA architecture. Although I had attended SOSP '01 and attended Matt Welsh's presentation on SEDA, I couldn't remember much about it so many years later. At the time, I did not connect the dots, but a Principal Engineer mentioned it and quickly I reminded myself about SEDA. Today I read an article explaining it and also a Matt's restrospective on SEDA that I wanted to share with you:&lt;br /&gt;&lt;br /&gt;http://muratbuffalo.blogspot.com/2011/02/seda-architecture-for-well-conditioned.html&lt;br /&gt;http://matt-welsh.blogspot.com/2010/07/retrospective-on-seda.html&lt;br /&gt;&lt;br /&gt;Matt's retrospective is interesting as the architecture is something that he stills sees a valid and worth considering for modern system, but the stages is something he would group to reduce latency. I would say that, from my experience, the issue is how to have the proper visibility into each stage and its queues, to understand how the system is behaving. Sometimes one just butt heads due to the lack of understanding of the overall architecture and due to lack of metrics on where your backlog may be to understand your bottleneck.&lt;br /&gt;&lt;br /&gt;One great question about this retrospective is how Matt views Actors (as in Scala)? The poster asks whether each actor could be a sort of micro-stage in a SEDA architecture. Unfortunately Matt hasn't replied to this question (yet).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5141196630247777182?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5141196630247777182/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5141196630247777182' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5141196630247777182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5141196630247777182'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/02/seda-architecture.html' title='SEDA architecture'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-7786540180997026212</id><published>2011-02-08T07:22:00.001-08:00</published><updated>2011-02-08T07:22:30.822-08:00</updated><title type='text'>Queueing Theory Books On Line</title><content type='html'>Good list of books online on queueing theory:&lt;br /&gt;http://web2.uwindsor.ca/math/hlynka/qonline.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-7786540180997026212?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/7786540180997026212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=7786540180997026212' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7786540180997026212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7786540180997026212'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/02/queueing-theory-books-on-line.html' title='Queueing Theory Books On Line'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1485314108560567194</id><published>2011-01-25T21:43:00.000-08:00</published><updated>2011-01-25T21:43:30.620-08:00</updated><title type='text'>How to find topmost frequent items from a data stream?</title><content type='html'>I've been asked this question in a interview a long time back: if you have a huge amount of data and don't have memory to keep all of them, how do you get the top items, even if you have some error. Answering this precisely is not simple and requiring the interviewee to provide a 100% correct may be too much, but the goal is more about the discussion - and luckily it seems I did well at that time. Anyway, below you can find two good references on the topic, in case you are interested in learning more:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.19.8594&amp;rep=rep1&amp;type=pdf"&gt;Manku, Motwani - "Approximate Frequency Counts over Data Streams" [pdf]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.eecs.harvard.edu/~michaelm/CS222/muthu.pdf"&gt;Data Streams: Algorithms and Applications&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1485314108560567194?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1485314108560567194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1485314108560567194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1485314108560567194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1485314108560567194'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/01/how-to-find-topmost-frequent-items-from.html' title='How to find topmost frequent items from a data stream?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6920037183351895595</id><published>2011-01-23T20:39:00.000-08:00</published><updated>2011-01-23T20:59:11.232-08:00</updated><title type='text'>First program in Scala: porting binary search add/remove from Java</title><content type='html'>Today I worked on my first program in Scala, after reading most of &lt;a href="http://www.amazon.com/Programming-Scala-Scalability-Functional-Objects/dp/0596155956/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1295843528&amp;sr=1-1"&gt;Programming Scala&lt;/a&gt;. This is the first time in a very long time that I try to learn a new programming language and I took the approach of first reading the book. After starting writing the code, though, I noticed how important it is to actually code something in the language, as without coding, you can't remember much.&lt;br /&gt;&lt;br /&gt;So, what I did first was to port the code to delete nodes from a binary tree available &lt;a href="http://www.sourcecodesworld.com/articles/java/java-data-structures/Deleting_items_from_a_Binary_Search_Tree.asp"&gt;here&lt;/a&gt; in Java to Scala. The outcome was almost identical, except for some Scala-specific things, like trying to use Option.&lt;br /&gt;&lt;br /&gt;Second, I tried to make is more Scala ("scalafy my code") and, since it's been a couple of weeks since I last read the "Programming Scala", I thought that there wasn't a whole lot I could do for this kind of program. However, after trying to implement pattern matching in some sections, I realized that I could get rid of my if statements (which were long, with a bunch of elses) only with pattern matching. Also, some of the "get" calls on the Options objects ended up being unnecessary with the pattern matching. I thought the result was quite elegant compared to the Java version. Open the &lt;a href="http://www.sourcecodesworld.com/articles/java/java-data-structures/Deleting_items_from_a_Binary_Search_Tree.asp"&gt;Java version&lt;/a&gt; in a different tab and compare the code, and let me know what you think. Also, if you know Scala, please let me know what suggestions you would have to make use of more Scala features.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;case class Node(value: Int, var right: Option[Node], var left: Option[Node])&lt;br /&gt;&lt;br /&gt;object TreeUtils {&lt;br /&gt; def printInOrder(node: Option[Node]) {&lt;br /&gt;  node match {&lt;br /&gt;   case Some(node) =&gt; {&lt;br /&gt;    printInOrder(node.left);&lt;br /&gt;    Console.print(" " + node.value);&lt;br /&gt;    printInOrder(node.right);    &lt;br /&gt;   }&lt;br /&gt;   case _ =&gt; ;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; def addNode(node: Option[Node], valueToAdd: Int): Option[Node] = {&lt;br /&gt;  node match {&lt;br /&gt;   case None =&gt; &lt;br /&gt;    Option(new Node(valueToAdd, None, None));&lt;br /&gt;   case Some(currentNode) =&gt; {&lt;br /&gt;    currentNode.value match {&lt;br /&gt;     case v if v &lt; valueToAdd =&gt;&lt;br /&gt;      currentNode.right = addNode(currentNode.right, valueToAdd);&lt;br /&gt;      node;&lt;br /&gt;     case v if v &gt; valueToAdd =&gt;&lt;br /&gt;      currentNode.left = addNode(currentNode.left , valueToAdd);&lt;br /&gt;      node;&lt;br /&gt;     case _ =&gt; node;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; def deleteNode(node: Option[Node], valueToDelete: Int): Option[Node] = {&lt;br /&gt;  node match {&lt;br /&gt;   case None =&gt; &lt;br /&gt;    None;&lt;br /&gt;   case Some(currentNode) =&gt; {&lt;br /&gt;    currentNode.value match {&lt;br /&gt;     case v if v &lt; valueToDelete =&gt;&lt;br /&gt;      currentNode.right  = deleteNode(currentNode.right, valueToDelete);&lt;br /&gt;      node;&lt;br /&gt;     case v if v &gt; valueToDelete =&gt;&lt;br /&gt;      currentNode.left  = deleteNode(currentNode.left , valueToDelete);&lt;br /&gt;      node;&lt;br /&gt;     case _ =&gt; {&lt;br /&gt;      (currentNode.left, currentNode.right) match {&lt;br /&gt;       case (None, None) =&gt; None&lt;br /&gt;       case (None, _) =&gt; currentNode.right &lt;br /&gt;       case (_, None) =&gt; currentNode.left&lt;br /&gt;       case (Some(leftNode), Some(rightNode)) if rightNode.left == None =&gt; {&lt;br /&gt;        rightNode.left = currentNode.left;&lt;br /&gt;        currentNode.right;&lt;br /&gt;       }&lt;br /&gt;       case (Some(leftNode), Some(rightNode)) =&gt; {&lt;br /&gt;        var q = rightNode;&lt;br /&gt;        var p = rightNode;&lt;br /&gt;        &lt;br /&gt;        while (p.left.get.left != None)&lt;br /&gt;         p = p.left.get;&lt;br /&gt;        &lt;br /&gt;        q = p.left.get;&lt;br /&gt;        p.left = q.right;&lt;br /&gt;        q.left  = currentNode.left;&lt;br /&gt;        q.right = currentNode.right;&lt;br /&gt;        Some(q);&lt;br /&gt;       }&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;object BinaryTree {&lt;br /&gt; def main(args: Array[String]) = {&lt;br /&gt;  var root : Option[Node] = None;&lt;br /&gt;  val numbers: Array[Int] = Array(56,86,71,97,82,99,65,36,16,10,28,52,46);&lt;br /&gt;  for (i &lt;- numbers) {&lt;br /&gt;   Console.println("Inserting " + i);&lt;br /&gt;   root = TreeUtils.addNode(root, i);&lt;br /&gt;  }&lt;br /&gt;  Console.print("Tree: ");&lt;br /&gt;  TreeUtils.printInOrder(root);&lt;br /&gt;  Console.println();&lt;br /&gt;  for (i &lt;- numbers) {&lt;br /&gt;   Console.println("Removing " + i);&lt;br /&gt;   root = TreeUtils.deleteNode(root, i);&lt;br /&gt;   Console.print("Tree: ");&lt;br /&gt;   root match {&lt;br /&gt;    case None =&gt; Console.println(" &lt;empty&gt; ");&lt;br /&gt;    case _ =&gt; &lt;br /&gt;     TreeUtils.printInOrder(root);&lt;br /&gt;     Console.println();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  Console.println("Done");&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6920037183351895595?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6920037183351895595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6920037183351895595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6920037183351895595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6920037183351895595'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/01/first-program-in-scala-porting-binary.html' title='First program in Scala: porting binary search add/remove from Java'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6627230154552376637</id><published>2011-01-07T19:06:00.000-08:00</published><updated>2011-01-07T19:08:04.159-08:00</updated><title type='text'>DO NOT BUY on Frys.com</title><content type='html'>It's been a while that I don't post, but this deserves a post in capital letter: DO NOT BUY on Frys.com. I placed an order on 11/25/2010, and their system recorded two orders, charged twice, and shipped two packages. When I called them, they told me to refuse the package when it was delivered by USPS. That is what I did on 12/07/2010. It's been a month since I refused the package, and several calls to their customer service number, one email sent through their web site (without response after a week), and I haven't received any refund. Except for the last associate I talked to, they did not seem to care a bit about the problem. Most of them say that I should keep waiting, because it can TAKE MONTHS. One of them said that he would talk to the manager and call me back: HE'S NEVER DONE THAT. Now, after a month of following their directions, they will investigate further without any guarantee whatsoever - yes, it's possible that they will never refund. &lt;br /&gt;&lt;br /&gt;I think I've been really spoiled by Amazon.com and other companies that care about their customers and forgot about companies like Frys. Frys clearly doesn't care about their customers, provide a horrible experience, and I will definitely recommend all my friends against buying anything from this company.&lt;br /&gt;&lt;br /&gt;After a quick search on Google, this is the first link I get about customers reviews of Frys.com - 950 reviews, 1 star out of 5. It seems I am not the only one:&lt;br /&gt;http://www.resellerratings.com/store/Fry_s_Electronics_Outpost&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6627230154552376637?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6627230154552376637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6627230154552376637' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6627230154552376637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6627230154552376637'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2011/01/do-not-buy-on-fryscom.html' title='DO NOT BUY on Frys.com'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-4755854423627434014</id><published>2010-08-12T08:49:00.001-07:00</published><updated>2011-04-06T21:13:00.008-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Do you use or consider subversion as source code repository?</title><content type='html'>Check this out in case you use branches:&lt;br /&gt;&lt;a href="http://blogs.collab.net/subversion/2008/07/subversion-merg/"&gt;http://blogs.collab.net/subversion/2008/07/subversion-merg/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Unless you use it only for checking in and out files, probably subversion is not the more robust solution.&lt;br /&gt;&lt;br /&gt;(Update: CollabNet seems to have deployed a different blog and broke existing links. Thanks to Paulo Naddeo for pointing that out.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-4755854423627434014?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/4755854423627434014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=4755854423627434014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4755854423627434014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4755854423627434014'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2010/08/do-you-use-or-consider-subversion-as.html' title='Do you use or consider subversion as source code repository?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-4391773842616332738</id><published>2010-06-24T19:53:00.000-07:00</published><updated>2010-06-24T19:53:16.786-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Synchronized Map in Oracle driver?</title><content type='html'>I posted this &lt;a href="http://forums.oracle.com/forums/thread.jspa?threadID=1091154"&gt;thread&lt;/a&gt; on Oracle's forum after finding out that the top monitor in my application was a "SynchronizedMap" in Oracle driver. It seems that each prepared statement needs to access this map, getting worse as one increases the number of database operations in the system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-4391773842616332738?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/4391773842616332738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=4391773842616332738' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4391773842616332738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4391773842616332738'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2010/06/synchronized-map-in-oracle-driver.html' title='Synchronized Map in Oracle driver?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2057930523515084972</id><published>2010-06-24T19:39:00.000-07:00</published><updated>2010-06-24T19:39:36.246-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>StringBuilder memory allocation</title><content type='html'>Today I was trying to understand a heap dump for a String that, when saved to a file, had 3 Mb in size. However, its retained dump was over 9 Mb! First, this String was a ThreadLocal variable - a library that we use to marshal this String into XML uses ThreadLocal (a good post on StringBuilders and ThreadLocal &lt;a href="http://sbdevel.wordpress.com/2009/03/12/threadlocal-stringbuilders-for-fast-text-processing/"&gt;here&lt;/a&gt;). &lt;br /&gt;&lt;br /&gt;A colleague tried to understand why it was 9Mb and found out a couple of things that we were not considering:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;UTF16: each character consumes 2 bytes in a String to be represented. So, our 3Mb file would consume a minimum of 6Mb of memory space&lt;/li&gt;&lt;li&gt;StringBuilder allocation: whenever StringBuilder needs to expand its capacity, it doubles the current allocated memory. So, if we had 4.5Mb and needed one byte more, it would allocate an internal buffer of 9Mb. In our case, it was clear that 3 out of 9Mb had never been used for anything&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2057930523515084972?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2057930523515084972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2057930523515084972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2057930523515084972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2057930523515084972'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2010/06/stringbuilder-memory-allocation.html' title='StringBuilder memory allocation'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-4163455584583271754</id><published>2010-06-09T21:25:00.000-07:00</published><updated>2010-06-09T21:25:20.486-07:00</updated><title type='text'>Apache Commons DBCP and initial pool size</title><content type='html'>Unless you are using BasicDataSource, DBCP does not provide an initial pool size, which is very important if you want to avoid pool expansion out of sudden. It is particularly important if you are migrating from C3P0, like what I did recently. So, in this case, you will have to code an initializer to do it for you. In my case, I wrote a static method that is invoked through Spring:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;import org.apache.commons.logging.Log;&lt;br /&gt;import org.apache.commons.logging.LogFactory;&lt;br /&gt;import org.apache.commons.pool.ObjectPool;&lt;br /&gt;&lt;br /&gt;public class DataSourceInitializer {&lt;br /&gt;    private static final Log log = LogFactory.getLog(DataSourceInitializer.class);&lt;br /&gt;&lt;br /&gt;    public static void init(ObjectPool pool, int initialSize, String dataSourceName) {&lt;br /&gt;        int count = 0;&lt;br /&gt;&lt;br /&gt;        log.info("Initializing connections for data source: " + dataSourceName);&lt;br /&gt;&lt;br /&gt;        for (int i = 0; i &lt; initialSize; i++) {&lt;br /&gt;            try {&lt;br /&gt;                pool.addObject();&lt;br /&gt;                count++;&lt;br /&gt;            }&lt;br /&gt;            catch (Exception e) {&lt;br /&gt;                log.warn("Failure to initialize connection.", e);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        log.info("Initialized " + count + " out of " + initialSize&lt;br /&gt;                + " connections for data source: " + dataSourceName);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;And, in Spring, I call it like this:&lt;pre name="code" class="xml"&gt;&amp;lt;bean id="dataSourceInitializer"&lt;br /&gt;class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"&lt;br /&gt;                depends-on="pollableConnectionFactory"&amp;gt;&lt;br /&gt;       &amp;lt;property name="staticMethod"&lt;br /&gt;           value="com.example.DataSourceInitializer.init" /&amp;gt;&lt;br /&gt;       &amp;lt;property name="arguments"&amp;gt;&lt;br /&gt;           &amp;lt;list&amp;gt;&lt;br /&gt;               &amp;lt;ref bean="objectPool" /&amp;gt;&lt;br /&gt;               &amp;lt;ref bean="databasePoolSize" /&amp;gt;&lt;br /&gt;               &amp;lt;value&amp;gt;mainDataSource&amp;lt;/value&amp;gt;&lt;br /&gt;           &amp;lt;/list&amp;gt;&lt;br /&gt;       &amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;/bean&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-4163455584583271754?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/4163455584583271754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=4163455584583271754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4163455584583271754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4163455584583271754'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2010/06/apache-commons-dbcp-and-initial-pool.html' title='Apache Commons DBCP and initial pool size'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6181275679636822972</id><published>2010-06-01T20:51:00.000-07:00</published><updated>2010-06-01T20:52:16.265-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>How to bind to all local addresses</title><content type='html'>Whenever we bind to an address, typically we bind to an address and port.&lt;br /&gt;&lt;pre name="code" class="java"&gt;InetSocketAddress local = new InetSocketAddress("localhost", port);&lt;br /&gt;socket.bind(local);&lt;br /&gt;&lt;/pre&gt;This binds your socket only to "localhost". What if your host has multiple names, such as "localhost" and "myhost.mydomain"? You can still bind to all local addresses by doing the following:&lt;br /&gt;&lt;pre name="code" class="java"&gt;InetSocketAddress local = new InetSocketAddress(port);&lt;br /&gt;socket.bind(local);&lt;br /&gt;&lt;/pre&gt;Internally, this binds to all localhost addresses by using InetAddress.anyLocalAddress() (which is package private).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6181275679636822972?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6181275679636822972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6181275679636822972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6181275679636822972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6181275679636822972'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2010/06/how-to-bind-to-all-local-addresses.html' title='How to bind to all local addresses'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6725135480417896725</id><published>2010-06-01T20:21:00.000-07:00</published><updated>2010-06-01T20:52:34.098-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Java Thread States</title><content type='html'>We had a little bit of debate last week about Java Thread states and I found the explanation for our questions in the &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.State.html"&gt;Thread.State&lt;/a&gt; javadoc. The main question is the difference between BLOCKED and WAITING, but I guess this subtle difference is clear below:&lt;br /&gt;&lt;br /&gt;NEW&lt;br /&gt;Thread state for a thread which has not yet started.&lt;br /&gt;&lt;br /&gt;RUNNABLE&lt;br /&gt;Thread state for a runnable thread. A thread in the runnable state is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor.&lt;br /&gt;&lt;br /&gt;BLOCKED&lt;br /&gt;Thread state for a thread blocked waiting for a monitor lock. A thread in the blocked state is waiting for a monitor lock to enter a synchronized block/method or reenter a synchronized block/method after calling Object.wait.&lt;br /&gt;&lt;br /&gt;WAITING&lt;br /&gt;Thread state for a waiting thread. A thread is in the waiting state due to calling one of the following methods:&lt;br /&gt;&lt;br /&gt;* Object.wait with no timeout&lt;br /&gt;* Thread.join with no timeout&lt;br /&gt;* LockSupport.park&lt;br /&gt;&lt;br /&gt;A thread in the waiting state is waiting for another thread to perform a particular action. For example, a thread that has called Object.wait() on an object is waiting for another thread to call Object.notify() or Object.notifyAll() on that object. A thread that has called Thread.join() is waiting for a specified thread to terminate.&lt;br /&gt;&lt;br /&gt;TIMED_WAITING&lt;br /&gt;Thread state for a waiting thread with a specified waiting time. A thread is in the timed waiting state due to calling one of the following methods with a specified positive waiting time:&lt;br /&gt;* Thread.sleep&lt;br /&gt;* Object.wait with timeout&lt;br /&gt;* Thread.join with timeout&lt;br /&gt;* LockSupport.parkNanos&lt;br /&gt;* LockSupport.parkUntil&lt;br /&gt;&lt;br /&gt;TERMINATED&lt;br /&gt;Thread state for a terminated thread. The thread has completed execution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6725135480417896725?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6725135480417896725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6725135480417896725' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6725135480417896725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6725135480417896725'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2010/06/java-thread-states.html' title='Java Thread States'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-8612941165645999565</id><published>2010-05-29T18:36:00.000-07:00</published><updated>2010-05-29T20:43:13.334-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>Book Review: iReport 3.7</title><content type='html'>Packt Publishing contacted me a few weeks ago and sent me a copy of their new &lt;a href="https://www.packtpub.com/ireport-3-7/book?utm_source=sacaluta.com&amp;utm_medium=bookrev&amp;utm_content=blog&amp;utm_campaign=mdb_002962"&gt;iReport 3.7 book&lt;/a&gt;, by Shamsuddin Ahammad. Although it took me longer to manage to find the time to read the entire book, I got done this weekend and would like to share my thoughts about it.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center"&gt;&lt;a href="https://www.packtpub.com/ireport-3-7/book?utm_source=sacaluta.com&amp;utm_medium=bookrev&amp;utm_content=blog&amp;utm_campaign=mdb_002962"&gt;&lt;img src="https://www.packtpub.com/sites/default/files/imagecache/productview/bookimages/8808_MockupCover_0.jpg" alt="iReport 3.7" title="iReport 3.7" width="125" height="152" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-weight:bold;"&gt;What is this book about?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This book is about iReport, a very neat tool to design reports intended to run using Jasper Reports library. Although Jasper Reports is probably the best open source report library, it is very hard to use it unless you have a tool to design your reports. I had the opportunity of using iReport a few years back, and without it, I would not have used Jasper Reports at all. Although Jasper Reports has always been very powerful, I would not have written raw XML to design my reports, so now you may understand why iReport turns out to be relevant and worthy of its own book.&lt;br /&gt;&lt;br /&gt;In addition to that, not only Jasper Reports is very powerful, but iReport is as well. I had some troubles a few years back for some more advanced tasks (like being able to use scriptlets for my reports), but even then I was able to figure out how to make it work. Recent versions are years-light better than at the time I used, so I highly recommend it as my open-source option for reports.&lt;br /&gt;&lt;br /&gt;This book targets those who want to quickly learn iReports. It is a hands-on book, introducing the basic and necessary concepts to get started, following a tutorial format. Each chapter covers a specific topic that will get the user to quickly learn a new feature and leverage them for their own projects.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;What does it cover?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As mentioned before, it covers a specific feature in each of its chapters. These are the covered topics: Report Layout and Formatting, Variables, Parameters, Groups, Subreports, Crosstab Reports, Charting, Images. It also covers how to display reports in Java applications.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Opinion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This book is definitely relevant given the importance of iReport and Jasper Reports in the open source world. It doesn't require any prior knowledge of Jasper, iReport, and only very minimal knowledge of SQL to be able to learn what iReport is about. I think the tutorial format is very interesting and does not bore you even if you read it cover-to-cover, like I did. Also, if you prefer to learn just what matters to you, it leads you to the basic knowledge of iReport very quickly, what is very important nowadays. This is definitely the kind of book I would recommend to anyone that doesn't know anything about iReport.&lt;br /&gt;&lt;br /&gt;On the other hand, this is not the only source of information you will need when using JasperReports. The integration of Jasper Reports with your applications is covered primarily through a Swing application and the integration with a web application is very short and doesn't provide details. If I were to review this book before it was published, I would have suggested that the author spent more time on the integration part. I would also remove or shorten the last chapter on Netbeans, as I don't think it's so relevant and does not provide much new information. Given that, if you buy this book, very likely you will need to look up on the web more information on how to actually generate the report files.&lt;br /&gt;&lt;br /&gt;Also, if you are using more advanced features, they are not covered in this book. One example is scriptlets. Also, it touches on the concepts only lightly, so if you are expecting to learn theory/concepts, internals of iReport or JasperReports, or even details about iReport (like configuration options, all the properties, all available report elements), this is not the book for you.&lt;br /&gt;&lt;br /&gt;In terms of the tutorial format, it provides the database schema and how to create in the appendices, which is definitely handy for those not familiar with MySQL. In my case, it was very simple to create the schemas copying the SQL statements from the ebook version. However, it does not provide data and it would have so simple to have provided some sample data so users do not have to populate the database to be able to follow each chapter's instructions. If you buy the print version, the code is not still available on Packt's website, so you will have to create the schema copying the SQL statements by hand. Being nit-picky, the only Java code that is provided in the book is badly indented/formatted and reviewers may have overlooked that.&lt;br /&gt;&lt;br /&gt;Finally, I have to say that I really enjoyed reading this book and learning more about the new version of iReport. I recommend this book to all of you that would like to start learning about iReport 3.7. Please leave your comments below if you had the chance to read this book as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-8612941165645999565?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/8612941165645999565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=8612941165645999565' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8612941165645999565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8612941165645999565'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2010/05/book-review-ireport-37.html' title='Book Review: iReport 3.7'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-7798702251157486830</id><published>2009-08-31T14:41:00.000-07:00</published><updated>2009-08-31T14:51:13.927-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Alternative to Wicket Ajax serialization</title><content type='html'>In the &lt;a href="http://blog.sacaluta.com/2009/08/apache-wicket-and-ajax-deal-breaker.html"&gt;last post&lt;/a&gt;, I talked about an issue I found with Wicket. The JIRA I filed with the Wicket team (&lt;a href="https://issues.apache.org/jira/browse/WICKET-2437"&gt;WICKET-2437&lt;/a&gt;) was resolved as "Won't Fix". The reason is that they do not want to make the compromise of having the user synchronizing the page, what is quite understandable. &lt;br /&gt;&lt;br /&gt;Igor (Wicket's author) suggested that I created a shared resource and point all my images to this shared resource. That is done by removing my panels and modifying the img src attribute directly. Of course that was painful as I need to serialize all my parameters to the panels as URL parameters, and then be able to parse on the other end shared resource). I tried this path and it worked beautifully. &lt;br /&gt;&lt;br /&gt;I know that Wicket supports multiple content types for a DynamicWebResource, but I wonder if I can make some other parts of my site (which were supposed to be async) truly async making them async. For now I can stick with Wicket, which is pretty good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-7798702251157486830?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/7798702251157486830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=7798702251157486830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7798702251157486830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7798702251157486830'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/08/alternative-to-wicket-ajax.html' title='Alternative to Wicket Ajax serialization'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1270030952138930548</id><published>2009-08-27T18:10:00.000-07:00</published><updated>2009-08-31T14:51:47.320-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Apache Wicket and Ajax: deal-breaker?</title><content type='html'>I've been using Wicket for the past months and found something that it's a deal-breaker if you have a web application with lots of Ajax where you rely on asynchronicity. Wicket &lt;b&gt;serializes&lt;/b&gt; client and server side requests for the same page. You understood it correctly: serialized. So, if you have multiple panels, all the requests will be serialized. The whole purpose of ajax for asynchronicity is defeated.&lt;br /&gt;&lt;br /&gt;So, this is a big disadvantage and, although I've been a big Wicket advocate, I would not consider it unless I find a good and simple workaround.&lt;br /&gt;&lt;br /&gt;For more context, see this JIRA I file with the Wicket team:&lt;br /&gt;https://issues.apache.org/jira/browse/WICKET-2437&lt;br /&gt;&lt;br /&gt;Update: I found an alternative. See this &lt;a href="http://blog.sacaluta.com/2009/08/alternative-to-wicket-ajax.html"&gt;post&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1270030952138930548?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1270030952138930548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1270030952138930548' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1270030952138930548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1270030952138930548'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/08/apache-wicket-and-ajax-deal-breaker.html' title='Apache Wicket and Ajax: deal-breaker?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5516963372077839163</id><published>2009-07-25T16:55:00.000-07:00</published><updated>2009-07-25T17:41:48.305-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Wicket + Spring Security: do NOT post info to j_spring_security_check as part of the URL</title><content type='html'>This week, when working on the integration of Spring Security with Wicket, I was trying to understand the best approach to create a customized login page. Then I came across this Apache wiki page: &lt;br /&gt;&lt;br /&gt;http://cwiki.apache.org/confluence/display/WICKET/Servlet+container+authentication&lt;br /&gt;&lt;br /&gt;It suggests that you post the info as a Wicket form and, in the Wicket class, you validate the info and post it to j_spring_security_check. This looks very nice at first, but later I realized a major problem. It posts the username and password as part of the URL. Yes, it posts something like that:&lt;br /&gt;&lt;br /&gt;j_spring_security?j_username=rodrigo&amp;j_password=mypassword&lt;br /&gt;&lt;br /&gt;What's wrong with that? If you have access log, this is the URL you are accessing, which shows up in the log files. I updated the Wiki page with this info and definitely did not follow this path.&lt;br /&gt;&lt;br /&gt;It turned out that, after searching everything I found on the web, the solution was pretty straightforwad. I added a regular form to my LoginPage with action set to j_spring_security_check and do not intercept this request through Wicket. That simple, no validation or check in my Wicket code at all.&lt;br /&gt;&lt;br /&gt;If you have any questions about this, don't hesitate to send me an email.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5516963372077839163?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5516963372077839163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5516963372077839163' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5516963372077839163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5516963372077839163'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/07/wicket-spring-security-do-not-post-info.html' title='Wicket + Spring Security: do NOT post info to j_spring_security_check as part of the URL'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2278512026135924475</id><published>2009-07-20T11:00:00.000-07:00</published><updated>2009-07-20T11:02:31.843-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Wicket:: how to output text (like a Servlet)</title><content type='html'>I wanted to output regular text, like a servlet, rather than an HTML - which is Wicket's default. This was to be used by a PingPage, to make sure the service is up and running. This is the way you can do that:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class PingPage extends WebPage {&lt;br /&gt;    public PingPage() {&lt;br /&gt;        getRequestCycle().setRequestTarget(new IRequestTarget() {&lt;br /&gt;            public void detach(RequestCycle requestCycle) {}&lt;br /&gt;            public Object getLock(RequestCycle requestCycle) { return null; }&lt;br /&gt;&lt;br /&gt;            public void respond(RequestCycle requestCycle) {&lt;br /&gt;              WebResponse r = (WebResponse)requestCycle.getResponse();&lt;br /&gt;              r.setContentType( "text/plain" );&lt;br /&gt;&lt;br /&gt;              PrintStream printStream = new PrintStream(r.getOutputStream());&lt;br /&gt;              printStream.println("healthy");&lt;br /&gt;          }&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2278512026135924475?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2278512026135924475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2278512026135924475' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2278512026135924475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2278512026135924475'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/07/wicket-how-to-output-text-like-servlet.html' title='Wicket:: how to output text (like a Servlet)'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1828823672947225204</id><published>2009-07-16T13:31:00.001-07:00</published><updated>2009-07-16T13:34:21.421-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Wicket: link/url relative to the context path</title><content type='html'>I was trying to figure that out and it took me long enough to find how to do that in wicket that it may be worth posting how to solve this problem.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;ExternalLink logoutLink = new ExternalLink("logout_link", "/j_spring_security_logout");&lt;br /&gt;logoutLink.setContextRelative(true);&lt;br /&gt;add(logoutLink);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I was integrating Spring Security and wanted to add the logout link. There is no need to figure out the context path, as the ExternalLink class has an option to set the link as relative to the context.&lt;br /&gt;&lt;br /&gt;You can find more info here: &lt;a href="http://wicketstuff.org/wicket13doc/org/apache/wicket/markup/html/link/ExternalLink.html#setContextRelative(boolean)"&gt;ExternalLink (javadoc)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1828823672947225204?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1828823672947225204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1828823672947225204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1828823672947225204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1828823672947225204'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/07/wicket-linkurl-relative-to-context-path.html' title='Wicket: link/url relative to the context path'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6231672276596478591</id><published>2009-05-13T12:31:00.001-07:00</published><updated>2009-05-13T12:31:26.105-07:00</updated><title type='text'>WeakHashMap is not a cache!</title><content type='html'>Good article about WeakHashMap:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.codeinstructions.com/2008/09/weakhashmap-is-not-cache-understanding.html"&gt;http://www.codeinstructions.com/2008/09/weakhashmap-is-not-cache-understanding.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6231672276596478591?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6231672276596478591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6231672276596478591' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6231672276596478591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6231672276596478591'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/05/weakhashmap-is-not-cache.html' title='WeakHashMap is not a cache!'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1544914404369638918</id><published>2009-05-07T09:56:00.000-07:00</published><updated>2009-05-07T10:02:19.155-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Wicket, Form and GET method</title><content type='html'>If you are using Wicket and has previous web development experience, one of the good things is that, everytime you submit, Wicket takes care of everything. However, URL after form submission is something strange as it leads you to wicket URLs that is depending on the user's session. The question is: how do you make Wicket behave as a plain form that submits using GET method?&lt;br /&gt;&lt;br /&gt;First, I set my URL strategy to make it bookmarkable:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;        MixedParamUrlCodingStrategy mypageURL = new MixedParamUrlCodingStrategy(&lt;br /&gt;                "/service/test",&lt;br /&gt;                MyPage.class,&lt;br /&gt;                new String[]{"type"}&lt;br /&gt;        );&lt;br /&gt;        mount(mypageURL);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then, in the page code, I override the form onSubmit() method to do the following:&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;        form.add(new SubmitLink("update") {&lt;br /&gt;            @Override&lt;br /&gt;            public void onSubmit() {&lt;br /&gt;                PageParameters parameters = new PageParameters();&lt;br /&gt;                parameters.add("period", Integer.toString(getPeriod()));&lt;br /&gt;                parameters.add("unit", getUnit().toString());&lt;br /&gt;                parameters.add("type", getType());&lt;br /&gt;                setResponsePage(getPage().getClass(), parameters);&lt;br /&gt;            }            &lt;br /&gt;        });&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So, after the user click on the submit link, it submits it similarly to a GET method and I get a nice URL like:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;https://localhost:5443/application/service/test/app/?unit=HOUR&amp;period=6&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The result is that this makes URLs much more bookmarkable throughout the session.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1544914404369638918?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1544914404369638918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1544914404369638918' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1544914404369638918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1544914404369638918'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/05/wicket-form-and-get-method.html' title='Wicket, Form and GET method'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6690332868093727723</id><published>2009-05-05T20:53:00.000-07:00</published><updated>2009-05-05T21:33:01.958-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Extracting SOAP attachments with Axis</title><content type='html'>&lt;span style="font-family:arial;"&gt;It was a little hard to find this information today, so I think it would be interesting to share it here. First, what I wanted was to get the attachment for a SOAP response. The response was empty, but the attachment had a png I needed to display in my Wicket application.&lt;br /&gt;&lt;br /&gt;It turns out that it is very simple to extract SOAP attachments. All you have to do is to write a handler that will be called during the web service call. Any number of handlers can be set in the BindingProvider. For example, this is my code to set the handlers:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;MyServicePort port = mws.getMyServicePort();&lt;br /&gt;BindingProvider bp = (BindingProvider) port;&lt;br /&gt;bp.getRequestContext().put(&lt;br /&gt;           BindingProvider.ENDPOINT_ADDRESS_PROPERTY,&lt;br /&gt;           DEFAULT_WS_URL);&lt;br /&gt;Binding binding = bp.getBinding();&lt;br /&gt;     &lt;br /&gt;// Add the logging handler&lt;br /&gt;List handlerList = binding.getHandlerChain();&lt;br /&gt;if (handlerList == null) {&lt;br /&gt;    handlerList = new ArrayList();&lt;br /&gt;    binding.setHandlerChain(handlerList);&lt;br /&gt;}&lt;br /&gt;     &lt;br /&gt;handlerList.add(handler);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;With this code, we only need to write our handler which will handle the message and can do whatever it wants with it - including accessing attachments.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&lt;br /&gt;public class SOAPAttachmentHandler&lt;br /&gt;    implements SOAPHandler&amp;lt;SOAPMessageContext&amp;gt; {&lt;br /&gt;   private Collection&amp;lt;Attachment&amp;gt; attachments;&lt;br /&gt; &lt;br /&gt;   @Override&lt;br /&gt;   public boolean handleFault(SOAPMessageContext context) {&lt;br /&gt;       context.getMessage();&lt;br /&gt;       return true;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   public boolean handleMessage(SOAPMessageContext context) {&lt;br /&gt;       attachments = ((SOAPMessageContextImpl)context).&lt;br /&gt;                           getWrappedMessage().getAttachments();&lt;br /&gt;       return true;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   public Set&amp;lt;QName&amp;gt; getHeaders() {&lt;br /&gt;       return null;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   @Override&lt;br /&gt;   public void close(MessageContext context) {&lt;br /&gt;       // blank&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public Collection&amp;lt;Attachment&amp;gt; getAttachments() {&lt;br /&gt;       return attachments;&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The class above extracts the attachments and store then in a class variable. After invoking the web service, I can access the attachments.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6690332868093727723?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6690332868093727723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6690332868093727723' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6690332868093727723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6690332868093727723'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/05/extracting-soap-attachments-with-axis.html' title='Extracting SOAP attachments with Axis'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2980282861287054385</id><published>2009-04-28T22:25:00.000-07:00</published><updated>2009-04-28T22:31:04.221-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Lack of memory</title><content type='html'>A very interesting thing happened a few days ago. After searching for a solution to an error message I was getting when running Apache Tomcat, I came across the following post:&lt;br /&gt;&lt;br /&gt;https://issues.apache.org/bugzilla/show_bug.cgi?id=39090&lt;br /&gt;&lt;br /&gt;And I found the solution to my problem in the comment #5. By accident, I saw the author of the comment and, to my surprise, I had been the author in 2006! Yes, that's right. I had absolutely no memory of writing this comment. And this solution is mentioned in many other places after I added this comment there.&lt;br /&gt;&lt;br /&gt;Actually, I ended up using Tomcat 6 due to the nuisance of having to change a lot of stuff in my project at Amazon, but this finding was funny anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2980282861287054385?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2980282861287054385/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2980282861287054385' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2980282861287054385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2980282861287054385'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/04/lack-of-memory.html' title='Lack of memory'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-4322175446089304661</id><published>2009-04-04T19:36:00.000-07:00</published><updated>2009-05-05T21:28:00.201-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Cygwin: created files (e.g. tar) have shared icon on Windows Vista</title><content type='html'>Everytime I create a file in cygwin shell, files end up with the shared folder icon on Windows Vista and it is a hell of pain to remove this icon (unsharing a folder takes a whole lot of time). This happens with files under your Documents folder, not with files created elsewhere.&lt;br /&gt;&lt;br /&gt;In order to fix this behavior, you can do the following in a cygwin shell:&lt;br /&gt;&lt;br /&gt;export CYGWIN=nontsec&lt;br /&gt;&lt;br /&gt;Or even better, edit your .bashrc and add this export to be done everytime you launch a new shell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-4322175446089304661?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/4322175446089304661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=4322175446089304661' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4322175446089304661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/4322175446089304661'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/04/cygwin-created-files-eg-tar-have-shared.html' title='Cygwin: created files (e.g. tar) have shared icon on Windows Vista'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5054602486454836287</id><published>2009-04-02T20:02:00.000-07:00</published><updated>2009-05-05T21:34:54.786-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Hudson Plugin 2: Adding a Post-Build action (for a Reporter/Publisher)</title><content type='html'>This is a follow-up to the &lt;a href="http://blog.sacaluta.com/2009/03/hudson-plugin-1-setting-up-system.html"&gt;Hudson Plugin 1&lt;/a&gt;. As told before, you create the plugin skeleton using:&lt;br /&gt;&lt;pre&gt;mvn hpi:create&lt;br /&gt;&lt;/pre&gt;This creates a plugin skeleton through the maven-hpi-plugin. As of this writing, the latest version (1.34) generates a code that uses a&lt;span style="font-weight: bold;"&gt;deprecated&lt;/span&gt; way of doing so, and it is the skeleton of a Builder plugin.&lt;br /&gt;&lt;br /&gt;Since we are building a Recorder/Publisher and we will use the recommended way of defining a plugin (through the Extension annotation), we will have to change most of the code. But it is important to understand what is the structure, so that's the value of generating the skeleton. Specially because of Hudson's choice of using Jelly for the plugin portions of the HTML page.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;src/main/java&lt;/span&gt;&lt;br /&gt;plugin Java code&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;src/main/resource&lt;/span&gt;&lt;br /&gt;jelly files where you specify code for the configuration of plugin (global and project configuration).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_r7my89kTTEM/SdWYEZ65JKI/AAAAAAAAACo/QomL5JS3kGI/s1600-h/hudson-eclipse-project.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 292px;" src="http://2.bp.blogspot.com/_r7my89kTTEM/SdWYEZ65JKI/AAAAAAAAACo/QomL5JS3kGI/s400/hudson-eclipse-project.jpg" alt="" id="BLOGGER_PHOTO_ID_5320325736252908706" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Java Code&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;We need to create at least two classes to start testing our plugin. Since we want to see results quickly, let's do the minimum possible here. Let's remember what we want to do here: to add a new "Post-build action" where we can configure the file pattern that we will use to find files to report the test results.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Subclass of hudson.Recorder.&lt;/li&gt;&lt;li&gt;Descriptor class&lt;/li&gt;&lt;/ol&gt;For 2. there are many options, but we will create a subclass of BuildStepDescriptor&amp;lt;publisher&amp;gt;. More details below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Resources&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;config.jelly: jelly code that will be shown in the "Post-build action" section for our plugin&lt;/li&gt;&lt;li&gt;global.jelly: jelly code that will be shown in the Manage Hudson/Configure System section (this file is not used here since we don't have global configuration so far)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;help.html: html code with help text for the "Post-build action". This is shown if you click on the ? on the right of your action.&lt;/li&gt;&lt;li&gt;help-artifact.html: html code with help text for the plugin option that will be entered by the user. In our case, the file pattern for the report files.&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Results&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_r7my89kTTEM/SdWYg2NZPyI/AAAAAAAAACw/4P3gs5DnFrw/s1600-h/hudson-postbuild-distributed-test.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 96px;" src="http://4.bp.blogspot.com/_r7my89kTTEM/SdWYg2NZPyI/AAAAAAAAACw/4P3gs5DnFrw/s400/hudson-postbuild-distributed-test.jpg" alt="" id="BLOGGER_PHOTO_ID_5320326224883040034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Files and Details&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;1. Since our Descriptor class is an inner class, this is the only Java class so far:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;src/main/java/com/sacaluta/DistributedTestRecorder.java&lt;/span&gt;&lt;pre name="code" class="java"&gt;public class DistributedTestRecorder extends Recorder {&lt;br /&gt;public static String DISPLAY_NAME = "Distributed Test Report";&lt;br /&gt;&lt;br /&gt;private final String report;&lt;br /&gt;&lt;br /&gt;@DataBoundConstructor&lt;br /&gt;public DistributedTestRecorder(String report) {&lt;br /&gt;this.report = report;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public String getReport() {&lt;br /&gt;return report;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public boolean perform(AbstractBuild build, Launcher launcher,&lt;br /&gt;    BuildListener listener) {&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Extension&lt;br /&gt;public static final class DescriptorImpl extends&lt;br /&gt;    BuildStepDescriptor&amp;lt;publisher&amp;gt; {&lt;br /&gt;@Override&lt;br /&gt;public String getDisplayName() {&lt;br /&gt;    return "Publish " + DistributedTestRecorder.DISPLAY_NAME;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void doCheck(StaplerRequest res, StaplerResponse rsp)&lt;br /&gt;        throws IOException, ServletException {&lt;br /&gt;    new FormFieldValidator.WorkspaceDirectory(res, rsp).process();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Override&lt;br /&gt;public boolean isApplicable(Class arg0) {&lt;br /&gt;    return true;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;2. Jelly file with the code for our Post-Build action&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;src/main/resources/com/sacaluta/config.jelly&lt;/span&gt;&lt;pre name="code" class="xml"&gt;&amp;lt;j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout"&lt;br /&gt; xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:bh="/lib/health"&amp;gt;&lt;br /&gt;&amp;lt;f:entry title="Distributed Test Report pattern" field="report"&lt;br /&gt;     description="&lt;br /&gt;     This is a file name pattern that can be used to locate the Distributed Test report files&lt;br /&gt;     (for example &amp;lt;b&amp;gt;**/performance/perf*&amp;lt;/b&amp;gt;).&amp;lt;br/&amp;gt;&lt;br /&gt;   The path is relative to &amp;lt;a href='ws/'&amp;gt;the module root&amp;lt;/a&amp;gt; unless&lt;br /&gt;   you are using Subversion as SCM and have configured multiple modules, in which case it is&lt;br /&gt;   relative to the workspace root.&amp;lt;br/&amp;gt;&lt;br /&gt;   "&amp;gt;&lt;br /&gt;&amp;lt;f:textbox /&amp;gt;&lt;br /&gt;&amp;lt;/f:entry&amp;gt;&lt;br /&gt;&amp;lt;/j:jelly&amp;gt;&lt;/pre&gt;3. HTML code for help files&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;src/main/resources/com/sacaluta/DistributedTestRecorder/help.html&lt;/span&gt;&lt;br /&gt;(main help file)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;src/main/resources/com/sacaluta/DistributedTestRecorder/help-report.html&lt;/span&gt;&lt;br /&gt;(help file for "report" configuration field - see above in the config.jelly file)&lt;pre name="code" class="html"&gt;&amp;lt;div&amp;gt;&lt;br /&gt;This is the distributed test plugin help to be added later.&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;Yes, that's all for now. You should already have a post-build action being displayed when you launch Hudson (remember to use "mvn hpi:run" to run Hudson and do not run "mvn package" before that).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5054602486454836287?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5054602486454836287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5054602486454836287' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5054602486454836287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5054602486454836287'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/04/hudson-plugin-2-adding-post-build.html' title='Hudson Plugin 2: Adding a Post-Build action (for a Reporter/Publisher)'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_r7my89kTTEM/SdWYEZ65JKI/AAAAAAAAACo/QomL5JS3kGI/s72-c/hudson-eclipse-project.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5508184243579048271</id><published>2009-04-01T20:11:00.000-07:00</published><updated>2009-04-01T21:33:16.887-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Guice</title><content type='html'>An interesting dependency injection framework was coded within Google called Guice (you say "juice"). The following video provides a good introduction to it:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://crazybob.org/2007/06/introduction-to-guice-video-redux.html"&gt;http://crazybob.org/2007/06/introduction-to-guice-video-redux.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I found the following features particularly interesting, which will probably be taken aboard by Spring in the future:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Provider: you can inject the provider rather than the dependency. That allows the class to instantiate multiple copies of the class, instantiate the copies lazily or conditionally. Also, if you have dependencies that have different scope (like having a request dependency in a session object), you can handle this case much better.&lt;/li&gt;&lt;li&gt;Development stages: this seems to be something for the next version, but it is pretty cool. You can specify beans to be loaded according to the stage (devel/prod), not loading unnecessary beans while you are developing.&lt;/li&gt;&lt;li&gt;Constructor listener: another feature for the next version. In short, to be able to intercept the construction of any of the dependencies to be injected.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;For a comparison with Spring, check out the following link:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/google-guice/wiki/SpringComparison"&gt;http://code.google.com/p/google-guice/wiki/SpringComparison&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I guess it will be hard to come up with a framework to beat Spring, but it seems that Guice and Google products have much better political acceptance and may have better chances of making its dependency injections officially supported in the JDK and sponsored by the JCP.&lt;br /&gt;&lt;br /&gt;Update: I found an &lt;a href="http://www.infoq.com/news/2007/09/webbeans-preview"&gt;article&lt;/a&gt; that supports my comment above about Web Beans + Guice where one of the readers commented:&lt;br /&gt;&lt;blockquote&gt;There's been a lot of talk over the past few years that perhaps Interface 21 should push to formally make the Spring Framework a part of the JEE specs -- it seemed like it might be possible with Rod Johnson officially declaring his support for JEE 6... well it looks like "Crazy" Bob Lee and the team behind Guice may have found a back door to get themselves into the party first -- according to a new series of articles about the upcoming Web Beans, the new spec is actually influenced by a combination of Seam and Guice ... I find these articles interesting in that Google has apparently taken the JBoss approach to supporting the JCP -- that is, create an independent product to fill a whole in the JEE specs, and then use the JCP to make that product into a spec itself (take a look at the JPA for a previous example)...&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5508184243579048271?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5508184243579048271/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5508184243579048271' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5508184243579048271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5508184243579048271'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/04/guice.html' title='Guice'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1049288910541654624</id><published>2009-03-31T22:12:00.000-07:00</published><updated>2009-03-31T22:41:37.199-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>The Grinder Framework: 10 limitations</title><content type='html'>&lt;a href="http://grinder.sourceforge.net/"&gt;The Grinder Framework&lt;/a&gt; looked very promising when I found it 2 or 3 weeks ago. I thought I had found the solution to do distributed performance testing, but after understanding how it works and testing it for sometime, I came across some limitations that made me code a client/server protocol and go from there:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;GUI-centric: Grinder should have been developed with an API-centric view. And then build the GUI on top of it. Not the reverse. I want to launch and run performance tests in an automated fashion. I admit that this is possible with the experimental Console API, but it was frustrating that this is something still experimental - and apparently without enough focus.&lt;/li&gt;&lt;li&gt;Grinder does not provide a way of distributing the agents. You must distribute them and start them manually. Of course I didn't expect Grinder to provide implementations for all possible agents distributions, but I would expect at least having a way of plugging in a class to distribute the agents or scripts that could do that. That way I could start my test, have my agents distributed (according to my needs), have them started, and then actually kick off the test execution. Some implementations for common cases (like a passwordless ssh connection) could be provided.&lt;/li&gt;&lt;li&gt;Grinder doesn't allow agents to collect additional metrics. For example, I don't want only to collect the total execution time, but some individual operations that are part of the tests (but may not be even called at all). As long as you find a way to wrap this in a Test class, you are fine, but that is not always the case - besides we may want to have some metrics hierarchy. And my use case does not include only times, but possibly collecting counts as well.&lt;/li&gt;&lt;li&gt;Grinder has the summary of statistics for the test run, not all the agents metrics. There may be a way of doing it, but my initial tests showed that The Grinder only stores the summary of the test execution. What about collecting and making available all metrics, so you can do calculations on these metrics? Or if I want to plot a graph based on them doing some correlations specific to my case?&lt;/li&gt;&lt;li&gt;Grinder does not allow you to use heterogeneous agents. I would like to run different agents in the same test execution.&lt;/li&gt;&lt;li&gt;Grinder requires all the agents to have the same number of threads - and this is not specified in the code, so you can't perform more complex tests or have a different behavior depending on the number of threads.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Grinder requires Python. Although Python is pretty cool and can be very useful, do I need to create a Python script even if I have my test ready to run? For example, I'd like to use a JUnit test seamlessly.&lt;/li&gt;&lt;li&gt;Grinder does not provide an API to store the statistics. The only of seeing them is through the console. This is related to item 4, but it goes over that limitation because I need to have access to all metrics and store for further processing and an API for this is needed.&lt;/li&gt;&lt;li&gt;Grinder does not provide a timed test resource. You can work around with the Console API, sleeping after starting the test and then stopping it. This should be part of the standard API.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Grinder does not provider a way of breaking the test depending on a certain condition.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Grinder seems very useful for standard HTTP GET tests, which seems to be the most common use case, but it has serious limitations for more complex distributed systems testing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1049288910541654624?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1049288910541654624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1049288910541654624' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1049288910541654624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1049288910541654624'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/03/grinder-framework-10-limitations.html' title='The Grinder Framework: 10 limitations'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5956775895628847651</id><published>2009-03-31T21:57:00.000-07:00</published><updated>2009-03-31T22:42:05.572-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Spring 3 and REST</title><content type='html'>&lt;span style="font-family:arial;"&gt;After listening to Rod Johnson's interview on the JavaPosse, I was trying to catch up with the Spring 3 improvements and I found this blog entry about the upcoming REST support, which seems pretty interesting:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/"&gt;http://blog.springsource.com/2009/03/08/rest-in-spring-3-mvc/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I really liked the workaround for HTML only supporting GET/POST. Other operations are added as a field (e.g. "_method") and Spring has a servlet filter (&lt;/span&gt;&lt;tt&gt;HiddenHttpMethodFilter&lt;/tt&gt;&lt;span style="font-family:arial;"&gt;) to change to the desired method. &lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5956775895628847651?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5956775895628847651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5956775895628847651' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5956775895628847651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5956775895628847651'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/03/spring-3-and-rest.html' title='Spring 3 and REST'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1883106343671917534</id><published>2009-03-31T21:43:00.000-07:00</published><updated>2009-03-31T22:42:18.361-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Introduction to REST</title><content type='html'>Good introduction to REST:&lt;br /&gt;&lt;a href="http://www.infoq.com/articles/rest-introduction"&gt;http://www.infoq.com/articles/rest-introduction&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1883106343671917534?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1883106343671917534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1883106343671917534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1883106343671917534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1883106343671917534'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/03/introduction-to-rest.html' title='Introduction to REST'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1941379929794110152</id><published>2009-03-28T15:02:00.001-07:00</published><updated>2009-04-02T20:58:07.803-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Hudson Plugin 1: Setting up the system</title><content type='html'>This is an updated version of the tutorial written by &lt;a href="http://javaadventure.blogspot.com/2008/01/writing-hudson-plug-in-part-1.html"&gt;Stephen Connoly&lt;/a&gt; to write a Hudson plugin. The plugin I create here was done on Hudson ver. 1.293.&lt;br /&gt;&lt;br /&gt;Hudson is a continuous build system that I've been using for the past several months. It's been very useful, but my needs require a customized plugin. Although I have some ideas on how to create a great plugin, let's start with the following goal in mind:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Add a &lt;b&gt;Post-Build Action&lt;/b&gt;, which is persisted. Example: default JUnit plugin&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_r7my89kTTEM/Sc6yIXXrXVI/AAAAAAAAACQ/PbVhw_QWPXU/s1600-h/hudson-postbuild-junit.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 110px;" src="http://1.bp.blogspot.com/_r7my89kTTEM/Sc6yIXXrXVI/AAAAAAAAACQ/PbVhw_QWPXU/s400/hudson-postbuild-junit.jpg" alt="" id="BLOGGER_PHOTO_ID_5318384066753158482" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Have a trend graph for the build and project results. See an example below.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_r7my89kTTEM/Sc6y0AIB-XI/AAAAAAAAACY/ZplZ4rhoFwk/s1600-h/open-tasks-trend.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 158px;" src="http://2.bp.blogspot.com/_r7my89kTTEM/Sc6y0AIB-XI/AAAAAAAAACY/ZplZ4rhoFwk/s400/open-tasks-trend.png" alt="" id="BLOGGER_PHOTO_ID_5318384816427759986" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;The only prerequisites to start working on a Hudson plugin are Maven 2 and Java 1.5 (JavaSE) or later. Yes, you don't need to worry about downloading or install Hudson itself, as Maven takes care of downloading the Hudson version you're developing for. You can launch Hudson with your development code using Maven, what speeds up the development greatly.&lt;br /&gt;&lt;br /&gt;So, to set up your system, do the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Install Java SDK 1.5 or later&lt;br /&gt;Add it to your path and set up JAVA_HOME environment variable&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Install the latest version of Maven 2&lt;br /&gt;Add it to your path and set up MAVEN_HOME environment variable&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Install your IDE (in this example, we will use Eclipse)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Let's configure Maven to find Hudson. To do it, let's edit Maven's configuration file:&lt;ul&gt;&lt;li&gt;Find Maven's configuration file depending on your environment:&lt;br /&gt;Unix: $HOME/.m2/settings.xml&lt;br /&gt;Windows: $HOME/.m2/settings.xml&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Add the following to your file:&lt;br /&gt;&lt;pre&gt;&amp;lt;settings&amp;gt;&lt;br /&gt;&amp;lt;profiles&amp;gt;&lt;br /&gt;&amp;lt;profile&amp;gt;&lt;br /&gt;&amp;lt;id&amp;gt;hudson&amp;lt;/id&amp;gt;&lt;br /&gt;&amp;lt;activation&amp;gt;&lt;br /&gt;  &amp;lt;activeByDefault /&amp;gt;&lt;br /&gt;&amp;lt;/activation&amp;gt;&lt;br /&gt;&amp;lt;pluginRepositories&amp;gt;&lt;br /&gt;  &amp;lt;pluginRepository&amp;gt;&lt;br /&gt;    &amp;lt;id&amp;gt;java.net2&amp;lt;/id&amp;gt;&lt;br /&gt;    &amp;lt;url&amp;gt;http://download.java.net/maven/2&amp;lt;/url&amp;gt;&lt;br /&gt;  &amp;lt;/pluginRepository&amp;gt;&lt;br /&gt;&amp;lt;/pluginRepositories&amp;gt;&lt;br /&gt;&amp;lt;/profile&amp;gt;&lt;br /&gt;&amp;lt;/profiles&amp;gt;&lt;br /&gt;&amp;lt;activeProfiles&amp;gt;&lt;br /&gt;&amp;lt;activeProfile&amp;gt;hudson&amp;lt;/activeProfile&amp;gt;&lt;br /&gt;&amp;lt;/activeProfiles&amp;gt;&lt;br /&gt;&amp;lt;pluginGroups&amp;gt;&lt;br /&gt;&amp;lt;pluginGroup&amp;gt;org.jvnet.hudson.tools&amp;lt;/pluginGroup&amp;gt;&lt;br /&gt;&amp;lt;/pluginGroups&amp;gt;&lt;br /&gt;&amp;lt;/settings&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ul&gt;Time to create the plugin skeleton (with Maven in the path):&lt;br /&gt;&lt;pre&gt;mvn hpi:create&lt;br /&gt;&lt;/pre&gt;Note that &lt;span style="font-style: italic;"&gt;groupId&lt;/span&gt; is the equivalent of package name and &lt;span style="font-style: italic;"&gt;artifactId&lt;/span&gt; is the equivalent of project name. We used "com.sacaluta" for groupId and "performance" for package name.&lt;br /&gt;&lt;br /&gt;Let's update the Hudson version this plugin will be for. As of this writing, the version that is set up in the pom.xml file (inside the plugin directory) is 1.279. Let's change it to 1.293.&lt;br /&gt;&lt;pre&gt;&amp;lt;properties&amp;gt;&lt;br /&gt;&amp;lt;!-- which version of Hudson is this plugin built against? --&amp;gt;&lt;br /&gt;&amp;lt;hudson.version&amp;gt;1.293&amp;lt;/hudson.version&amp;gt;&lt;br /&gt;&amp;lt;/properties&amp;gt;&lt;br /&gt;&lt;/pre&gt;And now we use Maven to make a Eclipse project out of it to open in our IDE:&lt;br /&gt;&lt;pre&gt;cd &lt;artifactid&gt; (e.g. cd performance)&lt;br /&gt;mvn -DdownloadSources=true eclipse:eclipse&lt;/artifactid&gt;&lt;br /&gt;&lt;/pre&gt;Finally, let's learn how to run Hudson from the command-line with your plugin code.&lt;br /&gt;&lt;pre&gt;mvn hpi:run&lt;br /&gt;&lt;/pre&gt;Once we are done with the plugin development, we can package and distribute your &lt;b&gt;.hpi&lt;/b&gt; plugin. This is the command to do this:&lt;br /&gt;&lt;pre&gt;mvn package&lt;br /&gt;&lt;/pre&gt;DO NOT run "mvn package" while developing the plugin. If you do it and then want to run "mvn hpi:run", make sure to run "mvn clean" before that.&lt;br /&gt;&lt;br /&gt;In the next post, we will start creating the plugin classes.&lt;br /&gt;&lt;br /&gt;This first part of the plugin creation was heavily inspired in the &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Plugin+tutorial"&gt;Hudson Plugin Tutorial&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1941379929794110152?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1941379929794110152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1941379929794110152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1941379929794110152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1941379929794110152'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2009/03/hudson-plugin-1-setting-up-system.html' title='Hudson Plugin 1: Setting up the system'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_r7my89kTTEM/Sc6yIXXrXVI/AAAAAAAAACQ/PbVhw_QWPXU/s72-c/hudson-postbuild-junit.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1988412863059570655</id><published>2008-11-20T08:08:00.000-08:00</published><updated>2008-11-20T08:11:23.836-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Every man is two people</title><content type='html'>"What is the underlying need, the psychological law behind this common tendency that makes men turn their backs on who they are in their professional lives? Every man is two people, and one hardly knows whether it is in the morning or in the evening that he reverts to his real self."&lt;br /&gt;&lt;br /&gt;The Man Without Qualities - Robert Musil&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1988412863059570655?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1988412863059570655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1988412863059570655' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1988412863059570655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1988412863059570655'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/11/every-man-is-two-people.html' title='Every man is two people'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-3904030279001987985</id><published>2008-11-20T06:35:00.000-08:00</published><updated>2008-11-20T06:36:04.656-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Lao Tzu quote</title><content type='html'>“Be content with what you have, rejoice in the way things are.  When you realize there is nothing lacking, the whole world belongs to you.” - Lao Tzu&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-3904030279001987985?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/3904030279001987985/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=3904030279001987985' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3904030279001987985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3904030279001987985'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/11/lao-tzu-quote.html' title='Lao Tzu quote'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-8562255667399948903</id><published>2008-11-02T10:18:00.000-08:00</published><updated>2008-11-02T10:23:15.913-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Asynchronous Architectures</title><content type='html'>Here are some posts about asynchronous architectures that I've been reading recently and found very insightful, including a presentation by Werner Vogels (Amazon CTO).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.webperformancematters.com/journal/2007/8/13/asynchronous-architectures-1.html"&gt;Asynchronous Architectures 1&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.webperformancematters.com/journal/2007/8/14/asynchronous-architectures-2.html"&gt;Asynchronous Architectures 2&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.webperformancematters.com/journal/2007/8/15/asynchronous-architectures-3.html"&gt;Asynchronous Architectures 3&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.webperformancematters.com/journal/2007/8/21/asynchronous-architectures-4.html"&gt;Asynchronous Architectures 4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/availability-consistency"&gt;Availability &amp; Consistency (Werner Vogels)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-8562255667399948903?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/8562255667399948903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=8562255667399948903' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8562255667399948903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8562255667399948903'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/11/asynchronous-architectures.html' title='Asynchronous Architectures'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-3228912856436855040</id><published>2008-09-26T21:30:00.000-07:00</published><updated>2008-09-26T22:19:34.361-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Hotmail and email forwarding</title><content type='html'>I always thought hotmail is one of the worst free email services, but I decided to give it a try when I joined Microsoft and was able to register a nice address with the domain live.com that had just been released. Now I am trying to get rid of it using a custom domain along with GMail. I am very happy with the decision so far. And for the first time I am even started using Google Talk, providing a more efficient communication and clean user interface than MSN Messenger. Even the Outlook Connector ended up being a way to move all my email from my live.com account - probably something Microsoft didn't thought about, otherwise they would have blocked in some way.&lt;br /&gt;&lt;br /&gt;What just made me mad - and it's not exactly surprising giving Microsoft's records - is that you cannot forward your hotmail/live.com emails. Usually the expected is that they don't have this feature, but they DO. And email is only forwarded if you are forwarding to hotmail accounts. This is just stupid - and another attempt to lock you in. First, you DON'T have POP, you DON'T have IMAP, and by using a proprietary protocol, you only have two options to access your email from a client program: using Outlook with a plug-in (Connector, which doesn't have exactly the best performance) or Windows Live Mail. No other option. I accepted these limitatinos since I am working at the Office group and have been trying to use Outlook. Not being able to forward your emails though just proves the point of everyone that criticizes Microsoft. Had they been offering a good service - and would first implement the very basic feature of checking for the new emails automatically without requiring the user to click "Check Email" all the time - more users would be using their services and no lock-in strategy would be necessary.&lt;br /&gt;&lt;br /&gt;Other complaint from my 11-month experience with Live + Outlook is the way junk email is handled. If you have a false positive, when clicking on the "Not Junk" button, you always get a dialog saying "so now you trust all email from this address?". If you click "no", it doesn't move the message back to the Inbox. You MUST add the sender's address to a white list. I don't want to have a white list to do that, but that it learns to recognize the email contents to do a better work at recognizing actual spam.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-3228912856436855040?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/3228912856436855040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=3228912856436855040' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3228912856436855040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3228912856436855040'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/09/hotmail-and-email-forwarding.html' title='Hotmail and email forwarding'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-3810010375411667957</id><published>2008-09-12T12:37:00.000-07:00</published><updated>2008-09-12T12:57:24.426-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Vista and System Restore out of control</title><content type='html'>I thought very strange that, no matter how much of my data I deleted, I was running out of space constantly these past weeks. Then, I decided to find out how much each directly was using. Due to the lack of "du" in Windows OSs, I thought that Windows Explorer would have similar functionality. I really thought so, because I remember seeing GUIs displaying how much each directory was taking up. Later I would remember that this was KDE or GNOME, not Windows. So, first discovery:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Windows does not ship with any utility to find out how much space is being used on your hard drive.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Having to deal with this limitation, here I go to find out any 3rd party solution rather than right clicking on each of the root-level directories and checking their properties. I found two: diruse.exe (part of Windows 2000 resource kit) and another tool that I can't remember now.&lt;br /&gt;&lt;br /&gt;Diruse.exe reports inaccurate values compared to Windows Explorer. It seems it counts the file multiple times for some reason that I didn't care to understand. The graphical tool, which is nice but not free, displayed that I had almost 30Gb that was being used by "unscannable folders" (note: this partition has 120Gb or, in other words, these unscannable folders amount to 25% of it). Go figure what are the unscannable folders. Even being admin, there are some system folders that you don't have access, including one name "System Volume Information".&lt;br /&gt;&lt;br /&gt;I gave a few tries to unlock this "System Volume Information", but without being lucky. So I found out what this folder is about: "System Restore" feature - something that I never used and maybe will never user. I followed some instructions on how to disable "System Restore" and clean up this folder and voila: I have 28Gb back.&lt;br /&gt;&lt;br /&gt;What surprises me is that:&lt;br /&gt;1. Apparently there is no limit for how much disk this system restore will use.&lt;br /&gt;2. Using Windows cleanup tool, it does not suggest this folder as a way to get disk space back.&lt;br /&gt;3. This folder is locked, so even an admin doesn't find out that it is using lots of disk space. You have to unlock to figure out.&lt;br /&gt;4. Getting to "System Restore" is not intuitive and, once there, it does not say anything about being using disk space. When you disable, there is a warning before disabling, but nothing about the disk space.&lt;br /&gt;5. In the end, what one would do is the same old mantra: reformat and reinstall the system. But, installing from a media that does not have the updates will not help you very much as all the updates will be installed again. And what is the result? System restore points will be logged automatically again, taking up something like 30Gb of disk space.&lt;br /&gt;&lt;br /&gt;What's the solution? Unless you understand why that happens, in which case you might get a Vista SP1 or later version that does not require installing new updates, the only solution is getting a larger hard disk or, what is more common, a new computer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-3810010375411667957?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/3810010375411667957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=3810010375411667957' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3810010375411667957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3810010375411667957'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/09/vista-and-system-restore-out-of-control.html' title='Vista and System Restore out of control'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6413706554381209191</id><published>2008-09-12T12:25:00.001-07:00</published><updated>2008-09-12T12:27:33.254-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Creative People</title><content type='html'>"Aw, c'mon," Freddie said with disbelief. "I know all kinds of creative types who just got big promotions." &lt;br /&gt;&lt;br /&gt;"That's because they met an even higher standard than cleverness that makes up for the fact that they are creative," Caroline answered. &lt;br /&gt;&lt;br /&gt;"And what's that?" &lt;br /&gt;&lt;br /&gt;"They threatened to leave the company." &lt;br /&gt;&lt;br /&gt;Excerpt from &lt;a href="http://fourstones.net/the-corporate-runs?topic=reeling-in-the-yearlings"&gt;Reeling in the Yearlings&lt;/a&gt;, which is insightful and funny.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6413706554381209191?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6413706554381209191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6413706554381209191' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6413706554381209191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6413706554381209191'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/09/creative-people.html' title='Creative People'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5434042090240608693</id><published>2008-08-10T09:58:00.001-07:00</published><updated>2008-08-10T09:59:34.194-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Mar Adentro: laugh by crying</title><content type='html'>From the movie &lt;a href="http://www.imdb.com/title/tt0369702/"&gt;Mar Adentro&lt;/a&gt; (The Sea Inside, The Sea Within):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;blockquote&gt;Why do you smile so much Ramon?&lt;br /&gt;                  &lt;br /&gt;When you can't escape and&lt;br /&gt;depend constantly on others&lt;br /&gt;                   &lt;br /&gt;You learn to cry by laughing&lt;br /&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5434042090240608693?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5434042090240608693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5434042090240608693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5434042090240608693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5434042090240608693'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/08/mar-adentro-laugh-by-crying.html' title='Mar Adentro: laugh by crying'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-39599582255491034</id><published>2008-08-10T09:48:00.000-07:00</published><updated>2008-08-10T09:51:12.093-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>The cost of intelectual property</title><content type='html'>Through Slashdot, I learned about an interesting article in this week's New Yorker magazine. It talks about striking the balance between private property in terms of intellectual property, but not lock the economy due to them. You can read the article &lt;a href="http://www.newyorker.com/talk/financial/2008/08/11/080811ta_talk_surowiecki"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-39599582255491034?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/39599582255491034/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=39599582255491034' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/39599582255491034'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/39599582255491034'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/08/cost-of-intelectual-property.html' title='The cost of intelectual property'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1274838816780299030</id><published>2008-08-10T09:09:00.000-07:00</published><updated>2008-08-10T09:13:45.593-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Carbonite again: now I can't unsubscribe</title><content type='html'>Carbonite renews your subscription automatically, unless you go to the site and unsubscribe. It is not clear where I should do, but it seems to be in the "update payment info" link. So far, so good. I had to do that becuase they sent me an email that they will charge me an annual fee in 7 days automatically, and I am pretty sure I will try some alternative solution. And guess what I get if I try to unsubscribe?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Server Error&lt;br /&gt;An error occurred while processing your request.&lt;br /&gt;Click back to return to the previous page and try your request again. If the problem persists, contact customersupport@carbonite.com.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And, if I send an email to the customer support, they say that they will reply within 72 hours!!! Fortunately I found out there is a phone number I can call, but given my experience so far, I will not be disappointed if it does not work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1274838816780299030?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1274838816780299030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1274838816780299030' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1274838816780299030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1274838816780299030'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/08/carbonite-again-now-i-cant-unsubscribe.html' title='Carbonite again: now I can&apos;t unsubscribe'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6269811988475041390</id><published>2008-08-01T21:42:00.000-07:00</published><updated>2008-08-01T21:47:34.476-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Randy Pausch quotes</title><content type='html'>Being almost 10PM on a Friday, that reminded of something I saw Randy Pausch saying in his famous "Last Lecture". And of course I added a couple of other quotes of his that are also very interesting.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;&lt;blockquote&gt;* "Work hard. I got tenure a year early. Junior faculty members used to say to me, 'What's your secret?' I said, 'It's pretty simple: call me any Friday night in my office at ten o'clock and I'll tell you.'" &lt;br /&gt;&lt;br /&gt;It is not the things we do in life that we regret on our death bed. It is the things we do not. Find your passion and follow it. And if there is anything that I have learned in life, you will not find that passion in things. And you will not find that passion in money. Because the more things and the more money you have, the more you will just look around and use that as the metric — and there will always be someone with more. Your passion must come from the things that fuel you from the inside. That passion will be grounded in people. It will be grounded in the relationships you have with people and what they think of you when your time comes.&lt;br /&gt;&lt;br /&gt;Wait long enough and people will surprise and impress you. He said, when you are pissed off at somebody, and you're angry at them, you just haven't given them enough time. Just give them a little more time — and they'll almost always impress you. And that really stuck with me. I think he's absolutely right on that one.&lt;/blockquote&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6269811988475041390?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6269811988475041390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6269811988475041390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6269811988475041390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6269811988475041390'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/08/randy-pausch-quotes.html' title='Randy Pausch quotes'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5415081100627215959</id><published>2008-07-27T13:05:00.001-07:00</published><updated>2008-07-27T13:10:43.153-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Spellchecker (Levenshtein distance)</title><content type='html'>Have you ever wondered how the spellchecker suggestions are computed? I had no idea, and found out that the editing distance between words is calculated to come up with a list of words that are "close" to the one you are typed. Those with the fewest number of edits are displayed. The algorithm, known as &lt;a href="http://en.wikipedia.org/wiki/Levenshtein_distance"&gt;Levenshtein distance&lt;/a&gt;, was devised in 1965. It uses dynamic programming, and it is a very clever and simple solution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5415081100627215959?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5415081100627215959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5415081100627215959' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5415081100627215959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5415081100627215959'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/07/spellchecker-levenshtein-distance.html' title='Spellchecker (Levenshtein distance)'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5599284183013261444</id><published>2008-07-25T17:42:00.000-07:00</published><updated>2008-12-10T03:17:10.301-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Apple Update annoyances</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_r7my89kTTEM/SIpzLcjphrI/AAAAAAAAABg/Kw7OUnTnrcQ/s1600-h/apple.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_r7my89kTTEM/SIpzLcjphrI/AAAAAAAAABg/Kw7OUnTnrcQ/s400/apple.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5227116957998352050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;First Apple not only suggests that you install Safari, but keep it checked. Everytime I have to uncheck this box. But now that was great. They release a new update with a bug in the updater: the description is displayed as "WhichDescription()".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5599284183013261444?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5599284183013261444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5599284183013261444' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5599284183013261444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5599284183013261444'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/07/apple-update-annoyances.html' title='Apple Update annoyances'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_r7my89kTTEM/SIpzLcjphrI/AAAAAAAAABg/Kw7OUnTnrcQ/s72-c/apple.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-9108092274923745944</id><published>2008-07-21T21:43:00.000-07:00</published><updated>2008-07-21T21:53:41.936-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Java benchmark: String, StringBuilder, and StringBuffer</title><content type='html'>Some results first comparing String, StringBuilder and StringBuffer, with and without pre-allocation.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;100000 times&lt;/span&gt;&lt;br /&gt;   String: 30786&lt;br /&gt;   StringBuilder (no pre-alloc): 5&lt;br /&gt;   StringBuilder (pre-alloc): 3&lt;br /&gt;   StringBuffer (no pre-alloc): 6&lt;br /&gt;   StringBuffer (pre-alloc): 5&lt;br /&gt;&lt;br /&gt;The results clearly show how bad String is if you need to change it constantly in comparison to StringBuilder or StringBuffer. Now, let's remove String and compare StringBuilder and StringBuffer further:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;1000000 (one million) times&lt;/span&gt;&lt;br /&gt;   StringBuilder (no pre-alloc): 58&lt;br /&gt;   StringBuilder (pre-alloc): 42&lt;br /&gt;   StringBuffer (no pre-alloc): 142&lt;br /&gt;   StringBuffer (pre-alloc): 122&lt;br /&gt;&lt;br /&gt;This benchmark seems to prove to me that StringBuilder, introduced in Java 1.5, is really the best option when running in a single thread. And one can see that the overhead of running StringBuffer, which is synchronized, is actually huge.&lt;br /&gt;&lt;br /&gt;Excerpt of my code to run this benchmark (*):&lt;br /&gt;&lt;pre&gt;  final int n = 100000;&lt;br /&gt;  final String a = "a";&lt;br /&gt;  &lt;br /&gt;  String s = "";&lt;br /&gt;  Date start = new Date();&lt;br /&gt;  for (int i = 0; i &amp;lt; n; ++i)&lt;br /&gt;  {&lt;br /&gt;   s = s + a;&lt;br /&gt;  }&lt;br /&gt;  Date end = new Date();&lt;br /&gt;  System.out.println("String: " +&lt;br /&gt;                     (end.getTime()-start.getTime()));&lt;br /&gt;   &lt;br /&gt;  StringBuilder sb = new StringBuilder();&lt;br /&gt;  start = new Date();&lt;br /&gt;  for (int i = 0; i &amp;lt; n; ++i)&lt;br /&gt;  {&lt;br /&gt;   sb.append(a);&lt;br /&gt;  }&lt;br /&gt;  end = new Date();&lt;br /&gt;  System.out.println("StringBuilder (no pre-alloc): " +&lt;br /&gt;                     (end.getTime()-start.getTime()));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;(*) Based on this &lt;a href="http://forums.sun.com/thread.jspa?threadID=5274794&amp;messageID=10151046"&gt;post&lt;/a&gt;, which does not compare StringBuffer&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-9108092274923745944?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/9108092274923745944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=9108092274923745944' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/9108092274923745944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/9108092274923745944'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/07/java-benchmark-string-stringbuilder-and.html' title='Java benchmark: String, StringBuilder, and StringBuffer'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5839760159155718643</id><published>2008-07-21T17:24:00.000-07:00</published><updated>2008-07-21T20:32:17.322-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Immigration and other golden cuffs</title><content type='html'>Currently immigration is something quite interesting to be studied, especially in the US with these long queues to get the green card. If you join a company in the US on a non-immigrant visa (like L-1 or H-1B), you usually start your green card process, either right away or after some time. To set the stage, let me explain better about these visas. L-1 implies that you must leave the country almost immediately if you leave the company. H-1B has a little bit more flexibility: you have one month to find another company that sponsors your visa or you will be out of legal status. Back to the green card, depending on the job requirements, on how your case is filed, it may take many many years to get it. And by many many years, I talk about 5-10 years, sometimes even more than that. Although theoretically possible to change jobs under certain circumstances, few do that because there is a chance the process is withdrawn and you lose your place in the line to get the green card. That means that you are stuck with one company, with one type of job (changing the job may jeopardize the whole process). And, even after you get it, you should stay with the company at least one year to avoid being potentially charged with green card fraud. &lt;br /&gt;&lt;br /&gt;I never liked being stuck with one company. And, when living in another country, I never liked the idea of living in that country without being sure that I could stay there and your personal investment in the country won't be lost. For this reason, I never really thought of coming to the US, because of the hard work to get a green card (besides the compromise). And, in my case, I could work in Europe since I am a EU citizen, so that makes me reflect more about what to do.&lt;br /&gt;&lt;br /&gt;For a big company, the point is not in getting the actually best and brightest minds (although all big companies say that all employees are the best and brightest!). Nevertheless, the point is not to hire genius, but relatively smart people and make the rules and decisions that benefit the average employee. And who would that be? The one that achieves or even exceeds what is expected based on his/her experience, and that stick with the company for a long time. These delays in the immigration process end up serving the best interest of big companies that are sponsoring the green card for the employees: in average, their immigrant employees will be around for a long time. It may not be used on purpose, but that is the fact and it benefits big companies. Who is brave enough to throw away many years of theirs lives, especially with a family that may be well settled in the country? And isn't it the best deal if you can hire an experienced foreigner paying less than what you would pay for an American with equivalent experience? The difference is only the relocation (which is one-time charge) and green card process (again, one-time charge). When outsourcing is not the best option, that is a great deal to keep big companies competitive in internal US market and also globally. These professionals (the average employee) get stuck over the time due to this immigration issues, sponsorships and related rules. But that is not all.&lt;br /&gt; &lt;br /&gt;Other common policy to make people stay with the company: you offer deferred compensation over time. That can be in the form of bonus, stocks, or anything as long that means that the employee will only get it if he/she spends many years at the company. And, on a regular basis, based on contribution, you pay more and more of his/her compensation in this way. Who will leave the company and leave that much money on the table? These are known as golden cuffs.&lt;br /&gt;&lt;br /&gt;Third, you create a competitive scheme that only the very best get compensated. That is great for the company, but that has different effects on the employees that end up being blind by immigration, deferred compensation, and this competition. These employees become more focused on whatever they need to do, losing track of skills that are generally applicable to other companies, and more and more skilled on whatever is specific to their employer. And, although I don't know if on purpose or not, but I see that people lose track of what is outside the company and their own view of the company is based on what they learn from the company material (what may be influenced by the company ideology). Back to the market, not knowing what is going on in the market is not too bad if your company follows market standards. But that is not often the case and some particular experiences are very specific and not much valued elsewhere. A professional who leaves such a company, being valued by his/her specific and narrowed knowledge with a high salary, may only get a job that pays much less that what he/she makes. Who would do that?&lt;br /&gt;&lt;br /&gt;Fourth, you create an environment where people feel good about themselves because they work for that company. More ideology work is necessary here, but it is not too hard. One can offer entertainment and other sorts of offers that seduce the employee family as well. And associate a good image of the company, so nobody will feel bad about being immoral or unethical to work for such an employer. Any bad press must be worked on and reverted, at least internally.&lt;br /&gt;&lt;br /&gt;In this environment, what happens is that the least important thing is if you really love what you are doing. And unfortunately the rest does not pay off if you pursue to do what you love and what you believe in. From my experience since university, though, the majority of people does not care much about that. After all, if all jobs are the same, why not to be with those that offers the points outlined before? At least there is some advantage to be at the big company. &lt;br /&gt;&lt;br /&gt;That is sad, very sad. Especially if you care about what you do and/or you are an outlier. [And not to mention how that compare to open source software, but that is a topic for another post.]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5839760159155718643?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5839760159155718643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5839760159155718643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5839760159155718643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5839760159155718643'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/07/immigration-and-other-golden-cuffs.html' title='Immigration and other golden cuffs'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2009870196114180507</id><published>2008-07-21T16:46:00.000-07:00</published><updated>2008-07-21T16:51:52.250-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Java covariant return types</title><content type='html'>In my attempt to try to catch up with more recent features in Java and Linux, I found out that a feature introduced in Java 5 that I was not aware of is covariant return types, what is neat. You can override a method and change the return type, what was impossible before Java 5, as long the returned type is a subclass of the return type of the superclass method.&lt;br /&gt;&lt;br /&gt;For example,&lt;br /&gt;&lt;pre&gt;class SuperClass {&lt;br /&gt;   SuperClass getX() {&lt;br /&gt;      return new SuperClass();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;class SubClass extends SuperClass {&lt;br /&gt;   SubClass getX() {&lt;br /&gt;      return new SubClass();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;There is an interesting page &lt;a href="http://www.java-tips.org/java-se-tips/java.lang/covariant-return-types.html"&gt;here&lt;/a&gt; about it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2009870196114180507?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2009870196114180507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2009870196114180507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2009870196114180507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2009870196114180507'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/07/java-covariant-return-types.html' title='Java covariant return types'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6406562563505390720</id><published>2008-07-18T21:33:00.000-07:00</published><updated>2008-07-18T21:40:14.623-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Stronger schools in the US</title><content type='html'>Very good &lt;a href="http://www.tiagoluchini.eu/2008/07/18/os-cerebros-vao-embora/"&gt;post&lt;/a&gt; by my friend Tiago. See the video below:&lt;br /&gt;&lt;br /&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/RdO4mI68JzA"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/RdO4mI68JzA" type="application/x-shockwave-flash" wmode="transparent" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;I think most of people that left their countries realized that this is a serious issue. But when you come from a developing country, that is not news. What surprises me above is to see that rich countries are starting to worry about that. And I am glad that countries like US do that ahead of time, before it is too late for them. &lt;br /&gt;&lt;br /&gt;On a related note, today I a sticker on a car window saying something like that: "Send our children to universities, not to war". It is a good start when this kind of mindset starts becoming more common around here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6406562563505390720?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6406562563505390720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6406562563505390720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6406562563505390720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6406562563505390720'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/07/stronger-schools-in-us.html' title='Stronger schools in the US'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5547934000561372184</id><published>2008-07-16T20:32:00.000-07:00</published><updated>2008-07-16T21:09:53.079-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Greg Kroah Hartman on the Linux Kernel</title><content type='html'>&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/L2SED6sewRw&amp;hl=en&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/L2SED6sewRw&amp;hl=en&amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;It's an interesting video about the Linux kernel. What always amazes is how it attracts contributors that would not happen if it were not open source and were that famous. Like Greg mentions people doing janitorial work or submitting even spelling patches. Although I don't know about the dynamics of the Windows team, it is hard to conceive that there are developers like that contributing to the Windows kernel.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5547934000561372184?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5547934000561372184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5547934000561372184' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5547934000561372184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5547934000561372184'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/07/greg-kroah-hartman-on-linux-kernel.html' title='Greg Kroah Hartman on the Linux Kernel'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5914531294286258893</id><published>2008-07-13T10:26:00.000-07:00</published><updated>2008-07-13T10:32:23.381-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Fixed vs Growth Mind-set</title><content type='html'>A friend sent me this interesting NY Times article: &lt;a href="http://www.nytimes.com/2008/07/06/business/06unbox.html?_r=1&amp;scp=1&amp;sq=JANET+RAE-DUPREE&amp;st=nyt&amp;oref=slogin"&gt;If You’re Open to Growth, You Tend to Grow&lt;/a&gt;. It starts with one question: "WHY do some people reach their creative potential in business while other equally talented peers don’t?" and shows how the best and the brightest sometimes have a fixed mind-set that prevent them to realize their potential. Looking out for the chances to grow and also learn from past mistakes, what is called a growth mind-set, may make the whole difference in terms of professional (and may I add personal) growth. Recommended reading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5914531294286258893?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5914531294286258893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5914531294286258893' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5914531294286258893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5914531294286258893'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/07/fixed-vs-growth-mind-set.html' title='Fixed vs Growth Mind-set'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-3579786144831372631</id><published>2008-07-05T08:22:00.001-07:00</published><updated>2008-07-05T08:36:32.941-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portuguese'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><title type='text'>Universidade Brasileira</title><content type='html'>Trechos do blog do Reinaldo Azevedo sobre universidades que achei bastante interessantes.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Com exceções, claro, como sempre, a universidade brasileira é um hospício de iletrados.&lt;br /&gt;&lt;br /&gt;A academia, no Brasil, é um dos últimos redutos do comunismo no mundo. Há mais comunistas nas universidades estaduais e federais do Brasil do que em Pequim.&lt;br /&gt;&lt;br /&gt;-- Reinaldo Azevedo&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-3579786144831372631?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/3579786144831372631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=3579786144831372631' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3579786144831372631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3579786144831372631'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/07/universidade-brasileira.html' title='Universidade Brasileira'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-84699684420695172</id><published>2008-07-02T08:08:00.000-07:00</published><updated>2008-07-02T08:10:23.479-07:00</updated><title type='text'>Brazil: Skilled Workers Wanted</title><content type='html'>Read this NYT &lt;a href="http://www.nytimes.com/2008/07/02/business/worldbusiness/02real.html?scp=1&amp;sq=brazil+skilled+workers&amp;st=nyt"&gt;article&lt;/a&gt; about the need of skilled workers in Brazil. Being that a global demand, how to compete with other countries that offer more attractive compensation packages to top talents?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-84699684420695172?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/84699684420695172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=84699684420695172' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/84699684420695172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/84699684420695172'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/07/brazil-skilled-workers-wanted.html' title='Brazil: Skilled Workers Wanted'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-9044981195509231958</id><published>2008-06-30T17:53:00.000-07:00</published><updated>2008-12-10T03:17:10.773-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Google Docs and broken page layout</title><content type='html'>See the bug below. A document with a horizontal page is not supported by Google Docs page layout.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_r7my89kTTEM/SGmAOTGpmwI/AAAAAAAAABY/Gzr03HxE1Hk/s1600-h/google-page-layout.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_r7my89kTTEM/SGmAOTGpmwI/AAAAAAAAABY/Gzr03HxE1Hk/s400/google-page-layout.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5217842626420120322" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-9044981195509231958?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/9044981195509231958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=9044981195509231958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/9044981195509231958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/9044981195509231958'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/06/google-docs-and-broken-page-layout.html' title='Google Docs and broken page layout'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_r7my89kTTEM/SGmAOTGpmwI/AAAAAAAAABY/Gzr03HxE1Hk/s72-c/google-page-layout.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-3192391758236281109</id><published>2008-06-30T17:36:00.000-07:00</published><updated>2008-06-30T17:46:05.997-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>GOOG-&gt;MSFT Exodus?</title><content type='html'>This &lt;a href="http://www.25hoursaday.com/weblog/2008/06/29/TheGOOGMSFTExodusWorkingAtGoogleVsWorkingAtMicrosoft.aspx"&gt;article&lt;/a&gt; tells a bit about the experience of people that worked at Google. One comment is particularly interesting to me:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;2) Google employ everybody as junior developer, ignoring the existing experience. It is nice to work in Google if it is your first job, really nice, but if you have 12 years of experience with lots of languages, technologies and platforms, at lots of senior positions, you should expect higher position in Google, right?&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;And this give us an impression that MSFT is better. I disagree. And, although I won't tell about any particular experience that I've been through or have seen, trust me that this is something that happens to MSFT as well. I've been down this road myself. Maybe more with some groups than others, but it happens. The reason is always the same: you experience is irrelevant to our company and we do lots of things that are very specific and require experience with these tools, processes, etc, to be more productive. After 8 months working at MSFT, I agree to some extent, but definitely this is not a valid point in its entirety.&lt;br /&gt;&lt;br /&gt;There are a couple of things one should think before joining company that does not value previous experience for the reason that everything is so specific to the company. First, it is how the experience with this company may be valued outside of it and, second, if you are not getting more and more stuck with this company as time goes by, as no one else will pay what you will get there after sometime and some salary raises.&lt;br /&gt;&lt;br /&gt;In spite of all that, and far from saying that MSFT is perfect, but definitely it is one of the most organized companies I worked for and I got the chance to know. Probably more than GOOG given the age of both companies.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-3192391758236281109?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/3192391758236281109/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=3192391758236281109' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3192391758236281109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3192391758236281109'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/06/goog-msft-exodus.html' title='GOOG-&gt;MSFT Exodus?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2131612614093746070</id><published>2008-06-27T21:18:00.000-07:00</published><updated>2008-06-27T21:26:07.363-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Losing your Photoshop Elements catalog twice with Carbonite</title><content type='html'>Sometime ago I posted an &lt;a href="http://yettocome.blogspot.com/2008/03/carbonite-not-so-good-restore.html"&gt;entry&lt;/a&gt; about my experience with Photoshop Elements. First, I really like Adobe Photoshop Elements, but I lost my Photos catalog for the second time in less than an year and it is really painful to have to recreate your catalog all over again for over 4,000 photos. The first time, I didn't recover the catalog when recovering from my Carbonite backup when I bought a new laptop. This time, Vista issues after trying to convert a video made me reinstall the computer and although I manually backed up my C:\Users directory before reinstalling, guess what? The catalog was gone again. I thought: well, Carbonite must have it backed up. But no, it does not back up the location where Adobe stores the Photoshop Elements catalog: C:\ProgramData. The option is not even displayed in the context menu. Is there any hope this issue will be fixed in Carbonite later versions?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2131612614093746070?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2131612614093746070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2131612614093746070' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2131612614093746070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2131612614093746070'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/06/losing-your-photoshop-elements-catalog.html' title='Losing your Photoshop Elements catalog twice with Carbonite'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6022449969113776539</id><published>2008-06-23T17:09:00.000-07:00</published><updated>2008-06-23T17:10:53.680-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Is Google making us Stupid?</title><content type='html'>This is a &lt;a href="http://www.theatlantic.com/doc/200807/google"&gt;fantastic article&lt;/a&gt; about how internet is changing the way we read and think.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6022449969113776539?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6022449969113776539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6022449969113776539' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6022449969113776539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6022449969113776539'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/06/is-google-making-us-stupid.html' title='Is Google making us Stupid?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2965640930216431350</id><published>2008-05-31T10:08:00.000-07:00</published><updated>2008-05-31T10:09:34.203-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='portuguese'/><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><title type='text'>Caverna</title><content type='html'>&lt;span style="font-style:italic;"&gt;&lt;blockquote&gt;"Quando digo que as pessoas que estão na caverna somos todos nós é porque damos muito mais atenção às imagens do que àquilo que a realidade é. Estamos lá dentro olhando uma parede, vendo sombras e acreditando que elas são reais."&lt;/blockquote&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JOSÉ SARAMAGO, escritor&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2965640930216431350?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2965640930216431350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2965640930216431350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2965640930216431350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2965640930216431350'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/05/caverna.html' title='Caverna'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6607096343180183947</id><published>2008-05-26T08:15:00.000-07:00</published><updated>2008-05-26T08:25:25.175-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>System-level access to Vista</title><content type='html'>This &lt;a href="http://www.offensive-security.com/movies/vistahack/vistahack.html"&gt;exploit&lt;/a&gt; allows an user to gain system-level access without any user or password by copying cmd.exe over to an executable that can be launched without logging in. Very interesting exploit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6607096343180183947?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6607096343180183947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6607096343180183947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6607096343180183947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6607096343180183947'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/05/system-level-access-to-vista.html' title='System-level access to Vista'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6099246998721193925</id><published>2008-05-19T17:56:00.000-07:00</published><updated>2008-05-19T17:59:45.264-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Help not wanted</title><content type='html'>&lt;a href="http://www.economist.com/world/na/displaystory.cfm?story_id=11016270"&gt;Help not wanted&lt;/a&gt;&lt;br /&gt;Congress is doing its best to lose the global talent war&lt;br /&gt;&lt;br /&gt;Apr 10th 2008&lt;br /&gt;From The Economist&lt;br /&gt;&lt;br /&gt;And, on a related subject, in Japan&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.nytimes.com/2008/05/17/business/worldbusiness/17engineers.html?_r=2&amp;pagewanted=1&amp;hp&amp;oref=slogin"&gt;High-Tech Japanese, Running Out of Engineers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;May 17th 2008&lt;br /&gt;From The New York Times&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6099246998721193925?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6099246998721193925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6099246998721193925' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6099246998721193925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6099246998721193925'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/05/help-not-wanted.html' title='Help not wanted'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-3421365504040395831</id><published>2008-05-19T17:43:00.000-07:00</published><updated>2008-05-19T17:49:05.307-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Eggs at Steve Ballmer in Hungary</title><content type='html'>See &lt;a href="http://index.hu/tech/uzlet/ballmer08051/"&gt;here&lt;/a&gt; the video. The assailant accuses Microsoft of bribery in business with Hungarian government and asks the taxpayer's money back.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-3421365504040395831?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/3421365504040395831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=3421365504040395831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3421365504040395831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3421365504040395831'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/05/eggs-at-steve-ballmer-in-hungary.html' title='Eggs at Steve Ballmer in Hungary'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-7118727499784959173</id><published>2008-05-12T08:11:00.000-07:00</published><updated>2008-05-12T08:20:32.002-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>MSN (Live) Messenger blocking YouTube URLs?</title><content type='html'>&lt;a href="http://yro.slashdot.org/article.pl?sid=08/05/10/166204&amp;from=rss"&gt;YouTube URLs being blocked by Microsoft IMs&lt;/a&gt;? I noticed some troubles with youtube URLs for quite some time, but never tried to investigate what is wrong. This is simply ridiculous. &lt;br /&gt;&lt;br /&gt;That reminded me of when I signed up on Zoho.com and Thinkfree.com using my live email, and they always go to the junk mail folder. I also recall reading that some people noticed that particular invite emails from competitors never make into their hotmail inboxes. Although I can't prove anything here, it is a bit strange, isn't it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-7118727499784959173?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/7118727499784959173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=7118727499784959173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7118727499784959173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7118727499784959173'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/05/msn-live-messenger-blocking-youtube.html' title='MSN (Live) Messenger blocking YouTube URLs?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-7801560963880996533</id><published>2008-05-08T16:32:00.000-07:00</published><updated>2008-05-08T16:37:07.975-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>US Immigration Laws: scary</title><content type='html'>&lt;a href="http://www.nytimes.com/2008/04/12/us/12naturalize.html"&gt;Perfectly Legal Immigrants, Until They Applied for Citizenship&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Spend many years in the US, have a family, house, and a job. Apply then for the US citizenship. If the US government finds something they don't like, be prepared to be deported, what would not happen if you hadn't asked for the citizenship. The article above tells the sad story of a Philippine couple that is to be deported after 25 years as legal immigrants in the US.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-7801560963880996533?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/7801560963880996533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=7801560963880996533' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7801560963880996533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7801560963880996533'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/05/us-immigration-laws-scary.html' title='US Immigration Laws: scary'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-7623152539165655610</id><published>2008-05-05T17:29:00.000-07:00</published><updated>2008-05-05T17:40:59.198-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Seattle: "[...] He knew what it meant to be lonely."</title><content type='html'>Read this Seattle Times' &lt;a href="http://seattletimes.nwsource.com/pacificnw/2005/0213/cover.html"&gt;article&lt;/a&gt; about the &lt;span style="font-weight:bold;"&gt;Seattle Freeze&lt;/span&gt;, the fear of intimacy of people that live in this area. I wonder if the same happens in other areas in the US or in other countries (especially in Europe) to the same extent as here.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;We ride bikes alone; go on walks alone; troll bookstores alone, then go home and read alone.&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;On the one hand, it's nice to bop in and out of situations knowing people will smile and treat you well. Nice is like bubble gum — it's sugary and pleasant." But if all you ever get is nice, never flirty or risky, she says, that gum loses its flavor pretty quick, and the human experience becomes ultimately less rewarding. Even depressing.&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Since arriving from Argentina, he's turned down the volume on his laugh, no longer reaches out to hug friends and has even stopped wearing his favorite loud red pants. Those first lonely years in the Northwest even gave him a bit of a taste for solitude.&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;[...] [S]he realized that when Seattleites say, "Let's do something sometime," what they really mean is: "Let's never do anything ever."&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-7623152539165655610?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/7623152539165655610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=7623152539165655610' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7623152539165655610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/7623152539165655610'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/05/seattle-freeze-he-knew-what-it-meant-to.html' title='Seattle: &quot;[...] He knew what it meant to be lonely.&quot;'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2811157402489329051</id><published>2008-05-03T08:41:00.000-07:00</published><updated>2008-05-03T09:20:05.593-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>La Traviata, children and social skills</title><content type='html'>&lt;blockquote&gt;[...] A performance of &lt;span style="font-style:italic;"&gt;La Traviata&lt;/span&gt; has much to enthrall a child: beautiful music, two parties, ball gowns, dancing, pretty scenery, love, straightforward moral issues that can later be discussed. An afternoon at such a performance will be meaningful for some children. In our era, in which information is electronically spoon-fed and young people's social skills are often less fully developed than their computer skills, exposure to moral and emotional situations in a theatrical setting may spark parts of a child's imagination that were previously dormant.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;-- Opera 101, Fred Plotkin&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2811157402489329051?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2811157402489329051/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2811157402489329051' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2811157402489329051'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2811157402489329051'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/05/la-traviata-children-and-social-skills.html' title='La Traviata, children and social skills'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-6264126959804144880</id><published>2008-05-02T11:08:00.000-07:00</published><updated>2008-05-02T11:12:52.136-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Microsoft: "pace is slow"</title><content type='html'>Many people wonder how working at Microsoft looks like. It depends on many factors, and particularly on your personal style. I thought I was one of the few outliners when I had some thoughts after completing 6 months working here, but it turns out someone else worked 6 months at the company like 8 years ago and was very talented to &lt;a href="http://www.theatlantic.com/issues/2000/02/002fallows.htm"&gt;put in words&lt;/a&gt; many of my thoughts. This is a &lt;strong&gt;must&lt;/strong&gt; read if you are curious about day-to-day life at Microsoft - or if you are interested in what could be my opinion.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-6264126959804144880?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/6264126959804144880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=6264126959804144880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6264126959804144880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/6264126959804144880'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/05/microsoft-pace-is-slow.html' title='Microsoft: &quot;pace is slow&quot;'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-5671768547880224282</id><published>2008-04-30T21:25:00.000-07:00</published><updated>2008-12-10T03:17:10.989-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photo'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Berlin Wall at Microsoft?</title><content type='html'>Yes, I never noticed that before. In the building across Office, there is a portion of Berlin Wall that was donated by Daimler-Benz to Microsoft. Something I would never expect to be part of Microsoft Art Collection, and although one could imagine many meanings for having that wall on the campus, even then it is nice to be able to see part of history right there.&lt;br /&gt;&lt;br /&gt;See a picture of this portion of the wall:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_r7my89kTTEM/SBlHOO_-9RI/AAAAAAAAABE/Yd0Pu_WH5bg/s1600-h/berlin-wall.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_r7my89kTTEM/SBlHOO_-9RI/AAAAAAAAABE/Yd0Pu_WH5bg/s400/berlin-wall.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5195261955018781970" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This picture is from &lt;a href="http://greasergrrl.spaces.live.com/blog/cns!989D470165883D80!5091.entry"&gt;here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-5671768547880224282?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/5671768547880224282/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=5671768547880224282' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5671768547880224282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/5671768547880224282'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/04/berlin-wall-at-microsoft.html' title='Berlin Wall at Microsoft?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_r7my89kTTEM/SBlHOO_-9RI/AAAAAAAAABE/Yd0Pu_WH5bg/s72-c/berlin-wall.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-3891945755830666006</id><published>2008-04-30T21:21:00.000-07:00</published><updated>2008-04-30T21:23:09.491-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='culture'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Gil Shaham with Berlin Philarmonic</title><content type='html'>&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/UiNyhXOKsLA&amp;hl=en"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/UiNyhXOKsLA&amp;hl=en" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;Definitely worth watching this video not once, but many times.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-3891945755830666006?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/3891945755830666006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=3891945755830666006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3891945755830666006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/3891945755830666006'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/04/gil-shaham-with-berlin-philarmonic.html' title='Gil Shaham with Berlin Philarmonic'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-8134861283021406056</id><published>2008-04-30T07:58:00.000-07:00</published><updated>2008-04-30T08:00:39.651-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Reflections about IT</title><content type='html'>There is a &lt;a href="http://it.slashdot.org/article.pl?no_d2=1&amp;sid=08/04/29/1917224"&gt;post&lt;/a&gt; on Slashdot about a guy disillusioned with IT. And very interesting comments with different viewpoints. Definitely worth your time if this kind of reflective subject attracts you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-8134861283021406056?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/8134861283021406056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=8134861283021406056' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8134861283021406056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8134861283021406056'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/04/reflections-about-it.html' title='Reflections about IT'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-8869708647319996423</id><published>2008-04-27T08:14:00.000-07:00</published><updated>2008-05-03T09:20:27.709-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>"Do we all hate our jobs?"</title><content type='html'>On Safari site I ran into a book name "Four Secrets to Liking Your Work" and decided to read the first pages. I found some interesting paragraphs right on the first page:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;blockquote&gt;Do we all hate our jobs?&lt;br /&gt;&lt;br /&gt;Picture a room filled with ten of your coworkers. Odds are that seven of them don't like what they do. Do you know which ones? Are you one of them?&lt;br /&gt;&lt;br /&gt;It gets worse. Research suggests that one of those seven coworkers might be actively working at cross purposes to undermine your company. This means that if you are trying to be productive, he or she is working against you, too!&lt;br /&gt;&lt;br /&gt;Why bother working at all? We like to believe that it's all about money. We see people endure dread, dissatisfaction, and misery in the name of the paycheck, but Herzberg and Maslow agree that once our monetary needs are met, it ceases to motivate us. And even if we do need the money, it's no substitute for engaging, enjoyable, productive work. Money can't buy back lost time.&lt;/blockquote&gt;&lt;/em&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-8869708647319996423?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/8869708647319996423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=8869708647319996423' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8869708647319996423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8869708647319996423'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/04/do-we-all-hate-our-jobs.html' title='&quot;Do we all hate our jobs?&quot;'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-1381242987454965784</id><published>2008-04-26T09:16:00.001-07:00</published><updated>2008-05-03T09:20:45.620-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quotes'/><category scheme='http://www.blogger.com/atom/ns#' term='philosophy'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Why Scott Berkun left Microsoft (or general reflections about life and one's options)</title><content type='html'>The following text is sublime and I found it by accident trying to find the reason the Gentoo founder left Microsoft after only 9 months there. Rarely I found texts that were so similar to my own feelings and impressions.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scottberkun.com/essays/41-why-i-left-microsoft/"&gt;Why I left Microsoft?&lt;/a&gt;, by Scott Berkun&lt;br /&gt;&lt;br /&gt;Some quotes from this text:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;blockquote&gt;From day one of kindergarten onward there was always a next step waiting. The choices were easy and safe: which classes, which activities, which universities. But an hour after my college graduation, sitting alone in an empty apartment on Beeler street in Pittsburgh, there were no more choices laid out for me. There was nothing. I confronted my future as a kind of void for the first time and was terrified. I’d never understood that emptiness, despite seeing its effect on older friends and my older brother. Until I was sitting alone surrounded by it, without the defense of a plan or a friend, I had no idea how frightening it was.&lt;/blockquote&gt;&lt;/em&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;My comment&lt;/strong&gt;: I had exactly the same thought when graduating. Everything was so simple, the next step was always there. And the frightening comes back all every time you start thinking that you may want to leave your current position and change your life. The future is a kind of void. You can create it, but it still scares.&lt;/blockquote&gt;&lt;br /&gt;&lt;em&gt;&lt;blockquote&gt;I questioned what I was doing with my time on the planet. Dreams of my college years had been fulfilled, and if I didn’t make big changes soon, I knew I’d be repeating myself. There were other challenges I wanted, and I became terrified of spending my life like a sad, confused bird of prey, circling the same territory over and over again, never understanding why there was nothing new to find. I needed a new situation to jump into and despite what my manager’s and peers said, I knew I couldn’t do that while working in the same place. I had to move on. I was surprised to find that even though I was ten years older, my fears about the big unknowns were just as scary as before. But when I measured my fears about staying, I found they were stronger than those about leaving, so I left.&lt;/blockquote&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;blockquote&gt;So I chose to leave Microsoft less for reasons of escaping a particular place or group of people, but more to seek out a new set of circumstances to live in.&lt;/blockquote&gt;&lt;/em&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;strong&gt;My comment&lt;/strong&gt;: That is exactly the reason that I left some of previous jobs or circumstances I was in and that could be the same reason I may leave Microsoft in the near future. I like to be an explorer and cannot simply accept a given position because it is convenient or because I am at a position many people dream about. The bright side of all of this is that, although you may get disappointed that things didn't work out as expected, you understand the downside (at least partially) of many possibilities in the life while exploring it.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-1381242987454965784?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/1381242987454965784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=1381242987454965784' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1381242987454965784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/1381242987454965784'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/04/why-scott-berkun-left-microsoft-or.html' title='Why Scott Berkun left Microsoft (or general reflections about life and one&apos;s options)'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-8905630035878345004</id><published>2008-04-16T21:42:00.000-07:00</published><updated>2008-04-16T21:58:51.393-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technology'/><category scheme='http://www.blogger.com/atom/ns#' term='english'/><title type='text'>Office 2007 = 12 times more memory than Office 2000?</title><content type='html'>&lt;a href="http://www.osnews.com/story/19635/Fat_Fatter_Fattest:_Microsofts_Kings_of_Bloat"&gt;Fat, Fatter, Fattest: Microsoft's Kings of Bloat&lt;/a&gt;&lt;br /&gt;posted by Thom Holwerda on Tue 15th Apr 2008 20:12 UTC, submitted by Craig Barth &lt;br /&gt;"What Intel giveth, Microsoft taketh away. Such has been the conventional wisdom surrounding the Windows/Intel (aka Wintel) duopoly since the early days of Windows 95. In practical terms, it means that performance advancements on the hardware side are quickly consumed by the ever-increasing complexity of the Windows/Office code base. Case in point: Microsoft Office 2007, which, when deployed on Windows Vista, consumes more than 12 times as much memory and nearly three times as much processing power as the version that graced PCs just seven short years ago, Office 2000. Despite years of real-world experience with both sides of the duopoly, few organizations have taken the time to directly quantify what my colleagues and I at Intel used to call The Great Moore's Law Compensator (TGMLC). In fact, the hard numbers above represent what is perhaps the first-ever attempt to accurately measure the evolution of the Windows/Office platform in terms of real-world hardware system requirements and resource consumption. In this article I hope to further quantify the impact of TGMLC and to track its effects across four distinct generations of Microsoft's desktop computing software stack."&lt;br /&gt;&lt;br /&gt;See the full Infoworld article &lt;a href="http://www.infoworld.com/article/08/04/14/16TC-winoffice-performance_1.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One interesting comment:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;You think it's just Office? Its ALL SOFTWARE. The dirty secret that nobody wants to talk about is that it's the OOP software paradigm. It's been a dismal failure and your bechmarks prove it. OOP was supposed to make software development faster and easier. In fact it simply made it bigger and harder to work on. Easily 80% of all clock cycles are consummed diving through ever-deeper heirachy trees full of do-nothing, duplicated getters and setters at every level. Moores Law is the only reason anything still workds. Imagine where we'd be if we didn't spend all those cycles trying vindicate a failed programming paradigm. Back in the 80's people thought true artificial intellegence would be possible when computers achieved 2G of memory. Today my desktop has 4g, plus 4, 3.2-gigahertz processors and more disk space that my employer owned in the entire company in the 80's. But its performace barely matches the TRS-80 I learned basic on. It makes me wish I had done something useful with my life -- like Walmart greeter.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-8905630035878345004?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/8905630035878345004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=8905630035878345004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8905630035878345004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/8905630035878345004'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/04/office-2007-12-times-more-memory-than.html' title='Office 2007 = 12 times more memory than Office 2000?'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-9120260049253183981</id><published>2008-04-14T07:28:00.000-07:00</published><updated>2008-04-14T07:32:07.911-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='english'/><category scheme='http://www.blogger.com/atom/ns#' term='politics'/><title type='text'>Government is not your daddy</title><content type='html'>Today, after arriving in the office, I see some business cards pinned to the wall. With an American flag as background, the cards have the title "Government is not your daddy." and then "Free will. Free market. What' s so hard to understand about thtat?". The cards are to advertise the following blog:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://notyourdadddy.wordpress.com"&gt;http://notyourdadddy.wordpress.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And although I couldn't read it yet to know if their texts are good or not, I really liked their creativity about the name and their efforts to make it known.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-9120260049253183981?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/9120260049253183981/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=9120260049253183981' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/9120260049253183981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/9120260049253183981'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/04/government-is-not-your-daddy.html' title='Government is not your daddy'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-10409743.post-2964210745379371184</id><published>2008-04-13T20:32:00.000-07:00</published><updated>2008-04-13T20:38:06.249-07:00</updated><title type='text'>A 101-year old marathoner</title><content type='html'>This &lt;a href="http://video.msn.com/video.aspx?mkt=en-us&amp;vid=f1536ff9-e0be-4d11-9775-8a2c40c66a7a&amp;fg=rss&amp;from=im_m_25-34"&gt;news&lt;/a&gt; really surprised me. A 101-year old marathoner that crossed the finish line of a marathon, and has an average of 14 smokes and 8 pints of beer a day. Wow! And his advise is good: "no matter how old you are, even if you are only seventy". I will remember him when I decide to stop running after 1 or 2 miles ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/10409743-2964210745379371184?l=blog.sacaluta.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.sacaluta.com/feeds/2964210745379371184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=10409743&amp;postID=2964210745379371184' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2964210745379371184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/10409743/posts/default/2964210745379371184'/><link rel='alternate' type='text/html' href='http://blog.sacaluta.com/2008/04/101-year-old-marathoner.html' title='A 101-year old marathoner'/><author><name>Rodrigo de Castro</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='23' height='32' src='http://bp2.blogger.com/_r7my89kTTEM/SGbry0mvB5I/AAAAAAAAABQ/ZicYbwJhDMY/S220/rodrigo.jpg'/></author><thr:total>0</thr:total></entry></feed>
