<?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:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
<title>Matt Ryall's Weblog</title>
<link>http://www.mattryall.net</link>

<description>Matt Ryall's Weblog</description>
<ttl>60</ttl>


<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/mattryall" type="application/rss+xml" /><item>
	<title>On a slow boat to China</title>
	<link>http://feedproxy.google.com/~r/mattryall/~3/41yo2ep31-k/on-a-slow-boat-to-china</link>
	<description>&lt;p&gt;Early next week, Liz and I are heading off to China for a long holiday. We&amp;#8217;re travelling for eight weeks, with only the loosest of itineraries. It&amp;#8217;s going to be an exciting adventure into the land widely regarded as having &lt;a href="http://www.google.com/search?q=worst+toilets+in+the+world"&gt;the worst toilets in the world&lt;/a&gt;.&lt;/p&gt;

&lt;p class="figure center"&gt;&lt;a href="http://www.flickr.com/photos/shanafin/1690282253/"&gt;&lt;img src="http://farm3.static.flickr.com/2226/1690282253_d008f450d1_d.jpg" alt="Tourist boat, Pudong, Shanghai"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Note: Artist&amp;#8217;s impression. Actual boat may vary.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Unfortunately, we&amp;#8217;re not really going to catch a slow boat there. Rather, we found incredibly cheap return flights from Sydney to Macau with Viva Macau. From our starting point in Macau, we plan to travel across most of the provinces in southern China over the following weeks.&lt;/p&gt;

&lt;p&gt;Some might remember that I was &lt;a href="http://www.mattryall.net/blog/2008/07/mandarin-cheat-sheet"&gt;learning Mandarin&lt;/a&gt; last year. My studies haven&amp;#8217;t really progressed very far. If I&amp;#8217;m lucky I might manage to be understood while saying &amp;#8216;hello&amp;#8217; or &amp;#8216;goodbye&amp;#8217;. Anything more complicated, and I&amp;#8217;m likely to get chased out of town for referring to somebody&amp;#8217;s mother as a horse. (Um, yeah, I guess that&amp;#8217;s an in-joke for Mandarin speakers.) Certainly, the language barrier is still going to be one of the biggest challenge in our travels.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ll be trying to post pictures from the trip as we go. Watch &lt;a href="http://www.flickr.com/photos/mjryall/"&gt;my Flickr account&lt;/a&gt; for updates on that front.&lt;/p&gt;

&lt;p class="figure center"&gt;&lt;a href="http://www.redoak.com.au"&gt;&lt;img src="http://www.mattryall.net/image/red-oak-beer.jpg" alt="Red Oak beer photograph" title="Join us for farewell drinks at Red Oak" style="width: 200px"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Join us for farewell drinks at Red Oak&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;d like to see us off, Liz and I will be having will be some farewell drinks this Friday, 15 May at the infamous &lt;a href="http://www.redoak.com.au/"&gt;Red Oak Beer Café&lt;/a&gt;. We should be there from around 6pm if you want to catch up before we go. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/mattryall/~4/41yo2ep31-k" height="1" width="1"/&gt;</description>
	<dc:creator>Matt Ryall</dc:creator>
	<dc:date>2009-05-11T15:38:01+11:00</dc:date>
	<guid isPermaLink="false">http://www.mattryall.net/blog/2009/05/on-a-slow-boat-to-china</guid>
<feedburner:origLink>http://www.mattryall.net/blog/2009/05/on-a-slow-boat-to-china</feedburner:origLink></item>

<item>
	<title>Smart Quotes: library for curly quotes in Java</title>
	<link>http://feedproxy.google.com/~r/mattryall/~3/v0X33FhfESA/smart-quotes-library-for-curly-quotes-in-java</link>
	<description>&lt;p class="figure right"&gt;
&lt;a href="" title="Smart Quotes: the Java library for converting &amp;quot;straight&amp;quot; quotes to “curly” quotes"&gt;&lt;img src="http://www.mattryall.net/image/smartquotes-logo-v1.png"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Recently, I&amp;#8217;ve become a fan of using proper punctuation in web pages. This includes simply expanding the range of punctuation I use to include a variety of dashes, fractions and symbols, and also the use of correctly curled quotation marks and apostrophes.&lt;/p&gt;

&lt;p&gt;Even for the enthusiastic, entering the proper quotation marks manually is a pain. On Mac OS X, you need to hold down the option key and remember which of the unmarked bracket or brace keys corresponds to your desired quotation mark. On Windows, it&amp;#8217;s even more painful to locate the quote with the character map or keyboard shortcut.&lt;/p&gt;

&lt;p&gt;To solve this problem, I&amp;#8217;ve written a new Java library, &lt;a href="http://code.google.com/p/smartquotes/"&gt;Smart Quotes&lt;/a&gt;, to automatically correct &amp;#34;straight quotes&amp;#34; to &amp;#8220;curly quotes&amp;#8221; in Java web applications like &lt;a href="http://www.atlassian.com/software/confluence/"&gt;Confluence&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Even now, a Google search for &amp;#8220;Java smart quotes&amp;#8221; or &amp;#8220;Java curly quotes&amp;#8221; returns lots of results about how to &lt;em&gt;remove&lt;/em&gt; the quotes rather than add them! While curly quote removal is a very simple search-and-replace, inserting correct curly quotes is a bit more of a hairy problem. You need to correctly curl the double quotes the right way, and recognise the distinction between apostrophes and single-quoted phrases.&lt;/p&gt;

&lt;p&gt;Smart Quotes processes HTML documents. It replaces straight double or single quotes only in the text sections, avoiding the tag attributes and preformatted blocks like &lt;code&gt;&amp;lt;code&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For example, the following markup:&lt;/p&gt;

&lt;p class="indent"&gt;&lt;code&gt;"Occasionally, quotations may contain 'internal &amp;lt;em&amp;gt;quoted passages&amp;lt;/em&amp;gt;', which shouldn't confuse one's quote-curling library."&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;is correctly converted by Smart Quotes into this HTML:&lt;/p&gt;

&lt;p class="indent"&gt;&amp;#8220;Occasionally, quotations may contain &amp;#8216;internal &lt;em&gt;quoted passages&lt;/em&gt;&amp;#8217;, which shouldn&amp;#8217;t confuse one&amp;#8217;s quote-curling library.&amp;#8221;&lt;/p&gt;

&lt;p&gt;This would work the same, even if the content were sprinkled with HTML tags.&lt;/p&gt;

&lt;p&gt;The Smart Quotes source code contains a &lt;a href="http://code.google.com/p/smartquotes/source/browse/#svn/trunk/src/test/resources/net/mattryall/smartquotes"&gt;large number of tests&lt;/a&gt; that verify the quoting behaviour, interaction with tags, and so on. If you use the library and find bugs, please consider submitting a patch with a test case.&lt;/p&gt;

&lt;p&gt;You may remember that when I &lt;a href="http://www.mattryall.net/blog/2008/06/markdown"&gt;started using Markdown&lt;/a&gt; on my blog, I also added &lt;a href="http://daringfireball.net/projects/smartypants/"&gt;SmartyPants&lt;/a&gt;. SmartyPants is a Perl library which does the same job as my new library, and I&amp;#8217;m indebted to it for a lot of assistance with the algorithm and the original inspiration for the project. While SmartyPants already solves this problem very nicely in Perl, it isn&amp;#8217;t suitable for integration into a cross-platform Java application.&lt;/p&gt;

&lt;p&gt;To integrate Smart Quotes usefully in Confluence, I&amp;#8217;ve written a &lt;a href="http://labs.atlassian.com/wiki/display/QUOT/Confluence+Smart+Quotes+Plugin"&gt;Smart Quotes macro plugin&lt;/a&gt;. This plugin takes any other Confluence wiki content as its body, and automatically replaces the quotes throughout. For this reason, you can just wrap the entire contents of the page in a {smart-quotes} macro to get proper curly quotes.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m hoping the &lt;a href="http://code.google.com/p/smartquotes/"&gt;Smart Quotes library&lt;/a&gt; proves useful to the many Java web application developers who would like proper punctuation in their web pages. It&amp;#8217;s available under an &lt;a href="http://www.apache.org/licenses/LICENSE-2.0"&gt;Apache open source license&lt;/a&gt;, so you can reuse and redistribute it under very flexible terms.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/mattryall/~4/v0X33FhfESA" height="1" width="1"/&gt;</description>
	<dc:creator>Matt Ryall</dc:creator>
	<dc:date>2009-05-02T09:31:12+11:00</dc:date>
	<guid isPermaLink="false">http://www.mattryall.net/blog/2009/05/smart-quotes-library-for-curly-quotes-in-java</guid>
<feedburner:origLink>http://www.mattryall.net/blog/2009/05/smart-quotes-library-for-curly-quotes-in-java</feedburner:origLink></item>

<item>
	<title>Oracle acquires Sun, Java</title>
	<link>http://feedproxy.google.com/~r/mattryall/~3/hsvWlp7b6Uw/oracle-acquires-sun-java</link>
	<description>&lt;p&gt;Yesterday, Sun was acquired by Oracle for $9.50 a share. Oracle CEO Larry Ellison is &lt;a href="http://www.nytimes.com/2009/04/21/technology/companies/21sun.html?partner=rss&amp;amp;emc=rss&amp;amp;pagewanted=all"&gt;quoted in the &lt;em&gt;New York Times&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;He said Java, the language used in most computer science schools and a technology used daily by millions of software developers, was “the single most important software asset we have ever acquired.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It worries me that Larry considers Java a &amp;#8220;software asset&amp;#8221;. Assets must have some value to the owner. What is the value of the Java programming language to Oracle? Perhaps the ability to better sell Java consulting. Or maybe, repositioning WebLogic as the standard Java enterprise platform.&lt;/p&gt;

&lt;p&gt;Regardless of what the primary commercial benefit is for Oracle, it&amp;#8217;s unlikely to have much to do with improvements to the language and the platform which help the average Java developer. &lt;/p&gt;

&lt;p&gt;As a developer who works with Java quite a bit, I see the development of the programming language not as an asset but as a liability for a company. It&amp;#8217;s a lot of time-consuming work with very few commercial benefits. Assuming the buyout is approved by the regulators and Sun&amp;#8217;s shareholders, it will be interesting to see what Oracle does with their so-called asset in the next few years.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/mattryall/~4/hsvWlp7b6Uw" height="1" width="1"/&gt;</description>
	<dc:creator>Matt Ryall</dc:creator>
	<dc:date>2009-04-21T08:09:49+11:00</dc:date>
	<guid isPermaLink="false">http://www.mattryall.net/blog/2009/04/oracle-acquires-sun-java</guid>
<feedburner:origLink>http://www.mattryall.net/blog/2009/04/oracle-acquires-sun-java</feedburner:origLink></item>

<item>
	<title>The infamous Turkish locale bug</title>
	<link>http://feedproxy.google.com/~r/mattryall/~3/aVagaDSfxcs/the-infamous-turkish-locale-bug</link>
	<description>&lt;p&gt;I discovered a quirky comment today in Confluence’s &lt;code&gt;Permission.forName(String)&lt;/code&gt; method:&lt;/p&gt;

&lt;pre class="code"&gt;
// use the english locale to avoid the infamous turkish locale bug
String upperName = permissionName.toUpperCase(Locale.ENGLISH);
&lt;/pre&gt;

&lt;p&gt;Naturally the question popped into my mind: what is the &amp;#8216;infamous Turkish locale bug&amp;#8217;? Looking into the JIRA issues related to the commit (&lt;a href="http://jira.atlassian.com/browse/CONF-5931"&gt;CONF-5931&lt;/a&gt;, &lt;a href="http://jira.atlassian.com/browse/CONF-7168"&gt;CONF-7168&lt;/a&gt;), I found a link Agnes put to this article about a common Java bug in the Turkish locale: &lt;a href="http://java.sys-con.com/node/46241"&gt;Turkish Java Needs Special Brewing&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;In the Turkish alphabet there are two letters for &amp;#8216;i&amp;#8217;, dotless and dotted. The problem is that the dotless &amp;#8216;i&amp;#8217; in lowercase becomes the dotless in uppercase. At first glance this wouldn&amp;#8217;t appear to be a problem; however, the problem lies in what programmers do with upper- and lowercases in their code.&lt;/p&gt;
  
  &lt;p&gt;The two lowercase letters are \u0069 &amp;#8216;i&amp;#8217; and \u0131 &amp;#8216;?&amp;#8217; (dotless &amp;#8216;I&amp;#8217;) and are totally unrelated. Their uppercase versions are \u0130 &amp;#8216;?&amp;#8217; (capital letter &amp;#8216;I&amp;#8217; with dot above it) and \u0049 &amp;#8216;I&amp;#8217;. The issue is that this behavior does not occur in English where the single lowercase dotted &amp;#8216;i&amp;#8217; becomes an uppercase dotless &amp;#8216;I&amp;#8217;.&lt;/p&gt;
  
  &lt;p&gt;With the statement String.toUppercase(), most Java programmers try to effectively neutralize case. Consider a HashMap with string keys and you have a key that you want to look up. If you want to ignore case, you&amp;#8217;ll probably uppercase everything going into the map, its entries, and the string you&amp;#8217;re doing the lookup with. This works fine for English, but not for Turkish, where dotless becomes dotless.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is a nice example of where you need to be very careful how you handle upper- and lower-casing in your application. Changing the word &amp;#8216;quit&amp;#8217; to uppercase in the Turkish locale will result in &amp;#8216;QU?T&amp;#8217;, not &amp;#8216;QUIT&amp;#8217;. I&amp;#8217;ve heard of other examples where the German ß (sharp &amp;#8216;s&amp;#8217;) doesn&amp;#8217;t behave exactly as English speakers would expect either.&lt;/p&gt;

&lt;p&gt;There are two ways to properly perform a case-insensitive comparison of Strings in Java in any locale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(preferred) use &lt;code&gt;String.equalsIgnoreCase()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;use a fixed locale (like Locale.ENGLISH) as an argument to &lt;code&gt;String.toUpperCase(Locale)&lt;/code&gt; or &lt;code&gt;String.toLowerCase(Locale)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also use &lt;code&gt;Character.toLowerCase()&lt;/code&gt; or &lt;code&gt;Character.toUpperCase()&lt;/code&gt; to derive a locale-independent case-insensitive String value. This was the solution used in a recent (and still unreleased) fix for &lt;a href="https://issues.apache.org/jira/browse/COLLECTIONS-294"&gt;the same problem&lt;/a&gt; in the Commons Collections &lt;a href="http://commons.apache.org/collections/api-3.2/org/apache/commons/collections/map/CaseInsensitiveMap.html"&gt;CaseInsensitiveMap&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/mattryall/~4/aVagaDSfxcs" height="1" width="1"/&gt;</description>
	<dc:creator>Matt Ryall</dc:creator>
	<dc:date>2009-02-11T07:53:08+11:00</dc:date>
	<guid isPermaLink="false">http://www.mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug</guid>
<feedburner:origLink>http://www.mattryall.net/blog/2009/02/the-infamous-turkish-locale-bug</feedburner:origLink></item>

<item>
	<title>Wiki visualisations with JavaScript: Processing.js and Raphaël</title>
	<link>http://feedproxy.google.com/~r/mattryall/~3/BuIbCItKVf4/wiki-visualisations-with-javascript</link>
	<description>&lt;p&gt;Once every few months, Atlassian holds a &amp;#8220;FedEx day&amp;#8221;. Developers are free to work on a project of their choosing, with the aim being to deliver something within 24 hours.&lt;/p&gt;

&lt;p&gt;For the October FedEx day, I wrote some visualisations for wiki data. My goal was to deliver some amazing visuals which could be applied to any data set. I wanted to explore the potential of two great new graphics libraries for JavaScript: &lt;a href="http://ejohn.org/blog/processingjs/"&gt;Processing.js&lt;/a&gt; and &lt;a href="http://raphaeljs.com/"&gt;Raphael&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The specific data I used wasn&amp;#8217;t really so important, but in this case I used the last 1000 comments on Atlassian&amp;#8217;s Extranet. Surprisingly, one thousand comments on Extranet blogs takes only about 3 weeks to accrue.&lt;/p&gt;

&lt;p&gt;For the live demos in this public example, I&amp;#8217;ve changed the titles and usernames in the dataset from the original Extranet ones to some automatically generated usernames and titles from a news website.&lt;/p&gt;

&lt;h3&gt;Screenshots&lt;/h3&gt;

&lt;p&gt;Here are some screenshots:&lt;/p&gt;

&lt;ul class="gallery"&gt;
&lt;li&gt;&lt;a title="Comments visualisation" href="http://www.mattryall.net/image/comments-vis.png"&gt;&lt;img alt="" src="http://www.mattryall.net/image/comments-vis-thumbnail.png"/&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Contributors visualisation" href="http://www.mattryall.net/image/contributors-vis.png"&gt;&lt;img alt="" src="http://www.mattryall.net/image/contributors-vis-thumbnail.png"/&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Activity visualisation" href="http://www.mattryall.net/image/activity-vis.png"&gt;&lt;img alt="" src="http://www.mattryall.net/image/activity-vis-thumbnail.png"/&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Live demos&lt;/h3&gt;

&lt;p&gt;Try these in Firefox 3 or higher:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.mattryall.net/demo/atlassian-vis/contributors/"&gt;&lt;strong&gt;Contributors&lt;/strong&gt;&lt;/a&gt; &amp;#8212; a tree graph visualisation linking commenters and blog post authors.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mattryall.net/demo/atlassian-vis/activity/"&gt;&lt;strong&gt;Activity&lt;/strong&gt;&lt;/a&gt; &amp;#8212; a rippling visualisation of comment activity on the wiki. Based loosely on the Apple Arabesque screensaver.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.mattryall.net/demo/atlassian-vis/comments/"&gt;&lt;strong&gt;Comments&lt;/strong&gt;&lt;/a&gt; &amp;#8212; a falling bar-graph visualisation of comments by blogpost. Based very much on &lt;a href="http://labs.digg.com/stack/"&gt;a Flash visualisation&lt;/a&gt; by Digg, but reimplemented in JS.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All three visualisations are done with real data in time-lapse, so you&amp;#8217;re seeing real data on the Extranet appear as you watch (albeit with the titles and usernames changed).&lt;/p&gt;

&lt;p&gt;The last two only work properly in Firefox 3 or higher (because it has support for text in Canvas), and they run the best in a recent Firefox nightly build. The first one, contributors, is based on Raphaël and should work with any browser. These demos really tax your computer, and will fully peg one CPU of a quad-core Mac Pro. The animation may be very slow on older machines.&lt;/p&gt;

&lt;h3&gt;What they mean&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Contributors&lt;/strong&gt; visualisation links together blog post authors with the people who comment on their blog posts. This means that people with a lot of links either comment on many blog posts or receive a lot of comments on their own.&lt;/p&gt;

&lt;p&gt;Each icon repels each of the others, but all icons are drawn towards the centre of the image. Links between the icons pull them together, but at close range the repulsion is usually stronger than the attraction from a link.&lt;/p&gt;

&lt;p&gt;Each author&amp;#8217;s icon starts to shrink unless they post another comment, in which case it jumps back to full size. Thus you can tell the age of each author&amp;#8217;s comment from the size of his or her picture.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Activity&lt;/strong&gt; visualisation is a fairly abstract visualisation of commenting on a wiki. It displays a new ripple whenever a new comment appears. The colour and location of the ripple is dependent on the username, based on the username&amp;#8217;s position in alphabetical order.&lt;/p&gt;

&lt;p&gt;If there are many comments at a particular point in time, the entire graph rises up as the activity increases.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Comments&lt;/strong&gt; visualisation shows quite clearly where the comments on the wiki are going. Each falling block is a new comment, and it falls in the column representing the blog it was posted on. Blogs with more comments get brighter colours as time goes on. New blogs appear from the right as they are posted.&lt;/p&gt;

&lt;p&gt;The titles at the bottom of the chart show the titles of the last seven blogs which received comments. The colours of the titles match the colours of the columns: brighter green means more comments.&lt;/p&gt;

&lt;p&gt;This visualisation was an attempt to recreate the &lt;a href="http://labs.digg.com/stack/"&gt;Digg Stack visualisation&lt;/a&gt; for our wiki in JavaScript. Unlike Digg, this visualisation has to use time-lapse data though, because comments on our wiki aren&amp;#8217;t frequent enough to always be an interesting animation.&lt;/p&gt;

&lt;h3&gt;Tools and tricks&lt;/h3&gt;

&lt;p&gt;Probably the single most interesting thing I learnt was how to achieve useful colours in animations. The secret is to use &lt;a href="http://en.wikipedia.org/wiki/HSL_and_HSV"&gt;HSB colour&lt;/a&gt;, which stands for Hue, Saturation and Brightness. Controlling these three variables separately &amp;#8212; rather than quantities of red, green and blue in regular RGB colour &amp;#8212; allows much more simpler animation of changing colours.&lt;/p&gt;

&lt;p&gt;The frameworks I used gave a lot of help with getting simple things up and running. The frameworks were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://ejohn.org/blog/processingjs/"&gt;Processing.js&lt;/a&gt; &amp;#8212; a JavaScript port of the Java-based &lt;a href="http://processing.org"&gt;Processing graphics API and language&lt;/a&gt; which renders to HTML 5 canvas. This is a raster graphics framework.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://raphaeljs.com"&gt;Raphaël&lt;/a&gt; &amp;#8212; a JavaScript vector graphics library, which uses SVG in modern browsers and VML in Internet Explorer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I found the raster graphics of Processing.js and Canvas particularly powerful for the fading animations used in &amp;#8220;Activity&amp;#8221;. This amazing effect is produced by simply drawing the black background in a semi-transparent manner with each frame rather than completely opaque. This is also the method used to leave &amp;#8220;trails&amp;#8221; behind the falling blocks in the &amp;#8220;Comments&amp;#8221; visualisation.&lt;/p&gt;

&lt;p&gt;Where raster graphics falls down is with interactivity. I decided to use Raphaël for the &amp;#8220;Contributors&amp;#8221; visualisation to support drag-and-drop, and at one point I also had the pictures hyperlinking to the relevant personal spaces on our Extranet.&lt;/p&gt;

&lt;p&gt;Processing.js had a few minor bugs that I fixed along the way. The HSB colour method didn&amp;#8217;t work properly, and I needed to correct the font metrics functions. Hopefully I&amp;#8217;ll be able to submit patches for these back to John soon.&lt;/p&gt;

&lt;p&gt;All the animations are run with the standard JavaScript &lt;code&gt;window.setInterval()&lt;/code&gt; method, but because JavaScript is single-threaded the framerate may actually vary based on the performance of the browser. You can click on any of the animations to pause them.&lt;/p&gt;

&lt;p&gt;The overall structure of all the animations is a pipeline of components to render. The components are modelled as Objects in JavaScript, and I keep track of them in an array while the animation is running. Each object has two functions: update(), which is responsible for updating the internal state of the object to reflect its movement; and draw(), which is responsible for drawing the object onto the screen.&lt;/p&gt;

&lt;p&gt;At each call of the timer we&amp;#8217;ve set, we loop through all the objects twice: once to update them, and once to display them. The separate stages allow an update() function to remove its own object from the rendering queue. Some of the update methods are quite complex, updating many variables related to the component&amp;#8217;s position, colour, velocity and interaction with other components.&lt;/p&gt;

&lt;p&gt;In the &amp;#8220;Comments&amp;#8221; visualisation, the most technically complex one, there are about 7 distinct types of components. Many of the components are linked together. The top-level component is a Column, representing one vertical bar in the graph. The Column object is linked to, and manages, any Blocks that are falling down in its column, as well as the Title which appears underneath the graph and is coloured the same as the column itself. The Author component, which appears at a certain height when a block is falling, is not tied to the column and manages it own separate lifecycle.&lt;/p&gt;

&lt;p&gt;I came up with some interesting functions to get the right colour and movement effects for some of the components. For example, the radius of each circle in the &amp;#8220;Activity&amp;#8221; visualisation is a quadratic function of its age in frames. As the age ranges from 0 to 100 frames, the radius accelerates from 30 up to 400 pixels.&lt;/p&gt;

&lt;ul class="gallery"&gt;
&lt;li&gt;&lt;a title="Activity visualisation, ripple radius function" href="http://www.mattryall.net/image/radiusFunction.png"&gt;&lt;img alt="" src="http://www.mattryall.net/image/radiusFunction-thumbnail.png"/&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a title="Comments visualisation, author fading function" href="http://www.mattryall.net/image/authorAgeFunction.png"&gt;&lt;img alt="" src="http://www.mattryall.net/image/authorAgeFunction-thumbnail.png"/&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A similar quadratic formula was used for fading the author names on the Comments visualisation. In this case, I wanted the author to get slightly brighter initially before fading away. The function I came up with you can see above.&lt;/p&gt;

&lt;p&gt;Another simple bit of math that turned out quite nicely was the overall shape of the Activity visualisation. I wanted some way to indicate overall activity on the wiki, and increasing the height of the graph seemed quite natural. What ended up working best was to plot the circles along a sine wave and increase the amplitude of the sine wave based on the activity. You&amp;#8217;ll see this in the visualisation where the centre of the graph rises when the activity is highest.&lt;/p&gt;

&lt;p&gt;The algorithm for the tree in the Contributors visualisation is original, but not really optimal. Perhaps I&amp;#8217;ll come back and fix that up at some later point.&lt;/p&gt;

&lt;h3&gt;Summary&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;m really happy with the way the visualisations turned out. I think there&amp;#8217;s some amazing visuals there. I&amp;#8217;m keen to get them up on some big screens around Atlassian, visualising our collaboration as it happens. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/mattryall/~4/BuIbCItKVf4" height="1" width="1"/&gt;</description>
	<dc:creator>Matt Ryall</dc:creator>
	<dc:date>2008-11-03T08:13:30+11:00</dc:date>
	<guid isPermaLink="false">http://www.mattryall.net/blog/2008/11/wiki-visualisations-with-javascript</guid>
<feedburner:origLink>http://www.mattryall.net/blog/2008/11/wiki-visualisations-with-javascript</feedburner:origLink></item>

<item>
	<title>HTML 5, headings and sections</title>
	<link>http://feedproxy.google.com/~r/mattryall/~3/Lg_z07CXjUk/html-5-headings-and-sections</link>
	<description>&lt;p&gt;Tonight there was a presentation at the &lt;a href="http://webstandardsgroup.org" title="Web Standards Group"&gt;Web Standards Group&lt;/a&gt; by &lt;a href="http://lachy.id.au/" title="Lachlan Hunt"&gt;Lachlan Hunt&lt;/a&gt; about some of the new facilities provided by new and upcoming web standards: &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/" title="HTML 5 Draft Recommendation"&gt;HTML 5&lt;/a&gt; and CSS 3. One point that proved interesting was his coverage of the sectioning feature of HTML 5.&lt;/p&gt;

&lt;p&gt;Whereas HTML 4 had just six levels of headings for the entire document, the working draft for HTML 5 stipulates that &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/#headings-and-sections" title="HTML 5: Headings and sections"&gt;each section has its own heading hierarchy&lt;/a&gt;. An &lt;code&gt;h1&lt;/code&gt; element that appears at the top level in a document is considered to &amp;#8220;rank higher than&amp;#8221; an &lt;code&gt;h1&lt;/code&gt; element found in a section or article within the document.&lt;/p&gt;

&lt;p&gt;For example, rather than using &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;h2&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;h3&amp;gt;&lt;/code&gt; elements for the headings in the sample shown below, you can use three nested &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; tags, each with its own &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p class="figure center noborder"&gt;
&lt;img alt="Diagram showing HTML 5 markup for sections and headings" src="http://www.mattryall.net/image/h5-markup-example.png" title="HTML 5 markup example"/&gt;&lt;br/&gt;
HTML 5 section and heading example
&lt;/p&gt;

&lt;p&gt;This might not seem much simpler in this basic example. In fact, to me it seems decidedly less simple. In the case where each section has its own distinct hierarchy of headings, the situation becomes even more confusing. However, I think the change makes a bit more sense if you consider it in light of two things.&lt;/p&gt;

&lt;p&gt;First, the spec recommends keeping the heading hierarchy sane by using either &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; tags throughout the document or keeping the headings in sync with the levels of sectioning. This latter case is similar to how you do it currently, just without the &lt;code&gt;&amp;lt;section&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Sections may contain headers of any rank, but authors are strongly encouraged to either use only h1  elements, or to use elements of the appropriate rank  for the section&amp;#8217;s nesting level.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Second, one of the main reasons why sections and other elements are allowed to contain their own heading hierarchy is to handle parts of a document included from elsewhere. There are many examples of this on the web: blogs, where a few articles appear each with its own heading structure; news sites, made up of sections each which comes from its own page with its own headings; search engines, which display excerpts from other sites.&lt;/p&gt;

&lt;p&gt;The point of the improvement is so that these sites that include other content don&amp;#8217;t have to do any special processing to embed an external article or section with its own heading structure. The levels are automatically adjusted by the browser to account for the fact that these headings are relevant only within one subsection of the page.&lt;/p&gt;

&lt;p&gt;So given these considerations, is it still worth the extra complexity of allowing six heading levels in every section within a document? I&amp;#8217;m not sure. It does add a lot of complexity. In just a few minutes at the WSG meeting, we came up with a number of significant problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Search engine optimisation, or SEO, relies on extracting the heading information from the page. Rather than simply matching &lt;code&gt;&amp;lt;h1&amp;gt;...&amp;lt;/h1&amp;gt;&lt;/code&gt;, search engines now need to follow &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/#outlines" title="HTML 5: Creating an outline"&gt;the fairly complicated process&lt;/a&gt; to determine the ranking of headings within the document.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Styling headings with CSS, particularly providing default styles, becomes much more verbose. Rather than using &lt;code&gt;h1, h2, h3 { ... }&lt;/code&gt;, with HTML 5 you would need to define &lt;code&gt;h1, section h1, section section h1 { ... }&lt;/code&gt;. This would probably be in addition to the old rules, if you&amp;#8217;re including content with nested headings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatically determining a table of content is a lot more complex. As linked above, you need to follow &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/#outlines" title="HTML 5: Creating an outline"&gt;a fairly tricky algorithm&lt;/a&gt; to determine the heading structure of a document.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;With current DOM APIs, you can easily find all headings at a particular level in the document with &lt;code&gt;document.getElementsByTagName('h2')&lt;/code&gt;. You&amp;#8217;d need to use a query selector to do this with the new-style use-a-h1-for-everything structure. Without an efficient query selector, this is much trickier. Even with a query selector, it&amp;#8217;s going to probably be a fair bit slower, which is a problem if you&amp;#8217;re doing it often.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Given these issues, I don&amp;#8217;t consider it beneficial to make headings relative to the section that contains them. What authors gain by not having to adapt included content on the server side so it uses appropriate heading levels, they end up potentially losing due to the increased complexity in determining the outline of a document and styling headings consistently in different sections.&lt;/p&gt;

&lt;p&gt;Perhaps if there is some benefit other than just for included content as I&amp;#8217;ve mentioned above, a compromise solution might be to have better HTML APIs which allow access to sections and headings in a more meaningful way than the existing DOM methods like &lt;code&gt;getElementByTagName&lt;/code&gt;. I could imagine methods like &lt;code&gt;HTMLElement.getSections()&lt;/code&gt; and &lt;code&gt;HTMLElement.getHeadings()&lt;/code&gt; proving useful in addressing some of the concerns above.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/mattryall/~4/Lg_z07CXjUk" height="1" width="1"/&gt;</description>
	<dc:creator>Matt Ryall</dc:creator>
	<dc:date>2008-10-07T23:37:06+11:00</dc:date>
	<guid isPermaLink="false">http://www.mattryall.net/blog/2008/10/html-5-headings-and-sections</guid>
<feedburner:origLink>http://www.mattryall.net/blog/2008/10/html-5-headings-and-sections</feedburner:origLink></item>

<item>
	<title>Webjam 8 roundup</title>
	<link>http://feedproxy.google.com/~r/mattryall/~3/ad-cLF_fKzI/webjam-8-roundup</link>
	<description>&lt;p&gt;&lt;a href="http://webjam.com.au/webjam8"&gt;Webjam 8&lt;/a&gt; was the first Webjam I&amp;#8217;ve been to, and I had a great time. Frenetic 3-minute talks from inspiring presenters and chatting to loads of web guys about their work &amp;#8212; what could be more fun?&lt;/p&gt;

&lt;p&gt;I found all the presentations interesting, but here are a few that still stand out the morning after:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://mrspeaker.webeisteddfod.com/"&gt;Mister Speaker&lt;/a&gt; demoed his amazing &lt;a href="http://www.henrytapia.com/archives/2008/09/27/turntubelist-wins-first-prize-at-webjam-8/"&gt;TurnTubeList&lt;/a&gt;, which allows dynamic cross-fading of YouTube videos for party music mixing.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://dmitry.baranovskiy.com"&gt;Dmitry&lt;/a&gt; gave a coding demo of &lt;a href="http://raphaeljs.com"&gt;Raphaël&lt;/a&gt;, where he threw together a dynamic reflection page in two minutes. TextMate wizardry FTW.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.flickr.com/photos/broccolini/1353753104/"&gt;Diana&lt;/a&gt; gave an awesome talk about her work on the &lt;a href="http://lgwebnetwork.org/"&gt;Local Government web network&lt;/a&gt;. She was just captivating: interesting ideas, great delivery.&lt;/li&gt;
&lt;li&gt;A couple of &lt;a href="http://dev.opera.com"&gt;Opera guys&lt;/a&gt; gave demos of their latest technology. What blew me away was a demo of &lt;a href="http://dev.opera.com/articles/view/a-call-for-video-on-the-web-opera-vid/"&gt;their &lt;code&gt;&amp;lt;video&amp;gt;&lt;/code&gt; tag implementation&lt;/a&gt;, and embedding video content in animated SVG. Totally amazing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There were many other cool demos, and I had a great time catching up with  contacts and friends. Thanks to &lt;a href="http://lachstock.com.au/"&gt;Lachlan&lt;/a&gt; and &lt;a href="http://webjam.com.au/webjam8"&gt;the Webjam 8 team&lt;/a&gt; for putting on a great show.&lt;/p&gt;

&lt;p class="figure center"&gt;
&lt;a href="http://flickr.com/photos/tags/webjam8/"&gt;&lt;img alt="Webjam photo" title="Webjam 8" src="http://farm4.static.flickr.com/3050/2887765376_107c51f75d.jpg"/&gt;&lt;/a&gt;&lt;br/&gt;
Webjam 8 (photo: &lt;a href="http://flickr.com/photos/halans/2887765376"&gt;Halans&lt;/a&gt;)
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/mattryall/~4/ad-cLF_fKzI" height="1" width="1"/&gt;</description>
	<dc:creator>Matt Ryall</dc:creator>
	<dc:date>2008-09-26T07:38:58+11:00</dc:date>
	<guid isPermaLink="false">http://www.mattryall.net/blog/2008/09/webjam-8-roundup</guid>
<feedburner:origLink>http://www.mattryall.net/blog/2008/09/webjam-8-roundup</feedburner:origLink></item>

<item>
	<title>SpringSource has a new business model</title>
	<link>http://feedproxy.google.com/~r/mattryall/~3/c0dWxmXPdFo/springsource-has-a-new-business-model</link>
	<description>&lt;p&gt;The Server Side &lt;a href="http://www.theserverside.com/news/thread.tss?thread_id=50727" title="New Spring maintenance policy"&gt;broke the news a few days ago&lt;/a&gt; that SpringSource is changing their &lt;a href="http://www.springsource.com/products/enterprise/maintenancepolicy"&gt;maintenance policy&lt;/a&gt; for the Spring Framework source code. In essence, they&amp;#8217;ll no longer make public patch releases of the Spring framework modules more than three months after a major release.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Customers who are using SpringSource Enterprise, available under a subscription, will receive maintenance releases for three years from the general availability of a major new version.   These customers receive ongoing, rapid patches as well as regular maintenance releases to address bugs, security vulnerabilities and usability issues, making SpringSource Enterprise the best option for production systems.&lt;/p&gt;
  
  &lt;p&gt;After a new major version of Spring is released, community maintenance updates will be issued for three months to address initial stability issues.  Subsequent maintenance releases will be available to SpringSource Enterprise customers. Bug fixes will be folded into the open source development trunk and will be made available in the next major community release of the software.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Charles has written a &lt;a href="http://fishbowl.pastiche.org/2008/09/23/spring_is_sprung/"&gt;good analysis&lt;/a&gt; of this change of attitude:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The language changes, often around the time the outside investors show up. The people who are downloading and using your software are no longer your community, they&amp;#8217;re the ones who are &lt;em&gt;taking&lt;/em&gt; your code without giving anything back. They&amp;#8217;re the &lt;em&gt;free-loaders&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The attitude of commercial software firms is &lt;em&gt;always&lt;/em&gt; going to be at odds with what is best for an open source community to flourish around software. A software company tracks every piece of work done on open source software against their bottom line. &amp;#8220;Should we implement this bug fix? It depends &amp;#8212; how much will people pay for it?&amp;#8221; It&amp;#8217;s really hard to come up with a business model which also allows people to use the software freely at the same time as turning a profit, so instead the freedom of the software suffers.&lt;/p&gt;

&lt;p&gt;So what&amp;#8217;s the solution? How can a company sponsor open source without appearing to restrict work on the open source project to promote their commercial offerings?&lt;/p&gt;

&lt;p&gt;One of the best ways is to set up an organisation which is separate to the company and responsible for the open source project. This organisation can be sponsored for a fixed amount by the company (or perhaps set up as a foundation), and is managed independently of the company.&lt;/p&gt;

&lt;p&gt;In this model, the open source organisation has complete autonomy and owns the copyright for the code. Its goals are to enhance and promote the use of its code throughout the world. Many of the most successful open source organisations are set up as foundations in this way: Apache, Mozilla, Eclipse.&lt;/p&gt;

&lt;p&gt;This avoids nasty situations like we have here. SpringSource, the company, could never decide that Spring, the open source project, should not publish patch releases to help the profitability of the company. Rather, SpringSource is just the company you go to for Spring expertise, because they have a great reputation and have most of the Spring committers on staff.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/mattryall/~4/c0dWxmXPdFo" height="1" width="1"/&gt;</description>
	<dc:creator>Matt Ryall</dc:creator>
	<dc:date>2008-09-23T14:24:45+11:00</dc:date>
	<guid isPermaLink="false">http://www.mattryall.net/blog/2008/09/springsource-has-a-new-business-model</guid>
<feedburner:origLink>http://www.mattryall.net/blog/2008/09/springsource-has-a-new-business-model</feedburner:origLink></item>

<item>
	<title>iPhone 2.1 adds SVG support to Mobile Safari</title>
	<link>http://feedproxy.google.com/~r/mattryall/~3/fZZ4BTCw1Xw/iphone-21-adds-svg-support-to-mobile-safari</link>
	<description>&lt;p&gt;The latest software upgrade to the iPhone, version 2.1, finally brings &lt;a href="http://en.wikipedia.org/wiki/Scalable_Vector_Graphics" title="Scalable Vector Graphics"&gt;SVG&lt;/a&gt; support to the iPhone. &lt;/p&gt;

&lt;p&gt;Why is this useful? Well, I first noticed that it was working on Dmitry&amp;#8217;s &lt;a href="http://raphaeljs.com/"&gt;Raphaël demo site&lt;/a&gt;, which includes some &lt;a href="http://raphaeljs.com/reflection.html" title="Reflection"&gt;cool&lt;/a&gt; &lt;a href="http://raphaeljs.com/text-rotation.html" title="Text rotation"&gt;demonstrations&lt;/a&gt; of dynamic vector graphics with SVG produced with this JavaScript library. These now work on the iPhone. As well as they can, anyway, in a &lt;a href="http://www.mattryall.net/blog/2008/08/web-pages-which-track-mouse-movement" title="Web pages that track mouse movement"&gt;browser that doesn&amp;#8217;t have a continuous pointing device&lt;/a&gt;.&lt;/p&gt;

&lt;script type="text/javascript" src="http://www.mattryall.net/demo/raphael/raphael.js"&gt;&lt;/script&gt;

&lt;script type="text/javascript"&gt;
jQuery(function () {
    var src = $("#reflection-demo img")[0].src;
    var R = Raphael("mirror", 169, 80);
    var gradient2 = {type: "linear", dots: [{color: "#fff", opacity: .5},
       {color: "#fff"}], vector: [0, 0, 0, "100%"]};
    R.image(src, 0, 0, 169, 240).matrix(1, 0, 0, -1, 0, 240);
    R.rect(-2, -2, 174, 83).attr({gradient: gradient2, "stroke-width": 0});
});
&lt;/script&gt;

&lt;div id="reflection-demo" class="figure center noborder"&gt;
SVG reflection demonstration&lt;br/&gt;
&lt;a href="http://www.flickr.com/photos/mjryall/434234941/"&gt;&lt;img src="http://farm1.static.flickr.com/151/434234941_35fcd697f5_m.jpg" width="169" height="240" alt="Demo image"  style="display: block; margin: 1em auto -1px" /&gt;&lt;/a&gt;
&lt;div id="mirror"&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Above is an example of reflection using Raphaël and SVG that will now work correctly on Mobile Safari. You should see a reflection underneath Aiden&amp;#8217;s photo.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/mattryall/~4/fZZ4BTCw1Xw" height="1" width="1"/&gt;</description>
	<dc:creator>Matt Ryall</dc:creator>
	<dc:date>2008-09-17T21:57:57+11:00</dc:date>
	<guid isPermaLink="false">http://www.mattryall.net/blog/2008/09/iphone-21-adds-svg-support-to-mobile-safari</guid>
<feedburner:origLink>http://www.mattryall.net/blog/2008/09/iphone-21-adds-svg-support-to-mobile-safari</feedburner:origLink></item>

<item>
	<title>A small victory for plain English</title>
	<link>http://feedproxy.google.com/~r/mattryall/~3/dR6FxS_eXdI/a-small-victory-for-plain-english</link>
	<description>&lt;p&gt;Tesco, the British supermarket chain, has bowed to grammatical pressure and decided to correct the signs in its stores which indicate service for customers with &amp;#8220;ten items or less&amp;#8221;.&lt;/p&gt;

&lt;p&gt;According to most guidelines on English grammar and usage, the correct form is &amp;#8220;ten items or fewer&amp;#8221;. However, many people consider this quite clumsy and not in common use, so Tesco has sidestepped the problem by &lt;a href="http://www.telegraph.co.uk/news/uknews/2659948/Tesco-to-ditch-ten-items-or-less-sign-after-good-grammar-campaign.html" title="Tesco to ditch 'ten items or less' sign after good grammar campaign"&gt;rewording the signs to say &amp;#8220;up to 10 items&amp;#8221;&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;From now on, signs in new stores are to say &amp;#8220;up to 10 items&amp;#8221; after a long running argument with those who have objected to the use of the word &amp;#8220;less&amp;#8221; in that context.&lt;/p&gt;
  
  &lt;p&gt;Many have argued that the signs ought to read &amp;#8220;ten items or fewer&amp;#8221; instead of &amp;#8220;ten items or less&amp;#8221;. Their argument is that the word &amp;#8216;fewer&amp;#8217; should be used when it refers to quantities that can be counted. &amp;#8216;Less&amp;#8217;, they say, should refer to quantities that cannot be counted.&lt;/p&gt;
  
  &lt;p&gt;The new form of words comes from a suggestion by the Plain English Campaign. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I&amp;#8217;m a big fan of &lt;a href="http://en.wikipedia.org/wiki/Plain_English"&gt;plain English&lt;/a&gt;, after having read the Australian Government &lt;a href="http://www.australia.gov.au/Style_Manual"&gt;Style manual&lt;/a&gt;, which mandates it. The clean style of choosing the shortest words and clearest sentence forms makes a refreshing change to many documents.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/mattryall/~4/dR6FxS_eXdI" height="1" width="1"/&gt;</description>
	<dc:creator>Matt Ryall</dc:creator>
	<dc:date>2008-09-16T18:16:01+11:00</dc:date>
	<guid isPermaLink="false">http://www.mattryall.net/blog/2008/09/a-small-victory-for-plain-english</guid>
<feedburner:origLink>http://www.mattryall.net/blog/2008/09/a-small-victory-for-plain-english</feedburner:origLink></item>


</channel>
</rss>
