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

<channel>
	<title>mente abierta</title>
	<atom:link href="http://alexcollins.org/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://alexcollins.org/blog</link>
	<description>Hacker, Lifter: musings on programming, weightlifting and life</description>
	<lastBuildDate>Wed, 15 Feb 2012 14:14:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>There&#8217;s nothin&#8217; wrong with the Findbugs Maven Plugin</title>
		<link>http://alexcollins.org/blog/2012/theres-nothin-wrong-with-the-findbugs-maven-plugin</link>
		<comments>http://alexcollins.org/blog/2012/theres-nothin-wrong-with-the-findbugs-maven-plugin#comments</comments>
		<pubDate>Wed, 15 Feb 2012 14:14:28 +0000</pubDate>
		<dc:creator>atc</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[findbugs]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://alexcollins.org/blog/?p=224</guid>
		<description><![CDATA[I made a schoolboy error. I ventured down the road named &#8220;Thinking your tools are broken instead of your code&#8221;. I haven&#8217;t done that in years. There&#8217;s nothing wrong with the Findbugs plugin for Maven. If you want to scan &#8230; <a href="http://alexcollins.org/blog/2012/theres-nothin-wrong-with-the-findbugs-maven-plugin">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I made a schoolboy error. I ventured down the road named &#8220;Thinking your tools are broken instead of your code&#8221;. I haven&#8217;t done that in years.</p>
<p>There&#8217;s nothing wrong with the <a href="http://alexcollins.org/blog/2012/is-findbugs-maven-plugin-onlyanalyze-broken" title="Is findbugs-maven-plugin onlyAnalyze broken?">Findbugs plugin for Maven</a>. If you want to scan sub-packages by using the <code>onlyAnalyze</code> option, simply end your package declaration with <code>.-</code>. The <a href="http://findbugs.sourceforge.net/manual/running.html#commandLineOptions" target="_blank">manual says so</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexcollins.org/blog/2012/theres-nothin-wrong-with-the-findbugs-maven-plugin/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Is findbugs-maven-plugin onlyAnalyze broken?</title>
		<link>http://alexcollins.org/blog/2012/is-findbugs-maven-plugin-onlyanalyze-broken</link>
		<comments>http://alexcollins.org/blog/2012/is-findbugs-maven-plugin-onlyanalyze-broken#comments</comments>
		<pubDate>Mon, 13 Feb 2012 10:51:29 +0000</pubDate>
		<dc:creator>atc</dc:creator>
				<category><![CDATA[Build Processes]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[build-processes]]></category>
		<category><![CDATA[findbugs]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven]]></category>

		<guid isPermaLink="false">http://alexcollins.org/blog/?p=209</guid>
		<description><![CDATA[I cannot seem to get onlyAnalyze working for my multi-module project: regardless of what package (or pattern) I set, maven-findbugs-plugin either parses everything or nothing and it doesn&#8217;t evaluate sub-packages as I&#8217;d expect from passing it packagename.*. To prove either &#8230; <a href="http://alexcollins.org/blog/2012/is-findbugs-maven-plugin-onlyanalyze-broken">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I cannot seem to get <code>onlyAnalyze</code> working for my multi-module project: regardless of what package (or pattern) I set, maven-findbugs-plugin either parses everything or nothing and it doesn&#8217;t evaluate sub-packages as I&#8217;d expect from passing it packagename.*.</p>
<p>To prove either myself or the plugin at fault (though I always assume it&#8217;s the former!), I setup a small Maven project with the following structure:</p>
<p><code><br />
    pom.xml<br />
    src/<br />
        main/java/acme/App.java<br />
        main/java/acme/moo/App.java<br />
        main/java/no_detect/App.java<br />
</code></p>
<p>which is very simple!</p>
<p>The POM has the following findbugs configuration:</p>
<pre>
    &lt;build&gt;
        &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;
                &lt;artifactId&gt;findbugs-maven-plugin&lt;/artifactId&gt;
                &lt;version&gt;2.4.0&lt;/version&gt;
                &lt;executions&gt;
                    &lt;execution&gt;
                        &lt;phase&gt;verify&lt;/phase&gt;
                        &lt;goals&gt;&lt;goal&gt;findbugs&lt;/goal&gt;&lt;goal&gt;check&lt;/goal&gt;&lt;/goals&gt;
                    &lt;/execution&gt;
                &lt;/executions&gt;
                &lt;configuration&gt;
                    &lt;debug&gt;true&lt;/debug&gt;
                    &lt;effort&gt;Max&lt;/effort&gt;
                    &lt;threshold&gt;Low&lt;/threshold&gt;
                    &lt;onlyAnalyze&gt;acme.*&lt;/onlyAnalyze&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
        &lt;/plugins&gt;
    &lt;/build&gt;
</pre>
<p>and every App.java has the following code with two obvious violations:</p>
<p><code><br />
    package acme;<br />
    import java.io.Serializable;</p>
<p>    public class App implements Serializable<br />
    {<br />
        private static final class NotSer {<br />
            private String meh = "meh";<br />
        }</p>
<p>        private static final NotSer ns = new NotSer();// Violation: not serializable field</p>
<p>        public static void main( String[] args )<br />
        {<br />
            ns.meh = "hehehe";// Vilation: unused<br />
            System.out.println( "Hello World!" );<br />
        }<br />
    }<br />
</code></p>
<p>Note that <code>no_detect.App</code> has the same content as above, but my expectation is that it wouldn&#8217;t be<br />
evaluated by findbugs because I have the &#8220;onlyAnalyze&#8221; option set to <code>acme.*</code> which I assume would<br />
evaluate <code>acme.App</code> and <code>acme.moo.App</code> and nothing else.</p>
<p>I now execute a <code>mvn clean install</code> to clean, build, test, run findbugs, package, install, which<br />
produces the following findbugs report (snipped for brevity) and results in a build failure which is expected<br />
because <code>acme.App</code> and <code>acme.moo.App</code>:</p>
<p><code><br />
    &lt;BugInstance category='BAD_PRACTICE' type='SE_NO_SERIALVERSIONID' instanceOccurrenceMax='0'&gt;<br />
    &lt;ShortMessage&gt;Class is Serializable, but doesn't define serialVersionUID&lt;/ShortMessage&gt;<br />
    &lt;LongMessage&gt;acme.App is Serializable; consider declaring a serialVersionUID&lt;/LongMessage&gt;<br />
    &lt;Details&gt;<br />
      &lt;p&gt; This field is never read.&amp;nbsp; Consider removing it from the class.&lt;/p&gt;<br />
    &lt;/Details&gt;<br />
    &lt;BugPattern category='BAD_PRACTICE' abbrev='SnVI' type='SE_NO_SERIALVERSIONID'&gt;&lt;ShortDescription&gt;Class is Serializable, but doesn't define serialVersionUID&lt;/ShortDescription&gt;&lt;Details&gt;<br />
    &lt;BugCode abbrev='UrF'&gt;&lt;Description&gt;Unread field&lt;/Description&gt;&lt;/BugCode&gt;&lt;BugCode abbrev='SnVI'&gt;&lt;Description&gt;Serializable class with no Version ID&lt;/Description&gt;&lt;/BugCode&gt;<br />
</code><br />
To summarise: only <code>acme.App</code> is analysed, <code>acme.moo.App</code> (bad) isn&#8217;t and neither is<br />
<code>no_detect.App</code> (good).</p>
<p>I tried with two wildcards in the <code>onlyAnalyze</code> option but that produces a **successful build** but<br />
with a findbugs error (<code>Dangling meta character '*'</code> etc).</p>
<p>I tried with <code>onlyAnalyze</code> set to <code>acme.*,acme.moo.*</code> which analyzes all the expected<br />
classes (<code>acme.App</code> and <code>acme.moo.App</code>) which means it &#8220;works&#8221; but not as I expect; i.e. I have to explicitly declare all parent-packages for the classes I want to analyze: that could get large and difficult to maintain on a multi-module project!</p>
<p>Must. Keep. Trying.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexcollins.org/blog/2012/is-findbugs-maven-plugin-onlyanalyze-broken/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Leiningen and standalone clojure programs</title>
		<link>http://alexcollins.org/blog/2012/leiningen-standalone-clojure-progra</link>
		<comments>http://alexcollins.org/blog/2012/leiningen-standalone-clojure-progra#comments</comments>
		<pubDate>Fri, 27 Jan 2012 17:04:07 +0000</pubDate>
		<dc:creator>atc</dc:creator>
				<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Lisp]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[leiningen]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[unit testing]]></category>

		<guid isPermaLink="false">http://alexcollins.org/blog/?p=201</guid>
		<description><![CDATA[Hacking away at various clojure-related stuff lead me to start using Leiningen. &#8220;Lein&#8221; is a build tool similar to Maven (and interoperates in fact&#8230;) to help you concentrate on coding. At some point in the day&#8217;s coding I wanted to &#8230; <a href="http://alexcollins.org/blog/2012/leiningen-standalone-clojure-progra">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://alexcollins.org/blog/category/hacking">Hacking</a> away at various <a href="http://alexcollins.org/blog/tag/clojure" title="Clojure">clojure</a>-related stuff lead me to start using Leiningen. &#8220;Lein&#8221; is a build tool similar to Maven (and interoperates in fact&#8230;) to help you concentrate on coding.</p>
<p>At some point in the day&#8217;s coding I wanted to run my code standalone instead of in a REPL. I needed a main entry point to the various algorithms I was writing that was outside of unit tests, so I decided to use the &#8220;lein run&#8221; command to do it for me.</p>
<p>In order to get a program running via lein using a main method, you have to provide the namespace of the class to run. If you want a JAR produced that&#8217;ll have the <code>Main-Class</code> declaration in your <code>MANIFEST.MF</code> you also need to add <code>:aot</code> and <code>:main namespace.here</code> to your project.clj AND add <code>(:gen-class)</code> in the <code>(ns)</code> call of your desired <code>.clj</code> holding a <code>-main</code> method. Phew!</p>
<p>To re-cap, then:</p>
<ul>
<li>To run a .clj that has a <code>-main</code> method/function declared, add <code>(:gen-class)</code> to its <code>(ns)</code> call and then run <code>lein run namespace.here</code></li>
<li>To produce a JAR with lein, do the above and add <code>:aot</code> and <code>:main namespace.here</code> to your project.clj then run <code>lein compile &#038;&#038; lein uberjar</code></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://alexcollins.org/blog/2012/leiningen-standalone-clojure-progra/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Learning Programming Languages</title>
		<link>http://alexcollins.org/blog/2012/learning-programming-languages</link>
		<comments>http://alexcollins.org/blog/2012/learning-programming-languages#comments</comments>
		<pubDate>Thu, 26 Jan 2012 10:21:13 +0000</pubDate>
		<dc:creator>atc</dc:creator>
				<category><![CDATA[Clojure]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Lisp]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://alexcollins.org/blog/?p=195</guid>
		<description><![CDATA[I&#8217;m a hacker. Hackers like learning. Every year I try and learn a new programming language: it helps me to get better at thinking, I learn new ways of programming, it&#8217;s fun and I keep abreast with technology. In picking &#8230; <a href="http://alexcollins.org/blog/2012/learning-programming-languages">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a <a href="http://alexcollins.org/blog/tag/hacking" title="Hacking">hacker</a>. Hackers like learning. Every year I try and learn a new programming language: it helps me to get better at thinking, I learn new ways of programming, it&#8217;s fun and I keep abreast with technology. </p>
<p>In picking up a new language I run through certain easy problems that help me tackle the necessities of learning the APIs for a particular language and picking up habits (both good and bad) that are idiomatic of the chosen tongue. So, I decided to document what I do to learn to code. You can <a href="http://wiki.alexcollins.org/articles/Learning_Programming_Languages">read it on my wiki</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexcollins.org/blog/2012/learning-programming-languages/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modern Service Oriented Architecture: the basics</title>
		<link>http://alexcollins.org/blog/2012/modern-service-oriented-architecture-the-basics</link>
		<comments>http://alexcollins.org/blog/2012/modern-service-oriented-architecture-the-basics#comments</comments>
		<pubDate>Tue, 03 Jan 2012 16:46:43 +0000</pubDate>
		<dc:creator>atc</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Software Analysis/Design]]></category>
		<category><![CDATA[analysis]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[soa]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://alexcollins.org/blog/?p=163</guid>
		<description><![CDATA[Just some of my notes on looking over SOA related theory. What is &#8220;SOA&#8221;? Service Oriented Architecture is a means of exposing business services separately from their platform and codebase in order to provide local and/or remote invokation of said &#8230; <a href="http://alexcollins.org/blog/2012/modern-service-oriented-architecture-the-basics">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Just some of my notes on looking over SOA related theory.</p>
<p><strong>What is &#8220;SOA&#8221;?</strong><br />
Service Oriented Architecture is a means of exposing business services<br />
separately from their platform and codebase in order to provide local<br />
and/or remote invokation of said services through abstracted data types<br />
and signatures.</p>
<p>Put simply: SOA allows you to talk to alternate platforms by removing<br />
the bespoke or language-specific features and data types to a<br />
higher/specified representation providing interoperability between<br />
platforms without the need for their awareness of eachother.</p>
<p>As a real world example, an organisation can provide interoperation<br />
between legacy and new systems by abstracting the manner of how they<br />
talk and the underlying content: new code can use technologies like XML<br />
to define the data and the corresponding types and the two systems can<br />
work together through that abstraction. This scenario is commonplace<br />
among business where different streams are responsible for systems and<br />
so a common format for data interchange is necessary to allow the two to<br />
co-exist separately.</p>
<p>SOA also provides a more modular approach to service integration: if a<br />
web service can &#8220;proxy&#8221; requests from one system to another, the two can<br />
change independently without the need for related changes to the<br />
services themselves. Such a scenario – one of proxying – can encourage<br />
an ecosystem of services allowing each to communicate with seemingly<br />
unrelated counterparts through a common set of data types and methods.</p>
<p><strong>Benefits of SOA</strong><br />
Typically, the &#8220;promises&#8221; of SOA are numerous.</p>
<p><i>SOA allows for system agility</i><br />
As aluded to previously, the ability for bespoke systems – those written<br />
for specific purposes in a language of choice – to communicate with each<br />
other allows for greater flexibility and scalability with an<br />
organisation’s data. For example, if you can have your sales systems<br />
talking to your suppliers through an aggregation service to warn of<br />
unusual sales volumes, out-of-stock items and so-on, you can better<br />
support the volume of a growing business and provide real-time response<br />
to customer needs.</p>
<p>Consider an organisation where a sales system cannot speak with the MI<br />
to ascertain whether a customer on the phone holds an account with you.<br />
Crazy, no? In scenarios like this where legacy, decades-old and<br />
difficult to support systems hold the key to sales success but are the<br />
hindrance to it, SLA can be leveraged to quickly and easily have the two<br />
communicating and providing front-line departments with the information<br />
they need.</p>
<p><i>SOA can encourage innovation</i><br />
In the post-Google era, notions of service &#8220;mash-ups&#8221; are commonplace.<br />
These newfound, new-age businesses popularised the developer by<br />
harnessing open source technologies and building public-facing APIs: all<br />
built on service oriented architecture. They encouraged interoperation<br />
between seemingly unrealted entities which built a platform for<br />
innovation and a revolution in the software industry.</p>
<p>If you reduce this scale and manage to accomplish this very nature<br />
within an organisation, then new products and alternatives to existing<br />
ones spring from innovative and organic attitudes from developers and<br />
system integrators.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexcollins.org/blog/2012/modern-service-oriented-architecture-the-basics/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ouch</title>
		<link>http://alexcollins.org/blog/2012/ouch</link>
		<comments>http://alexcollins.org/blog/2012/ouch#comments</comments>
		<pubDate>Mon, 02 Jan 2012 17:56:33 +0000</pubDate>
		<dc:creator>atc</dc:creator>
				<category><![CDATA[Site]]></category>

		<guid isPermaLink="false">http://alexcollins.org/blog/?p=185</guid>
		<description><![CDATA[Don&#8217;t sudo telinit 6 all willy-nilly in a terminal without thinking twice. I just restarted this server accidentally! Very ouch. I&#8217;ve decided to have this alias in my .bashrc: alias telinit="echo Do you really want to telinit this server?!"]]></description>
			<content:encoded><![CDATA[<p>Don&#8217;t <code>sudo telinit 6</code> all willy-nilly in a terminal without thinking twice. I just restarted this server accidentally! Very ouch.</p>
<p>I&#8217;ve decided to have this alias in my <code>.bashrc</code>:</p>
<p><code>alias telinit="echo Do you really want to telinit this server?!"</code></p>
]]></content:encoded>
			<wfw:commentRss>http://alexcollins.org/blog/2012/ouch/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google&#8217;s slogan &#8220;Don&#8217;t be evil&#8221; is missing a bit</title>
		<link>http://alexcollins.org/blog/2012/googles-slogan-dont-be-evil-is-missing-a-bit</link>
		<comments>http://alexcollins.org/blog/2012/googles-slogan-dont-be-evil-is-missing-a-bit#comments</comments>
		<pubDate>Sun, 01 Jan 2012 18:17:06 +0000</pubDate>
		<dc:creator>atc</dc:creator>
				<category><![CDATA[Site]]></category>

		<guid isPermaLink="false">http://alexcollins.org/blog/?p=183</guid>
		<description><![CDATA[Don&#8217;t be evil [to our bottom line].]]></description>
			<content:encoded><![CDATA[<p>Don&#8217;t be evil <strong>[to our bottom line]</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexcollins.org/blog/2012/googles-slogan-dont-be-evil-is-missing-a-bit/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notes on Maven vs Ant</title>
		<link>http://alexcollins.org/blog/2011/notes-on-maven-vs-ant</link>
		<comments>http://alexcollins.org/blog/2011/notes-on-maven-vs-ant#comments</comments>
		<pubDate>Sun, 11 Dec 2011 13:26:59 +0000</pubDate>
		<dc:creator>atc</dc:creator>
				<category><![CDATA[Build Processes]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[build-processes maven programming hacking code ant]]></category>

		<guid isPermaLink="false">http://alexcollins.org/blog/?p=172</guid>
		<description><![CDATA[The Problem Do you have lack of consistency and understanding how your software is built? Does this equal varying degrees of success – both in each build and in changing or adding new features to it – and lack of &#8230; <a href="http://alexcollins.org/blog/2011/notes-on-maven-vs-ant">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h1 id="the-problem">The Problem</h1>
<p>Do you have lack of consistency and understanding how your software is built? Does this equal varying degrees of success – both in each build and in changing or adding new features to it – and lack of confidence from your developers?</p>
<p>Did you roll your own build process that’s &quot;the best thing since sliced bread&quot; but only a select few developers really know how to use it? Do you dedicate resource to tweaking or fixing your build scripts?</p>
<p>To put it another way: are all your developers building the software using the same scripts your continuous integration environment is using?</p>
<h1 id="whats-wrong-with-the-above">What’s Wrong with the Above?</h1>
<p>I believe building software should not be a complex process. It should be rare for a developer to delve into the build system to tweak it.</p>
<p>I also believe that because there are common parts to building – source code, tests, packaging – that there is little need for a &quot;shop&quot; to be going it alone and building something vanilla just because they can.</p>
<p>Essentially, building software comes down to performing a few tasks regularly and consistently; a developer will need to build, test and package regularly. Rarely do they need to work on the build system (unless something’s broken&#8230;).</p>
<p>With this in mind, should developers therefore not be able to perform these tasks without thinking about it? Wouldn’t it be beneficial to us all – as an industry even – to be able to go anywhere and build most software the same way because the requirements for building doesn’t differ?</p>
<p>I’m not making a case for never &quot;rolling your own&quot;, I’m merely trying to clarify that those who do may not need to do so. Granted, some scenarios warrant custom build scripts and the like.</p>
<h1 id="the-ant-perspective">The Ant Perspective</h1>
<p>With Ant, building means code. It means logic and that invariably doesn’t get the same strictness and quality applied to it like your everday Java and its counterparts. This means the build scripts quickly become convoluted, poorly maintained due to a &quot;get it working&quot; attitude. Unless a <em>good/strong</em> developer is dedicated to maintaining and scaling the build scripts, the job gets shared around and each unique developer’s perspective warps the overall goal.</p>
<p>Most software building is just a set of tasks that are repeated for each build. Compile this. Package this. Distribute that. It doesn’t make sense to have a human do that: computers are here to do the mundane stuff.</p>
<h1 id="the-maven-perspective">The Maven Perspective</h1>
<p>With Maven, you just provide metadata. The framework provides the logic in a consistent and predictable manner.Don&#8217;t you want developers to be concentrating on writing code: fixing bugs, implementing new functionality and improving the quality of the product.</p>
<p>Maven allows one to have artefacts produced properly, with correct structure, metadata and naming conventions, that mean a developer – or person – doesn’t have to think to do it. These artefacts are of production quality, always.</p>
<h1 id="consistency">Consistency</h1>
<p>Consistency means one does not have to think about how or what they’re going to do when it comes to the build process.</p>
<p>If you’re a foreman building me a house and I say &quot;build it this way please&quot; and hand you a 3000 page instruction manual on how the Tudors and Stuarts built their houses prior to the great fire of London, you don’t say &quot;Yeah sure!&quot; you recoil because years of history and experience has taught you otherwise.</p>
<p>Is it fair to say that developers need to spend time fixing bugs and implementing new features and not spending time tweaking the bugs in the build system? Would you be happy to pay for a plumber to spend time fixing his toolbox instead of correcting that leak? If this isn’t acceptable, then you can understand why businesses might not want to spend the time (money) correcting your poor house keeping.</p>
<h1 id="quality-across-the-board">Quality Across the Board</h1>
<p>Consistency breeds quality. A scenario where best practice is common, reliable and well-established norms are instinct encourages going the extra mile to write better software. In contrast, an unreliable, poorly designed and maintained mode of practice breeds contempt. Building your software is part of all of this and is a contributor to success or failure.</p>
<p>I’m by no means saying &quot;blame your tools&quot;, just that better-quality tools can contribute to improved output.</p>
<h1 id="environments-are-a-different-beast">Environments are a Different Beast</h1>
<p>Environments have numerous issues whereas development seems fine; &quot;Works for me&quot; is far too common a response for when someone has to investigate a problem in a given deployment target.</p>
<h1 id="the-big-wins-with-maven">The big wins with Maven</h1>
<ul>
<li>
<p>Consistency across the board. It shouldn’t matter where you go or what customer project you’re on, you build, deploy, package and distribute artefacts the same way. Imagine a situation where developers can go anywhere and &quot;pick up where they left off&quot;: start developing within minutes.</p>
</li>
<li>
<p>Junit testing &#8211; maven bakes testing from the beginning, which brings it to the developer’s mindset at the right points (i.e. always)</p>
</li>
<li>
<p>Greatly simplifies build processes: it doesn’t become a matter of how, but when. Developers learn a simple set of commands that never changes</p>
</li>
<li>
<p>Dependency management is excellent: simplifies set up of projects, developers can get up-and-running within minutes</p>
</li>
<li>
<p>Packaging is excellent. Multiple formats supported, from JARs, EARs to Zip, TAR etc and it is not left to the understanding and implementation of the developer implementing the build script</p>
</li>
<li>
<p>Industry recognised: we don’t have to have developers &quot;get up to speed&quot; because maven works the same everywhere, developers just remember a few goals to tell maven what to do: compile, clean, test, package and they’re ready to start coding</p>
</li>
<li>
<p>Have your developers building code and understanding how it’s built, not programming by coincidence. Don&#8217;t be in a position where your developers are relying on their IDE to build and having a separate process entirely for your CI!</p>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://alexcollins.org/blog/2011/notes-on-maven-vs-ant/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convert LaTeX to any output format easily</title>
		<link>http://alexcollins.org/blog/2011/latex-convert-format-pdf-html-plain-markdown-wiki</link>
		<comments>http://alexcollins.org/blog/2011/latex-convert-format-pdf-html-plain-markdown-wiki#comments</comments>
		<pubDate>Sun, 04 Dec 2011 14:20:35 +0000</pubDate>
		<dc:creator>atc</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[LaTeX]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[notes]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[scripting]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://alexcollins.org/blog/?p=166</guid>
		<description><![CDATA[I use LaTeX to take notes, record TODO lists, the shopping and everything in between. Oftentimes, I&#8217;ll need to copy my notes to somewhere: a wiki, this blog, or to put in an email. It&#8217;s at this point I need &#8230; <a href="http://alexcollins.org/blog/2011/latex-convert-format-pdf-html-plain-markdown-wiki">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I use <a href="http://alexcollins.org/blog/2011/basic-latex-example" title="Basic LaTeX example">LaTeX</a> to take notes, record TODO lists, the shopping and everything in between.</p>
<p>Oftentimes, I&#8217;ll need to copy my notes to somewhere: a wiki, this blog, or to put in an email. It&#8217;s at this point I need to quickly convert to my target format.</p>
<p>So, to satisfy the above, I wrote a wrapper <a href="http://alexcollins.org/blog/tag/linux">script</a> that takes a file name and corresponding target format for output (according to Pandoc):</p>
<p><code>#!/bin/bash<br />
if [ $# -lt 2 ]; then<br />
	echo "Please provide a filename and output format compatible with pandoc"<br />
	exit 1<br />
fi<br />
pandoc -f latex -t $2 $1</code></p>
<p>Very simple. Like I said, take a file name and the pandoc output format and then pass it all to pandoc to convert the <a href="http://alexcollins.org/blog/2011/latex-coloured-boxes-with-rounded-edges" title="LaTeX: coloured boxes with rounded edges">LaTeX</a> original to a format of my choosing. Very handy!</p>
]]></content:encoded>
			<wfw:commentRss>http://alexcollins.org/blog/2011/latex-convert-format-pdf-html-plain-markdown-wiki/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>You wouldn&#8217;t build a palace with breeze blocks</title>
		<link>http://alexcollins.org/blog/2011/you-wouldnt-build-palace-with-breeze-blocks</link>
		<comments>http://alexcollins.org/blog/2011/you-wouldnt-build-palace-with-breeze-blocks#comments</comments>
		<pubDate>Fri, 02 Dec 2011 12:20:00 +0000</pubDate>
		<dc:creator>atc</dc:creator>
				<category><![CDATA[Build Processes]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[build processes]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://alexcollins.org/blog/?p=141</guid>
		<description><![CDATA[I strongly believe that if you want to build awesome software, then every aspect of it needs to be as good as you want the final product to be. It is often the case that aged software shops will have &#8230; <a href="http://alexcollins.org/blog/2011/you-wouldnt-build-palace-with-breeze-blocks">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>I strongly believe that if you want to build awesome software, then every aspect of it needs to be as good as you want the final product to be.</p>
<p>It is often the case that aged software shops will have put in place aspects of their software that they&#8217;ll &#8220;revisit later on&#8221;, which then doesn&#8217;t happen.</p>
<p>It gets lost to the crowd of &#8220;more important things to do&#8221;.</p>
<p>One of the most common neglects I see is how a shop will build, deploy and distribute its software. At best their solution is amateur. It&#8217;s usually home-baked and rigged with esoteric and often superfluous tasks and features that are &#8220;necessary&#8221; due to some poor design decision made previously. The build system &#8212; be it continuous integration or some poor sod in the corner &#8212; has to do 30 different things, copy 11 thousand files, just to compile the few.</p>
<p>And so the problem persists; the rot festers; the software continues to be sub-par and so do the profit margins.</p>
<p>I feel that if you start from the ground-up, that you build consistently and efficiently then your software becomes such. If it is easy for a developer to build and deploy or distribute your software, it&#8217;s then easy for them to do their job. Any developer knows the pains they&#8217;ll go through day-to-day when making a change that requires a 15-minute rebuild and 5 minute deployment wait just to check the first name field doesn&#8217;t fall over on a null pointer.</p>
<p>With poor practice comes poor software comes poor profit. </p>
<p>So if you&#8217;re heading up a development shop and your developers are crying for a more efficient, simpler, consistent build process, then heed their recommendations and concerns. Let them spend the time and money streamlining how they work, because you&#8217;ll get reliability, efficiency and less coffee breaks if you do.</p>
<p>Would you pay for that shiny new tablet PC if it came packaged in A4 paper? </p>
<p>How disappointed do you feel with a product when you hold it and you &#8220;know&#8221; its build quality is poor. </p>
<p>Why is software any different?</p>
<p>You wouldn&#8217;t build a palace with breeze blocks.</p>
]]></content:encoded>
			<wfw:commentRss>http://alexcollins.org/blog/2011/you-wouldnt-build-palace-with-breeze-blocks/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

