<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Nico de Wet</title>
	<atom:link href="http://nicodewet.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://nicodewet.com</link>
	<description>Nico&#039;s thoughts on business, software and more</description>
	<lastBuildDate>Thu, 23 Feb 2012 19:53:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='nicodewet.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/6c97c13a7b730da2fa2cd532a109d63c?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Nico de Wet</title>
		<link>http://nicodewet.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://nicodewet.com/osd.xml" title="Nico de Wet" />
	<atom:link rel='hub' href='http://nicodewet.com/?pushpress=hub'/>
		<item>
		<title>Be sure to perform dependency validation using the Spring container&#8217;s initialization callback mechanism</title>
		<link>http://nicodewet.com/2012/02/23/be-sure-to-perform-dependency-validation-using-the-spring-containers-initialization-callback-mechanism/</link>
		<comments>http://nicodewet.com/2012/02/23/be-sure-to-perform-dependency-validation-using-the-spring-containers-initialization-callback-mechanism/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 19:53:25 +0000</pubDate>
		<dc:creator>nicodewet</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[IoC container]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://nicodewet.com/?p=538</guid>
		<description><![CDATA[Ala JavaSpecialists&#8217; newsletter, this post comes to you from the beautiful Kuils River region of greater Cape Town, also known as the Kuils Riviera. Here you are reminded that to some &#8220;life is not a beach&#8221;, in particular when passing by the local township where dismal poverty and a hand to mouth existance reigns. On [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=538&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div id="attachment_548" class="wp-caption alignleft" style="width: 356px"><a href="http://nicodewet.files.wordpress.com/2012/02/nicodewet-com_spring_container.jpg"><img class="size-full wp-image-548  " title="Spring Container In The Real World" src="http://nicodewet.files.wordpress.com/2012/02/nicodewet-com_spring_container.jpg?w=600" alt=""   /></a><p class="wp-caption-text">A Spring Container In The Real World</p></div>
<p>Ala <a href="http://www.javaspecialists.eu/">JavaSpecialists&#8217; newsletter</a>, this post comes to you from the beautiful <a href="http://en.wikipedia.org/wiki/Kuils_River">Kuils River</a> region of greater Cape Town, also known as the <em>Kuils Riviera</em>. Here you are reminded that to some &#8220;life is not a beach&#8221;, in particular when passing by the local township where dismal poverty and a hand to mouth existance reigns.</p>
<p>On that note, lets dive straight into the subject matter of this post, performing the most basic validation in your Spring beans to quickly <strong>detect stupid mistakes</strong>.</p>
<p>Now, as a Spring user you have a number of options when it comes to configuring dependencies you wish to have injected into a given bean. You can use autowiring, which itself has further options, such as autowiring by type or name, or you can use xml configuration with explicit bean references. Regardless of what you use, it pays to use the Spring container&#8217;s initialization callback mechanism to avoid or easily detect basic mistakes that can easily eat up hours of development time. This entails validating your dependencies, at the very least in terms of whether they are null or not, in a consistent fashion in any given project.</p>
<p>Lets first get onto an example of such a basic mistake, in which a suspected wiring configuration error, which turned out to be a programmer error, cost precious time, and then move onto what do to, consistently, to avoid future similar wasteage.</p>
<p><strong>BEFORE</strong></p>
<p>Herewith a class under test, note the @Autowired bean <i>propertyService</i>.</p>
<p><pre class="brush: java;">
public class ConfigServiceImpl implements ConfigService {

    @Autowired
    @Qualifier(&quot;propertyServiceBean&quot;)
    protected PropertyService propertyService;

    // NO INIT METHOD

...
}
</pre></p>
<p>Here is <strong>the stupid mistake</strong>.</p>
<p><pre class="brush: java;">
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {&quot;/com/mayloom/activiti/config/spring-context.xml&quot;})
public class ConfigServiceTest {

   @Autowired
   private ConfigService configService;

   @Test
   public void updateConfiguration() {

      ConfigService configService = new ConfigServiceImpl(); // This line must be removed

      Properties props = configService.getProperties();
</pre></p>
<p>The mistake is the programmer is autowiring the configService yet also instatiating it. The latter renders Autowiring of dependencies in <i>configService</i> as useless, the entire line must be removed. It could be that this was a class that was later turned into a Spring bean, so just an oversight.</p>
<p>This the the result of the mistake, or at least a snippet of the surefire report showing the offending <strong>NullPointerException</strong>.</p>
<p><pre class="brush: java;">
-------------------------------------------------------------------------------
Test set: com.mayloom.config.ConfigServiceTest
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.282 sec &lt;&lt;&lt; FAILURE!
updateConfiguration(com.mayloom.config.ConfigServiceTest)  Time elapsed: 0.266 sec  &lt;&lt;&lt; ERROR!
java.lang.NullPointerException
	at com.mayloom.config.ConfigServiceImpl.getProperties(ConfigServiceImpl.java:72)
</pre></p>
<p>Now, if you had been making various Spring configuration changes in your project, and you see the above, one could start thinking that a wiring configuration error is the cause and waste hours reconfiguring and basically looking in the wrong place, even though the mistake made is quite obvious to us now.</p>
<p><b>AFTER</b></p>
<p>To quickly rule out wiring errors as a cause, in this case, and in general, all one has to do is to check that wired dependencies are not null as shown in the <a href="http://static.springsource.org/spring/docs/3.0.0.RELEASE/reference/html/beans.html#beans-factory-lifecycle-default-init-destroy-methods">Default initialization and destroy methods</a> section of the Spring manual.</p>
<p>So, we would end up with the pertitent section of our spring configuration looking as as shown below, with the <b>default-init-method</b> being what we want to include.</p>
<p><pre class="brush: xml;">
&lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
       xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
       xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
		   http://www.springframework.org/schema/context/spring-context-3.0.xsd&quot; default-init-method=&quot;init&quot;&gt;
</pre></p>
<p>Next, we&#8217;ll update ConfigServiceImpl as shown below.</p>
<p><pre class="brush: java;">
public class ConfigServiceImpl implements ConfigService {
	
  @Autowired
  @Qualifier(&quot;propertyServiceBean&quot;)
  protected PropertyService propertyService;
	
  // this is (unsurprisingly) the initialization callback method
  public void init() {
    	log.info(&quot;==================== ConfigServiceImpl =========================&quot;);
        if (this.propertyService == null) {
            throw new IllegalStateException(&quot;The [propertyService] property must be set.&quot;);
        }
    }
</pre></p>
<p>Thats pretty much it, no advanced concurrency lesson here, no generics to marvel at, but it may save you time.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nicodewet.wordpress.com/538/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nicodewet.wordpress.com/538/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nicodewet.wordpress.com/538/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nicodewet.wordpress.com/538/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nicodewet.wordpress.com/538/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nicodewet.wordpress.com/538/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nicodewet.wordpress.com/538/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nicodewet.wordpress.com/538/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nicodewet.wordpress.com/538/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nicodewet.wordpress.com/538/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nicodewet.wordpress.com/538/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nicodewet.wordpress.com/538/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nicodewet.wordpress.com/538/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nicodewet.wordpress.com/538/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=538&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nicodewet.com/2012/02/23/be-sure-to-perform-dependency-validation-using-the-spring-containers-initialization-callback-mechanism/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17b88a67f6e771cf9b41fcfffdc917e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nicodewet</media:title>
		</media:content>

		<media:content url="http://nicodewet.files.wordpress.com/2012/02/nicodewet-com_spring_container.jpg" medium="image">
			<media:title type="html">Spring Container In The Real World</media:title>
		</media:content>
	</item>
		<item>
		<title>java.lang.OutOfMemoryError: unable to create new native thread</title>
		<link>http://nicodewet.com/2012/02/05/java-lang-outofmemoryerror-unable-to-create-new-native-thread/</link>
		<comments>http://nicodewet.com/2012/02/05/java-lang-outofmemoryerror-unable-to-create-new-native-thread/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 20:27:24 +0000</pubDate>
		<dc:creator>nicodewet</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://nicodewet.com/?p=529</guid>
		<description><![CDATA[If you&#8217;ve been spending too much time dealing with higher level business logic, it&#8217;s easy to start losing touch with JVM performance tuning, and the OS in general. A recent bout of java.lang.OutOfMemoryError: unable to create new native thread forced me to spend some time initially barking up the wrong tree, and then fixing it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=529&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve been spending too much time dealing with higher level business logic, it&#8217;s easy to start losing touch with JVM performance tuning, and the OS in general. A recent bout of <em>java.lang.OutOfMemoryError: unable to create new native thread</em> forced me to spend some time initially barking up the wrong tree, and then fixing it by brute force.</p>
<p><strong>Brute Force Fix</strong></p>
<p>To get onto the fix first. All I needed to do was to configure the nproc settings for the user in question (it happened to be jenkins) upwards in /etc/security/limits.conf</p>
<p><strong>Playing</strong></p>
<p>Before getting onto the most obvious fix, I went off on a tangent and refreshed my memory on the effects of the heap size, permanent generation size, thread stack  size and other related topics (the bash based thread count script is a work in progress). A simple program to help you determine how many threads you can create can be found below if you are also keen on experimentation.</p>
<p><pre class="brush: java;">
public class RunOutOfMemory {
	
/**
* Results
* 
* ==== Environment: 32bit Win 7, 2GB RAM, Java 7 ====
* 
* Reducing the default maximum thread stack size allows more of the process' virtual 
* memory address space to be used by the Java heap and vice-versa.
* 
* Note, when it comes to virtual memory usage consumed by the jvm process, we are 
* not including the heap and permanent generation allocation.
* 
* Test: 1. ALL VM arguments at default values: OutOfMemory with 3974 threads = 
*                                                       1238 MB (320k / thread)
* 	2. -Xss1m, rest VM arguments at default values: OutOfMemory with 1211 threads 
*                                                                           = 1211 MB  
* 	3. -Xss2m, rest VM arguments at default values: OutOfMemory with 533 threads 
*                                                                           = 1066 MB
*       4. -Xss128k, rest VM arguments at default values: OutOfMemory with 10358 threads 
*                                                                           = 1294 MB
* 
* &quot;On Windows, the default thread stack size is read from the binary (java.exe). As of 
* Java SE 6, this value is 320k in the 32-bit VM and 1024k in the 64-bit VM.&quot; oracle.com
* 
* ==== Linux ====
* 
* NOTE: Pay close attention to your limits configured in /etc/security/limits.conf You 
* may want to adjust the nproc setting for your process upwards if you are seeing a 
* &quot;cannot create native thread&quot; message
*/
		public static void main(String[] pArgs) {

			try {
				// keep spawning new threads forever
				while (true) {
					// thread begins execution, JVM calls run method of this new thread
					new TestThread().start();
				}
			} catch (java.lang.OutOfMemoryError e ) {
    	  
				// when out of memory error is reached, print out the number of
				// successful threads spawned and exit
				System.out.println(TestThread.CREATE_COUNT);
				System.exit(-1);
			}
		}

		
		static class TestThread extends Thread {
			
			private static int CREATE_COUNT = 0;
			
			public TestThread() {
				CREATE_COUNT++;
			}
			
			// make the thread wait for eternity after being spawned
			public void run() {
				this.suspend();
			}
		}
}
</pre></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nicodewet.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nicodewet.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nicodewet.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nicodewet.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nicodewet.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nicodewet.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nicodewet.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nicodewet.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nicodewet.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nicodewet.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nicodewet.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nicodewet.wordpress.com/529/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nicodewet.wordpress.com/529/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nicodewet.wordpress.com/529/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=529&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nicodewet.com/2012/02/05/java-lang-outofmemoryerror-unable-to-create-new-native-thread/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17b88a67f6e771cf9b41fcfffdc917e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nicodewet</media:title>
		</media:content>
	</item>
		<item>
		<title>Fedora 16 on Pimped Up Sony Vaio Y Series</title>
		<link>http://nicodewet.com/2011/11/27/fedora-16-on-pimped-up-sony-vaio-y-series/</link>
		<comments>http://nicodewet.com/2011/11/27/fedora-16-on-pimped-up-sony-vaio-y-series/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 13:11:58 +0000</pubDate>
		<dc:creator>nicodewet</dc:creator>
				<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://nicodewet.com/?p=515</guid>
		<description><![CDATA[This post is a brief report, that is to be updated over time, of my experiences of the Sony Vaio Y Series laptop, pimped up with a 64GB SSD, with Fedora 16 in the driving seat. The overal goal was to have a laptop that can be used as a highly portable software development environment. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=515&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://nicodewet.files.wordpress.com/2011/11/logo_fedoralogo.png"><img class="alignleft  wp-image-517" style="border:5px solid white;" title="Logo_fedoralogo" src="http://nicodewet.files.wordpress.com/2011/11/logo_fedoralogo.png?w=360&#038;h=109" alt="" width="360" height="109" /></a>This post is a brief report, that is to be updated over time, of my experiences of the <a href="http://www.sony.co.za/product/vpcyb35ag">Sony Vaio Y Series</a> laptop, pimped up with a 64GB SSD, with Fedora 16 in the driving seat. The overal goal was to have a laptop that can be used as a highly portable software development environment.</p>
<p>I came across the Vaio Y Series in the aftermath of a botched laptop upgrade. It all started in an effort to enhance the battery life of the old chunky beast, without too much thought I  recently went out and bought a 64GB <a href="http://www.kingston.com/ukroot/ssd/v100.asp">Kingston SSDNow V100</a>, downloaded the freshly released Ubuntu 11.11 ISO and went to work. Sadly the laptop was in such a sad state that it didn&#8217;t work out, so I went out and bought a 32 bit Sony Vaio Y Series laptop (VPCYB35AG) which  had fairly decent reviews in terms of battery life, and I absolutely loved the size and 11.6 inch HD screen.</p>
<p>I started by backing up the Windows 7 Starter edition OS onto a 16GB flash drive, and then swapped drives, the reason for the backup to flash drive, in addition to the OS already on the 320GB drive that came with the laptop, was incase there wasn&#8217;t sufficient driver support for the Vaio and I had to use Windows 7. I wanted to avoid the latter since I don&#8217;t regard Windows as a suitable development environment for server-side development, which is what I specialize in. Kudos to Sony when it comes to their recovery process, I tested Windows 7 recovery on the SSD, just to be sure that it would work, and it was all effortless.</p>
<p>In any case, having tested the laptop without linux, I got round to creating a bootable Fedora 16 USB key and installed onto the SDD. The first attempt failed, I do not know why, so I just repeated the process. Second time round it worked just fine.</p>
<p>The first challenge was getting used to Gnome 3 and also inconsistent boot behaviour that may be related to the next generation InsydeH20 UEFI BIOS and GRUB2. On the inconsistent boot behaviour, that may have been caused by me leaving on the &#8220;boot from external device&#8221; option in InsydeH20, I am uncertain. With regards to Gnome 3, so far I&#8217;m just getting used to it, and I like it, in any case, I am not too concerned with such details right now, its driver support that I&#8217;m concerned with, I just want the laptop to work in terms of the basics. Overall, right now I&#8217;d say I&#8217;m enjoying the experience, and given that all I&#8217;ve done to date is to &#8220;yum update&#8221;, the existing driver support is sufficient to get to work. So I&#8217;m generally happy. I&#8217;ll update this post in a couple of weeks time, once the laptop has seen more use.</p>
<p><strong>Update 28 Nov 2011</strong></p>
<p>Installed the latest official ATI Catalyst driver (11.11), and Gnome 3 immediately reverted to &#8220;fallback mode&#8221;, which in terms of usability seems a fairly serious regression. Rather the vent online, contacted AMD via their web form for support, this is the request:</p>
<p><em>Hi there,</em></p>
<p><em>I have purchased a Sony Vaio VPCYB35AG with an AMD E-450 APU (by the way your web form only gives an option for the E-350) and installed Fedora 16 with comes with Gnome 3.</em></p>
<p><em>I then installed the Catalyst ATI driver (ati-driver-installer-11-11-x86.x86_64.run). Rather than improving matters, it made it worse and so I researched what might be going wrong.</em></p>
<p><em>In any case, as far as I can tell (please see http://ati.cchtml.com/show_bug.cgi?id=99), AMD is aware of a Graphical corruption issues pertaining to the gnome-shell, but has not done anything about it.</em></p>
<p><em>Please can you let me know whether AMD is attending to this issue. I am sure there are thousands of affected linux users.</em></p>
<p><em>Regards,</em><br />
<em>Nico</em></p>
<p>As a parting comment, I wish I could just pay Sony, or whoever else, to give me a glitch free system. In any case, lets see what AMD says.</p>
<p><strong>Update 3 Dec 2011</strong></p>
<p>Given that I had little confidence in getting a satisfactory response from AMD, I reloaded Windows 7 and have been using it for the last few days. I&#8217;m now back to 4.5 hours battery life, instead of the 2.5 on Fedora 16. So, this brings, sadly, an end to my attempt to get any linux distribution going on my Vaio.</p>
<p>I did receive the following response from AMD 2 Dec 2011, which does not inspire confidence, as it does not help me. I would have been willing to pay for a working driver.</p>
<p><em><span style="font-family:Calibri;">We do not officially support GNOME3, since none of our supported distributions use it by default. Unbuntu 11.10 is the first one to ship with this product, but it does not use Gnome3 by default.</span></em></p>
<p><em><span style="font-family:Calibri;">Our OpenGL team is currently aware of the issue, plans may be in place to support it later on but there is no official word as of yet. </span></em></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nicodewet.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nicodewet.wordpress.com/515/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nicodewet.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nicodewet.wordpress.com/515/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nicodewet.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nicodewet.wordpress.com/515/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nicodewet.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nicodewet.wordpress.com/515/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nicodewet.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nicodewet.wordpress.com/515/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nicodewet.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nicodewet.wordpress.com/515/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nicodewet.wordpress.com/515/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nicodewet.wordpress.com/515/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=515&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nicodewet.com/2011/11/27/fedora-16-on-pimped-up-sony-vaio-y-series/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17b88a67f6e771cf9b41fcfffdc917e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nicodewet</media:title>
		</media:content>

		<media:content url="http://nicodewet.files.wordpress.com/2011/11/logo_fedoralogo.png" medium="image">
			<media:title type="html">Logo_fedoralogo</media:title>
		</media:content>
	</item>
		<item>
		<title>Book Review: The Net Delusion &#8211; How Not To Liberate The World</title>
		<link>http://nicodewet.com/2011/10/02/book-review-the-net-delusion-how-not-to-liberate-the-world/</link>
		<comments>http://nicodewet.com/2011/10/02/book-review-the-net-delusion-how-not-to-liberate-the-world/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 14:03:48 +0000</pubDate>
		<dc:creator>nicodewet</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://nicodewet.com/?p=495</guid>
		<description><![CDATA[The Net Delusion &#8211; How Not To Liberate The World, by Evgeny Morozov, is an excellent read on many levels. The central concepts in the book are that of cyber-utopianism  a naive belief in the emancipatory nature of online communication that rests on a stubborn refusal to acknowledge its downside and Internet-centrism a philosophy of [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=495&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://nicodewet.files.wordpress.com/2011/10/nicodewet-com_net_delusion1.jpg"><img class="alignleft size-medium wp-image-504" style="border:4px white;" title="nicodewet.com_net_delusion" src="http://nicodewet.files.wordpress.com/2011/10/nicodewet-com_net_delusion1.jpg?w=209&#038;h=300" alt="" width="209" height="300" /></a><a href="http://www.amazon.co.uk/Net-Delusion-How-Liberate-World/dp/1846143535" target="_blank">The Net Delusion &#8211; How Not To Liberate The World</a>, by Evgeny Morozov, is an excellent read on many levels. The central concepts in the book are that of <strong><em>cyber-utopianism</em></strong></p>
<blockquote><p> a naive belief in the emancipatory nature of online communication that rests on a stubborn refusal to acknowledge its downside</p></blockquote>
<p>and <strong><em>Internet-centrism</em></strong></p>
<blockquote><p>a philosophy of action that informs how decisions, including those that deal with democracy promotion, are made and how long-term strategies are crafted.</p></blockquote>
<p>Even if you have no interest in liberating the world and promoting <a href="http://en.wikipedia.org/wiki/Democratization" target="_blank">democratization</a>, Morozov&#8217;s concepts of cyber-utopianism and Internet-centrism <strong>are equally applicable to business and personal dealings</strong> and worth reading for this reason alone. In addition, Morozov raises valid concerns regarding the dominance and power of US service providers, especially since they are not immune to US government interference and can act with impunity when it comes to a large portion of the worlds population&#8217;s sensitive personal data.</p>
<p>Finally, Morozov warns against the &#8220;digital visionaries&#8221; that are seemingly ever present nowadays in all spheres of life, with entire consultancies based on, and by definition biased towards, the virtues of tweeting, Facebooking and advertising online. Such online social visionaries bring back memories of the <a href="http://en.wikipedia.org/wiki/Dot-com_bubble" target="_blank">Dot-com bubble</a>, except this time its the <strong>Dot-social bubble</strong>. A memorable quote in this regard:</p>
<blockquote><p>..most digital visionaries see the Web as a Swiss army knife ready for any job at hand. They rarely alert us to the information black-holes creates by the Internet, from the sprawling surveillance apparatus facilitated by the public nature of social neworking to the persistence of myth making and propaganda, which is much easier to produce and distribute in a world where every fringe movement blogs, tweets, and Facebooks.</p></blockquote>
<p>Personally, I would give the book 9/10 and recommend it as a worthy read along-side with Naomi Klein&#8217;s <a href="http://www.naomiklein.org/shock-doctrine" target="_blank">The Shock Doctrine</a> and <a href="http://www.naomiklein.org/no-logo" target="_blank">No Logo</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nicodewet.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nicodewet.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nicodewet.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nicodewet.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nicodewet.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nicodewet.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nicodewet.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nicodewet.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nicodewet.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nicodewet.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nicodewet.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nicodewet.wordpress.com/495/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nicodewet.wordpress.com/495/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nicodewet.wordpress.com/495/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=495&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nicodewet.com/2011/10/02/book-review-the-net-delusion-how-not-to-liberate-the-world/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17b88a67f6e771cf9b41fcfffdc917e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nicodewet</media:title>
		</media:content>

		<media:content url="http://nicodewet.files.wordpress.com/2011/10/nicodewet-com_net_delusion1.jpg?w=209" medium="image">
			<media:title type="html">nicodewet.com_net_delusion</media:title>
		</media:content>
	</item>
		<item>
		<title>Java Exception Rule Book</title>
		<link>http://nicodewet.com/2011/10/02/java-exception-rule-book/</link>
		<comments>http://nicodewet.com/2011/10/02/java-exception-rule-book/#comments</comments>
		<pubDate>Sun, 02 Oct 2011 09:52:22 +0000</pubDate>
		<dc:creator>nicodewet</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[exceptions]]></category>
		<category><![CDATA[best practice]]></category>
		<category><![CDATA[joshua bloch]]></category>

		<guid isPermaLink="false">http://nicodewet.com/?p=396</guid>
		<description><![CDATA[This post consists of a briefly outlined set of Java Exception rules, or best practices, with an accompanying look at rule compliance using specific transient network and database layer Exceptions. The rules are based on the relevant rules from Joshua Bloch&#8217;s lauded and highly recommended Effective Java, 2nd Edition. Bloch is arguably the authority on [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=396&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://nicodewet.files.wordpress.com/2011/08/nicodewet-com_exceptions.jpg"><img class="alignleft size-medium wp-image-397" title="Java Exceptions Illustrated With Exceptional Fruit" src="http://nicodewet.files.wordpress.com/2011/08/nicodewet-com_exceptions.jpg?w=300&#038;h=200" alt="" width="300" height="200" /></a><strong></strong></p>
<p>This post consists of a briefly outlined set of Java Exception rules, or best practices, with an accompanying look at rule compliance using specific transient network and database layer Exceptions.</p>
<p>The rules are based on the relevant rules from Joshua Bloch&#8217;s lauded and highly recommended <a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683">Effective Java, 2nd Edition</a>. Bloch is arguably the authority on the subject, and his legacy includes being listed as author of the Sun JDK <a href="http://download.oracle.com/javase/6/docs/api/java/lang/Throwable.html">Throwable</a> implementation (see @author in the source code).</p>
<h2><strong>RULE BOOK<br />
</strong></h2>
<p>The author has violated these rules hundreds if not thousands of times over the last decade. As a mitigating factor it can be argued that the rules in themselves represent exception utopia, and so, it is highly unlikely that they will all be consistently followed in any given code base, or put differently, that even with the best of intentions any software engineer will follow all of them due to say project timeline pressures.</p>
<p>Such pressure may however be a symptom of not asserting one&#8217;s own standards when a unit of work or project commences, to alleviate pressure one can always <em>clearly communicate one&#8217;s own non negotiable engineering standards</em> at the start of a project.</p>
<p><strong>Rule 1: Never use exceptions for ordinary control flow</strong></p>
<p><pre class="brush: java;">
import java.util.ArrayList;
import java.util.Iterator;

/**
* Do not, use Exceptions for flow control, this is an example of what not to do.
*
* @author nico
*/
public class DontUseExceptionsForFlowControl {

 public static void main(String[] args) {

   ArrayList list = new ArrayList();

   list.add(&quot;hello world&quot;);

   // Let's to the wrong thing, and jump out of this loop with an iterator related
   // Exception...

   Iterator iter = list.iterator();

   while(true) {

     try {

       System.out.println(iter.next());

     } catch (java.util.NoSuchElementException e) {

        // Using Exception for flow control, so can safely ignore this one.
        // TODO Stop using Exceptions for flow control.
     }

   }

  }

}
</pre></p>
<p>Using Exceptions for ordinary control flow violates the <a href="http://c2.com/cgi/wiki?PrincipleOfLeastAstonishment" target="_blank">Principle of Least Astonishmen</a>t which states <em>&#8220;the result of performing some operation should be obvious, consistent, and predictable, based upon the name of the operation and other clues&#8221;</em>.</p>
<h3><strong>Rule 2: Never write APIs that force others to use Exceptions for ordinary control flow</strong></h3>
<p><pre class="brush: java;">
/**
* Database layer API, implementation detail agnostic.
*/
public interface EmailDatabaseHelper {

 // TODO refactor, this forces the user to catch checked exception EmailDoesNotExistException, with an email
 // address not existing being in no way exceptional, and hence in ordinary control flow
 public void doesEmailExist(String email) throws EmailDoesNotExistException;
}
</pre></p>
<h3><strong>Rule 3: Use runtime exceptions for programmer errors and checked exceptions where recovery is possible</strong></h3>
<p>Note that this rule does not state, as you may expect, that you must use unchecked exceptions for programmer errors, since that casts too wide a net. Unchecked throwables include runtime exceptions and errors, with the latter conventionally reserved for JVM error reporting under conditions where continued execution is impossible.</p>
<h3><strong>Rule 4: When uncertain as to whether a condition is recoverable or not, use an unchecked exception</strong></h3>
<p>The reasoning behind this is simple, if you do not know how an API user will recover from the checked exception, do not place the burden on the API user in terms of trying to figure out how, and potentially wasting time concluding that its not possible.</p>
<h3><strong>Rule 5: Only use checked exceptions if the API user can take action to recover from the said exception</strong></h3>
<p>If the only course of action, that you could take, when confronted with your own checked exception, is a variation of the below example then chances are good that you should not be using a checked exception. The checked exception adds no value, so, either attempt to refactor as per Rule 6, or use an unchecked exception.</p>
<p><pre class="brush: java;">
} catch (CheckedExceptionWithNoUsefulActionPossible e) {
  logger.error(&quot;an error occurred&quot;);
  e.printStackTrace();
  System.exit(1); // or stopping the current thread
}
</pre></p>
<h3><strong>Rule 6: Refactor, where possible, checked exceptions that violate rule 5 into a state-checking method and unchecked exception</strong></h3>
<p>Before.</p>
<p><pre class="brush: java;">
try {
  ball.kick(HARD);
} catch (BallCannotBeKickedException e) {
  // recover from exceptional conditions
}
</pre></p>
<p>After. State-checking method and unchecked exception has been introduced.</p>
<p><pre class="brush: java;">
// ball will not be accessed concurrently, and so the calling sequence is safe
if (ball.isKickeable()) {
  ball.kick(HARD);
} else {
  // recover from exceptional condition
}
</pre></p>
<h3>Rule 7: Clearly document if the unrecoverability of an unchecked exception is likely to be transient in nature</h3>
<p>Certain conditions are unrecoverable at a particular instant but not permanently, and a prime example is an exception related to a lock being held on a database table on which say an update is being attempted. Methods that throw unchecked exceptions where the exception relates to a condition that may be transient in nature should document this fact, that is that the condition may be transient, and suggest a retry in the Javadoc comment associated with the unchecked exception.</p>
<h3><strong>Rule 8: Use the standard Java platform library unchecked exceptions where appropriate, do not re-invent the wheel</strong></h3>
<p>Reuse the standard Java platform library unchecked exceptions whereever possible, whilst honouring their documented semantics. A prime example is <a href="http://download.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html">IllegalArgumentException</a>. See the subclasses of <a href="http://download.oracle.com/javase/7/docs/api/java/lang/RuntimeException.html">RuntimeException</a> for further candidates.</p>
<h3><strong>Rule 9: When dealing with lower-level exceptions inappropriate to the higher-level abstraction, perform either exception translation or exception chaining</strong></h3>
<p>Exception translation.</p>
<p><pre class="brush: java;">
try {
     // lower level method invocation e.g. JPA call
} catch(LowerLevelMethodInvocationException e) {
     // now translate the lower level exception into an exception that matches
     // the higher level abstraction in our current context
     throw new HigherLevelException(...);
}
</pre></p>
<p>Exception chaining with chaining-aware contructor.</p>
<p><pre class="brush: java;">
class HigherLevelAbstractionException extends Exception {
    HigherLevelAbstractionException(Throwable cause) {
         super(cause);
    }
}
try {
     // lower level method invocation e.g. JPA call
} catch(LowerLevelMethodInvocationException e) {
     // now translate the lower level exception into an exception that matches
     // the higher level abstraction in our current context
     throw new HigherLevelAbstractionException(e); // use chaining-aware constructor
}
</pre></p>
<h3><strong>Rule 10: You MUST document all exceptions, checked and unchecked, thrown by your methods</strong></h3>
<p>Excuse the all-caps and repetition will <em>all</em> exceptions being defined, but proper documentation is in no way negotiable and is every software engineers professional responsibility. The Javadoc @throws tag must be used to document both checked and unchecked exceptions in terms of the conditions under which they will be thrown. The only difference between checked and unchecked exceptions is that you must only define checked exceptions with the <strong>throws</strong> keyword, do not include unchecked exceptions here.</p>
<h3><strong>Rule 11: Force including the values of all parameters and fields that comprise the cause of an exception in its detail message</strong></h3>
<p><strong></strong>Support personnel or fellow programmers, when faced with a stack trace in say a log file, require pertinent data in order to ascertain exactly what caused an exception. Without the values of all parameters and fields that comprised the exception, it may be impossible to reproduce an exception.</p>
<p>In terms of forcing including pertinent parameter and field data in the detail message of exception, simply do not provide a constructor that has a string parameter as detail message, rather force the user to specify the said data in the constructor.</p>
<p>Consider the following checked exception, which has accessor methods since as per Rule 5 such exceptions should be used for recoverable exceptions.</p>
<p><pre class="brush: java;">
/**
* @author Nico
*/
public class ServiceOperationException extends Exception {

private String suppliedApiKey;

/**
* Construct an ServiceOperationException.
*
* @param suppliedApiKey    the API key supplied to the service user upon successful registration
*/
public ServiceOperationException(String suppliedApiKey) {

// detail message
super(&quot;Supplied API Key: &quot; + suppliedApiKey);

// capture for recovery purposes
this.suppliedApiKey = suppliedApiKey;
}

public String getSuppliedApiKey() {
return suppliedApiKey;
}

public void setSuppliedApiKey(String suppliedApiKey) {
this.suppliedApiKey = suppliedApiKey;
}
}
</pre></p>
<h3><strong>Rule 12: Ensure that your methods are failure atomic and if not document this fact in your API<br />
</strong></h3>
<p>Methods that are failure atomic leave an object in the state it was prior to the method invocation in the event of failure. Either ensure parameters have their validity checked before proceeding to to the actual work (and modification) in a method invoked on a mutable object, or ensure the relevant class is modified to be immutable.</p>
<h3><strong>Rule 13: Never ignore exceptions</strong></h3>
<p>From time to time you may see empty catch blocks, and in the worst case, catch blocks that catch java.lang.Exception (as <a href="http://today.java.net/article/2006/04/04/exception-handling-antipatterns#catchingException" target="_blank">listed</a> in Tim McCune&#8217;s <a href="http://today.java.net/article/2006/04/04/exception-handling-antipatterns" target="_blank">Exception-Handling Antipatterns</a>) or java.lang.Throwable. This is a cardinal sin, and should never be done. At the very least, the exception should be logged (that is the entire stack trace should be logged) with an appropriate log level. In some cases, it may be justifiable to take no action, but in such cases, comments must justify why no action is taken.</p>
<h2><strong>RULE COMPLIANCE &#8211; RECOVERABLE TRANSIENT CONDITIONS<br />
</strong></h2>
<p>Some exceptions are associated with conditions that are possibly but not necessarily transient in nature, and so, when faced with them, the appropriate course of action is to automatically retry the operation. The <a href="http://static.springsource.org/spring-batch/reference/html/retry.html">Spring Batch Retry</a> mechanism is geared for exactly such exceptions.</p>
<p>In terms of the rules, Rule 3, 4, 5, 6 and 7 are applicable, given our definition of the conditions being transient, but not with absolute certainty. In other words, given the lack of certainty as to whether the condition is recoverable, an <strong>unchecked</strong> exception should be used, as per Rule 3, 4 and Rule 5. If we choose not adhere to this rule, and feel the condition is indeed recoverable, and use a <strong>checked</strong> exception, as per Rule 5, then as per Rule 6 one should refactor into an <strong>unchecked</strong> exception with an accompanying <strong>state-checking</strong> method.</p>
<p>So, in short, we should use:</p>
<ul>
<li><strong></strong>unchecked exception (if uncertain if recoverable) or if unrecoverability is a certainty</li>
</ul>
<ul>
<li><strong></strong>checked exception if recoverable</li>
</ul>
<ul>
<li><strong></strong>even better, unchecked exception with a state-checking method if recoverable</li>
</ul>
<h3><strong>Database Layer</strong></h3>
<p>Consider the following exceptions, that one may see with a Spring / JPA / Hibernate stack:</p>
<ol>
<li><a href="http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/transaction/UnexpectedRollbackException.html" target="_blank">UnexpectedRollbackException</a> (Spring)</li>
<li><a href="http://java.sun.com/javaee/5/docs/api/javax/persistence/OptimisticLockException.html" target="_blank">OptimisticLockException</a> (JPA)</li>
<li><a href="http://docs.jboss.org/hibernate/core/3.2/api/org/hibernate/exception/LockAcquisitionException.html" target="_blank">LockAcquisitionException</a> (Hibernate)</li>
</ol>
<p>The decision to make all of these unchecked exceptions complies with the rules, given that within the context of a single transaction, the underlying condition is not recoverable. Within the context of retries, and so multiple transactions, the condition may indeed be recoverable due to the transient nature of the underlying conditions (a lock on a table will most likely not be permanently held). So, methods that throw these exceptions should firstly document that they throw these exceptions with @throws Javasdoc (as per Rule 10) and then also document the fact that the user may wish to attempt retries (as per Rule 7).</p>
<h3><strong>Network Layer</strong></h3>
<p>Another example of an exception that may point to a transient condition is a <a href="http://download.oracle.com/javase/1.4.2/docs/api/java/net/SocketException.html" target="_blank">SocketException</a>, especially when considering its subclasses, <a href="http://download.oracle.com/javase/1.4.2/docs/api/java/net/BindException.html" target="_blank">BindException</a>, <a href="http://download.oracle.com/javase/1.4.2/docs/api/java/net/ConnectException.html" target="_blank">ConnectException</a>, <a href="http://download.oracle.com/javase/1.4.2/docs/api/java/net/NoRouteToHostException.html" target="_blank">NoRouteToHostException</a> and <a href="http://download.oracle.com/javase/1.4.2/docs/api/java/net/PortUnreachableException.html" target="_blank">PortUnreachableException</a>. These exceptions are all checked exceptions, and this is incorrect since at the instant an associated method was called, recovery would not necessarily be possible, that is, recovery is not a certainty, so Rule 3 is violated. Rather, as per Rule 4, the exceptions should be unchecked and the transient nature of the exceptions should be documented as per Rule 7.</p>
<h2><strong>Key References</strong></h2>
<ol>
<li>Chapter 9 of Joshua Bloch&#8217;s (the author of <a href="http://download.oracle.com/javase/7/docs/api/java/lang/Throwable.html">java.lang.Throwable</a>) <a href="http://www.amazon.com/Effective-Java-2nd-Joshua-Bloch/dp/0321356683" target="_blank">Effective Java</a>, Second Edition. <em>If you don&#8217;t own a copy, buy one, you won&#8217;t regret it.</em></li>
<li>Tim McCune&#8217;s <a href="http://today.java.net/article/2006/04/04/exception-handling-antipatterns" target="_blank">Exception-Handling Antipatterns</a></li>
</ol>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nicodewet.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nicodewet.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nicodewet.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nicodewet.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nicodewet.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nicodewet.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nicodewet.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nicodewet.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nicodewet.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nicodewet.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nicodewet.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nicodewet.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nicodewet.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nicodewet.wordpress.com/396/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=396&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nicodewet.com/2011/10/02/java-exception-rule-book/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17b88a67f6e771cf9b41fcfffdc917e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nicodewet</media:title>
		</media:content>

		<media:content url="http://nicodewet.files.wordpress.com/2011/08/nicodewet-com_exceptions.jpg?w=300" medium="image">
			<media:title type="html">Java Exceptions Illustrated With Exceptional Fruit</media:title>
		</media:content>
	</item>
		<item>
		<title>Empty if() statements in your code &#8211; keep them or dump them?</title>
		<link>http://nicodewet.com/2011/06/12/empty-if-statements-in-your-code-keep-them-or-dump-them/</link>
		<comments>http://nicodewet.com/2011/06/12/empty-if-statements-in-your-code-keep-them-or-dump-them/#comments</comments>
		<pubDate>Sun, 12 Jun 2011 18:28:00 +0000</pubDate>
		<dc:creator>nicodewet</dc:creator>
				<category><![CDATA[software]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[software engineering]]></category>
		<category><![CDATA[static code analysis]]></category>

		<guid isPermaLink="false">http://nicodewet.com/?p=372</guid>
		<description><![CDATA[When using the static Java code analysis tool PMD, one of the basic rules that you can violate is the empty if statement rule, which has a critical severity level by default. Why is there such a rule in the first place and is the critical severity level warranted? As an avid user, or abuser [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=372&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://nicodewet.files.wordpress.com/2011/06/nicodewet-com_code_analysis.jpg"><img class="alignleft size-full wp-image-373" title="G" src="http://nicodewet.files.wordpress.com/2011/06/nicodewet-com_code_analysis.jpg?w=600" alt=""   /></a></p>
<p>When using the static Java code analysis tool <a href="http://pmd.sourceforge.net/" target="_blank">PMD</a>, one of the <a href="http://pmd.sourceforge.net/rules/basic.html">basic rules</a> that you can violate is the empty if statement rule, which has a critical severity level by default. Why is there such a rule in the first place and is the critical severity level warranted? As an avid user, or abuser in terms of PMD, of empty if statements, with no clear answer, I went and trawled the web for answers.</p>
<p>To start off with, PMD does offer the following advise, in the <a href="http://pmd.sourceforge.net/bestpractices.html" target="_blank">Best Practices page</a></p>
<blockquote><p>Generally, pick the ones you like, and ignore or <a href="http://pmd.sourceforge.net/suppressing.html">suppress</a> the warnings you don&#8217;t like. It&#8217;s just a tool.</p></blockquote>
<p>In the context of the subject matter of this post, that may be a hint to buy the official book, <a href="http://pmdapplied.com/" target="_blank">PMD Applied</a>, which is fair enough. In any case, lets get onto the first obvious example of why the rule is warranted and motivate why it should be a critical violation:</p>
<p><pre class="brush: java;">
if (firstCode != null &amp;&amp; firstCode.getCode() != null &amp;&amp; firstCode.getCode().equals(&quot;101&quot;)) {
    doSomething();
} else {
    // TODO: process code &quot;102&quot;
}
</pre></p>
<p>Another version of the above is of course the version without the TODO comment:</p>
<p><pre class="brush: java;">
if (firstCode != null &amp;&amp; firstCode.getCode() != null &amp;&amp; firstCode.getCode().equals(&quot;101&quot;)) {
    doSomething();
} else {

}
</pre></p>
<p>Both cases are clear problem areas, as the code is blatantly incomplete, and if your unit tests don&#8217;t pick it up, you certainly want your static code analyzer doing so. But what about the following:</p>
<p><pre class="brush: java;">
if (firstCode != null &amp;&amp; firstCode.getCode() != null &amp;&amp; firstCode.getCode().equals(&quot;101&quot;)) {
    doSomething();
} else {
    // only supporting 101 in this release, 102 onwards to follow
}
</pre></p>
<p>In this example, some value is being added in terms of comments, and I have regularly been taking this approach, until PMD forced me to think about it. I took the approach in part because from what I can remember from compiler implementation theory any given compiler, such as a Java byte code compiler, would be clever enough to detect and remove the dead code.</p>
<p>As it turns out, from some limited research, this is not necessarily the case, since if it was, then shrinking tools such as <a href="http://proguard.sourceforge.net/">ProGuard</a> would surely not list &#8220;Remove unnecessary branches&#8221; as a byte code optimisation feature.</p>
<p>I managed to find very few opinions on this online, although <a href="http://coding.derkeiler.com/Archive/Perl/comp.lang.perl.misc/2008-08/msg00452.html">the following</a> was of interest. In the end, I have concluded that the gain provided in the documentation in the final example, does not add sufficient value to justify the risk of not completing a branch,  and also, it bloat the code base. So, I have resolved to do away with the practise and moving such comments either above the if statement or into the javadoc where appropriate.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nicodewet.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nicodewet.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nicodewet.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nicodewet.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nicodewet.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nicodewet.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nicodewet.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nicodewet.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nicodewet.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nicodewet.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nicodewet.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nicodewet.wordpress.com/372/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nicodewet.wordpress.com/372/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nicodewet.wordpress.com/372/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=372&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nicodewet.com/2011/06/12/empty-if-statements-in-your-code-keep-them-or-dump-them/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17b88a67f6e771cf9b41fcfffdc917e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nicodewet</media:title>
		</media:content>

		<media:content url="http://nicodewet.files.wordpress.com/2011/06/nicodewet-com_code_analysis.jpg" medium="image">
			<media:title type="html">G</media:title>
		</media:content>
	</item>
		<item>
		<title>Hiring A Software Product Owner &#8211; Key Candidate Measurement Criteria</title>
		<link>http://nicodewet.com/2011/04/26/hiring-a-software-product-owner-key-candidate-measurement-criteria/</link>
		<comments>http://nicodewet.com/2011/04/26/hiring-a-software-product-owner-key-candidate-measurement-criteria/#comments</comments>
		<pubDate>Tue, 26 Apr 2011 11:52:19 +0000</pubDate>
		<dc:creator>nicodewet</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[product owner]]></category>
		<category><![CDATA[SCRUM]]></category>
		<category><![CDATA[software engineering]]></category>

		<guid isPermaLink="false">http://nicodewet.com/?p=304</guid>
		<description><![CDATA[In a software project,  the product owner is responsible for representing the interests of stakeholders and the business. The importance of this role cannot be overstated, since put in a more matter of fact way, the product owner is responsible for the success of the product. In this post, key candidate measurement criteria, garnered from [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=304&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div id="attachment_305" class="wp-caption alignleft" style="width: 351px"><a href="http://nicodewet.files.wordpress.com/2011/04/nicodewet-com_hard_working_engineer.jpg"><img class="size-full wp-image-305" title="Donkey" src="http://nicodewet.files.wordpress.com/2011/04/nicodewet-com_hard_working_engineer.jpg?w=600" alt=""   /></a><p class="wp-caption-text">Measurable Engineering Excellence Should Matter To Your Product Owner - Not Simplistic Perceptions of Hard Work</p></div>
<p>In a software project,  the product owner is responsible for representing the interests of stakeholders and the business. The importance of this role cannot be overstated, since put in a more matter of fact way, the product owner is responsible for the success of the product. In this post, key candidate measurement criteria, garnered from the experiences of the author, are presented. These will help you avoid the nightmare scenario where vasts sums are paid devoid of any prior measures whatsoever, with purely subjective motivations such as &#8220;<strong>the guys have been working really hard</strong>&#8221; or &#8220;<strong>I have seen the user interface demo</strong>&#8220;.</p>
<p>Before proceeding to the key measurement criteria, we briefly address who the product owner may be and what the interests of the stakeholders and business may be.</p>
<p><strong>Who Is The Product Owner?</strong></p>
<p>The product owner, an individual, can either literally be the product owner or an appointed agent in a software development project using, as an example, a <a title="Scrum" href="http://en.wikipedia.org/wiki/Scrum_%28development%29">Scrum</a> management framework. In a small to medium sized enterprise, the product owner may be an individual that has additional responsibilities, and in a startup, it is likely that a founder takes on the role, in which case, it would be investors that would in effect be &#8216;hiring&#8217; their product owner.</p>
<p>Regardless of the structuring in the enterprise, as with any, if the individual with the responsibility is not held accountable for failure, or on the flip side sufficiently rewarded for success, then in the absence of extreme luck, you are doomed, if not in the short run, then most probably in the long run. Naturally, with accountability comes authority, and likewise, if your product owner does not have sufficient authority, formally, then in the absence of extreme luck&#8230;</p>
<p><strong>What Are The Interests Of The StakeHolders and Business?</strong></p>
<p>The interests of stakeholders and the business are naturally variable, but we can at the very least presume that the business has a short term or long term goal of profitability. In other words, the success of the product can generally be measured at the very least in terms of growth in profitability. It is worth noting, and this is by no means piercing insight, that without formal project parameters presented as directives by the stakeholders and the business, in the absence of extreme luck&#8230;</p>
<p><strong>Key Measurement Criteria</strong></p>
<p>The following criteria are in no way negotiable, and admittedly, the first, and most important, is difficult to measure.<strong><br />
</strong></p>
<p><strong>1. Passion For Both Software Engineering and Your Business Domain</strong></p>
<p>Although passion is subjective, there are ways to measure at the very least interest levels when it comes to both software engineering and your business domain. In a general sense, a person without passion, especially in a key position, is likely to demotivate the rest of the team.<strong><br />
</strong></p>
<p><strong>2. Commercial Software Development Experience</strong></p>
<p><em>Elementary Filtering</em></p>
<p>If the candidate does not have any commercial experience whatsoever, not matter how good they look, whether on paper, physically or in terms of reputation, by hiring them into this key senior position you are taking a risk that is not worth taking. It may be repetitive, but again, if the candidate matches either of the following, do not hire them as your software product owner:</p>
<ul>
<li>No commercial experience whatsoever &#8211; please note that working at a foundation or not for profit organization does not count as commercial experience.</li>
<li>No commercial software development experience &#8211; please note that university projects simply do not count, and again, developing software at a foundation or not for profit organization does not count as commercial experience.</li>
</ul>
<p><em>Secondary Filtering</em></p>
<p>The candidate should ideally have software engineering experience in an environment with mature software engineering processes, and in the first instance, the candidate should have some feel for what immature and mature processes are. It should be remembered that the product owner must look after the interests of all stakeholders, and if for example quality and ease of maintenance is an objective, you do not want an individual who has no idea how to measure the many different facets of software quality, and in the worst case, motivates for or authorises the payment for a project based on a variation of how hard he/she believes the team has worked or a simple user interface demonstration.</p>
<p>Although the following set of concepts are by no means all-encompassing, the candidate should understand and have at least some knowledge of:</p>
<ul>
<li>Either explicitly, or in principle, <a href="http://www.sei.cmu.edu/cmmi/">Capability Maturity Model Integration</a> (CMMI)</li>
<li>Technical debt [<a href="http://en.wikipedia.org/wiki/Technical_debt">1</a>][<a href="http://www.martinfowler.com/bliki/TechnicalDebt.html">2</a>] and the measurement thereof</li>
<li><a href="http://martinfowler.com/articles/continuousIntegration.html">Continuous integration</a></li>
<li>Usability measures</li>
<li>Various sofware development methodologies and their strengths and weaknesses</li>
</ul>
<p>You will notice that there is a focus on measures above, and this is key. Software development can very quickly degrade into a subjective discipline if left devoid of measures of success, and an entirely subjective process is not engineering, its <strong>flying by the seat of your pants</strong>. In short, there is simply no way a product owner can do their job without a strong software engineering background.</p>
<p><strong>3. Suitable Personality Traits</strong></p>
<p><em>Meticulous And Streetwise Leader With Some Charisma<br />
</em></p>
<p>You are unlikely to see this as a bullet point in a job specification requirement as it sounds a bit ridiculous, so lets cull the &#8216;Some Charisma&#8217; requirement, and we are left with &#8216;meticulous, streetwise leader&#8217;. It still doesn&#8217;t sound kosher enough, but lets get to the semantics regardless. When it comes to the leader portion, you can look at the candidates CV for a past history in this regard. So we are left with the meticulous and streetwise requirements. When we say streetwise, it again comes down to experience, on the software development and product development streets, if someone tries to pull a fast one (e.g.  try to leave an intellectual property clause out of a contract), your product manager should know the move.</p>
<p><em>Respectful To Specialist Engineers (And All Stakeholders)<br />
</em></p>
<p>Although the candidate should have a strong software engineering background, over time it is likely that there will be a widening gulf between the expertise of specialist software engineers and the generalist product owner.</p>
<p>You do not want someone who will belittle what they do not understand, and it happens time and time again, especially if the person does not have the required software engineering qualifications and experience to begin with. In the worst case scenario, your product owner will openly show contempt for, and blame failures on, technical team members and in particular developers, rather than investigate the root causes of problems and potential remedies (e.g. seeking the counsel of an independent engineering consultant). In this worst case scenario, your engineers will leave, and the better ones will go first.</p>
<p><em>Likely To Assume Responsibility For Failure</em></p>
<p>You want to avoid hiring the type of person who is likely to hide failure and not assume responsibility for it. Here we are entering the murky waters of professional integrity, and the potential for this post to degrade, <em>ad nauseum</em>, into a  lecture on ethics. But on a serious note, how does one avoid hiring the kind of person who is likely to be dishonest, or in a different form, only report on successes, but not known failures in order to protect their own interests?</p>
<p>When it comes to this topic, while one can rely on one&#8217;s gut feelings, industrial psyhcologists and psychometrists are best placed to advise. Costs might become a consideration here, but one can apply testing on the short list and the money spent here may be some of the best dollars you have ever spent. Based on our own basic research we have determined that role play exercises, rather than questionairres (e.g. <a href="http://en.wikipedia.org/wiki/Myers-Briggs_Type_Indicator">Myers-Briggs</a>) are the best placed tools, but again, it is best that you consult with the experts in this domain.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nicodewet.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nicodewet.wordpress.com/304/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nicodewet.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nicodewet.wordpress.com/304/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nicodewet.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nicodewet.wordpress.com/304/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nicodewet.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nicodewet.wordpress.com/304/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nicodewet.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nicodewet.wordpress.com/304/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nicodewet.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nicodewet.wordpress.com/304/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nicodewet.wordpress.com/304/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nicodewet.wordpress.com/304/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=304&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nicodewet.com/2011/04/26/hiring-a-software-product-owner-key-candidate-measurement-criteria/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17b88a67f6e771cf9b41fcfffdc917e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nicodewet</media:title>
		</media:content>

		<media:content url="http://nicodewet.files.wordpress.com/2011/04/nicodewet-com_hard_working_engineer.jpg" medium="image">
			<media:title type="html">Donkey</media:title>
		</media:content>
	</item>
		<item>
		<title>A Look At Sightseeking.com</title>
		<link>http://nicodewet.com/2011/03/13/a-look-at-sightseeking-com/</link>
		<comments>http://nicodewet.com/2011/03/13/a-look-at-sightseeking-com/#comments</comments>
		<pubDate>Sun, 13 Mar 2011 09:45:44 +0000</pubDate>
		<dc:creator>nicodewet</dc:creator>
				<category><![CDATA[business]]></category>

		<guid isPermaLink="false">http://nicodewet.com/?p=298</guid>
		<description><![CDATA[If you&#8217;re a fan of Geocaching, or GPS Cache hunting, then you may also be interested Sightseeking.com that was launched during the course of last week. Rather than hunt for a cache, you try to hunt for the GPS location where the picture was taken. Personally, I think its a great concept and I&#8217;ve given [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=298&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://nicodewet.files.wordpress.com/2011/03/sightseeking_logo.jpg"><img class="alignleft size-full wp-image-299" title="sightseeking_logo" src="http://nicodewet.files.wordpress.com/2011/03/sightseeking_logo.jpg?w=600" alt=""   /></a></p>
<p>If you&#8217;re a fan of Geocaching, or GPS Cache hunting, then you may also be interested <a title="Sightseeking.com" href="http://sightseeking.com" target="_blank">Sightseeking.com</a> that was launched during the course of last week. Rather than hunt for a cache, you try to hunt for the GPS location where the picture was taken.</p>
<p>Personally, I think its a great concept and I&#8217;ve given it a whirl by uploading sight #9, now I just hope someone finds it. I ended up having to find the site online myself since I forgot to use the GPS on my phone to tag the location. I used Google Maps to find it and then used the &#8216;What&#8217;s here?&#8217; option on the right-click menu. I&#8217;m quite a co-ordinate ignoramus, so was not really sure what to enter in the boxes in Sightseeking.com. In terms of an enhancement to the sight, I would make the default co-ordinate entry format match what is  found on Google maps.</p>
<p>I tried to find one of the sites on the site, and happen to know exactly where it is, but think I got unstuck with the Google Maps presumably decimal co-ordinates to degrees, minutes, seconds convertion. In any case, I&#8217;ll try again some time, especially since I&#8217;m short on bling and the site is offering an ounce of gold as a lucky draw prize.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nicodewet.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nicodewet.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nicodewet.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nicodewet.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nicodewet.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nicodewet.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nicodewet.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nicodewet.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nicodewet.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nicodewet.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nicodewet.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nicodewet.wordpress.com/298/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nicodewet.wordpress.com/298/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nicodewet.wordpress.com/298/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=298&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nicodewet.com/2011/03/13/a-look-at-sightseeking-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17b88a67f6e771cf9b41fcfffdc917e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nicodewet</media:title>
		</media:content>

		<media:content url="http://nicodewet.files.wordpress.com/2011/03/sightseeking_logo.jpg" medium="image">
			<media:title type="html">sightseeking_logo</media:title>
		</media:content>
	</item>
		<item>
		<title>Building and Managing Fixed Broadband Wireless Access Networks &#8211; Not For Sissies</title>
		<link>http://nicodewet.com/2010/11/28/building-and-managing-fixed-broadband-wireless-access-networks-not-for-sissies/</link>
		<comments>http://nicodewet.com/2010/11/28/building-and-managing-fixed-broadband-wireless-access-networks-not-for-sissies/#comments</comments>
		<pubDate>Sun, 28 Nov 2010 14:01:50 +0000</pubDate>
		<dc:creator>nicodewet</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[FBWA]]></category>
		<category><![CDATA[hotspots]]></category>
		<category><![CDATA[reliable]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://nicodewet.com/?p=277</guid>
		<description><![CDATA[Whether you are new to the field of Fixed Broadband Wireless Access Network (FBWA) or a salty old sea dog in my opinion the white paper &#8220;How to Build and Manage a Successful FBWA Business&#8221; [edit 16/06/2011 regretfully this article is no longer available online, sorry] is an excellent read. WISPs and WiFi hotspot network [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=277&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://nicodewet.files.wordpress.com/2010/11/nicodewet-com_microwave_network_tower.jpg"><img class="alignleft size-full wp-image-278" style="border:5px solid white;" title="Telecommunication mast." src="http://nicodewet.files.wordpress.com/2010/11/nicodewet-com_microwave_network_tower.jpg?w=600" alt=""   /></a> Whether you are new to the field of Fixed Broadband Wireless Access Network (FBWA) or a salty old sea dog in my opinion the white paper &#8220;How to Build and Manage a Successful FBWA Business&#8221; <em>[edit 16/06/2011 regretfully this article is no longer available online, sorry]</em> is an excellent read. WISPs and WiFi hotspot network operators fall within the FBWA category, and even if you plan to run a single commercial WiFi hotspot, with one access point, I would recommend you read this article.</p>
<p>The article makes an important point in that providing a highly reliable service is a significantly greater challenge in the FBWA space than in the cellular mobile telephony service (CMTS) space. It does this by reminding the reader that reliability requirements in terms of backhaul links are significantly more stringent in FBWA networks than in CMTS networks, since with the former, backhual link downtime generally results on consumer downtime since one has a single point of failure, whilst in the latter, service degradation is the result, which is generally preferable to having no service at all.</p>
<p>In a nutshell, the article suggests, in my opinion, that you better know what you are doing if you are going to provide a high quality, highly reliable FBWA network. In my mind, if you are operating a commercial prepaid FBWA network, the demands are even greater and potentially commercial WiFi hotspot operations present the greatest challenge if you are serious about your service levels (and if you are not, thankfully in South Africa there is the <a href="http://www.michalsons.com/the-consumer-protection-act-a-heads-up">Consumer Protection Act</a> or the old fashioned way, consumers voting with their feet).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nicodewet.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nicodewet.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nicodewet.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nicodewet.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nicodewet.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nicodewet.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nicodewet.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nicodewet.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nicodewet.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nicodewet.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nicodewet.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nicodewet.wordpress.com/277/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nicodewet.wordpress.com/277/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nicodewet.wordpress.com/277/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=277&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nicodewet.com/2010/11/28/building-and-managing-fixed-broadband-wireless-access-networks-not-for-sissies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17b88a67f6e771cf9b41fcfffdc917e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nicodewet</media:title>
		</media:content>

		<media:content url="http://nicodewet.files.wordpress.com/2010/11/nicodewet-com_microwave_network_tower.jpg" medium="image">
			<media:title type="html">Telecommunication mast.</media:title>
		</media:content>
	</item>
		<item>
		<title>Who&#8217;s Who In South Africa&#8217;s WiFi Hotspot Zoo</title>
		<link>http://nicodewet.com/2010/11/09/whos-who-in-south-africas-wifi-hotspot-zoo/</link>
		<comments>http://nicodewet.com/2010/11/09/whos-who-in-south-africas-wifi-hotspot-zoo/#comments</comments>
		<pubDate>Tue, 09 Nov 2010 05:34:45 +0000</pubDate>
		<dc:creator>nicodewet</dc:creator>
				<category><![CDATA[business]]></category>
		<category><![CDATA[hotspots]]></category>
		<category><![CDATA[wifi]]></category>

		<guid isPermaLink="false">http://nicodewet.com/?p=268</guid>
		<description><![CDATA[This posting is a simple listing of my opinion of who South Africa&#8217;s four most prominent WiFi hotspot operators are. I got asked such a question recently and thought I&#8217;d answer here. But first a definition, when I say WiFi hotspot I mean in the traditional sense, that is predominantly serving the hospitality industry with [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=268&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://nicodewet.files.wordpress.com/2010/11/nico_de_wet-com_wifi_zoo.jpg"><img class="alignleft size-full wp-image-269" title="animal planet new" src="http://nicodewet.files.wordpress.com/2010/11/nico_de_wet-com_wifi_zoo.jpg?w=600" alt=""   /></a>This posting is a simple listing of my opinion of who South Africa&#8217;s four most prominent WiFi hotspot operators are. I got asked such a question recently and thought I&#8217;d answer here.</p>
<p>But first a definition, when I say WiFi hotspot I mean in the traditional sense, that is predominantly serving the hospitality industry with the network controlled by hotspot management software (i.e. a basic WiFi router with open access does not qualify). Secondly, when I say operator I mean the company in question largely, but not necessarily exclusively, owns and operates the access points that comprise their network. Lastly, saying that these operators are the most prominent is a bit vague, and so as qualifying criteria I add number of access points being operated by any company as being in the hundreds.</p>
<p>Here is my listing of the my perception of the top four in alpabetical order:</p>
<ul>
<li><a title="AlwaysOn" href="http://www.alwayson.co.za/" target="_blank">AlwaysOn</a></li>
<li><a title="RedButton" href="http://www.redbutton.co.za" target="_blank">RedButton</a></li>
<li><a title="Skyrove" href="http://www.skyrove.com" target="_blank">Skyrove</a></li>
<li><a title="Wireless G" href="http://www.wirelessg.co.za" target="_blank">Wireless G</a></li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/nicodewet.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/nicodewet.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/nicodewet.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/nicodewet.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/nicodewet.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/nicodewet.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/nicodewet.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/nicodewet.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/nicodewet.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/nicodewet.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/nicodewet.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/nicodewet.wordpress.com/268/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/nicodewet.wordpress.com/268/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/nicodewet.wordpress.com/268/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=nicodewet.com&amp;blog=8943366&amp;post=268&amp;subd=nicodewet&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://nicodewet.com/2010/11/09/whos-who-in-south-africas-wifi-hotspot-zoo/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/17b88a67f6e771cf9b41fcfffdc917e0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">nicodewet</media:title>
		</media:content>

		<media:content url="http://nicodewet.files.wordpress.com/2010/11/nico_de_wet-com_wifi_zoo.jpg" medium="image">
			<media:title type="html">animal planet new</media:title>
		</media:content>
	</item>
	</channel>
</rss>
