<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>HACKINGON.NET</title>
    <description>Pragmatic ALT.NET Web Development</description>
    <link>http://hackingon.net/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.4.5.0</generator>
    <language>en-AU</language>
    <blogChannel:blogRoll>http://hackingon.net/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Liam McLennan</dc:creator>
    <dc:title>HACKINGON.NET</dc:title>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Hackingonnet" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="hackingonnet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>The Peter-Principled Pointy-Haired Bureaucrat</title>
      <description>&lt;div&gt;The phrase that most annoys me in the office is:&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;blockquote&gt;
&lt;div&gt;&amp;quot;but that's just the way it is. Anyway...&amp;quot;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;or&lt;/div&gt;
&lt;blockquote&gt;
&lt;div&gt;&amp;quot;but we can't change that&amp;quot;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Blind allegience to the master. This phrase is most often dropped when some potential improvement has become too obvious to simply ignore. It is the beuracrats rallying cry to do nothing and return to the safe and the simple. This is the culture that renders agile retrospectives pointless in many large organisations. The most that can come out of a retro is a list of improvements that will never be implemented. It does not take long before the team develops a social convention that what can't be fixed should not be mentioned, and so the sweeping under the rug is complete. &amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;But it's bullshit. The status quo is not immutable.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Most often, the only forces preventing improvement are laziness, cowardice and politics. Some peter-principled pointy-haired bureaucrat has hoarded power to himself to feed his ego or career prospects.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Corporate I.T. are often the worst offenders. They establish their little fifedom and rule as brutal dictators. They have discovered that the easiest way to secure a network is to render it completely non-functional. I sometimes wonder why they bother with firewalls and proxies when they could simple remove all the network cables. An information worker's computer is a tool to facilitate their work, yet the first thing that happens when new computers are delivered is that I.T. swoops down from Mount Olympus and renders them barely functional.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;I feel that if we abandoned the unspoken assumption that waste is acceptable then incompetence would cease to be excusable. We are so accustomed to inefficiency that we no longer notice or care.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;blockquote&gt;
&lt;div&gt;Blood and destruction shall be so in use&amp;nbsp;&lt;/div&gt;
&lt;div&gt;And dreadful objects so familiar&amp;nbsp;&lt;/div&gt;
&lt;div&gt;That mothers shall but smile when they behold&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Their infants quarter'd with the hands of war;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;All pity choked with custom of fell deeds&lt;/div&gt;
&lt;/blockquote&gt;</description>
      <link>http://hackingon.net/post/The-Peter-Principled-Pointy-Haired-Bureaucrat.aspx</link>
      <author>liam.mclennan.nospam@nospam.gmail.com (liammclennan)</author>
      <comments>http://hackingon.net/post/The-Peter-Principled-Pointy-Haired-Bureaucrat.aspx#comment</comments>
      <guid>http://hackingon.net/post.aspx?id=f15bb6db-7970-4a3a-aee5-c76f213f880c</guid>
      <pubDate>Thu, 03 Nov 2011 08:17:00 +1000</pubDate>
      <dc:publisher>liammclennan</dc:publisher>
      <pingback:server>http://hackingon.net/pingback.axd</pingback:server>
      <pingback:target>http://hackingon.net/post.aspx?id=f15bb6db-7970-4a3a-aee5-c76f213f880c</pingback:target>
      <slash:comments>25</slash:comments>
      <trackback:ping>http://hackingon.net/trackback.axd?id=f15bb6db-7970-4a3a-aee5-c76f213f880c</trackback:ping>
      <wfw:comment>http://hackingon.net/post/The-Peter-Principled-Pointy-Haired-Bureaucrat.aspx#comment</wfw:comment>
      <wfw:commentRss>http://hackingon.net/syndication.axd?post=f15bb6db-7970-4a3a-aee5-c76f213f880c</wfw:commentRss>
    </item>
    <item>
      <title>Life</title>
      <description>&lt;div&gt;&lt;img alt="galaxy" width="640" height="430" vspace="10" hspace="10" align="right" src="/userfiles/image/galaxy.jpg" /&gt;In high school I had a small and very close group of friends. They were the best friends I have ever had, or will ever have. Five years after we graduated my girlfried (now wife) and I held a fancy-dress party. One of my old school friends was complaining of shoulder pain. He had an appointment with a specialist the next day. The cause of his shoulder pain turned out to be a tumor. A year later he died.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;I am sure most people have a similar story that reminds them of their mortality. And there but for the grace of a random universe go I. At the time, I made a commitment (to myself) not to forget my friend, because I knew how easy it is to let someone's memory fade. Five years later I don't think about him every day, but he is in my thoughts a lot. He reminds me to go fast, to create as much value as I can and waste no time. Time is long. Life is short.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;My wife and I are expecting our first child in February. Despite every baby name book ever written we have not been able to choose a first name, but we agreed on a middle name straight away - Michael.&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <link>http://hackingon.net/post/Life.aspx</link>
      <author>liam.mclennan.nospam@nospam.gmail.com (liammclennan)</author>
      <comments>http://hackingon.net/post/Life.aspx#comment</comments>
      <guid>http://hackingon.net/post.aspx?id=66074b94-85db-418a-8817-b584c8b174a1</guid>
      <pubDate>Sun, 16 Oct 2011 17:33:00 +1000</pubDate>
      <dc:publisher>liammclennan</dc:publisher>
      <pingback:server>http://hackingon.net/pingback.axd</pingback:server>
      <pingback:target>http://hackingon.net/post.aspx?id=66074b94-85db-418a-8817-b584c8b174a1</pingback:target>
      <slash:comments>14</slash:comments>
      <trackback:ping>http://hackingon.net/trackback.axd?id=66074b94-85db-418a-8817-b584c8b174a1</trackback:ping>
      <wfw:comment>http://hackingon.net/post/Life.aspx#comment</wfw:comment>
      <wfw:commentRss>http://hackingon.net/syndication.axd?post=66074b94-85db-418a-8817-b584c8b174a1</wfw:commentRss>
    </item>
    <item>
      <title>Nhibernate Linq, Oracle and comparing to an empty string</title>
      <description>&lt;p&gt;&amp;nbsp;When you write an NHibernate Linq query you may want to include a predicate to check that a property/field has a value, which might look like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;person.Email != &amp;quot;&amp;quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;NHibernate will convert this to a sql expression&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Email &amp;lt;&amp;gt; ''&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Because oracle evaluates empty strings as null this does not work. The query will never return any rows. The best solution I could find was to use the string length&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;person.Email.Length &amp;gt; 0&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <link>http://hackingon.net/post/Nhibernate-Linq-Oracle-and-comparing-to-an-empty-string.aspx</link>
      <author>liam.mclennan.nospam@nospam.gmail.com (liammclennan)</author>
      <comments>http://hackingon.net/post/Nhibernate-Linq-Oracle-and-comparing-to-an-empty-string.aspx#comment</comments>
      <guid>http://hackingon.net/post.aspx?id=761b36ee-9ee4-47dd-b9ab-8288419bbb50</guid>
      <pubDate>Wed, 07 Sep 2011 11:03:00 +1000</pubDate>
      <category>Web Development</category>
      <dc:publisher>liammclennan</dc:publisher>
      <pingback:server>http://hackingon.net/pingback.axd</pingback:server>
      <pingback:target>http://hackingon.net/post.aspx?id=761b36ee-9ee4-47dd-b9ab-8288419bbb50</pingback:target>
      <slash:comments>11</slash:comments>
      <trackback:ping>http://hackingon.net/trackback.axd?id=761b36ee-9ee4-47dd-b9ab-8288419bbb50</trackback:ping>
      <wfw:comment>http://hackingon.net/post/Nhibernate-Linq-Oracle-and-comparing-to-an-empty-string.aspx#comment</wfw:comment>
      <wfw:commentRss>http://hackingon.net/syndication.axd?post=761b36ee-9ee4-47dd-b9ab-8288419bbb50</wfw:commentRss>
    </item>
    <item>
      <title>Notes On Problem Solving</title>
      <description>&lt;div&gt;I have tried to solve many problems in my life, with the solutions created falling roughly into two categories: those that I am proud of and those that I would prefer to forget. Attempting to bias my future towards the former category I spent some time examinging what those successfull solutions had in common, and devised the following heuristic that anecdotally appears to work for me. YMMV. I'm probably stupid. The fact is you may be better off to do exactly the opposite of anything I say.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h1&gt;Heuristic for Successful Problem Solving&lt;/h1&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;Break It Down&lt;/h2&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Start by decomposing a big hairy problem into many small fuzzy problems. Refine or restart this process until a promising design emerges.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;Solve a Little Problem&lt;/h2&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Pick a small fuzzy problem that provides a logical first (or next) step. Learn as much as possible about the problem domain including everything needed to solve the small fuzzy problem and then a little bit more. This means giving up the implied rule that if you're not typing you're not working. It means reading. And prototyping. And decompiling. I know that I need more knowledge and less typing when I find myself slipping into trial and error.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;Record What You Learn&lt;/h2&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;When you're on a role or under pressure it can be difficult but I have found it valuable to make sure that I record what I learn. For a web programmer this is often as simple as recording a significant URL for later reference. Here are some concrete examples:&lt;/div&gt;
&lt;ul&gt;
    &lt;li&gt;Write what you have learnt in setting concrete (that's a little joke)&lt;/li&gt;
    &lt;li&gt;Begin each spike with a set of questions that the spike aims to answer. I use a readme file located somewhere obvious (such as /project/spikes/name_of_spike/readme). When the spike is complete append the answer to each question to the readme.&lt;/li&gt;
    &lt;li&gt;Record notes in a personal wiki. I have a &lt;a href="http://www.tiddlywiki.com/"&gt;tiddlywiki&lt;/a&gt; in my dropbox. I have been recording notes in the same wiki since July 2005.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;Do Not Compromise: Measure Twice, Cut Once&lt;/h2&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Uncle Bob never tires of reminding us that cutting corners makes us move slower. My anecdotal experience suggests that compromising on the solutions to the small fuzzy problems is a mistake. It makes me slower in the medium and long term. Take the time to get the best solution. Rewrite things.&amp;nbsp;To get it right I often have to do things more than once.&amp;nbsp;Many small things working perfectly are how we build big complicated things that work at all.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Management tend to work by intuition. And refusing to compromise on quality intuitively feels like gold-platting that will hurt budgets and timeframes. But it won't. If the goal is the best solution possible then it will help budgets and timeframes. It may be the only way to hit budgets and timeframes. Your boss may say that you are not being pragmatic because she doesn't realise that doing it properly IS pragmatic.&amp;nbsp;The best solutions are produced when the goal is perfection. The old 'be pragmatic' get it done and out the door attitude leads to mediocraty. This is why I like to work on products, where quality is everything.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;h2&gt;If You Are Not Winning Stop&lt;/h2&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;If it's not working, for the love of atheist god, quit, walk away, give up, throw in the towel, and then burn the towel.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;It's a little known fact that all of Einstein's greatest breakthroughs occured on the can.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;Again, I am writing this down because I know that it is true, yet I find it hard to practive, because it is counter intuitive. It always feel like just one more hack will get me over the line. Once more, slipping into trial and error is a sure sign that things are not right. So stop. Get someone else to take a look at it, leave it until tomorrow or take a walk.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;</description>
      <link>http://hackingon.net/post/Notes-On-Problem-Solving.aspx</link>
      <author>liam.mclennan.nospam@nospam.gmail.com (liammclennan)</author>
      <comments>http://hackingon.net/post/Notes-On-Problem-Solving.aspx#comment</comments>
      <guid>http://hackingon.net/post.aspx?id=66713380-b4a6-45e6-af1c-6e0cb7265d6b</guid>
      <pubDate>Sun, 21 Aug 2011 19:04:00 +1000</pubDate>
      <category>Web Development</category>
      <dc:publisher>liammclennan</dc:publisher>
      <pingback:server>http://hackingon.net/pingback.axd</pingback:server>
      <pingback:target>http://hackingon.net/post.aspx?id=66713380-b4a6-45e6-af1c-6e0cb7265d6b</pingback:target>
      <slash:comments>10</slash:comments>
      <trackback:ping>http://hackingon.net/trackback.axd?id=66713380-b4a6-45e6-af1c-6e0cb7265d6b</trackback:ping>
      <wfw:comment>http://hackingon.net/post/Notes-On-Problem-Solving.aspx#comment</wfw:comment>
      <wfw:commentRss>http://hackingon.net/syndication.axd?post=66713380-b4a6-45e6-af1c-6e0cb7265d6b</wfw:commentRss>
    </item>
    <item>
      <title>Rich Text Editors (and Microsoft Word) Must Die</title>
      <description>&lt;p&gt;Rich text editors, by which I mostly mean the WYSIWYG text editors that allow people to create formatted HTML, are a blight upon the internet. Every application I have ever seen that included a rich text editor resulted in the creation of eye-bleedingly hideous content. Take this average example of what happens when information workers get their hands on a WYSIWYG editor:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://hackingon.net/image.axd?picture=Windows-Live-Writer/3cd015ab2f88/14180F80/image.png"&gt;&lt;img width="756" height="772" border="0" style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" alt="image" src="http://hackingon.net/image.axd?picture=Windows-Live-Writer/3cd015ab2f88/25339F58/image_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now doesn&amp;rsquo;t that make you want to cry?&lt;/p&gt;
&lt;p&gt;This is not an edge case. Content creators consistently give birth to these monsters and no amount of gentle (or rough) cajoling will help. It&amp;rsquo;s not their fault, they only do what comes naturally and what they should be expected to do. It&amp;rsquo;s our fault for providing tools with inherent flaws.&lt;/p&gt;
&lt;h2&gt;Why Does This Happen?&lt;/h2&gt;
&lt;p&gt;We include rich text editors in applications because they provide instant visual feedback, giving the user a feeling of power and control. But it&amp;rsquo;s like giving a light saber to a two year old. What follows is my list of reasons why rich text editors must die.&lt;/p&gt;
&lt;h3&gt;When Everything Is Highlighted, Nothing Is Highlighted&lt;/h3&gt;
&lt;p&gt;This is the most common and acute symptom or rich text editors. Authors wish to highlight an important point, &lt;strong&gt;so they make it bold&lt;/strong&gt;. But of course the other things they have to say &lt;em&gt;&lt;u&gt;&lt;font size="4"&gt;are important too&lt;/font&gt;&lt;/u&gt;&lt;/em&gt;. All of which leads to the &lt;font size="5" color="#ff0000" style="background-color: #ffff00"&gt;&lt;strong&gt;truly important idea&lt;/strong&gt;&lt;/font&gt;. By the time they are done, nothing stands out.&lt;/p&gt;
&lt;h3&gt;I Know It When I See It&lt;/h3&gt;
&lt;p&gt;A moderately talented information worker is capable of examining published material and expressing an intelligent opinion on the effectiveness of the design. They intuitively &amp;lsquo;feel&amp;rsquo; when a design works, but this does not translate into an ability to create good design themself. When it comes to their own work their design-dar is completely useless. The majority of the people creating content do not have the skills to present that content with good design.&lt;/p&gt;
&lt;h3&gt;Shotgun Surgery&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://c2.com/cgi/wiki?ShotgunSurgery"&gt;Shotgun Surgery&lt;/a&gt; is a software development anti-pattern described as &amp;ldquo;making a number of small changes to a number of different areas in the code, in order to effect a single, coherent change in behavior&amp;rdquo;. This situation arises in content formatting if the content creators have been able to include formatting within their content. Imagine having a library of thousands of help files and wanting to change the heading font. If the authors have individually set the heading fonts in each document then you have a big problem.&lt;/p&gt;
&lt;h3&gt;Consistency&lt;/h3&gt;
&lt;p&gt;Related to shotgun surgery is the difficulty of enforcing consistency when authors are able to format content themselves. &lt;a href="http://joncom.be/experiments/markdown-editor/"&gt;Writing about his experience with documentation in his workplace&lt;/a&gt;, Jon Combe discussed:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;inconsistencies between documents that make styling and branding across documents a project in itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Information Loss&lt;/h3&gt;
&lt;p&gt;When text is saved as HTML information is lost. Automatic operations against the content becomes difficult. Consider the common example of searching documents. Its easy to search text but searching HTML is tricky. You first need to extract the text from the markup. It would not do to return thousands of results for &amp;lsquo;div&amp;rsquo;.&lt;/p&gt;
&lt;p&gt;Consider the merging of documents. It&amp;rsquo;s easy to merge text documents programmatically. Merging HTML is problematic because the merged document may be semantically incorrect or malformed. Merging Microsoft Word of PDF documents is close to impossible.&lt;/p&gt;
&lt;h3&gt;Separation of Concerns&lt;/h3&gt;
&lt;p&gt;As programmers we know that we should not mix orthogonal concerns, such as content and presentation. They should be defined separately and they should be able to vary independently.&lt;/p&gt;
&lt;h2&gt;Some Ideas That Almost Work&lt;/h2&gt;
&lt;p&gt;The democratization of content creation and publishing is one of the drivers of the current technology revolution, so this problem cannot be solved by taking away their crayons. But what if we took away just the coloured ones? Here are some strategies in use today that reduce, but don&amp;rsquo;t solve the problem.&lt;/p&gt;
&lt;h3&gt;Reduced Formatting Options&lt;/h3&gt;
&lt;p&gt;Reduce the &lt;a href="http://www.tinymce.com/tryit/full.php"&gt;text-editor gone mad&lt;/a&gt; by disabling as many of the formatting controls as you can get away with. The less power authors have, the less damage they can do.&lt;/p&gt;
&lt;h3&gt;Reduce Formatting to Styles&lt;/h3&gt;
&lt;p&gt;The logical conclusion of reducing formatting options is to prevent all formatting other than the application of CSS styles. This actually solves a number of my objections to rich text formatting (but not all).&lt;/p&gt;
&lt;h2&gt;But What Can I Do?&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://hackingon.net/image.axd?picture=Windows-Live-Writer/3cd015ab2f88/656190D4/image.png"&gt;&lt;img width="164" height="244" border="0" align="right" style="background-image: none; border-right-width: 0px; margin: 0px 0px 0px 10px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" alt="image" src="http://hackingon.net/image.axd?picture=Windows-Live-Writer/3cd015ab2f88/1AB6B508/image_thumb.png" /&gt;&lt;/a&gt;Step away from the black pit of despair, for their is a solution.&lt;/p&gt;
&lt;h3&gt;Create Content Using A Semantic Text Language &amp;ndash; Such As Markdown&lt;/h3&gt;
&lt;p&gt;Markdown is an easy-to-read, easy-to-write lightweight markup language. It is extremely close to plain text, with just the most basic formatting commands included. It encourages authors to focus on content and leave presentation as a separate step.&lt;/p&gt;
&lt;p&gt;Jon Combe described why markdown (or similar) is the best solution to the rich text editor blues:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Anyone, technical or otherwise, can work with it, we can edit a stylesheet once and keep all documents looking consistent across the product range, and use it to export to HTML and PDF (via pandoc). Sure, Word can do the above, but at the expense of ugly, bloated HTML and inconsistencies between documents that make styling and branding across documents a project in itself.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jon publishes a &lt;a target="_blank" href="http://joncom.be/experiments/markdown-editor/edit/"&gt;markdown editor&lt;/a&gt; that you can use to experiment with the syntax. If you use &lt;a target="_blank" href="http://github.github.com/github-flavored-markdown/"&gt;Github&lt;/a&gt;,&amp;nbsp;&lt;a target="_blank" href="http://stackoverflow.com/editing-help"&gt;Stack Overflow&lt;/a&gt;&amp;nbsp;or &lt;a target="_blank" href="http://www.funnelweblog.com/"&gt;FunnelWeb&lt;/a&gt; then you have probably already used markdown.&lt;/p&gt;
&lt;p&gt;This is an option that will not be popular with users. They WANT full control over the presentation of the document they are creating because:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;power always feels good&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect"&gt;they don&amp;rsquo;t realise that their design skills suck&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;they have not thought about broader issues such as full text search, varied presentation or programmatic manipulation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Like most medicine it might not taste good at first, but the benefits are enormous, especially to organisations that publish large volumes of material.&lt;/p&gt;
&lt;p&gt;I have a dream that one day we will see the end of rich text editors, Microsoft Word and their kind.&lt;/p&gt;
&lt;p&gt;I have a dream that one day the overzealous formatters and the semantic text aficionados will be able to sit down together at the table of brotherhood.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;PS. I feel a tad guilty about appropriating one of the twentieth centuries greatest speeches to make an insignificant point about content creation, storage and manipulation. To salve my conscience here is a link to the &lt;a href="http://www.americanrhetoric.com/speeches/mlkihaveadream.htm"&gt;full text of Martin Luther King&amp;rsquo;s I Have A Dream speech&lt;/a&gt;. Read it.&lt;/p&gt;</description>
      <link>http://hackingon.net/post/Text-Editors-(and-Microsoft-Word)-Must-Die.aspx</link>
      <author>liam.mclennan.nospam@nospam.gmail.com (liammclennan)</author>
      <comments>http://hackingon.net/post/Text-Editors-(and-Microsoft-Word)-Must-Die.aspx#comment</comments>
      <guid>http://hackingon.net/post.aspx?id=2a387449-f1bd-4a96-b62f-3cd8588330ab</guid>
      <pubDate>Wed, 17 Aug 2011 18:58:00 +1000</pubDate>
      <category>Web Development</category>
      <dc:publisher>liammclennan</dc:publisher>
      <pingback:server>http://hackingon.net/pingback.axd</pingback:server>
      <pingback:target>http://hackingon.net/post.aspx?id=2a387449-f1bd-4a96-b62f-3cd8588330ab</pingback:target>
      <slash:comments>20</slash:comments>
      <trackback:ping>http://hackingon.net/trackback.axd?id=2a387449-f1bd-4a96-b62f-3cd8588330ab</trackback:ping>
      <wfw:comment>http://hackingon.net/post/Text-Editors-(and-Microsoft-Word)-Must-Die.aspx#comment</wfw:comment>
      <wfw:commentRss>http://hackingon.net/syndication.axd?post=2a387449-f1bd-4a96-b62f-3cd8588330ab</wfw:commentRss>
    </item>
    <item>
      <title>JavaScript Course For Pluralsight</title>
      <description>&lt;p&gt;&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: arial, helvetica, 'sans serif'; font-size: 13px; "&gt;It's not exactly news now, but earlier this year I published a course for pluralsight called&amp;nbsp;&lt;a href="http://www.pluralsight-training.net/microsoft/courses/tableofcontents?courseName=jscript-fundamentals" style="color: rgb(123, 0, 0); font-family: arial, helvetica, sans-serif; font-size: 12px; text-decoration: none; "&gt;'JavaScript Fundamentals'&lt;/a&gt;. The course has been doing&amp;nbsp;&lt;em&gt;very&lt;/em&gt;&amp;nbsp;well so thank you to everyone who completed it. It's not free - I think you need a $30 monthly subscription to view it.&lt;/span&gt;&lt;/p&gt;</description>
      <link>http://hackingon.net/post/JavaScript-Course-For-Pluralsight.aspx</link>
      <author>liam.mclennan.nospam@nospam.gmail.com (liammclennan)</author>
      <comments>http://hackingon.net/post/JavaScript-Course-For-Pluralsight.aspx#comment</comments>
      <guid>http://hackingon.net/post.aspx?id=e7de5a45-52e8-44f1-8cbe-1d38228fd8a1</guid>
      <pubDate>Fri, 12 Aug 2011 07:02:00 +1000</pubDate>
      <category>Web Development</category>
      <dc:publisher>liammclennan</dc:publisher>
      <pingback:server>http://hackingon.net/pingback.axd</pingback:server>
      <pingback:target>http://hackingon.net/post.aspx?id=e7de5a45-52e8-44f1-8cbe-1d38228fd8a1</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://hackingon.net/trackback.axd?id=e7de5a45-52e8-44f1-8cbe-1d38228fd8a1</trackback:ping>
      <wfw:comment>http://hackingon.net/post/JavaScript-Course-For-Pluralsight.aspx#comment</wfw:comment>
      <wfw:commentRss>http://hackingon.net/syndication.axd?post=e7de5a45-52e8-44f1-8cbe-1d38228fd8a1</wfw:commentRss>
    </item>
    <item>
      <title>Why Namespace and Directory Hierarchies Should Not Always Match</title>
      <description>&lt;p&gt;I tweeted&lt;/p&gt;
&lt;blockquote&gt; there are good reasons to have different hierarchies for directories and namespaces. Resharper overruled. &lt;/blockquote&gt;
&lt;p&gt;this post adds a brief explanation of what the hell I was talking about.&lt;/p&gt;
&lt;p&gt;By default, Resharper encourages us to use a directory hierarchy that matches our namespace hierarchy. Most of the time this is a sensible starting point, but there are some occassions when it is not ideal.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In my current project we group classes by function. Elsewhere, we have other classes that are named by function. The purpose of namespaces is to prevent name collision, but in our case if the namespaces match the directories it actually causes a name collision between the namespace and the identically named class.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Since there is no reason why the classes grouped (in directories) by function need to be in separate namespaces we put them all in the same namespace, thus resolving the name collision.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <link>http://hackingon.net/post/Why-Namespace-and-Directory-Hierarchies-Should-Not-Always-Match.aspx</link>
      <author>liam.mclennan.nospam@nospam.gmail.com (liammclennan)</author>
      <comments>http://hackingon.net/post/Why-Namespace-and-Directory-Hierarchies-Should-Not-Always-Match.aspx#comment</comments>
      <guid>http://hackingon.net/post.aspx?id=0561a6e3-d171-44be-8536-98b5155fb318</guid>
      <pubDate>Wed, 27 Jul 2011 20:04:00 +1000</pubDate>
      <dc:publisher>liammclennan</dc:publisher>
      <pingback:server>http://hackingon.net/pingback.axd</pingback:server>
      <pingback:target>http://hackingon.net/post.aspx?id=0561a6e3-d171-44be-8536-98b5155fb318</pingback:target>
      <slash:comments>13</slash:comments>
      <trackback:ping>http://hackingon.net/trackback.axd?id=0561a6e3-d171-44be-8536-98b5155fb318</trackback:ping>
      <wfw:comment>http://hackingon.net/post/Why-Namespace-and-Directory-Hierarchies-Should-Not-Always-Match.aspx#comment</wfw:comment>
      <wfw:commentRss>http://hackingon.net/syndication.axd?post=0561a6e3-d171-44be-8536-98b5155fb318</wfw:commentRss>
    </item>
    <item>
      <title>A Pattern For Injecting Dependencies into JavaScript Modules</title>
      <description>&lt;p&gt;&amp;nbsp;The obvious and default way of resolving dependencies in JavaScript modules is to do so as needed. In other words, I request a dependency at the point where it is required. The effect of this is to make all modules responsible for resolving the dependencies that they require and to make it nearly impossible to test modules in isolation. Such code often looks like this:&lt;/p&gt;
&lt;script src="https://gist.github.com/1086983.js?file=gistfile1.js"&gt;&lt;/script&gt;
&lt;p&gt;My current preferred solution is to write modules that expose a sinlge variable which is &amp;nbsp;a function that returns the actual module. The input to the function is the modules dependencies. At runtime the function is called with no arguments - so it resolves the dependencies internally. For testing, the function is passed mock dependencies. Here is a module that supports dependency injection:&lt;/p&gt;
&lt;script src="https://gist.github.com/1086987.js?file=gistfile1.txt"&gt;&lt;/script&gt;
&lt;p&gt;and an example of using the module with real and fake dependencies:&lt;/p&gt;
&lt;script src="https://gist.github.com/1086996.js?file=gistfile1.js"&gt;&lt;/script&gt;
&lt;p&gt;The examples given use the node.js module syntax, but the pattern works for require.js and probably some other JavaScript module frameworks. This is what I came up with because I could not find any existing work on dependency injection for JavaScript modules. If you can point me to any alternatives I would appreciate it.&lt;/p&gt;</description>
      <link>http://hackingon.net/post/A-Pattern-For-Injecting-Dependencies-into-JavaScript-Modules.aspx</link>
      <author>liam.mclennan.nospam@nospam.gmail.com (liammclennan)</author>
      <comments>http://hackingon.net/post/A-Pattern-For-Injecting-Dependencies-into-JavaScript-Modules.aspx#comment</comments>
      <guid>http://hackingon.net/post.aspx?id=fde3da37-48dc-4fc3-97a5-95f68a2b629c</guid>
      <pubDate>Sun, 17 Jul 2011 10:33:00 +1000</pubDate>
      <category>Web Development</category>
      <dc:publisher>liammclennan</dc:publisher>
      <pingback:server>http://hackingon.net/pingback.axd</pingback:server>
      <pingback:target>http://hackingon.net/post.aspx?id=fde3da37-48dc-4fc3-97a5-95f68a2b629c</pingback:target>
      <slash:comments>5</slash:comments>
      <trackback:ping>http://hackingon.net/trackback.axd?id=fde3da37-48dc-4fc3-97a5-95f68a2b629c</trackback:ping>
      <wfw:comment>http://hackingon.net/post/A-Pattern-For-Injecting-Dependencies-into-JavaScript-Modules.aspx#comment</wfw:comment>
      <wfw:commentRss>http://hackingon.net/syndication.axd?post=fde3da37-48dc-4fc3-97a5-95f68a2b629c</wfw:commentRss>
    </item>
    <item>
      <title>Notes on NHibernate Many-to-many Relationships</title>
      <description>&lt;div&gt;&lt;font size="2" face="Arial"&gt;1. Ideally, a many-to-many relationship should be  managed by just one end of the relationship. Therefore, the mapping on one end  should be inverse. If both ends control the relationship then connecting the two  entities can cause duplicate entries in the join table.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font size="2" face="Arial"&gt;2. To delete an entiity that is part of a  many-to-many the entity must be removed from the collection that controlls the  relationship (i.e. the one that is not inverse)&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font size="2" face="Arial"&gt;3. Cascading on many-to-many relationships refers  to the other entity, not to the relationship. Cascading deletes is usually a bad  idea.&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;font size="2" face="Arial"&gt;4. By default, fluent nhibernate maps many-to-many  relationships using bags. If something is deleted from the bag &lt;a href="http://www.codinginstinct.com/2010/03/nhibernate-tip-use-set-for-many-to-many.html"&gt;nhibernate  persists the change by deleting (from the database) every record in the bag&lt;/a&gt;, and  then re-inserting every record except the one that was deleted. If the  collection contains a large number of records this could cause a performance  problem. A solution is to map the relationship as sets. For fluent nhibernate  this means using the AsSet() method on the relationship mapping and using  ICollection&amp;lt;&amp;gt; as the type of the collections.&lt;/font&gt;&lt;/div&gt;</description>
      <link>http://hackingon.net/post/Notes-on-NHibernate-Many-to-many-Relationships.aspx</link>
      <author>liam.mclennan.nospam@nospam.gmail.com (liammclennan)</author>
      <comments>http://hackingon.net/post/Notes-on-NHibernate-Many-to-many-Relationships.aspx#comment</comments>
      <guid>http://hackingon.net/post.aspx?id=117a34d1-1bfb-433e-ae16-94fce1303bbd</guid>
      <pubDate>Wed, 06 Jul 2011 18:27:00 +1000</pubDate>
      <category>Web Development</category>
      <dc:publisher>liammclennan</dc:publisher>
      <pingback:server>http://hackingon.net/pingback.axd</pingback:server>
      <pingback:target>http://hackingon.net/post.aspx?id=117a34d1-1bfb-433e-ae16-94fce1303bbd</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://hackingon.net/trackback.axd?id=117a34d1-1bfb-433e-ae16-94fce1303bbd</trackback:ping>
      <wfw:comment>http://hackingon.net/post/Notes-on-NHibernate-Many-to-many-Relationships.aspx#comment</wfw:comment>
      <wfw:commentRss>http://hackingon.net/syndication.axd?post=117a34d1-1bfb-433e-ae16-94fce1303bbd</wfw:commentRss>
    </item>
    <item>
      <title>The Expressiveness of CoffeeScript</title>
      <description>&lt;p&gt;Some time ago I wrote a simple JavaScript function (_properties) to report the non-function properties of a JavaScript object. &lt;/p&gt;
&lt;script src="https://gist.github.com/1014150.js?file=gistfile1.js"&gt;&lt;/script&gt;
&lt;p&gt;the same function, rewritten in CoffeeScript, is:&lt;/p&gt;
&lt;script src="https://gist.github.com/1014146.js?file=gistfile1.coffee"&gt;&lt;/script&gt;
&lt;p&gt;It is shorter (down from 9 lines to 2) and easier to read.&lt;/p&gt;</description>
      <link>http://hackingon.net/post/The-Expressiveness-of-CoffeeScript.aspx</link>
      <author>liam.mclennan.nospam@nospam.gmail.com (liammclennan)</author>
      <comments>http://hackingon.net/post/The-Expressiveness-of-CoffeeScript.aspx#comment</comments>
      <guid>http://hackingon.net/post.aspx?id=dbb11783-89c6-420d-903e-3785a8848b1c</guid>
      <pubDate>Wed, 08 Jun 2011 20:05:00 +1000</pubDate>
      <category>Web Development</category>
      <dc:publisher>liammclennan</dc:publisher>
      <pingback:server>http://hackingon.net/pingback.axd</pingback:server>
      <pingback:target>http://hackingon.net/post.aspx?id=dbb11783-89c6-420d-903e-3785a8848b1c</pingback:target>
      <slash:comments>7</slash:comments>
      <trackback:ping>http://hackingon.net/trackback.axd?id=dbb11783-89c6-420d-903e-3785a8848b1c</trackback:ping>
      <wfw:comment>http://hackingon.net/post/The-Expressiveness-of-CoffeeScript.aspx#comment</wfw:comment>
      <wfw:commentRss>http://hackingon.net/syndication.axd?post=dbb11783-89c6-420d-903e-3785a8848b1c</wfw:commentRss>
    </item>
  </channel>
</rss>

