<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://quest.windwards.net"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>Quest for improvement - quest-blog</title>
 <link>http://quest.windwards.net/tags/quest-blog</link>
 <description></description>
 <language>en</language>
<item>
 <title>asynchrmi 1.2 released</title>
 <link>http://quest.windwards.net/content/asynchrmi-12-released</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; property=&quot;content:encoded&quot;&gt;&lt;p&gt;&lt;a href=&quot;https://bitbucket.org/quest/asynchrmi&quot;&gt;asynchrmi&lt;/a&gt; goes to version 1.2. This is the first production-ready release. Its core features seems to serve us well.&lt;/p&gt;
&lt;p&gt;For those who used earlier snapshots, note that there is an interface change in the ChainBuilder. It now uses a common object called a ChainResult. In traditional Promise programming, each group of tasks typically feed the next step. When using asynchrmi we foung that we needed to gradually build up a data by successive layers of relation lookups. Only at the end do we have enough data to produce the actual result (i.e. a web page).&lt;/p&gt;
&lt;p&gt;Maven dependency looks thus:&lt;/p&gt;
&lt;pre&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;net.windwards&lt;span class=&quot;nt&quot;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;asynchrmi&lt;span class=&quot;nt&quot;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
     &lt;span class=&quot;nt&quot;&gt;&amp;lt;version&amp;gt;&lt;/span&gt;1.3-SNAPSHOT&lt;span class=&quot;nt&quot;&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
   &lt;span class=&quot;nt&quot;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-tags field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Tags:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/quest-blog&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;quest-blog&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/java-programming&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;java-programming&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/jboss&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;jboss&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/asynchrmi&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;asynchrmi&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Thu, 02 Jul 2015 13:33:43 +0000</pubDate>
 <dc:creator>quest</dc:creator>
 <guid isPermaLink="false">38 at http://quest.windwards.net</guid>
 <comments>http://quest.windwards.net/content/asynchrmi-12-released#comments</comments>
</item>
<item>
 <title>asynchrmi helps writing JBoss RMI clients</title>
 <link>http://quest.windwards.net/content/asynchrmi-helps-writing-jboss-rmi-clients</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; property=&quot;content:encoded&quot;&gt;&lt;p&gt;I have started a new project called &lt;a href=&quot;https://bitbucket.org/quest/asynchrmi&quot;&gt;asynchrmi&lt;/a&gt;. The purpose of this lib is to make it simpler to write serious applications that calls a JBoss application server.&lt;/p&gt;
&lt;p&gt;We were in the process of writing a modern web frontend to our car-sharing system when we concluded that: 1) making many parallel calls to JBoss as different users didn&#039;t work, and 2) that because of the heavily relational datamodel (a typical Hibernate model) you needed to make several calls to get all the data you wanted - calls that could be parallelized.&lt;/p&gt;
&lt;p&gt;In order to encourage the building of a vocabulary, I wrote a simple library called asynchrmi that enables threadpool-mediated, Future- and/or callback-driven client JNP operations that will be safely threaded.&lt;/p&gt;
&lt;p&gt;The project is still in early stages, but has proved useful and robust.&lt;/p&gt;
&lt;p&gt;The big missing piece is the ability to inject RMI endpoints on RMITask objects so that all the tedious lookups can be compressed (and ideally performed in parallel).&lt;/p&gt;
&lt;p&gt;Please note that this is a large hammer. You can easily sink your application server, either via lock-death or through load-death. Proceed with caution.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-tags field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Tags:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/quest-blog&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;quest-blog&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/java-programming&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;java-programming&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/jboss&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;jboss&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/asynchrmi&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;asynchrmi&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Fri, 15 Aug 2014 09:33:01 +0000</pubDate>
 <dc:creator>quest</dc:creator>
 <guid isPermaLink="false">37 at http://quest.windwards.net</guid>
 <comments>http://quest.windwards.net/content/asynchrmi-helps-writing-jboss-rmi-clients#comments</comments>
</item>
<item>
 <title>IPv4 addresses must really be running out</title>
 <link>http://quest.windwards.net/content/ipv4-addresses-must-really-be-running-out</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; property=&quot;content:encoded&quot;&gt;&lt;p&gt;The IPv4 address space really must be running out. Today I received the following spam:&lt;/p&gt;
&lt;p class=&quot;rteindent1&quot;&gt;&lt;span style=&quot;font-family:arial,helvetica,sans-serif;&quot;&gt;We are currently seeking to enter into direct lease with respect to any of your unused IPv4 netblocks.  We pay Competitive lease rates via wire transfer and close transactions quickly.  Our lease/rental of your IP space will always be governed by best practices. If interested, please respond to this email and we can work out the details.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Someone is getting desperate - or spotting a business opportunity.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-tags field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Tags:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/quest-blog&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;quest-blog&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/ip&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;ip&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Thu, 26 Jun 2014 09:09:56 +0000</pubDate>
 <dc:creator>quest</dc:creator>
 <guid isPermaLink="false">34 at http://quest.windwards.net</guid>
 <comments>http://quest.windwards.net/content/ipv4-addresses-must-really-be-running-out#comments</comments>
</item>
<item>
 <title>The case against dependency injection (in its common form)</title>
 <link>http://quest.windwards.net/content/case-against-dependency-injection-its-common-form</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; property=&quot;content:encoded&quot;&gt;&lt;p&gt;Dependency injection as it seems to be commonly used in Javaverse, is at the center of what I consider problematic (read sucks) with the philosophy behind JEE.&lt;/p&gt;
&lt;p&gt;To be clear: annotation-driven dependency injection is a reasonable software pattern. For example, it allows defining partial standards such as JAX-RS. However, dependency injection as the default mechanism (i.e. with one global namespace) for interconnecting beans makes sense only for small projects.&lt;/p&gt;
&lt;p&gt;Dependency injection is often sold with the argument that it solves the problem of constructors with long argument lists. The problem with this sales pitch is that having ten arguments to your constructor or having ten injections on your class both amount to an unsurveillable mess. Put differently, ten constructor arguments or ten injections make no difference to a unit test.&lt;/p&gt;
&lt;p&gt;Both JAX-RS and stateless beans are (more or less) instantiated per request. Given the low cost of instantiation this makes sense as an isolation mechanism, but since classes are just used to group responders that are related (operate on similar data, use shared helpers, et cetera) each responder method is likely to require a slightly different set of injections. The grouping class ends up with the union of all injections. The result is a chaotic network that is hard to create a mental map of. Where dependency injection has created such networks, isolating functional units for testing becomes much harder. Massive mocking ensues.My position is that in order to be comprehensible and unit testable, any large software project needs to be divided into subsystems. Each subsystem should be a namespace unto itself. Its interaction should be isolated properly, e.g. using a message passing pattern (a message queue in JMS terminology). A system thus subdivided will not suffer from unwieldy constructors. It could still use dependency injection internally for e.g. plugins.&lt;/p&gt;
&lt;div&gt;
	Expressed differently, dependency injection should be a tool in the hands of a systems architect to apply where relevant, rather than the default mechanism of a framework for interconnecting individual classes. Square Dagger is designed for this purpose and allows creating mini-frameworks focused on sensible injection.&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-tags field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Tags:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/quest-blog&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;quest-blog&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/java-programming&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;java-programming&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Tue, 11 Jun 2013 21:51:27 +0000</pubDate>
 <dc:creator>quest</dc:creator>
 <guid isPermaLink="false">36 at http://quest.windwards.net</guid>
 <comments>http://quest.windwards.net/content/case-against-dependency-injection-its-common-form#comments</comments>
</item>
<item>
 <title>Evolution of the lib-framework dichotomy</title>
 <link>http://quest.windwards.net/content/evolution-lib-framework-dichotomy</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; property=&quot;content:encoded&quot;&gt;&lt;p&gt;The debate about the relative merits of frameworks versus libraries will likely remain a fixture in software development theory for a long time to come. Nevertheless, there are trends afoot, that suggest that this dichotomy is not so rigid as the &lt;a data-mce-=&quot;&quot; href=&quot;http://www.cs.umaine.edu/%7Elarry/latour/WISR/wisr6/proceedings/ps/lubars.ps&quot; shape=&quot;rect&quot; target=&quot;_blank&quot;&gt;OO theorists of the 90s would have us think&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The increasingly asynchronous nature of programming is one such trend. Many modern libraries, from &lt;a data-mce-=&quot;&quot; href=&quot;http://akka.io&quot; shape=&quot;rect&quot; target=&quot;_blank&quot;&gt;Akka&lt;/a&gt; to &lt;a data-mce-=&quot;&quot; href=&quot;http://backbonejs.org&quot; shape=&quot;rect&quot; target=&quot;_blank&quot;&gt;backbone.js&lt;/a&gt; prescribe event-driven (callback-/message-driven) models that means a certain inversion of control is present. They thus acquires framework-like properties. The starkest example is probably the rapid adoption of MapReduce as the prevalent query paradigm in newer NoSQL databases.&lt;/p&gt;
&lt;p&gt;We have also seen the rise of several platforms lately. &lt;a data-mce-=&quot;&quot; href=&quot;http://www.docker.com&quot; shape=&quot;rect&quot; target=&quot;_blank&quot;&gt;Docker&lt;/a&gt; is perhaps the most interesting example, though &lt;a data-mce-=&quot;&quot; href=&quot;http://www.npmjs.org&quot; shape=&quot;rect&quot; target=&quot;_blank&quot;&gt;npm&lt;/a&gt; also deserves to be named. These are clearly frameworks, but with very narrow contracts: if you follow a narrow set of rules, tons of magic will ensue.&lt;/p&gt;
&lt;p&gt;Thirdly, most serious frameworks are acts of curation. As can be seen from e.g. &lt;a data-mce-=&quot;&quot; href=&quot;http://search.maven.org&quot; shape=&quot;rect&quot; target=&quot;_blank&quot;&gt;Maven&lt;/a&gt;, the nature of this curation is changing, as are developers&#039; expectations. &lt;a data-mce-=&quot;&quot; href=&quot;http://jbossas.jboss.org/&quot; shape=&quot;rect&quot; target=&quot;_blank&quot;&gt;JBoss AS&lt;/a&gt; now exposes all its internal dependencies as &quot;modules&quot; allowing easy (or at least clear) replacement. A stark contrast to older versions&#039; repackaged jars.&lt;/p&gt;
&lt;p&gt;The dichotomy is also affected by the steadily improving quality, particularly of open source projects. This is partly because a lot of open source is in fact produced commercially, but improving methodology and fierce competition also helps. This reduces the need for discovery and quality aspects of curation.&lt;/p&gt;
&lt;p&gt;I think all these trends points roughly in the same direction: it pushes both libs and frameworks towards the middle ground, with narrow concepts (e.g. Akka&#039;s &quot;there is only message-passing&quot;), usually following established, well understood models (e.g. MapReduce). These will be successful because they can easily be combined into new constructs, lib style (e.g. a Maven-Docker plugin). I think we would do well to remember this when choosing software components for our projects.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-tags field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Tags:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/quest-blog&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;quest-blog&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/software-development&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;software-development&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Tue, 09 Apr 2013 23:15:16 +0000</pubDate>
 <dc:creator>quest</dc:creator>
 <guid isPermaLink="false">35 at http://quest.windwards.net</guid>
 <comments>http://quest.windwards.net/content/evolution-lib-framework-dichotomy#comments</comments>
</item>
<item>
 <title>How to get a servlet to answer </title>
 <link>http://quest.windwards.net/content/how-get-servlet-answer</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; property=&quot;content:encoded&quot;&gt;&lt;p&gt;The basic problem, as illustrated by this somewhat aged &lt;a href=&quot;http://account.pacip.com/jetty/doc/PathMapping.html&quot;&gt;Jetty pathSpec documentation&lt;/a&gt;, is that &quot;/&quot; is treated as &quot;/*&quot; when giving a servlet path spec. Thus, if you want to have a servlet as &quot;front page&quot; in an embedded scenario:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
ServletContextHandler servlets = 
    new ServletContextHandler(ServletContextHandler.SESSIONS);
servlets.addServlet(MyServlet.class, &quot;/&quot;);&lt;/pre&gt;&lt;p&gt;... that servlet will get requests for the entire URL space and no other servlet in the context will get any requests. In particular, if you want to add a DefaultServlet to serve static web pages, images and CSS, that will be tricky.&lt;/p&gt;
&lt;p&gt;The solution is to stick each servlet in its own context handler. If you do this, you can control in what order they are asked to handle the HTTP request. Thus, you can make sure it asks all other servlets before asking the greedy &quot;/&quot; servlet. Something like this:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
ServletContextHandler html, servlets;
servlets = new ServletContextHandler(ServletContextHandler.SESSIONS);
servlets.addServlet(MyServlet.class, &quot;/&quot;);

html = new ServletContextHandler(ServletContextHandler.SESSIONS);
ServletHolder holder = html.addServlet(DefaultServlet.class, &quot;/html/*&quot;);
holder.setInitParameter(&quot;resourceBase&quot;, &quot;./&quot;);

ContextHandlerCollection collection = new ContextHandlerCollection();
// First, try the static stuff
collection.addHandler(html);
// Then ask the greedy servlet
collection.addHandler(servlets);

Server server = new Server(8080);
server.setHandler(collection);
server.start();
server.join();&lt;/pre&gt;&lt;p&gt;The reason this works is that a context will simply &quot;pass&quot; if it does not match a certain URL.&lt;/p&gt;
&lt;p&gt;While on the subject, it is fairly annoying when developing that the context won&#039;t print tracebacks. When developing, we would prefer the error web page to contain the stack trace. This can be achieved fairly easily:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
ErrorHandler errorHandler = new ErrorHandler();
errorHandler.setShowStacks(true);
server.addBean(errorHandler);
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-tags field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Tags:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/quest-blog&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;quest-blog&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/java-programming&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;java-programming&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/teaching&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;teaching&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Thu, 27 Dec 2012 11:06:05 +0000</pubDate>
 <dc:creator>quest</dc:creator>
 <guid isPermaLink="false">27 at http://quest.windwards.net</guid>
 <comments>http://quest.windwards.net/content/how-get-servlet-answer#comments</comments>
</item>
<item>
 <title>In defence of keyboards</title>
 <link>http://quest.windwards.net/content/defence-keyboards</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; property=&quot;content:encoded&quot;&gt;&lt;p&gt;Tablet computers worry me.&lt;/p&gt;
&lt;p&gt;I strongly beleive that the tools we use shape both our behaviour and our opinions. There may be large individual variation in our reaction and some delay, but gradually and collectively opinions will shift to adapt to what is feasible with the set of tools we wield.&lt;/p&gt;
&lt;p&gt;So, for example, mobile and smart phones have shifted everyday behaviour away from planning. Railroads transformed our perception of distance. Penicillin totally changed both our behaviour when infected and our view of illness in general. It seems that tablet sales is increasing partly at the expense of laptops. This means we exchange our fast-typing physical keyboards for cumbersome onscren ones. The keyboard being the primere tool for expressing complex opinions, this is - theoretically - cause for some concern.&lt;/p&gt;
&lt;p&gt;I would not worry so much about disappearing keyboards if it was not for the signs that most computer users seem not to appreciate the importance of keyboards. I am continually amazed at how many users of stationary computers put up with horrible keyboards that are shipped with your typical desktop computer. This worries me because it seems probable that without good keyboards, will mean less talkback, less dialog and a more passive consumption of content. Gradually, as keyboards become less frequent, users will favour sites and services with more linking and less unrestrained navigation, leaving more room for middlemen to control what is and is not read.&lt;/p&gt;
&lt;p&gt;One probable consequence is that photos and video recording becomes more frequent since most tablets have cameras. Video is much more difficult than text for computers to comprehend, which means that search engines will have a harder time providing useful answers.&lt;/p&gt;
&lt;p&gt;I doubt that searching will lose its hegemony because of the shift to crappy onboard keyboards, but even its weakening may have large consequences for the shape of the Internet. This is not a claim that the apocalypse is coming. It may well be that most tablets mutate into Asus Transformers or that people decide that they don&#039;t want to live without keyboards and buy separate physical keyboards. In theory, speech transcription could rise to the challenge. Rather my purpose with this post is to raise awareness of the good keyboard and add an admonishment that you should be aware of how the tools you are wielding empower you as well as limit you. &lt;/p&gt;
&lt;p&gt;This post was written on a tablet.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-tags field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Tags:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/quest-blog&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;quest-blog&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Sat, 17 Nov 2012 17:00:08 +0000</pubDate>
 <dc:creator>quest</dc:creator>
 <guid isPermaLink="false">26 at http://quest.windwards.net</guid>
 <comments>http://quest.windwards.net/content/defence-keyboards#comments</comments>
</item>
<item>
 <title>What does it mean to develop software?</title>
 <link>http://quest.windwards.net/content/what-does-it-mean-develop-software</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; property=&quot;content:encoded&quot;&gt;&lt;p&gt;Consider the following:&lt;/p&gt;
&lt;p&gt;In principle, in the general purpose computing world, once you check in to your version control system a solution to a certain problem, you will solve that problem for everyone everywhere for all eternity.&lt;/p&gt;
&lt;p&gt;You may counter that if that were true, there would be only one Get Things Done app for Android, rather than 100. However, this springs more from disagreement on what the problem is.&lt;/p&gt;
&lt;p&gt;If we take that basic premise to be true, we need to gradually increase our capacity to solve problems. If we do not, logically we must sooner or later run out of problems that we can actually solve.&lt;/p&gt;
&lt;p&gt;Or, bluntly put, writing software is the craft of producing unemployment.&lt;/p&gt;
&lt;p&gt;Now, Joseph Stigliz may say that this has a lot to do with cheap capital favouring capital investment (such as massive compute farms and powerful software systems) over investment in manpower. This may be so, but this has been the norm for the last decade and a bit, and is likely to remain true for a decade to come while banks and states deleverage. Thus the principle will stand for the forseeable future (several aeons by ICT yardsticks).&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-tags field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Tags:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/quest-blog&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;quest-blog&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/software-development&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;software-development&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Thu, 04 Oct 2012 12:14:48 +0000</pubDate>
 <dc:creator>quest</dc:creator>
 <guid isPermaLink="false">25 at http://quest.windwards.net</guid>
 <comments>http://quest.windwards.net/content/what-does-it-mean-develop-software#comments</comments>
</item>
<item>
 <title>What makes a good unit test?</title>
 <link>http://quest.windwards.net/content/what-makes-good-unit-test</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; property=&quot;content:encoded&quot;&gt;&lt;h2&gt;
	Motivating rant&lt;/h2&gt;
&lt;p&gt;There are numerous articles out there talking about how to write unit tests. Still, I find that they mostly assume that the reader is an accomplished developer trying to learn to write unit tests.&lt;/p&gt;
&lt;p&gt;In particular, many articles, such as &lt;a href=&quot;http://wiki.developerforce.com/page/How_to_Write_Good_Unit_Tests&quot;&gt;this one from the force.com people&lt;/a&gt;, may have the right idea, but atrocious examples. In the linked article, the getFraction() example doesn&#039;t test the behaviour of a unit, it tests the division operation of the processor! Not only is this a fairly unlikely failure, it is also highly specific to the processor the unit test is run on, and doesn&#039;t say whether it is going to work on any other processor the code is need to work on.&lt;/p&gt;
&lt;p&gt;For those who are trying to learn programming, a somewhat different approach is needed. This article tries to find an approach that work in a situation where you are trying to learn programming with a test-driven approach.&lt;/p&gt;
&lt;h2&gt;
	What is a &quot;test&quot;?&lt;/h2&gt;
&lt;p&gt;Technically, a test is a small program that tries to make certain that some part of the production software performs as expected.&lt;/p&gt;
&lt;p&gt;Simply put, each test should tell a story. This story contains&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;
		a protagonist: it may be a procedure, method, class or an object,&lt;/li&gt;
&lt;li&gt;
		(usually) supporting characters: these are typically mocked objects or methods, and&lt;/li&gt;
&lt;li&gt;
		an interesting story: this is usually a use case for a part (the so-called &quot;unit&quot;) of the system.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;
	So what is a &quot;unit&quot;?&lt;/h2&gt;
&lt;p&gt;Most people ask this question when they try to make sense of test-driven development. The traditional answer is that the unit is, in &lt;a href=&quot;http://en.wikipedia.org/wiki/Unit_testing&quot;&gt;Wikipedia&#039;s terms&lt;/a&gt; &quot;&lt;em&gt;the smallest testable part of an application&lt;/em&gt;.&quot; The problem is that when we write the test before the implementation, the choice of a unit is a side-effect of the narrative of the test and so does not require particular consideration.&lt;/p&gt;
&lt;h2&gt;
	So what about this story?&lt;/h2&gt;
&lt;p&gt;Without further ado:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public void testWolfCanWasteHousesButNotThatOfPracticalPiglet() {
    Wolf wolf = new Wolf();
    Piglet fifer = Hamlet.lookupPiglet(&quot;&lt;i&gt;Fifer&lt;/i&gt;&quot;);
    assert !fifer.isMason(); // sanity check
    House house = fifer.getHouse();
    wolf.huffAndPuff(house);
    assert house.isRuined();
    assert house.getDoor().isOpen();

    Piglet practical = Hamlet.lookupPiglet(&quot;Practical&quot;);
    assert practical.isMason();
    house = practical.getHouse();
    wolf.huffAndPuff(house);
    assert !house.isRuined();
    assert !house.getDoor().isOpen();
}&lt;/pre&gt;&lt;p&gt;This test documents the contract between a Wolf and various piglets. Basicly, it says that a Wolf can huff and puff and blow the house down, unless the house is built by a mason.&lt;/p&gt;
&lt;p&gt;Depending on programming language and development environment, exactly how to execute a test varies. There are numerous articles detailing this for various programming language and environment. Search engines are your friends.&lt;/p&gt;
&lt;p&gt;Tests should be named for what they test. The ultimate goal of the test name is so that a developer immediately understands contract has been broken.&lt;/p&gt;
&lt;h2&gt;
	Finally&lt;/h2&gt;
&lt;p&gt;Finally, there are some &lt;a href=&quot;http://blog.stevensanderson.com/2009/08/24/writing-great-unit-tests-best-and-worst-practises/&quot;&gt;fine articles about unit testing&lt;/a&gt; out there.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-tags field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Tags:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/teaching&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;teaching&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/test-driven&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;test-driven&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/quest-blog&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;quest-blog&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Thu, 12 Jul 2012 07:06:28 +0000</pubDate>
 <dc:creator>quest</dc:creator>
 <guid isPermaLink="false">21 at http://quest.windwards.net</guid>
 <comments>http://quest.windwards.net/content/what-makes-good-unit-test#comments</comments>
</item>
<item>
 <title>June 6 is World IPv6 day</title>
 <link>http://quest.windwards.net/content/june-6-world-ipv6-day</link>
 <description>&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; property=&quot;content:encoded&quot;&gt;&lt;p&gt;June 6 is not only Sweden&#039;s national holiday. It is also &lt;a href=&quot;http://www.worldipv6day.org/&quot;&gt;World IPv6 day&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;Major ISPs, home networking equipment manufacturers, and web companies around the world are coming together to permanently enable IPv6 for their products and services by 6 June 2012.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;My pledge for this year is to try to make this website visible via IPv6. Since it is hosted on EC2, this will mean using 6to4 tunneling, which seems to be allowed. Stay tuned for updates.&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-tags field-type-taxonomy-term-reference field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Tags:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot; rel=&quot;dc:subject&quot;&gt;&lt;a href=&quot;/tags/quest-blog&quot; typeof=&quot;skos:Concept&quot; property=&quot;rdfs:label skos:prefLabel&quot; datatype=&quot;&quot;&gt;quest-blog&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Thu, 31 May 2012 11:48:16 +0000</pubDate>
 <dc:creator>quest</dc:creator>
 <guid isPermaLink="false">20 at http://quest.windwards.net</guid>
 <comments>http://quest.windwards.net/content/june-6-world-ipv6-day#comments</comments>
</item>
</channel>
</rss>
