<?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-2688686657011973469</id><updated>2011-07-07T20:56:26.665-07:00</updated><category term='yui'/><category term='yahoo'/><category term='wiki'/><category term='tfs'/><category term='s3'/><category term='ec2'/><category term='NCover'/><category term='design usability mac ipod headphone jack apple'/><category term='development'/><category term='ebay'/><category term='ads'/><category term='firebug'/><category term='benchmark'/><category term='web20expo'/><category term='development tools'/><category term='mapreduce'/><category term='hadoop'/><category term='gfs'/><category term='atlassian'/><category term='firefox'/><category term='define'/><category term='VSTS'/><category term='TDD'/><category term='bigtable'/><category term='nokia'/><category term='path coverage'/><category term='code coverage'/><category term='python'/><category term='plugin'/><category term='mocking'/><category term='amazon'/><category term='n76'/><category term='performance'/><category term='mox'/><category term='apollo'/><category term='usability'/><category term='web20'/><category term='headphone'/><category term='jack'/><category term='cenqua'/><category term='nano'/><category term='san francisco'/><category term='ajax'/><category term='definitions'/><category term='sphere'/><category term='sector'/><category term='communication'/><category term='yslow'/><category term='blog'/><category term='appdrop'/><category term='web20expo07'/><category term='problems'/><category term='appengine'/><category term='ipod'/><category term='UDT'/><category term='MbUnit'/><category term='mac'/><category term='search'/><category term='unit testing'/><category term='marketing'/><category term='design'/><category term='ria'/><category term='testing'/><category term='webapp'/><category term='pmock'/><category term='hbase'/><category term='branch coverage'/><category term='google'/><category term='battelle'/><title type='text'>pragmatic dreamer  on software</title><subtitle type='html'>sharing my own vision with the rest of the world</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-324956601141444732</id><published>2010-01-26T14:43:00.000-08:00</published><updated>2010-01-26T15:04:30.056-08:00</updated><title type='text'>I almost turned into a consumerist today</title><content type='html'>When the 8 port, 100Mbps, Allied Telesyn switch broke, we faced a business critical issue: the $300 monthly profit was at stake. We had to get a new AC adapter immediately. &lt;br /&gt;&lt;br /&gt;This was the kind of stuff that kept me busy 10 years ago when I was running me and my brother's business: Escape Computer Games &amp; Internet Club - you know - the kind of place where people used to spend time on IRC,  Counter-Strike and Broodwar in 2000. This was the place we celebrated the opening of, in the fall of '98, playing Duke Nukem, Starcraft and Quake until 8 in the morning when I went to school and slept a bit. Luckily for me, my parents came back from the vacation after a week and I started sleeping again.&lt;br /&gt;&lt;br /&gt;The switch was 12V but wouldn't settle for less than 1.5A. No regular AC adapters we could get in the local market could output that power. &lt;br /&gt; &lt;br /&gt;That's when Dudu stepped in. He was the passioned, self trained engineer that used to fix the TV or your cell phone and usually worked surrounded by tons of wreck (a really lucrative business 15 years ago in Romania), never made it to college kind of dude.  He built us a hideous, cubical, 1kg, 12V (probably 3A) AC adapter from a broken VHS player. &lt;br /&gt; &lt;br /&gt;Total cost: $10. &lt;br /&gt;Counter/Terrorists kids satisfaction : priceless. &lt;br /&gt;&lt;br /&gt;The "device" had all the bells and whistles required to operate the high end switch for more than 3 years until we shut down the business as I went to college.&lt;br /&gt;&lt;br /&gt;So yesterday, when my 4 port, 54Mbps Linksys wireless router stopped blinking, I just decided to get a new Linksys WRT54GL as it had good reviews on Amazon. &lt;br /&gt;It was procrastination mixed with laziness that led me this evening to the situation of being in the same situation as yesterday: no interwebs, staring at the broken wireless router that wouldn't start no matter how many times I replugged it. &lt;br /&gt;&lt;br /&gt;Like any computer science major that never had an electronics class in his life, I did the logical thing: I opened up the wireless box, glazed for about 30 seconds at the circuit board, decided everything looked good, took out my multimeter, recursively killed the multimeter (I measured the power in the cable that was powering it), then I tongue-tested the still blinking Bandridge AC adaptor that used to power my Linksys wireless router. &lt;br /&gt;&lt;br /&gt;I didn't "feel" any 12V at 1A pain! It wasn't the router, it was just a broken, 12V, 1A AC adapter! Can you sense the history repeating? There no profit at stake, I almost got a new wireless router, it was just laziness that forced me try the impossible. &lt;br /&gt;&lt;br /&gt;I won't make the story too long and explain how after 10 years, 600KM away from Escape, perfectly fitting a Linksys router, the old, ugly, cubical VHS born AC adapter promptly brought the green lights on my router back to life. For free!&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://api.photoshop.com/home_9f8494635275455383fefc1d9663394f/adobe-px-thumbnails/3de482568812450898a2b55b07ce1736/fullsize.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://api.photoshop.com/home_9f8494635275455383fefc1d9663394f/adobe-px-thumbnails/3de482568812450898a2b55b07ce1736/fullsize.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fixed wireless router: &lt;br /&gt;$80 more for me, &lt;br /&gt;$50 less for Cisco, &lt;br /&gt;$30 less for eMag and Co&lt;br /&gt;&lt;br /&gt;My early entrepreneurship memories: priceless.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-324956601141444732?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/324956601141444732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=324956601141444732' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/324956601141444732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/324956601141444732'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2010/01/i-almost-turned-into-consumerist-today.html' title='I almost turned into a consumerist today'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-6055712151708041988</id><published>2009-08-01T09:52:00.001-07:00</published><updated>2009-08-01T14:28:23.680-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='sphere'/><category scheme='http://www.blogger.com/atom/ns#' term='sector'/><category scheme='http://www.blogger.com/atom/ns#' term='mapreduce'/><category scheme='http://www.blogger.com/atom/ns#' term='UDT'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><category scheme='http://www.blogger.com/atom/ns#' term='benchmark'/><title type='text'>Is it time to say "Good bye, Hadoop"?</title><content type='html'>Not just yet.&lt;br /&gt;&lt;br /&gt;This got to by mail me from &lt;a href="http://twitter.com/adalq"&gt;@adalq&lt;/a&gt; the other day &lt;a href="http://return42.blogspot.com/2009/07/sectorsphere-beats-hadoop.html"&gt;Sector/Sphiere beats Hadoop. Again.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sector.sourceforge.net/index.html"&gt;Sector/Sphere&lt;/a&gt; is a distributed data storing and processing framework able to operate on wide area networks developed by a team from The &lt;a href="http://www.ncdm.uic.edu/"&gt;National Center for Data Mining&lt;/a&gt; (NCDM) at the &lt;a href="http://www.uic.edu/"&gt;University of Illinois at Chicago&lt;/a&gt; (UIC) led by &lt;a href="http://www.rgrossman.com/"&gt;Robert Grossman&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;While the original article is malicious (an aspect that doesn't really do any good to the project, in my perspective), the technology is worth a look from both the processing and data transfer perspectives and the design paper is a great read.&lt;br /&gt;&lt;br /&gt;The comparison was made with hadoop 0.18.3 (0.20.0 won the &lt;a href="http://sortbenchmark.org/"&gt;Terrasort benchmark&lt;/a&gt;), however, it looks &lt;b&gt;2-3 times faster than Hadoop 0.18.3&lt;/b&gt; for the &lt;a href="http://sector.sourceforge.net/benchmark.html"&gt;unofficial TerraSort benchmark&lt;/a&gt; and more than 10 times faster to load data in. I'm not sure Hadoop 0.20.0 would beat that, but it's definitely a lot faster than 0.18.3 and it would take a proper benchmark to draw any conclusions - something I'm expecting to happen in the near future. It's also worth saying that Hadoop 0.20 &lt;a href="http://developer.yahoo.net/blogs/hadoop/2009/05/hadoop_sorts_a_petabyte_in_162.html"&gt;sorted 1TB in 62 seconds and 1PB in 16.25 hours&lt;/a&gt;. That's a lot faster than what Sector/Sphere benchmark, but on a larger cluster. It also proves Hadoop's ability to scale - it was on a ~3800 nodes cluster - something that Sector/Sphere hasn't been tested on. &lt;br /&gt;&lt;br /&gt;&lt;big&gt;Where does the Sector/Spehere's performance come from? (ignoring the fact that it’s implemented in C++)&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;UDT Protocol (UDP based Data Transfer)&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://udt.sourceforge.net/"&gt;UDT&lt;/a&gt;  for data transfer– a much faster protocol than TCP that works great over WAN as well. &lt;/li&gt;&lt;li&gt;UDP for message passing &lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;UDT is the winner of the &lt;a href="http://www.hpcwire.com/offthewire/UIC_Groups_Win_Bandwidth_Challenge_Award.html"&gt;Bandwidth Challenge Award&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Stream processing computing paradigm a.k.a SMPD&lt;/b&gt; (Single Program Multiple Data) it’s a paradigm similar to what is used in GPU programming (more generic than map-reduce) and that extends it's application from GPU or Cell processors to distributed computing.So you get streams (datasets or parts of datasets) on which you run UDFs (User Defined Functions) on SPEs (Stream Processing Engines).   &lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The scheduling&lt;/b&gt; is somehow resembling Hadoop’s default one, but less complex – in that it takes some input slices and assigns them to SPEs based on locality, utilization, etc. and it somehow optimized - when more SPEs are available remaining segments are ran on more than one SPE and the results are collected from whichever SPE finishes first.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;File System management&lt;/b&gt;&lt;br /&gt;Sector is not a file system per se. It actually uses the underlying filesystem. It doesn’t break files into blocks like Hadoop HDFS which seems to cut a lot of overhead. (but also comes with the downside of having to split your own data – something they didn’t take into account when doing the benchmark).&lt;br /&gt;&lt;br /&gt;While definitely worth a look and even test, it does have some limitations and pitfalls.  &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;it doesn’t really deal with high availability&lt;/b&gt; (even though it does replicate data, the master is a SPOF). &lt;/li&gt;&lt;li&gt;&lt;b&gt;it doesn’t even mention consistency&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;&lt;b&gt;It doesn't handle fault tolerance too well&lt;/b&gt;. It can't ignore bad data - a bad input seems result in a job failure.&lt;/li&gt;&lt;li&gt;it doesn’t use blocks for storing files thare are limitations that come with the native file systems. &lt;/li&gt;&lt;li&gt;the &lt;b&gt;master might be a bottleneck&lt;/b&gt; for large clusters since it coordinates all UDT connections.&lt;/li&gt;&lt;li&gt;the &lt;b&gt;scheduler is pretty basic&lt;/b&gt; e.g. it doesn't deal with multiple jobs running at the same time&lt;/li&gt;&lt;li&gt;runs only on Linux. I'm not sure this a real problem. While this is probably just a matter of time but common, who's running Hadoop clusters on Windows or OSX machines? I'm an OSX user, and even so I often think developer environments should be as close as possible to production.&lt;/li&gt;&lt;/ul&gt;But these shouldn't be showstoppers and some of them seem to be on Sector/Sphere's roadmap already. Of course it takes more than reading about something to be able to draw conclusions, so I'm looking forward to test it and see the results.&lt;br /&gt;&lt;br /&gt;I don’t see why Hadoop couldn't benefit from these and vice versa. I’m thinking about GMP/UDT and SMPD. I’m not sure about the licensing, however - &lt;a href="http://draft.blogger.com/%20http://sector.sourceforge.net/software.html"&gt;GPL&lt;/a&gt; seems a pretty poor choice to me (sorry Stallman!), however, UDT is &lt;a href="http://udt.sourceforge.net/software.html"&gt;BSD&lt;/a&gt;.    &lt;big&gt;&amp;nbsp;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;Just to answer Tobias Svensson's question: &lt;i&gt;Is it time to say "Good bye, Hadoop"?&lt;/i&gt;&lt;/big&gt;&lt;br /&gt;&lt;br /&gt;Not just yet. Hadoop is here to stay. While I was one of the 5-6 people to raise hands at the "Who's coming from outside US?" at the &lt;a href="http://developer.yahoo.com/events/hadoopsummit09/"&gt;Hadoop Summit '09&lt;/a&gt; last month, the room was packed with 700+ attendees. Hadoop is not just a map-reduce framework anymore. It had grown wings outside of Yahoo and it has an &lt;a href="http://hadoop.apache.org/"&gt;entire ecosystem&lt;/a&gt; around it. Just take a look at &lt;a href="http://wiki.apache.org/hadoop/PoweredBy"&gt;who's using it&lt;/a&gt; to make a better idea. Even before 1.0 Hadoop is pretty much production ready. We have been using Hadoop and HBase at Adobe since 2008 and have big plans.&lt;br /&gt;&lt;br /&gt;This doesn't mean there isn't place for other players and competition has always proved constructive. I'm really glad to see so much energy spent in this domain both from companies and academia.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;big&gt;References&lt;/big&gt;   &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cca08.org/papers/gu-grossman-ahm-08-1.pdf"&gt;www.cca08.org/papers/gu-grossman-ahm-08-1.pdf&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cca08.org/files/slides/Robert-Grossman-sector-cca08-v12p.pdf"&gt;www.cca08.org/files/slides/Robert-Grossman-sector-cca08-v12p.pdf&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://sector.sourceforge.net/index.html"&gt;http://sector.sourceforge.net/index.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rgrossman.com/dl/journal-035.pdf"&gt;www.rgrossman.com/dl/journal-035.pdf&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://udt.sourceforge.net/"&gt;http://udt.sourceforge.net/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hadoop.apache.org/"&gt;http://hadoop.apache.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cloudera.com/blog/2008/11/23/job-scheduling-in-hadoop/"&gt;http://www.cloudera.com/blog/2008/11/23/job-scheduling-in-hadoop/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Update: I've somehow managed to screw the entire layout while saving the post after adding the tags (double escaping or something), so I've used an earlier version and had to go through updating it again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-6055712151708041988?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/6055712151708041988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=6055712151708041988' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/6055712151708041988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/6055712151708041988'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2009/08/is-it-time-to-say-bye-hadoop.html' title='Is it time to say &quot;Good bye, Hadoop&quot;?'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-6531961196101884003</id><published>2009-07-19T05:12:00.001-07:00</published><updated>2009-07-19T05:34:49.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit testing'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='pmock'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='mox'/><category scheme='http://www.blogger.com/atom/ns#' term='mocking'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Setting default behaviors for undefined methods in mocks. Good or bad?</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Grig Gheorghiu wrote a good post about &lt;a href="http://agiletesting.blogspot.com/2009/07/python-mock-testing-techniques-and.html"&gt;mocking techniques in python&lt;/a&gt;. I don't want to reiterate anything here, nor talk about the basics of mocking and stubbing. Read Martin Fowler's post on &lt;a href="http://martinfowler.com/articles/mocksArentStubs.html"&gt;mocks vs. stubs&lt;/a&gt; for that. &lt;br /&gt;&lt;br /&gt;I also use &lt;a href="http://code.google.com/p/pymox/"&gt;mox&lt;/a&gt;, however, I do behavioral testing with mocks by default while TDD-ing (top-bottom approach) and then do the integration and functional tests.&lt;br /&gt;&lt;br /&gt;One thing I wish &lt;a href="http://code.google.com/p/pymox/"&gt;mox&lt;/a&gt; would have (&lt;a href="http://pmock.sourceforge.net/overview.html#DefaultBehaviourForUndefinedMethods"&gt;pmock&lt;/a&gt; has it) is the &lt;b&gt;"set default behavior for undefined methods"&lt;/b&gt; for a mock object.&lt;br /&gt;I often mock an abject and only want to check one or two methods are called, and not specify every single call (e.g. begin transaction or commit transaction calls. I believe these are the matter of a different, isolated test). So I'd like (sometimes!) to check for specific calls and not fail for undefined calls.&lt;br /&gt;&lt;br /&gt;For example, if we test calls to &lt;tt&gt;foo&lt;/tt&gt; for methods &lt;tt&gt;a(), x(), y(), z()&lt;/tt&gt; and &lt;tt&gt;b()&lt;/tt&gt; potentially being called depending on some logic, I'd like to mock it and test different behaviors in different tests.  If &lt;tt&gt;a()&lt;/tt&gt; and &lt;tt&gt;b()&lt;/tt&gt; &lt;b&gt;are called every time&lt;/b&gt; then I'll have some tests checking that &lt;tt&gt;a()&lt;/tt&gt; and &lt;tt&gt;b()&lt;/tt&gt; are called, then I'd have a separated test checking &lt;tt&gt;x()&lt;/tt&gt; is called in certain situations and so on for &lt;tt&gt;y()&lt;/tt&gt; and &lt;tt&gt;z()&lt;/tt&gt;.&lt;br /&gt;&lt;br /&gt;When recording, I don't want to repeat calls to &lt;tt&gt;a()&lt;/tt&gt; and &lt;tt&gt;b()&lt;/tt&gt; in every mock. The test for these two methods already checks this.&lt;br /&gt;&lt;br /&gt;In a simplified scenario in "pseudo-python" with mox you'd end up having the following mock definitions:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mock x behavior&lt;br /&gt; foo_mock.a()&lt;br /&gt; foo_mock.x()&lt;br /&gt; foo_mock.b()&lt;br /&gt;&lt;br /&gt;mock y behavior&lt;br /&gt; foo_mock.a()&lt;br /&gt; foo_mock.y()&lt;br /&gt; foo_mock.b()&lt;br /&gt;&lt;br /&gt;# and so on...&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I don't want to repeat the &lt;tt&gt;a()&lt;/tt&gt; and &lt;tt&gt;b()&lt;/tt&gt; calls expectations in every test, I want to test them in isolation:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;mock a, x, b full workflow behavior&lt;br /&gt;  foo_mock.a()&lt;br /&gt;  foo_mock.x()&lt;br /&gt;  foo_mock.b()&lt;br /&gt;&lt;br /&gt;mock general a, b behavior&lt;br /&gt;  foo_mock.a()&lt;br /&gt;  foo_mock.b()&lt;br /&gt;  foo_mock.set_default_stub(return True)&lt;br /&gt;&lt;br /&gt;mock x behavior&lt;br /&gt;  foo_mock.x()&lt;br /&gt;  foo_mock.set_default_stub(return something)&lt;br /&gt;&lt;br /&gt;mock y behavior&lt;br /&gt;  foo_mock.y()&lt;br /&gt;  foo_mock.set_default_stub(return something)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Testing behavior in isolation has several advantages. When behavior changes you get a small number of failed unit tests and can easily spot the culprit. Also, the maintenance cost is reduced, since you don't have to change every test when behavior changes.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I wonder if there's a better approach than setting a default behavior for unknown methods. I reuse the mocks when possible, but this isn't a generic solution since it's not trivial to manage behavior for an existing mock (e.g. add or remove method calls to an existing recorder or easily change calls order). Also generalizing the code too much might make your tests harder to read and understand.&lt;br /&gt;&lt;br /&gt;Let me know if you have a good strategy for this class of behavioral testing problems.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-6531961196101884003?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/6531961196101884003/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=6531961196101884003' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/6531961196101884003'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/6531961196101884003'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2009/07/setting-default-behaviors-for-undefined.html' title='Setting default behaviors for undefined methods in mocks. Good or bad?'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-2172394153475086816</id><published>2008-04-15T07:29:00.001-07:00</published><updated>2008-04-15T07:50:31.473-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bigtable'/><category scheme='http://www.blogger.com/atom/ns#' term='gfs'/><category scheme='http://www.blogger.com/atom/ns#' term='appdrop'/><category scheme='http://www.blogger.com/atom/ns#' term='hbase'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='webapp'/><category scheme='http://www.blogger.com/atom/ns#' term='hadoop'/><category scheme='http://www.blogger.com/atom/ns#' term='appengine'/><title type='text'>Google App Engine ported... or is it?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://imgs.xkcd.com/comics/duty_calls.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px;" src="http://imgs.xkcd.com/comics/duty_calls.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;Rounded Corners Crap&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Short story shorter:&lt;br /&gt;&lt;br /&gt;Tim O'Reilly  meditates about App Engine being a &lt;a href="http://radar.oreilly.com/archives/2008/04/is-google-app-engine-a-lockin.html"&gt;lock-in game&lt;/a&gt;. Chris Anderson copied App Engine SDK (the one you can download and run locally) to EC2 and &lt;a href="http://waxy.org/2008/04/exclusive_google_app_engine_ported_to_amazons_ec2/"&gt;thinks&lt;/a&gt; he ported App Engine to EC2. Enthusiasts got wet. He got traffic on his google ads enabled site and a PR boost.&lt;br /&gt;&lt;br /&gt;Again, Rounded Corners Crap&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Why is that?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;App Engine has a few components:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SDK (Includes the webapp framework, mongrel-like dev web server, local filesystem DataStore and other mocks)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;webapp Framework (a thin Django/Rails clone)&lt;/li&gt;&lt;li&gt;DataStore API (some sort of not-relational database based on BigTable)&lt;/li&gt;&lt;li&gt;Users API (google account authentication)&lt;/li&gt;&lt;li&gt;URL Fetch API (3rd party WS communication)&lt;/li&gt;&lt;li&gt;Mail API&lt;/li&gt;&lt;/ul&gt;Now the entire SDK is open-source. Not much of a framework lock-in, is it? However you can find &lt;i&gt;most&lt;/i&gt; of the stuff they have anywhere (think rails or django).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;So what's the catch?&lt;/span&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;Google scales it for you.&lt;br /&gt;&lt;br /&gt;You don't have to bother with load balancers, sharding, master-master replications, authentication and all the operational issues. You can focus on your business needs.&lt;br /&gt;&lt;b&gt;&lt;br /&gt;The lock-in is in their services not in the SDK.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Google has GFS/BigTable/MapReduce/Sawzall and some really smart stuff on top of that which enables them to scale your data model dynamically. Now this is App Engine: a nice SDK with a powerful set of backend services.&lt;br /&gt;&lt;br /&gt;The App Engine EC2 port is nothing but webapp framework with some mocks for authentication and storage. No scaling. I do wonder why it took 4 days to do that it seems like a 4 hour job.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;No scalability, no play.&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Now let's say someone takes it to the next level and uses Hadoop, HDFS, HBase and all the Apache goodies for the storage. It's still not enough. It's like having a filesystem when you need a database. You'd have to build something really smart on top of that. Let only the SQL idiom google has (GQL) and it's still hard to do that on top of HStack. You'd have to build an object oriented database. Think relations and indexes and joins and all the bells end whisles.&lt;br /&gt;&lt;br /&gt;And no, SimpleDB doesn't do that.&lt;br /&gt;&lt;br /&gt;I'm still amazed on how fast people buy silver bullets.&lt;br /&gt;&lt;br /&gt;I do have to admit that this in the Web 2.0 rounded corner-ish philosophy: build hype on vapors.&lt;br /&gt;&lt;br /&gt;Happy chewing!&lt;br /&gt;&lt;br /&gt;PS: there's also an &lt;a href="http://es.cohesiveft.com/site/google-appengine"&gt;App Engine Elastic Server&lt;/a&gt;. Already.&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;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-2172394153475086816?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/2172394153475086816/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=2172394153475086816' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/2172394153475086816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/2172394153475086816'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2008/04/google-app-engine-ported-or-is-it.html' title='Google App Engine ported... or is it?'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-1049380480664698493</id><published>2008-03-15T05:43:00.000-07:00</published><updated>2008-08-27T16:21:45.688-07:00</updated><title type='text'>untitled.jpeg</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_npdbzVokGyc/R9vK1LHWIzI/AAAAAAAAACM/UiWkByC0tFI/s1600-h/rbf-logo.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_npdbzVokGyc/R9vK1LHWIzI/AAAAAAAAACM/UiWkByC0tFI/s200/rbf-logo.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5177955211457995570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;Seeing the &lt;a href="http://roblogfest.ro"&gt;ro&lt;/a&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;a href="http://roblogfest.ro"&gt;blog&lt;/a&gt;&lt;/span&gt;&lt;a href="http://roblogfest.ro"&gt;fest&lt;/a&gt; &lt;a href="http://vladbirdu.fototarget.ro/"&gt;winning photoblogs&lt;/a&gt; made me wanna grab my camera and go out. I think I hadn't touched it in the last 3 weeks. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-1049380480664698493?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/1049380480664698493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=1049380480664698493' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/1049380480664698493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/1049380480664698493'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2008/03/untitledjpeg.html' title='untitled.jpeg'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_npdbzVokGyc/R9vK1LHWIzI/AAAAAAAAACM/UiWkByC0tFI/s72-c/rbf-logo.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-8806313029908884174</id><published>2007-11-11T08:27:00.000-08:00</published><updated>2007-11-11T12:48:53.396-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='define'/><category scheme='http://www.blogger.com/atom/ns#' term='ads'/><category scheme='http://www.blogger.com/atom/ns#' term='search'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='battelle'/><category scheme='http://www.blogger.com/atom/ns#' term='definitions'/><title type='text'>define: ad free searches</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm almost done reading John Battelle's book, "The Search". As I'm not a native english speaker, sometimes I find words I don't know (e.g. comeuppance, soiree, plummet, exhortation, etc). Most of the times I can guess their meaning from the context, but I like to lookup their definition. This is where google search (and my iphone) comes handy. The nice part is the "define: [word]" is ad free. I guess not many use this pattern. Otherwise we'd probably see ads here too. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-8806313029908884174?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/8806313029908884174/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=8806313029908884174' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/8806313029908884174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/8806313029908884174'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2007/11/define-ad-free-searches.html' title='define: ad free searches'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-3270131532451568046</id><published>2007-08-01T06:44:00.000-07:00</published><updated>2007-08-01T13:19:35.442-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tfs'/><category scheme='http://www.blogger.com/atom/ns#' term='wiki'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><category scheme='http://www.blogger.com/atom/ns#' term='cenqua'/><category scheme='http://www.blogger.com/atom/ns#' term='atlassian'/><category scheme='http://www.blogger.com/atom/ns#' term='development tools'/><title type='text'>Atlassian + Cenqua Joins the Big Players</title><content type='html'>&lt;em&gt;1 August, 2007&lt;/em&gt;: Atlassian announces the acquisition of Cenqua&lt;br /&gt;&lt;br /&gt;Atlassian won't be the "Enterprise Wiki" anymore. They aim higher.&lt;br /&gt;&lt;br /&gt;I played a while ago with Clover and Fisheye. Very good tools. Jira and Confluence are maybe the de facto wiki and bug tracker.&lt;br /&gt;&lt;br /&gt;Cenqua has several development tools&lt;br /&gt;&lt;a href="http://www.atlassian.com/software/clover/"&gt;Clover&lt;/a&gt; is a Java/.Net code coverage tool&lt;br /&gt;&lt;a href="http://www.atlassian.com/software/fisheye/"&gt;Fisheye&lt;/a&gt; (Source Control (svn, cvs) monitoring, analysis)&lt;br /&gt;&lt;a href="http://www.atlassian.com/software/crucible/"&gt;Crucible&lt;/a&gt; (Peer code review)&lt;br /&gt;&lt;br /&gt;Atlassian completes the suit with&lt;br /&gt;&lt;a href="http://www.atlassian.com/software/jira/"&gt;Jira&lt;/a&gt; (bug tracker)&lt;br /&gt;&lt;a href="http://www.atlassian.com/software/confluence/"&gt;Confluence&lt;/a&gt; (wiki)&lt;br /&gt;&lt;a href="http://www.atlassian.com/software/bamboo/"&gt;Bamboo&lt;/a&gt; (continuous integration, build telemetry)&lt;br /&gt;&lt;a href="http://www.atlassian.com/software/crowd/"&gt;Crowd&lt;/a&gt; (identity management)&lt;br /&gt;&lt;br /&gt;With all these they'll have a powerful development ecosystem.&lt;br /&gt;&lt;br /&gt;What's next?&lt;br /&gt;&lt;br /&gt;Maybe Joel Spolsky and Martin Fowler join their tools. CruiseControl/Mingle + FogBugz should be nice :). And they'd have the QA tool suite also.&lt;br /&gt;&lt;br /&gt;The current big players:&lt;br /&gt;IBM has the Rational suite.&lt;br /&gt;Microsoft has the  VSTS/TFS.&lt;br /&gt;&lt;br /&gt;What do you use in your day to day work?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-3270131532451568046?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/3270131532451568046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=3270131532451568046' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/3270131532451568046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/3270131532451568046'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2007/08/atlassian-cenqua-joins-big-players.html' title='Atlassian + Cenqua Joins the Big Players'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-2006396038578194588</id><published>2007-06-30T02:12:00.001-07:00</published><updated>2007-06-30T03:38:10.211-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='yui'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='yslow'/><category scheme='http://www.blogger.com/atom/ns#' term='yahoo'/><category scheme='http://www.blogger.com/atom/ns#' term='web20expo'/><category scheme='http://www.blogger.com/atom/ns#' term='web20expo07'/><category scheme='http://www.blogger.com/atom/ns#' term='firebug'/><title type='text'>YSlow at The Ajax Experience</title><content type='html'>A couple of months ago I wrote an &lt;a href="http://cosminlehene.blogspot.com/2007/05/firebug-to-get-new-wings-from-yahoo.html"&gt;enthusiastic post&lt;/a&gt; about Yahoo! hiring a dev to work on Firebug. I was hoping that means YSlow will be released sooner.  But since then they hadn't talked about it.&lt;br /&gt;&lt;br /&gt;In the meantime  Nate Koechley announced the YSlow tool at the &lt;a href="http://www.vivabit.com/atmedia2007/europe/"&gt;@media2007&lt;/a&gt; conference in London (June 7th-8th)&lt;br /&gt;&lt;br /&gt;It looks like Steve Sounders is going to reveal &lt;a href="http://www.ajaxperformance.com/2007/06/11/ajax-experience-schedule-finalized/"&gt;"the super secret YSlow project"&lt;/a&gt; one more time at The Ajax Experience conference (SF Jul 25th-27th).&lt;br /&gt;&lt;br /&gt;This time the talk it's not titled "High Performance Web Pages" but &lt;a href="http://ajaxexperience.techtarget.com/west/html/performance.html#SSoudersYSlow"&gt;Performance Analysis with YSlow for Firebug&lt;/a&gt;. The content seems to be the same as for Web20Expo conference in April 2007, however, I believe they have a newer version of the YSlow tool. In the meantime you can get the previous presentation from &lt;a href="http://stevesouders.com/docs/high-performance-web-sites.ppt"&gt;&lt;span style="font-size:-1;"&gt;&lt;span class="a"&gt;stevesouders.com/docs/&lt;b&gt;high&lt;/b&gt;-&lt;b&gt;performance&lt;/b&gt;-&lt;b&gt;web&lt;/b&gt;-&lt;b&gt;sites&lt;/b&gt;.&lt;b&gt;ppt&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I don't really get why they haven't released this tool yet, and why they are so quiet about it. After all, it's just a performance lint tool and in April at the Web2Expo they said they're going to release it this summer. Perhaps...&lt;br /&gt;&lt;br /&gt;My 2 cents: Stick to the rules not to the lint tool and you'll be just fine ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-2006396038578194588?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/2006396038578194588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=2006396038578194588' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/2006396038578194588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/2006396038578194588'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2007/06/yslow-at-ajax-experience.html' title='YSlow at The Ajax Experience'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-601454314144180012</id><published>2007-06-24T11:43:00.000-07:00</published><updated>2007-06-24T13:30:22.024-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='nokia'/><category scheme='http://www.blogger.com/atom/ns#' term='problems'/><category scheme='http://www.blogger.com/atom/ns#' term='n76'/><title type='text'>dis connecting people</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_npdbzVokGyc/Rn7UWEfp0xI/AAAAAAAAAAc/BGEEskvMA2k/s1600-h/nokian76-100.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_npdbzVokGyc/Rn7UWEfp0xI/AAAAAAAAAAc/BGEEskvMA2k/s320/nokian76-100.jpg" alt="" id="BLOGGER_PHOTO_ID_5079730905349214994" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I always ranted about nokia phones. I always found them better than the rest. I would even argue about it. A couple of weeks ago I payed a small treasure to change my old, falling to pieces nokia phone with the new N76. It's the Motorola RAZR of nokia. It has Symbian on it and all the bells and whistles. The thinest smartphone, the slickest, etc. Almost. It won't work with Push Mail because Ms Exchange  seems to reject other nokia phones than E series.&lt;br /&gt;That's a bummer!&lt;br /&gt;&lt;br /&gt;The first glitch I found was that the micro SD cover won't fit well in its place and stays a little outside giving a cheesy aspect. Being a clamshell you'd expect to be able to open the phone with one hand. Stop dreaming. It's difficult to open it with both hands.&lt;br /&gt;&lt;br /&gt;These are non issues, You get used to this kind of stuff. The phone has a nice interface for playing music. After a short time the phone rebooted. "That's ok", I said.&lt;br /&gt;&lt;br /&gt;Second day I activated 3G data transfer. I popped the browser and started playing just to see how it works. After a few clicks the browser just exited. I repeated this for 4 or 5 times. In the meantime the phone would freeze from time to time - mostly when I was about to answer phone calls or to look at missed calls. It froze and then it rebooted. I took a deep breath of hope.&lt;br /&gt;Being a software developer I said that nokia must have joined the "continuous beta" paradigm. I was sure that I'd found a software update. But the phone was up to date.&lt;br /&gt;&lt;br /&gt;The 3rd day I felt that my battery lasts really short. Less than 12 hours. Measuring I figured out that it wears out in around 5-7 hours. Bluetooth off, 3G off.&lt;br /&gt;Ok..&lt;br /&gt;&lt;br /&gt;Apparently the store only changes the phone if you get back within the first 48 hours. After that you have to send it to a nokia service center.&lt;br /&gt;Now I'm pissed.&lt;br /&gt;Not only I payed a fortune on a new phone, but I have now I waste my time searching for the service center and taking it there.&lt;br /&gt;&lt;br /&gt;So I get to Cirma Electronics - nokia authorized service. I left my phone there and they gave me a piece of paper. I was told it will last 4-5 business days and that I could call the number on the paper to ask about it's status.&lt;br /&gt;&lt;br /&gt;After 3 more days I call that number.&lt;br /&gt;Busy or no answer. I call once, twice, ten times. Same thing the next day. After a short online investigation. I can request the phone status using their website! After one week I went there and picked it up.&lt;br /&gt;&lt;br /&gt;Hurray!&lt;br /&gt;The phone was replaced with a brand new one. Wow! This must be the Finnish way. So I happily go home to charge it because the battery was completely warn out. I plugged the phone charger and...&lt;br /&gt;&lt;br /&gt;Surprise!!!&lt;br /&gt;The phone is as dead as possible: it won't charge, it won't start it only warmed up well after a few hours. I called the service center with tears in my eyes...&lt;br /&gt;of course: busy or no answer. I wasn't really in the mood to go back there. It was Friday and I'd probably get there just after they close the shop.&lt;br /&gt;&lt;br /&gt;This was evil.&lt;br /&gt;After a little googling and a few help from a friend I get the phone number of the Purchase Director of Cirma Electronics. Very politely, he explains to me. It's possible to have a perfect phone (QA wise) that is dead as mine. Now I'm puzzled. What does a Quality Assurance Engineer's job at nokia means? He tells me how to get to their offices and promises me that they will take care to sort this out really fast.&lt;br /&gt;&lt;br /&gt;This is the first man in 2 weeks that seems customer focused.&lt;br /&gt;Of course I forgot to tell you that I asked a contact from Customer Department, but that manager left the company. So here I am. I'm getting my problem solved by the Purchase Director.&lt;br /&gt;&lt;br /&gt;It's Sunday now. Tomorrow I'll start a new "connecting people" adventure.&lt;br /&gt;&lt;br /&gt;Any bets on the new piece?&lt;br /&gt;Good night!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-601454314144180012?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/601454314144180012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=601454314144180012' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/601454314144180012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/601454314144180012'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2007/06/dis-connecting-people.html' title='dis connecting people'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_npdbzVokGyc/Rn7UWEfp0xI/AAAAAAAAAAc/BGEEskvMA2k/s72-c/nokian76-100.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-3733715754675310979</id><published>2007-06-24T10:52:00.000-07:00</published><updated>2007-06-24T13:10:18.573-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design usability mac ipod headphone jack apple'/><category scheme='http://www.blogger.com/atom/ns#' term='headphone'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='nano'/><category scheme='http://www.blogger.com/atom/ns#' term='jack'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><title type='text'>apples, jacks and macs</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_npdbzVokGyc/Rn6ztUfp0vI/AAAAAAAAAAM/yf-CNMs1q7M/s1600-h/jackinmac-100.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_npdbzVokGyc/Rn6ztUfp0vI/AAAAAAAAAAM/yf-CNMs1q7M/s320/jackinmac-100.jpg" alt="" id="BLOGGER_PHOTO_ID_5079695020897456882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Every time I plug my iPod headphones in my Mac  I find myself forcing the plug.&lt;br /&gt;The jack plug won't completely fit in the socket. It fits in my iPod Nano it even fits in my IBM T43 perfectly but I find myself pushing it harder in my Mac because I get the feeling it didn't go all the way in.&lt;br /&gt;&lt;br /&gt;User experience and usability are first class citizens in the World of the Apples. These products are all about the way they look and fit in your home and with each other. And still, I have to force the headphones jack every single time. Not only it doesn't go all the way in, but if you push it softly it will stop and then if you push little harder it will go a little more, but not entirely.&lt;br /&gt;&lt;br /&gt;I wonder if it's only my headphones plug or my  Mac socket. If not, I wonder why in the world an iPod headphones plug will fit anything but its Mac brother.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-3733715754675310979?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/3733715754675310979/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=3733715754675310979' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/3733715754675310979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/3733715754675310979'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2007/06/apples-jacks-and-macs.html' title='apples, jacks and macs'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_npdbzVokGyc/Rn6ztUfp0vI/AAAAAAAAAAM/yf-CNMs1q7M/s72-c/jackinmac-100.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-6250432864402655005</id><published>2007-05-08T00:22:00.000-07:00</published><updated>2007-05-08T00:43:37.181-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='yui'/><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='yslow'/><category scheme='http://www.blogger.com/atom/ns#' term='yahoo'/><category scheme='http://www.blogger.com/atom/ns#' term='web20expo'/><category scheme='http://www.blogger.com/atom/ns#' term='web20expo07'/><category scheme='http://www.blogger.com/atom/ns#' term='firebug'/><title type='text'>Firebug to get new wings from Yahoo!</title><content type='html'>A few weeks ago Steve Sounders and Tenni Theurer held a workshop on &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_sess/13253"&gt;"High Performance Web Sites" at Web2.0Expo in San Francisco&lt;/a&gt;. They presented 14 best practices to improve the front-end performance. They also had a nice demo of YSlow.&lt;br /&gt;&lt;br /&gt;YSlow is a performance lint-tool that grades web pages for each rule. Very useful performance safety net that comes as a Firefox plugin. They didn't make any promises about the tool by that time, but they did say that it might be available for public use this summer.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://yuiblog.com/blog/2007/05/07/firebug/"&gt;Yesterday YUI team announced they are hiring an engineer to work on Firebug.  &lt;/a&gt;I'd say we'll have our performance lint-tool soon but there's sure more than just that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-6250432864402655005?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/6250432864402655005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=6250432864402655005' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/6250432864402655005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/6250432864402655005'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2007/05/firebug-to-get-new-wings-from-yahoo.html' title='Firebug to get new wings from Yahoo!'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-8940020507532130288</id><published>2007-04-23T20:45:00.000-07:00</published><updated>2007-04-24T23:58:47.962-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ria'/><category scheme='http://www.blogger.com/atom/ns#' term='ebay'/><category scheme='http://www.blogger.com/atom/ns#' term='web20'/><category scheme='http://www.blogger.com/atom/ns#' term='san francisco'/><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='s3'/><category scheme='http://www.blogger.com/atom/ns#' term='ec2'/><category scheme='http://www.blogger.com/atom/ns#' term='web20expo'/><category scheme='http://www.blogger.com/atom/ns#' term='web20expo07'/><category scheme='http://www.blogger.com/atom/ns#' term='apollo'/><title type='text'>Web 2.0 Expo and the new LEGO</title><content type='html'>Seeing the services, APIs and the rest of the web (2.0) nowadays feels like unleashing me many years ago in a LEGO room... Of course, when I was 6 I didn't have an original LEGO...&lt;br /&gt;&lt;br /&gt;Just came from Web 2.0 Expo.&lt;br /&gt;The conference was rich in content and San Francisco is just great.&lt;br /&gt;&lt;br /&gt;I often had a hard time choosing between different tracks. The food was good as well and the overall event logistic was ok (more  outlets would have been great). I also believe I should improve my notes taking skills :).&lt;br /&gt;&lt;br /&gt;I arrived on Friday the 13th, so I had time to do a little site seeing in SF Friday and Saturday and I started attending the workshops on Sunday&lt;br /&gt;&lt;br /&gt;I attended&lt;br /&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/13253"&gt;&lt;span class="summary"&gt;High Performance Webpages&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3241"&gt;&lt;span class="organizer"&gt;Steve Souders&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3287"&gt;&lt;span class="organizer"&gt;Tenni Theurer&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/13790"&gt;&lt;span class="summary"&gt;What is Web 2.0: The Rules for Creating Successful Online Products in the 21st Century&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;i&gt;&lt;span style="font-size:78%;"&gt;      &lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3044"&gt;&lt;span class="organizer"&gt;Dion Hinchcliffe&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;workshops and&lt;br /&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/11827"&gt;&lt;span class="summary"&gt;The New Hybrid Designer&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/2696"&gt;&lt;span class="organizer"&gt;Chris Messina&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3040"&gt;&lt;span class="organizer"&gt;Emily Chang&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3041"&gt;&lt;span class="organizer"&gt;Kelly Goto&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3042"&gt;&lt;span class="organizer"&gt;Richard MacManus&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/11250"&gt;&lt;span class="summary"&gt;The Lost Remote:  The Internet Video Revolution&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/1276"&gt;&lt;span class="organizer"&gt;Dirk-Willem van Gulik&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3144"&gt;&lt;span class="organizer"&gt;Jay Adelson&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3286"&gt;&lt;span class="organizer"&gt;Erik Hachenburg&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3357"&gt;&lt;span class="organizer"&gt;Liz Gannes&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3402"&gt;&lt;span class="organizer"&gt;Howard Lindzon&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3448"&gt;&lt;span class="organizer"&gt;Marc Siry&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/11829"&gt;&lt;span class="summary"&gt;Placelessness and the Advance of Micropublishing&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3496"&gt;&lt;span class="organizer"&gt;Alex Faaborg&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/13944"&gt;&lt;span class="summary"&gt;The Story Behind Facebook's APIs: From REST to FQL&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3610"&gt;&lt;span class="organizer"&gt;Dave Morin&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3611"&gt;&lt;span class="organizer"&gt;Ari Steinberg&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/13944"&gt;&lt;span class="summary"&gt;&lt;/span&gt;&lt;/a&gt;&lt;i&gt;&lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3610"&gt;&lt;span class="organizer"&gt;&lt;/span&gt;&lt;/a&gt;&lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3611"&gt;&lt;span class="organizer"&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/11136"&gt;&lt;span class="summary"&gt;Case Study:  Digging into the Technology Behind the Development of Digg&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3079"&gt;&lt;span class="organizer"&gt;Owen Byrne&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/12172"&gt;&lt;span class="summary"&gt;Using Widget Syndication for Online Marketing and Measurement&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3158"&gt;&lt;span class="organizer"&gt;Ed Anuff&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3613"&gt;&lt;span class="organizer"&gt;Hooman Radfar&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/10577"&gt;&lt;span class="summary"&gt;Panel: Comparing Web Application Frameworks&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/1776"&gt;&lt;span class="organizer"&gt;David A. Black&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/2785"&gt;&lt;span class="organizer"&gt;Avi Bryant&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/2936"&gt;&lt;span class="organizer"&gt;Adrian Holovaty&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3276"&gt;&lt;span class="organizer"&gt;Dustin Whittle&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3308"&gt;&lt;span class="organizer"&gt;Jeremy Kemper&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/12169"&gt;&lt;span class="summary"&gt;Creating Offline Web Applications Within the Browser&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/2970"&gt;&lt;span class="organizer"&gt;Brad Neuberg&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/i&gt;&lt;/span&gt;&lt;div class="vevent"&gt; &lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/13471"&gt;&lt;span class="summary"&gt;Web-scale Computing:  Building Low-cost, Scalable Apps with Web Services&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3068"&gt;&lt;span class="organizer"&gt;Don MacAskill&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3315"&gt;&lt;span class="organizer"&gt;Mike Culver&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3431"&gt;&lt;span class="organizer"&gt;Chad Walters&lt;/span&gt;&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/11218"&gt;&lt;span class="summary"&gt;Reality Bites: The Future of Gaming + Virtual Worlds 2.0&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/1703"&gt;&lt;span class="organizer"&gt;Joichi Ito&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/2273"&gt;&lt;span class="organizer"&gt;Raph Koster&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/2948"&gt;&lt;span class="organizer"&gt;Susan Wu&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3294"&gt;&lt;span class="organizer"&gt;Craig Sherman&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3404"&gt;&lt;span class="organizer"&gt;Ginsu Yoon&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3512"&gt;&lt;span class="organizer"&gt;Lane Merrifield&lt;/span&gt;&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:78%;"&gt;&lt;a class="url" href="http://www.web2expo.com/cs/webex2007/view/e_sess/13331"&gt;&lt;span class="summary"&gt;The Social Media Revolution: You Oughta Be in Pictures (and Podcasting, and Vlogging)&lt;/span&gt;&lt;/a&gt;&lt;i&gt;      &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3049"&gt;&lt;span class="organizer"&gt;Robert Scoble&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3363"&gt;&lt;span class="organizer"&gt;Jeremiah Owyang&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3407"&gt;&lt;span class="organizer"&gt;Chris Pirillo&lt;/span&gt;&lt;/a&gt;,       &lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/3408"&gt;&lt;span class="organizer"&gt;Thomas Hawk&lt;/span&gt;&lt;/a&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;sessions.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;It was a great density of IT stars and it seems everyone knows each other in "the valley".I expected to find a lot of buzz around AJAX, RIA and micro buzzwords like these, but in fact I got my "macro view" on web 2.0 consolidated.&lt;br /&gt;&lt;br /&gt;Web 2.0 bubble is a lot about social trends and RSS. Exposing the API of your web applications, exposing services and letting the user build upon your online web framework is one of the current directions. Ebay wants to expose it's entire API in a fashion that would replicate the original experience, more: it would host your applications based on their API in their own grid.&lt;br /&gt;&lt;/div&gt;Bringing the web applications on the desktop and enabling users to work offline is one of the next steps and Adobe's Apollo got quite a buzz.&lt;br /&gt;&lt;br /&gt;I found the Amazon Web Services S3 and EC2 to be really neat and &lt;i&gt;&lt;a href="http://www.web2expo.com/cs/webex2007/view/e_spkr/1848"&gt;&lt;span class="organizer"&gt;Jeffrey P. Bezos's&lt;/span&gt;&lt;/a&gt;&lt;/i&gt; keynote was great.&lt;br /&gt;&lt;br /&gt;The new Web 2.0 LEGO looks pretty original and real.&lt;br /&gt;Also, many of the web 2.0 applications, in real life, are as useful as a LEGO toy: they cultivate your imagination, they are fun but useless for anything else.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/clehene/sets/72157600084523540/"&gt;Web20Expo in pictures&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-8940020507532130288?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/8940020507532130288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=8940020507532130288' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/8940020507532130288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/8940020507532130288'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2007/04/web-20-expo-and-new-lego.html' title='Web 2.0 Expo and the new LEGO'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-752372972140942800</id><published>2006-12-11T08:26:00.000-08:00</published><updated>2007-01-20T07:35:50.410-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='path coverage'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='NCover'/><category scheme='http://www.blogger.com/atom/ns#' term='VSTS'/><category scheme='http://www.blogger.com/atom/ns#' term='MbUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='code coverage'/><category scheme='http://www.blogger.com/atom/ns#' term='branch coverage'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>100%  is just not enough. TDD chapters</title><content type='html'>&lt;div style="text-align: justify;"&gt;Frequently Unit Testing with Code Coverage is horribly overrated by enthusiastic IT professionals.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;The real life context&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Last week I was invited to attend a 3 days introductory Visual Studio Team System seminar at Microsoft. It briefly highlighted a few aspects of both Agile and Formal methodologies from &lt;a href="http://www.microsoft.com/technet/itsolutions/msf/default.mspx"&gt;Microsoft Solutions Framework&lt;/a&gt; point of view. Then we were shown some VSTS demos, VSTS capabilities - all the nice bells ans whistles.&lt;br /&gt;&lt;br /&gt;Talking about TDD capabilities we got to unit tests code coverage. It all sounded nice until the question:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Coverage!... nice! What kind of coverage?"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Well, code coverage. You see, when you create unit tests this tool lets you analyze which parts of the code are really executed and which aren't - and you get a percent stating the amount of code that is covered by unit tests." &lt;/span&gt;- answered the trainer.&lt;br /&gt;&lt;br /&gt;It was nice: it had code highlights of the exercised code... But still: What kind of coverage?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Statement Coverage, Branch Coverage, Path Coverage?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a difficult question with a simple answer: It's statement coverage. Well, a little more: block coverage. Rely on statement coverage and you're toasted!&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;Let me clear things up:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Statement (Line) Coverage&lt;/span&gt; measures the lines of code that have been exercised - if you have a 10 line piece of code and a test runs using 6 of them then you'd get a 60% line coverage.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Branch (or Conditional) Coverage&lt;/span&gt; measures evaluation points coverage (such as boolean expressions). If you had an &lt;span style="font-family:courier new;"&gt;if (a&lt;b)&gt; expression and tested it using (3,2) for a and b and (4,1) for c and d you'd get 25% conditional coverage.&lt;br /&gt;&lt;/b)&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Path Coverage&lt;/span&gt; measures the coverage out of all the possible paths in the code graph - from a sequence of execution point of view.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;hr /&gt;&lt;br /&gt;Back to office a colleague tells me pretty intrigued:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"That tool reports wrongly: It says 100% coverage and I KNOW it's not 100%"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The "user story" sounded like this:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-style: italic;"&gt;"An user can delete an x_event if the user has access to X functionality and the x_event is in one of the following phases: P1 or P2 or P3"&lt;/span&gt; (out of 9 possible phases: P1, P2, ..., P9)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I saw several unit tests that looked something like this example:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;font-size:85%;"  &gt;public boolean CanDeleteX_event(User user, X_event event) {&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;&lt;span style="font-size:85%;"&gt;...&lt;br /&gt;if (user.HasAccessToApplication(X) &amp;&amp;amp;&lt;br /&gt;(event.phase == P1 || event.phase == P2 || event.phase == P3)&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;This can be simplified to the boolean expression:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;X AND(P1 OR P2 OR P3)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;It was fine, but the coverage tool only reported statement coverage.&lt;br /&gt;I told him how I believed the test should look like&lt;br /&gt;&lt;ul&gt;&lt;li&gt;test for X and P1 (positive)&lt;/li&gt;&lt;li&gt;test for non X and P1 (negative)&lt;/li&gt;&lt;li&gt;test for X and P2 (positive)&lt;/li&gt;&lt;li&gt;test for X and P3 (positive)&lt;/li&gt;&lt;li&gt;test for X and P4 (negative)&lt;/li&gt;&lt;li&gt;test for non X and P4 (negative)&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;But how much should we get covered by unit tests?&lt;br /&gt;&lt;/span&gt;The statement coverage is 100% after first unit test. Clearly not enough. 100% conditional coverage would be a lot of unit tests for a simple thing. 18 to be more exactly(3 positives and 15 negatives):  X  with each of the 9 phases and non X with each of the 9 phases.&lt;br /&gt;&lt;br /&gt;What if I have a bigger expression? 100% conditional coverage by unit tests might turn unpractical.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"You don' need to cover every possible combination" &lt;/span&gt;- I told him.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"What if, by mistake, P7 = P3? X and P7 is not tested to be negative and you'd have a bug!" - &lt;/span&gt;&lt;span&gt;he asks.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Well, you could create a test fixture for phases to validate that each phase is what it's supposed to be, but you don't need to validate them here because it's outside of the scope of this functionality - such an error should be discovered within the test fixture for phases." &lt;/span&gt;&lt;span&gt;- I replied.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"What if, by mistake, I write the code this way:&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 102, 102);font-family:courier new;" &gt;X AND (P1 OR P2 OR P3 OR P7)&lt;/span&gt;?&lt;br /&gt;Now all the unit tests are green even if the code is wrong."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This one was trickier... I was really wondering how much testing should there be done in fact? 100% conditional coverage is a lot of work and an answer like this wouldn't bring any smile ever...&lt;br /&gt;Then I realized:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Well think about how TDD is supposed to be:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;You take the story first:"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:100%;" &gt;"[...] the user must have access to X functionality and the event must be in one of the following phases: P1 or P2 or P3"&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;/span&gt;(out of 9 possible phases)&lt;br /&gt;&lt;br /&gt;The process should be red-green-refactor for each little property:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;- "the user must have access to functionality X"&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;you write the test for this&lt;/li&gt;&lt;li&gt;you run it to see it failing&lt;/li&gt;&lt;li&gt;you implement just enough to compile (the test should fail)&lt;/li&gt;&lt;li&gt;you implement just enough to make the test pass&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;( return true if the user has access to X)&lt;/li&gt;&lt;li&gt;you move on&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center; font-style: italic;"&gt;"...the event must be in one of the phases P1 or P2 or P3"&lt;/div&gt;&lt;ul&gt;&lt;li&gt;repeat the steps above for P1 and you get the following boolean expressions:&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: center;"&gt;&lt;span style="color: rgb(102, 102, 102); font-weight: bold;font-family:courier new;" &gt;X AND P1&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;then&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold; color: rgb(102, 102, 102);font-family:courier new;" &gt;X AND (P1 OR P2)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;and, finally, after the P3 test:&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center; font-family: courier new; font-weight: bold; color: rgb(102, 102, 102);"&gt;X AND (P1 OR P2 OR P3)&lt;/div&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;"Building  your code incrementally using small steps, writing a test before each step makes it impossible to get to:&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold; color: rgb(102, 102, 102);font-family:courier new;" &gt;X AND (P1 OR P2 OR P3 OR P7)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-style: italic;"&gt; because that would imply to have a positive test for X and P7 which you don't."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Are we there yet?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Doing TDD will not guarantee 100% branch coverage&lt;br /&gt;but will sure mean that every single piece of code has a test behind and you won't end up with **extras** so you won't need to exaggerate with unit testing and still get a pretty defensive coding.&lt;br /&gt;&lt;br /&gt;Unit tests should be written after user story requirements not after code. So you end up with the following dependencies:&lt;br /&gt;&lt;br /&gt;Requirements have depending unit tests that have depending implemented functionalities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2688686657011973469-752372972140942800?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/752372972140942800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=752372972140942800' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/752372972140942800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/752372972140942800'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2006/12/100-is-just-not-enough-tdd-chapters_11.html' title='100%  is just not enough. TDD chapters'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2688686657011973469.post-974132841493225819</id><published>2006-11-24T15:11:00.000-08:00</published><updated>2006-11-25T01:12:52.569-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>Blogging .Communication need or Marketing?</title><content type='html'>&lt;span style="font-family:verdana;"&gt;&lt;span style="font-weight: bold;"&gt;Inception&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Never thought the time frame between deciding to start a blog and the first actual post would be so long... Picking up the blog site, choosing a blog title, choosing an URL for the blog, choosing the language, the template and then struggling to write the first post...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:verdana;"&gt;The hardest part was choosing the URL because first 20 things that popped out my mind were magically "not available". One moment I had the impression that any combination of 2 or 3 English words is taken - though typing the combination in a browser would show a "page not found" - so not really taken. I really wonder who has cosmin.blogspot.com...&lt;br /&gt;&lt;br /&gt;The second big dilemma was deciding for the language: Romanian or English?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Marketing Drive&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The truth is the idea of "joelonsoftware.com" is appealing. Beside that: having a place like a store display one could use to "market" himself - make a brand out of it's own name and then being able to "promote" others, getting revenue out of it - no matter if adsense or just higher traffic on promotions. Greedy image, isn't it?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Communication&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I find it as a good place to turn my beliefs in statements and then to debate them. A selfish need to publish my own monologues based on my own view over how things are. A place to build my own sandcastle with my own toys - turn my ideas into the shapes I imagine.&lt;br /&gt;&lt;br /&gt;Good Night.&lt;br /&gt;&lt;br /&gt;&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/2688686657011973469-974132841493225819?l=cosminlehene.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cosminlehene.blogspot.com/feeds/974132841493225819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2688686657011973469&amp;postID=974132841493225819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/974132841493225819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2688686657011973469/posts/default/974132841493225819'/><link rel='alternate' type='text/html' href='http://cosminlehene.blogspot.com/2006/11/blogging-communication-need-or.html' title='Blogging .Communication need or Marketing?'/><author><name>Cosmin Lehene</name><uri>http://www.blogger.com/profile/09239615924983676181</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='21' src='http://1.bp.blogspot.com/_npdbzVokGyc/SvVxF2faJfI/AAAAAAAAAHo/_pGZf8pre3o/s1600-R/n725867550_681098_4154.jpg'/></author><thr:total>0</thr:total></entry></feed>
