<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet Fp-Syd</title>
	<link rel="self" href="http://www.kablambda.org/planet-fp-syd/atom.xml"/>
	<link href="http://www.kablambda.org/planet-fp-syd/"/>
	<id>http://www.kablambda.org/planet-fp-syd/atom.xml</id>
	<updated>2012-05-19T19:30:21+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry>
		<title type="html">GPU-accelerated array computations in Haskell</title>
		<link href="http://justtesting.org/gpu-accelerated-array-computations-in-haskell"/>
		<id>http://justtesting.org/gpu-accelerated-array-computations-in-haskell</id>
		<updated>2012-05-14T06:48:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;p&gt;I just published stable release 0.12 of the embedded array language &lt;a href=&quot;https://github.com/AccelerateHS/accelerate&quot;&gt;Accelerate&lt;/a&gt; for high-performance GPU computing on Hackage. The release includes example applications, such as a real-time Canny edge detector, a fluid flow simulator, and a quasicrystal animation, as well as example algorithms, such as radixsort, matrix computations, and a Black-Scholes option pricing model.&lt;/p&gt;
&lt;p&gt;In the new modularised architecture, the Accelerate release comprises four packages:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://hackage.haskell.org/package/accelerate&quot;&gt;accelerate&lt;/a&gt;&amp;nbsp;(the main package providing the Accelerate language),&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hackage.haskell.org/package/accelerate-io&quot;&gt;accelerate-io&lt;/a&gt;&amp;nbsp;(conversion operations with other Haskell array libraries, including the data-parallel companion library &lt;a href=&quot;http://hackage.haskell.org/package/repa&quot;&gt;Repa&lt;/a&gt;),&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hackage.haskell.org/package/accelerate-cuda&quot;&gt;accelerate-cuda&lt;/a&gt;&amp;nbsp;(backend targetting NVIDIA GPUs via the CUDA SDK), and&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hackage.haskell.org/package/accelerate-examples&quot;&gt;accelerate-examples&lt;/a&gt;&amp;nbsp;(example applications and regression tests).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, see&amp;nbsp;&lt;a href=&quot;https://github.com/AccelerateHS/accelerate&quot;&gt;Accelerate on GitHub&lt;/a&gt;. To use the CUDA backend, you need a CUDA-enabled NVIDIA GPU as well as having the CUDA SDK already installed.&lt;/p&gt;
&lt;ul&gt;
&lt;/ul&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/gpu-accelerated-array-computations-in-haskell&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/gpu-accelerated-array-computations-in-haskell#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Using the Glasgow Haskell Compiler (GHC) on OS X Lion with Xcode 4.3</title>
		<link href="http://justtesting.org/using-the-glasgow-haskell-compiler-ghc-on-os"/>
		<id>http://justtesting.org/using-the-glasgow-haskell-compiler-ghc-on-os</id>
		<updated>2012-04-21T12:25:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;p&gt;Here is what you need to do if you want to use the&amp;nbsp;&lt;a href=&quot;http://www.haskell.org/ghc&quot; title=&quot;GHC&quot;&gt;Glasgow Haskell Compiler (GHC)&lt;/a&gt; on OS X Lion with a clean installation of Xcode 4.3.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Command line tools&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You need to install the command line tools from Apple. You may do that in two ways (the second is faster as it is a much smaller download):&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Install all of Xcode:           
&lt;ul&gt;
&lt;li&gt;Install Xcode from the Mac App Store.&lt;/li&gt;
&lt;li&gt;Launch Xcode.&lt;/li&gt;
&lt;li&gt;In the Preferences dialog of Xcode, select the &quot;Downloads&quot; pane and install &quot;Command line tools&quot;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Install the command line tools only:           
&lt;ul&gt;
&lt;li&gt;At the &lt;a href=&quot;http://developer.apple.com/downloads&quot; title=&quot;Apple Developer downloads&quot;&gt;downloads page of Apple Developer&lt;/a&gt;, download the latest &quot;Command line tools&quot;.&lt;/li&gt;
&lt;li&gt;Install them.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In both cases, you need to &lt;a href=&quot;https://developer.apple.com/programs/register/&quot; title=&quot;Register as Apple Developer&quot;&gt;register&lt;/a&gt; as an Apple developer. (This is a free registration.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Install GHC 7.4.1 (or later)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Older versions of GHC &amp;mdash;including GHC 7.0.4, which is part of the &lt;a href=&quot;http://hackage.haskell.org/platform/&quot;&gt;Haskell Platform&lt;/a&gt;&amp;nbsp;2011.4.0.0 (December 2011)&amp;mdash; won't work. They complain about not being able to execute '/Developer/usr/bin/gcc'. (You can fix this by modifying GHC's wrapper script as mentioned in the comments.)&lt;/p&gt;
&lt;p&gt;Download and install &lt;a href=&quot;http://www.haskell.org/ghc/download_ghc_7_4_1#macosx_x86_64&quot; title=&quot;GHC 7.4.1 (x86_64)&quot;&gt;GHC 7.4.1&lt;/a&gt;&amp;nbsp;(or a later version) &amp;mdash; or install the Haskell Platform once a 2012 release has been made.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Install Cabal tools (optional)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;To facilitate the easy installation of Haskell packages, you should get the cabal-install tool.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download&amp;nbsp;&lt;a href=&quot;http://www.haskell.org/cabal/release/cabal-install-0.14.0/cabal-install-0.14.0.tar.gz&quot;&gt;cabal-install-0.14.0.tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Unpack the tarball and, inside the created 'cabal-install-0.14.0' directory, run the following: 'sh bootstrap.sh'&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&amp;nbsp;As&amp;nbsp;@zmoazeni points out in the comments,&amp;nbsp;Homebrew has now been updated, so that you can install both GHC and cabal-install version 0.14 by executing&lt;/p&gt;
&lt;p&gt;&lt;span&gt;brew install ghc --devel&lt;br /&gt;brew install cabal-install&lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Using GHC's LLVM backend (optional)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you like to use GHC's LLVM backend &amp;mdash;which is more efficient for array-based and other loop-oriented code&amp;mdash; you need to seperately install LLVM. (This is despite the Apple tools being based on LLVM as well.)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install &lt;a href=&quot;http://mxcl.github.com/homebrew/&quot; title=&quot;Homebrew&quot;&gt;Homebrew&lt;/a&gt; (as per the instructions on that webpage).&lt;/li&gt;
&lt;li&gt;Then, execute the following: 'brew install llvm'&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Compiling GHC from the sources in the Git repositories (GHC developers only)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you plan to work on GHC itself and you need to compile the develeopment version of GHC straight from the Git repositories, you need to install the GNU auto tools as well&amp;nbsp;(which are no longer distributed by Apple).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install&amp;nbsp;&lt;a href=&quot;http://mxcl.github.com/homebrew/&quot; title=&quot;Homebrew&quot;&gt;Homebrew&lt;/a&gt;&amp;nbsp;(as per the instructions on that webpage) &amp;mdash; if you didn't do that already to install LLVM above.&lt;/li&gt;
&lt;li&gt;Then, execute the following: 'brew install autoconf automake'&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The GHC Trac has more information on &lt;a href=&quot;http://hackage.haskell.org/trac/ghc/wiki/Building&quot;&gt;Building and Porting GHC&lt;/a&gt;.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/using-the-glasgow-haskell-compiler-ghc-on-os&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/using-the-glasgow-haskell-compiler-ghc-on-os#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Goanna 2.7 Released</title>
		<link href="http://redlizards.com/blog/release/goanna-2-7-released/"/>
		<id>http://redlizards.com/blog/?p=719</id>
		<updated>2012-04-20T03:29:49+00:00</updated>
		<content type="html">&lt;p&gt;We are delighted to announce the new Goanna 2.7 release across all product lines!&lt;/p&gt;
&lt;p&gt;There are some major improvements and a bunch of new features in the new release.&lt;br /&gt;
Most noteworthy, we completely redesigned the  way we handle different compilers&lt;br /&gt;
and environments in Goanna Studio for Eclipse. It is now straightforward to support&lt;br /&gt;
different &lt;strong&gt;embedded compilers&lt;/strong&gt; and cross-compilation settings.&lt;/p&gt;
&lt;p&gt;In this release we also provide some early support for &lt;strong&gt;Visual Studio 11&lt;/strong&gt;. As one&lt;br /&gt;
of the leaders in Visual Studio support we provide a beta for public download and&lt;br /&gt;
exploration.&lt;/p&gt;
&lt;p&gt;As usual there has been a lot of improvements to the underlying &lt;strong&gt;analysis engine&lt;/strong&gt; often times&lt;br /&gt;
significantly reducing the overall runtime. There are improved checks and reduced false positives&lt;br /&gt;
as well as a re-worked interprocedural analysis that finds more issues in a single run.&lt;/p&gt;
&lt;h3&gt;Goanna Studio Eclipse &amp;amp; Visual Studio&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The IDE versions now come with preconfigured setting for different needs:  &amp;#8221;Quick Check&amp;#8221;&lt;br /&gt;
and &amp;#8220;Deep Check&amp;#8221; . The &amp;#8220;Quick Check&amp;#8221; performs most checks that  can be run quickly to allow fast results. The &amp;#8220;Deep Check&amp;#8221; option does thorough analysis and includes all possible checks. These are simple alternatives to the default/customised configuration.&lt;/li&gt;
&lt;li&gt;There is a free beta version of a new &amp;#8220;Suppression Manager&amp;#8221; included to view sort, filter, and manage the warnings from a project.&lt;/li&gt;
&lt;li&gt;Goanna has early support for Visual Studio 11 (beta).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;All Versions&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Goanna has changed from a custom configuration file format to use JSON. By moving to the new format it is much easier to support different compilers and environments.&lt;/li&gt;
&lt;li&gt;There is a new user guide as well as a separate reference guide with more introductions, check examples and explanations.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;The Goanna interprocedural analysis has been improved to give stable results between runs.&lt;/li&gt;
&lt;li&gt;Reduced false positive reporting for many cases including the RED-unusued-var-all  check.&lt;/li&gt;
&lt;li&gt;Better handling of random numbers (from the &amp;#8220;rand()&amp;#8221; function).&lt;/li&gt;
&lt;li&gt;Support for the &amp;#8220;-isystem&amp;#8221; argument by default.&lt;/li&gt;
&lt;li&gt;Improved  overall Goanna performance including avoiding some pathological examples.&lt;/li&gt;
&lt;li&gt;Greater support of the C++11 standard and future options to support other languages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;/h3&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">GPU computing in Haskell: version 0.10 of Data.Array.Accelerate</title>
		<link href="http://justtesting.org/gpu-computing-in-haskell-version-010-of-dataa"/>
		<id>http://justtesting.org/gpu-computing-in-haskell-version-010-of-dataa</id>
		<updated>2012-04-12T06:38:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;p&gt;Accelerate is an embedded language for GPU-accelerated array computations in Haskell that targets NVIDIA's CUDA framework and also has an experimental OpenCL backend (that currently does not support the whole feature set of the language). I just released &lt;a href=&quot;http://hackage.haskell.org/package/accelerate-0.10.0.0&quot; title=&quot;accelerate 0.10.0.0&quot;&gt;version 0.10.0.0 of Accelerate&lt;/a&gt;. A considerable amount of example code is in the companion package &lt;a href=&quot;http://hackage.haskell.org/package/accelerate-examples&quot;&gt;accelerate-examples&lt;/a&gt;. The main user-visible changes in this release are frontend bug fixes.&lt;/p&gt;
&lt;p&gt;For more information, have a look at &lt;a href=&quot;https://github.com/mchakravarty/accelerate&quot; title=&quot;Accelerate @ GitHub&quot;&gt;Accelerate on GitHub&lt;/a&gt;.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/gpu-computing-in-haskell-version-010-of-dataa&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/gpu-computing-in-haskell-version-010-of-dataa#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Work Efficient Higher-Order Vectorisation</title>
		<link href="http://justtesting.org/work-efficient-higher-order-vectorisation"/>
		<id>http://justtesting.org/work-efficient-higher-order-vectorisation</id>
		<updated>2012-03-24T07:26:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;p&gt;Our new draft paper on&amp;nbsp;&lt;a href=&quot;http://www.cse.unsw.edu.au/~chak/papers/LCKLP12.html&quot; title=&quot;Work Efficient Higher-Order Vectorisation&quot; target=&quot;_blank&quot;&gt;Work Efficient Higher-Order Vectorisation&lt;/a&gt;&amp;nbsp;introduces a novel representation for nested, irregular parallel arrays that enables the work-efficient SIMD-ification of nested data parallelism &amp;mdash; i.e., nested parallelism is transformed into flat parallelism, while maintaining the work complexity of a naive pointer-based representation of nested arrays. This solves a long standing problem that dates back to the original implementation of the language NESL.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/work-efficient-higher-order-vectorisation&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/work-efficient-higher-order-vectorisation#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Perdition 1.19-rc5 Released</title>
		<link href="http://horms.org/pleb_blossom/permalink/2012/2012-03-20T21_25_20.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2012/2012-03-20T21_25_20.shtml</id>
		<updated>2012-03-20T12:25:20+00:00</updated>
		<content type="html">&lt;a href=&quot;http://horms.net/projects/perdition/&quot; class=&quot;noborder&quot;&gt;&lt;img src=&quot;http://horms.net/projects/perdition/pics/perdition_100.jpg&quot; align=&quot;right&quot; alt=&quot;[perdition]&quot; width=&quot;100&quot; height=&quot;47&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;
				&lt;p&gt;
				I have released version 1.19-rc5 of Perdition.
				The key changes are:
				&lt;ul&gt;
				&lt;li&gt; ldap: fix segmentation fault in dbserver_get2()
				&lt;li&gt; Manage-sieve: Fix handling of plain login which would segmentation
				     fault in some cases
				&lt;li&gt; Manage-sieve: Fix handling of long authentication hashes
				&lt;li&gt; Enhance --bind_address option parsing to handle IPv6 addresses
				&lt;li&gt; Fix 8/4byte integer type miss-matches which may lead to
				     undefined behaviour
				&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;
				&lt;p&gt;
				The code and related libraries are available as tarballs
				&lt;a href=&quot;http://horms.net/linux/perdition/download/1.19-rc5/&quot;&gt;here&lt;/a&gt;.
				More information is available in the &lt;a href=&quot;http://lists.vergenet.net/pipermail/perdition-users/2010-September/002413.html&quot;&gt;announcement email&lt;/a&gt;.
				More information about perdition &lt;a href=&quot;http://horms.net/linux/perdition/&quot;&gt;here&lt;/a&gt;.
				&lt;br clear=&quot;left&quot; /&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Goanna is Gearing Up for Visual Studio 11</title>
		<link href="http://redlizards.com/blog/release/goanna-is-gearing-up-for-visual-studio-11/"/>
		<id>http://redlizards.com/blog/?p=697</id>
		<updated>2012-03-20T04:35:53+00:00</updated>
		<content type="html">&lt;p&gt;Red Lizards Software is preparing for the future! As one of the pioneers for supporting Visual Studio 2010, we are once again leading innovation and we are happy to announce our preparation for a sim-ship release with the upcoming Visual Studio 11.&lt;/p&gt;
&lt;p&gt;As recently &lt;a href=&quot;http://blogs.msdn.com/b/jasonz/&quot;&gt;announced&lt;/a&gt;, Visual Studio 11 beta is now available for download. The new IDE comes with a simplified design and a much streamlined user experience. At this point in time MSDN subscribers can download and trial the beta release: &lt;a href=&quot;http://go.microsoft.com/?linkid=9801725&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;size-full wp-image-698 alignnone&quot; title=&quot;get-vs-11-beta-1&quot; src=&quot;http://redlizards.com/blog/wp-content/uploads/2012/03/get-vs-11-beta-1.png&quot; alt=&quot;Visual Studio 11 Download&quot; width=&quot;104&quot; height=&quot;37&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;Goanna Studio&quot; href=&quot;http://redlizards.com/products/goanna-studio.html&quot;&gt;Goanna Studio&lt;/a&gt;, previously already available for Visual Studio 2005,  Visual Studio 2008, and Visual Studio 2010, will be available in time for the upcoming Visual Studio 11 to seamlessly support our innovative and trend defining users. A big thanks also goes to our development team for working with the guys at Microsoft to make Goanna Studio even better in the upcoming release. As a sneak peak we give you a first screenshot below, but if you want to try Goanna Studio for Visual Studio yourself, send us an email at &lt;a title=&quot;Trial Goanna Studio for Visual Studio 11&quot; href=&quot;mailto:vs11@redlizards.com?subject=I like to trial Goanna for Visual Studio 11&quot;&gt;vs11@redlizards.com&lt;/a&gt;.&lt;/p&gt;
&lt;div id=&quot;attachment_706&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;a href=&quot;http://redlizards.com/blog/wp-content/uploads/2012/03/goanna-studio-vs-11-beta.png&quot; rel=&quot;lightbox[697]&quot;&gt;&lt;img class=&quot;size-medium wp-image-706  &quot; title=&quot;goanna-studio-vs-11-beta&quot; src=&quot;http://redlizards.com/blog/wp-content/uploads/2012/03/goanna-studio-vs-11-beta-300x107.png&quot; alt=&quot;Goanna Studio in Visual Studio 11 beta&quot; width=&quot;300&quot; height=&quot;107&quot; /&gt;&lt;/a&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Goanna Studio in Visual Studio 11 beta&lt;/p&gt;&lt;/div&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;h3&gt;About&lt;/h3&gt;
&lt;p&gt;Red Lizard Software is the leading provider of code confidence tools for C/C++ developers, bringing advanced static analysis closer to the developer by providing solutions for flexible build integration on the server and deep IDE embedding on the desktop across platforms.&lt;/p&gt;
&lt;p&gt;Goanna is a fast, scalable, and precise software solution that detects software bugs and security vulnerabilities automatically during the development process, helping to keep product launch timetables on track and to reduce life cycle costs.&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Android's Achilles Heel</title>
		<link href="http://justtesting.org/androids-achilles-heel"/>
		<id>http://justtesting.org/androids-achilles-heel</id>
		<updated>2012-02-12T09:54:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;p&gt;Marco Arment reports,&lt;/p&gt;
&lt;p&gt;&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p&gt;89% of iOS devices running Instapaper in the last 60 days have at least iOS 5.0.92% if I only go 2 weeks back.Almost time to require it.&lt;/p&gt;&amp;mdash; Marco Arment (@marcoarment) &lt;a href=&quot;https://twitter.com/marcoarment/status/168155309569875969&quot;&gt;February 11, 2012&lt;/a&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;Contrast that with&amp;nbsp;Russell Ivanovic's figure for the latest Android OS (Ice Cream Sandwich):&lt;/p&gt;
&lt;p&gt;&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p&gt;Fun figures: 99.97%(the percentage of Android phones NOT running Android 4.0, Ice Cream Sandwich)&lt;/p&gt;&amp;mdash; Russell Ivanovic (@rustyshelf) &lt;a href=&quot;https://twitter.com/rustyshelf/status/167753064189669376&quot;&gt;February 9, 2012&lt;/a&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;This is not the whole story as Marco's number is for the users of a single app (Instapaper) and I don't know whether Russell's numbers are for the users of Pocket Weather AU and Pocketcasts or generally for the whole Android ecosystem. I still think these numbers are indicative of the state of OS updates in the iOS and Android ecosystems.&lt;/p&gt;
&lt;p&gt;Of all the differences between the two ecosystems, this is to me Android's biggest problem. (This assumes that smartphone OS updates will contain many important &lt;strong&gt;user-visible&lt;/strong&gt; changes for some more years.)&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/androids-achilles-heel&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/androids-achilles-heel#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Released Data.Array.Accelerate 0.9.0.0 — the Haskell array library for GPUs</title>
		<link href="http://justtesting.org/released-dataarrayaccelerate-0900-the-haskell"/>
		<id>http://justtesting.org/released-dataarrayaccelerate-0900-the-haskell</id>
		<updated>2012-02-01T05:55:09+00:00</updated>
		<content type="html">&lt;p&gt;
	I just released&amp;nbsp;&lt;a href=&quot;http://hackage.haskell.org/package/accelerate-0.9.0.0&quot;&gt;accelerate 0.9.0.0&lt;/a&gt;&amp;nbsp;on Hackage. This is the version that has been available from the&amp;nbsp;&lt;a href=&quot;https://github.com/mchakravarty/accelerate&quot;&gt;GitHub repository&lt;/a&gt;&amp;nbsp;for a while (supporting shape polymorphism, stencil computations, block I/O, and much more), but adapted such that it works with the forthcoming GHC 7.4.1 release. (I tested it with 7.4.1 RC2).&lt;p&gt;&lt;/p&gt;&lt;div&gt;It doesn't yet include Trevor's recent work that improved the CUDA backend in many significant ways — you can get that code from&amp;nbsp;&lt;a href=&quot;https://github.com/tmcdonell/accelerate&quot;&gt;Trevor's fork on GitHub&lt;/a&gt;.&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;For more details, see the&amp;nbsp;&lt;a href=&quot;https://github.com/mchakravarty/accelerate&quot;&gt;main GitHub repository&lt;/a&gt;&amp;nbsp;and the&amp;nbsp;&lt;a href=&quot;https://github.com/mchakravarty/accelerate/wiki&quot;&gt;GitHub wiki pages&lt;/a&gt;.&lt;/div&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/released-dataarrayaccelerate-0900-the-haskell&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/released-dataarrayaccelerate-0900-the-haskell#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Free, nicely presented textbooks with good distribution</title>
		<link href="http://justtesting.org/free-textbooks"/>
		<id>http://justtesting.org/free-textbooks</id>
		<updated>2012-01-26T13:36:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;p&gt;Free, nicely presented textbooks with good distribution have got quite an appeal.&lt;/p&gt;
&lt;p&gt;&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p&gt;Begun it has RT @&lt;a href=&quot;https://twitter.com/stevedekorte&quot;&gt;stevedekorte&lt;/a&gt;: First version of Io Programming Guide available for free on iTunes book store &lt;a href=&quot;http://t.co/AovAFyrL&quot; title=&quot;http://itunes.apple.com/us/book/io/id497620067?mt=11&quot;&gt;itunes.apple.com/us/book/io/id4…&lt;/a&gt;&lt;/p&gt;&amp;mdash; Mac (@wmacgyver) &lt;a href=&quot;https://twitter.com/wmacgyver/status/162351174647939073&quot;&gt;January 26, 2012&lt;/a&gt;&lt;/blockquote&gt;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/free-textbooks&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/free-textbooks#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Benchmarking and QuickChecking readInt.</title>
		<link href="http://www.mega-nerd.com/erikd/Blog/CodeHacking/Haskell/read_int.html"/>
		<id>http://www.mega-nerd.com/erikd/Blog/2012/01/24/read_int.atom</id>
		<updated>2012-01-24T00:52:00+00:00</updated>
		<content type="html">&lt;p&gt;
I'm currently working on converting my
	&lt;a href=&quot;http://hackage.haskell.org/package/http-proxy/&quot;&gt;
	http-proxy&lt;/a&gt;
library from using the
	&lt;a href=&quot;http://hackage.haskell.org/package/enumerator&quot;&gt;
	Data.Enumerator&lt;/a&gt;
package to
	&lt;a href=&quot;http://hackage.haskell.org/package/conduit/&quot;&gt;
	Data.Conduit&lt;/a&gt;
(explanation of why in my
	&lt;a href=&quot;http://www.mega-nerd.com/erikd/Blog/CodeHacking/Haskell/telnet-conduit.html&quot;&gt;
	last blog post&lt;/a&gt;).
&lt;/p&gt;

&lt;p&gt;
During this conversion, I have been studying the sources of the
	&lt;a href=&quot;http://hackage.haskell.org/package/warp/&quot;&gt;
	Warp&lt;/a&gt;
web server because my http-proxy was originally derived from the Enumerator
version of Warp.
While digging through the Warp code I found the following code (and comment)
which is used to parse the number provided in the &lt;tt&gt;Content-Length&lt;/tt&gt; field
of a HTTP header:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  -- Note: This function produces garbage on invalid input. But serving an
  -- invalid content-length is a bad idea, mkay?
  readInt :: S.ByteString -&gt; Integer
  readInt = S.foldl' (\x w -&gt; x * 10 + fromIntegral w - 48) 0

&lt;/pre&gt;

&lt;p&gt;
The comment clearly states that that this function can produce garbage,
specifically if the string contains anything other than ASCII digits.
The comment is also correct that an invalid &lt;tt&gt;Content-Length&lt;/tt&gt; is a bad
idea.
However, on seeing the above code, and remembering something I had seen recently
in the standard library, I naively sent the
	&lt;a href=&quot;https://github.com/yesodweb/wai/&quot;&gt;
	Yesod project&lt;/a&gt;
a patch replacing the above code with a version that uses the &lt;tt&gt;readDec&lt;/tt&gt;
function from the &lt;tt&gt;Numeric&lt;/tt&gt; module:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  import Data.ByteString (ByteString)
  import qualified Data.ByteString.Char8 as B
  import qualified Numeric as N

  readInt :: ByteString -&gt; Integer
  readInt s =
      case N.readDec (B.unpack s) of
          [] -&gt; 0
          (x, _):_ -&gt; x

&lt;/pre&gt;

&lt;p&gt;
About 3-4 hours after I submitted the patch I got an email from
	&lt;a href=&quot;http://www.snoyman.com/&quot;&gt;
	Michael Snoyman&lt;/a&gt;
saying that parsing the &lt;tt&gt;Content-Length&lt;/tt&gt; field is a hot spot for the
performance of Warp and that I should benchmark it against the code I'm
replacing to make sure there is no unacceptable performance penalty.
&lt;/p&gt;

&lt;p&gt;
That's when I decided it was time to check out Bryan O'Sullivan's
	&lt;a href=&quot;http://hackage.haskell.org/package/criterion/&quot;&gt;
	Criterion&lt;/a&gt;
bench-marking library.
A quick read of the docs and bit of messing around and I was able to prove to
myself that using &lt;tt&gt;readDec&lt;/tt&gt; was indeed much slower than the code I wanted
to replace.
&lt;/p&gt;

&lt;p&gt;
The initial disappointment of finding that a more correct implementation was
significantly slower than the less correct version quickly turned to joy as I
experimented with a couple of other implementations and eventually settled on
this:
&lt;/p&gt;


&lt;pre class=&quot;code&quot;&gt;

  import Data.ByteString (ByteString)
  import qualified Data.ByteString.Char8 as B
  import qualified Data.Char as C

  readIntTC :: Integral a =&gt; ByteString -&gt; a
  readIntTC bs = fromIntegral
          $ B.foldl' (\i c -&gt; i * 10 + C.digitToInt c) 0
          $ B.takeWhile C.isDigit bs

&lt;/pre&gt;

&lt;p&gt;
By using the &lt;tt&gt;Integral&lt;/tt&gt; type class, this function converts the given
&lt;tt&gt;ByteString&lt;/tt&gt; to any integer type (ie any type belonging to the
&lt;tt&gt;Integral&lt;/tt&gt; type class).
When used, this function will be specialized by the Haskell compiler at the
call site to to produce code to read string values into &lt;tt&gt;Int&lt;/tt&gt;s,
&lt;tt&gt;Int64&lt;/tt&gt;s or anything else that is a member of the &lt;tt&gt;Integral&lt;/tt&gt;
type class.
&lt;/p&gt;

&lt;p&gt;
For a final sanity check I decided to use
	&lt;a href=&quot;http://hackage.haskell.org/package/QuickCheck&quot;&gt;
	QuickCheck&lt;/a&gt;
to make sure that the various versions of the generic function were correct for
values of the type they returned.
To do that I wrote a very simple QuickCheck property as follows:
&lt;/p&gt;


&lt;pre class=&quot;code&quot;&gt;

  prop_read_show_idempotent :: Integral a =&gt; (ByteString -&gt; a) -&gt; a -&gt; Bool
  prop_read_show_idempotent freader x =
      let posx = abs x
      in posx == freader (B.pack $ show posx)

&lt;/pre&gt;

&lt;p&gt;
This QuickCheck property takes the function under test &lt;tt&gt;freader&lt;/tt&gt; and
QuickCheck will then provide it values of the correct type.
Since the function under test is designed to read &lt;tt&gt;Content-Length&lt;/tt&gt; values
which are always positive, we only test using the absolute value of the value
randomly generated by QuickCheck.
&lt;/p&gt;


&lt;p&gt;
The complete test program can be found on Github
	&lt;a href=&quot;https://gist.github.com/1662654&quot;&gt;
	in this Gist&lt;/a&gt;
and can be compiled and run as:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  ghc -Wall -O3 --make readInt.hs -o readInt &amp;amp;&amp;amp; ./readInt

&lt;/pre&gt;

&lt;p&gt;
When run, the output of the program looks like this:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  Quickcheck tests.
  +++ OK, passed 100 tests.
  +++ OK, passed 100 tests.
  +++ OK, passed 100 tests.
  Criterion tests.
  warming up
  estimating clock resolution...
  mean is 3.109095 us (320001 iterations)
  found 27331 outliers among 319999 samples (8.5%)
    4477 (1.4%) low severe
    22854 (7.1%) high severe
  estimating cost of a clock call...
  mean is 719.4627 ns (22 iterations)

  benchmarking readIntOrig
  mean: 4.653041 us, lb 4.645949 us, ub 4.663823 us, ci 0.950
  std dev: 43.94805 ns, lb 31.52653 ns, ub 73.82125 ns, ci 0.950

  benchmarking readDec
  mean: 13.12692 us, lb 13.10881 us, ub 13.14411 us, ci 0.950
  std dev: 90.63362 ns, lb 77.52619 ns, ub 112.4304 ns, ci 0.950

  benchmarking readRaw
  mean: 591.8697 ns, lb 590.9466 ns, ub 594.1634 ns, ci 0.950
  std dev: 6.995869 ns, lb 3.557109 ns, ub 14.54708 ns, ci 0.950

  benchmarking readInt
  mean: 388.3835 ns, lb 387.9500 ns, ub 388.8342 ns, ci 0.950
  std dev: 2.261711 ns, lb 2.003214 ns, ub 2.585137 ns, ci 0.950

  benchmarking readInt64
  mean: 389.4380 ns, lb 388.9864 ns, ub 389.9312 ns, ci 0.950
  std dev: 2.399116 ns, lb 2.090363 ns, ub 2.865227 ns, ci 0.950

  benchmarking readInteger
  mean: 389.3450 ns, lb 388.8463 ns, ub 389.8626 ns, ci 0.950
  std dev: 2.599062 ns, lb 2.302428 ns, ub 2.963600 ns, ci 0.950

&lt;/pre&gt;

&lt;p&gt;
At the top of the output is proof that all three specializations of the generic
function &lt;tt&gt;readIntTC&lt;/tt&gt; satisfy the QuickCheck property.
From the Criterion output its pretty obvious that the &lt;tt&gt;Numeric.readDec&lt;/tt&gt;
version is about 3 times slower that the original function.
More importantly, all three version of this generic function are an order of
magnitude faster than the original.
&lt;/p&gt;

&lt;p&gt;
That's a win!
I will be submitting my new function for inclusion in Warp.
&lt;/p&gt;


&lt;p&gt;
&lt;b&gt;Update : 14:13&lt;/b&gt;
&lt;/p&gt;

&lt;p&gt;
At around the same time I submitted my latest version for &lt;tt&gt;readInt&lt;/tt&gt;
Vincent Hanquez
	&lt;a href=&quot;https://github.com/yesodweb/wai/pull/34#issuecomment-3626110&quot;&gt;
	posted a comment on the Github issue&lt;/a&gt;
suggesting I look at the
	&lt;a href=&quot;http://www.haskell.org/ghc/docs/7.2.2/html/users_guide/syntax-extns.html#magic-hash&quot;&gt;
	GHC MagicHash extension&lt;/a&gt;
and pointed me to
	&lt;a href=&quot;http://tab.snarc.org/posts/haskell/2011-11-15-lookup-tables.html&quot;&gt;
	an example&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Sure enough, using the MagicHash technique resulted in something significantly
faster again.
&lt;/p&gt;

&lt;p&gt;
&lt;b&gt;Update #2 : 2012-01-29 19:46&lt;/b&gt;
&lt;/p&gt;

&lt;p&gt;
In version 0.3.0 and later of the
	&lt;a href=&quot;http://hackage.haskell.org/package/bytestring-lexing&quot;&gt;
	bytestring-lexing&lt;/a&gt;
package there is a function &lt;tt&gt;readDecimal&lt;/tt&gt; that is even faster than the
MagiHash version.
&lt;/p&gt;</content>
		<author>
			<name>Erik de Castro Lopo</name>
			<email>erikd@mega-nerd.com</email>
			<uri>http://www.mega-nerd.com/erikd/Blog</uri>
		</author>
		<source>
			<title type="html">m3ga blog</title>
			<subtitle type="html">An ocassional rant</subtitle>
			<link rel="self" href="http://www.mega-nerd.com/erikd/Blog/index.atom"/>
			<id>http://www.mega-nerd.com/erikd/Blog/index.atom</id>
			<updated>2012-01-29T09:30:23+00:00</updated>
			<rights type="html">Copyright 2006-2010 Erik de Castro Lopo</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Unix wins</title>
		<link href="http://justtesting.org/unix-wins"/>
		<id>http://justtesting.org/unix-wins</id>
		<updated>2012-01-15T03:41:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;p&gt;&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p&gt;A brief history of personal computing platforms.&lt;a href=&quot;http://t.co/DURA5ACa&quot; title=&quot;http://twitpic.com/87bt3s&quot;&gt;twitpic.com/87bt3s&lt;/a&gt;&lt;/p&gt;&amp;mdash; Horace Dediu (@asymco) &lt;a href=&quot;https://twitter.com/asymco/status/158295418378260480&quot;&gt;January 14, 2012&lt;/a&gt;&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;We are witnessing the transition from Windows on Intel to Unix on (mostly) ARM. It is a testament to the flexibility of the design that a system originally designed for mainframes achieves mass market appeal on resource-constrained mobile systems.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://twitpic.com/87bt3s&quot;&gt;http://twitpic.com/87bt3s&lt;/a&gt;&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/unix-wins&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/unix-wins#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Simple Telnet Client Using Data.Conduit.</title>
		<link href="http://www.mega-nerd.com/erikd/Blog/CodeHacking/Haskell/telnet-conduit.html"/>
		<id>http://www.mega-nerd.com/erikd/Blog/2012/01/14/telnet-conduit.atom</id>
		<updated>2012-01-14T02:22:00+00:00</updated>
		<content type="html">&lt;p&gt;
Below is a simple telnet client written using Haskell's new
	&lt;a href=&quot;http://hackage.haskell.org/package/conduit/&quot;&gt;
	Conduit&lt;/a&gt;
library.
This library was written by
	&lt;a href=&quot;http://www.snoyman.com/&quot;&gt;Michael Snoyman&lt;/a&gt;
the man behind the
	&lt;a href=&quot;http://www.yesodweb.com/&quot;&gt;
	Yesod&lt;/a&gt;
Web Framework for Haskell.
&lt;/p&gt;

&lt;p&gt;
The Conduit library is a second generation approach to the problem of
guaranteeing bounded memory usage in the presence of lazy evaluation.
The first generation of these ideas were libraries like
	&lt;a href=&quot;http://hackage.haskell.org/package/iteratee&quot;&gt;
	Iteratee&lt;/a&gt;,
	&lt;a href=&quot;http://hackage.haskell.org/package/enumerator&quot;&gt;
	Enumerator&lt;/a&gt;,
and
	&lt;a href=&quot;http://hackage.haskell.org/package/iterIO&quot;&gt;
	IterIO&lt;/a&gt;.
All of these first generation libraries use the the term &lt;i&gt;enumerator&lt;/i&gt;
for data producers and &lt;i&gt;iteratee&lt;/i&gt; for data consumers.
The new Conduit library calls data producers &lt;i&gt;&quot;sources&quot;&lt;/i&gt; and data consumers
&lt;i&gt;&quot;sinks&quot;&lt;/i&gt; to make them a little more approachable.
&lt;/p&gt;

&lt;p&gt;
The other big difference between Conduit and the early libraries in this space
is to do with guaranteeing early clean up of potentially scarce resources like
sockets.
Although I have not looked in any detail at the IterIO library, both Iteratee and
Enumerator simply rely on Haskell's garbage collector to clean up resources
when they are no longer required.
The Conduit library on the other hand uses
	&lt;a href=&quot;http://hackage.haskell.org/packages/archive/conduit/latest/doc/html/Control-Monad-Trans-Resource.html&quot;&gt;
	Resource transformers&lt;/a&gt;
to guarantee release of these resources as soon as possible.
&lt;/p&gt;

&lt;p&gt;
The client looks like this
(&lt;a href=&quot;https://gist.github.com/1596792&quot;&gt;latest available here&lt;/a&gt;):
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  import Control.Concurrent (forkIO, killThread)
  import Control.Monad.IO.Class (MonadIO, liftIO)
  import Control.Monad.Trans.Resource
  import Data.Conduit
  import Data.Conduit.Binary
  import Network (connectTo, PortID (..))
  import System.Environment (getArgs, getProgName)
  import System.IO


  main :: IO ()
  main = do
      args &amp;lt;- getArgs
      case args of
          [host, port] -&amp;gt; telnet host (read port :: Int)
          _ -&amp;gt; usageExit
    where
      usageExit = do
          name &amp;lt;- getProgName
          putStrLn $ &quot;Usage : &quot; ++ name ++ &quot; host port&quot;


  telnet :: String -&amp;gt; Int -&amp;gt; IO ()
  telnet host port = runResourceT $ do
      (releaseSock, hsock) &amp;lt;- with (connectTo host $ PortNumber $ fromIntegral port) hClose
      liftIO $ mapM_ (`hSetBuffering` LineBuffering) [ stdin, stdout, hsock ]
      (releaseThread, _) &amp;lt;- with (
                            forkIO $ runResourceT $ sourceHandle stdin $$ sinkHandle hsock
                            ) killThread
      sourceHandle hsock $$ sinkHandle stdout
      release releaseThread
      release releaseSock

&lt;/pre&gt;

&lt;p&gt;
There are basically three blocks, a bunch of imports at the top, the program's
entry point &lt;b&gt;&lt;tt&gt;main&lt;/tt&gt;&lt;/b&gt; and the &lt;b&gt;&lt;tt&gt;telnet&lt;/tt&gt;&lt;/b&gt; function.
&lt;/p&gt;

&lt;p&gt;
The &lt;b&gt;&lt;tt&gt;telnet&lt;/tt&gt;&lt;/b&gt; function is pretty simple.
Most of the function runs inside a &lt;b&gt;&lt;tt&gt;runResourceT&lt;/tt&gt;&lt;/b&gt; resource
transformer.
The purpose of these resources transformers is to keep track of resources such
as sockets, file handles, thread ids etc and make sure they get released in a
timely manner.
For example, in the &lt;b&gt;&lt;tt&gt;telnet&lt;/tt&gt;&lt;/b&gt; function, the &lt;b&gt;&lt;tt&gt;connectTo&lt;/tt&gt;&lt;/b&gt;
function call opens a connection to the specified host and port number and
returns a socket.
By wrapping the &lt;b&gt;&lt;tt&gt;connectTo&lt;/tt&gt;&lt;/b&gt; in the call to &lt;b&gt;&lt;tt&gt;with&lt;/tt&gt;&lt;/b&gt;
then the socket is registered with the resource transformer.
The &lt;b&gt;&lt;tt&gt;with&lt;/tt&gt;&lt;/b&gt; function has the following prototype:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  with :: Resource m
       =&gt; Base m a             -- Base monad for the current monad stack
       -&gt; (a -&gt; Base m ())     -- Resource de-allocation function
       -&gt; ResourceT m (ReleaseKey, a)

&lt;/pre&gt;

&lt;p&gt;
When the resource is registered, the user must also supply a function that will
destroy and release the resource.
The &lt;b&gt;&lt;tt&gt;with&lt;/tt&gt;&lt;/b&gt; function returns a &lt;b&gt;&lt;tt&gt;ReleaseKey&lt;/tt&gt;&lt;/b&gt; for the
resource and the resource itself.
Formulating the &lt;b&gt;&lt;tt&gt;with&lt;/tt&gt;&lt;/b&gt; function this way makes it hard to misuse.
&lt;/p&gt;

&lt;p&gt;
The other thing of interest is that because a telnet client needs to send data
in both directions, the server-to-client communication path and the
client-to-server communication run in separate GHC runtime threads.
The thread is spawned using &lt;b&gt;&lt;tt&gt;forkIO&lt;/tt&gt;&lt;/b&gt; and even though the thread
identifier is thrown away, the resource transformer still records it and will
later call &lt;b&gt;&lt;tt&gt;killThread&lt;/tt&gt;&lt;/b&gt; to clean up the thread.
&lt;/p&gt;

&lt;p&gt;
The main core of the program are the two lines containing calls to
&lt;b&gt;&lt;tt&gt;sourceHandle&lt;/tt&gt;&lt;/b&gt; and &lt;b&gt;&lt;tt&gt;sinkHandle&lt;/tt&gt;&lt;/b&gt;.
The first of these lines pulls data from &lt;b&gt;&lt;tt&gt;stdin&lt;/tt&gt;&lt;/b&gt; and pushes it to
the socket &lt;b&gt;&lt;tt&gt;hsock&lt;/tt&gt;&lt;/b&gt; while the second pulls from the socket and
pushes it to &lt;b&gt;&lt;tt&gt;stdout&lt;/tt&gt;&lt;/b&gt;.
&lt;/p&gt;

&lt;p&gt;
It should be noted that the final two calls to &lt;b&gt;&lt;tt&gt;release&lt;/tt&gt;&lt;/b&gt; are not
strictly necessary since the resource transformer will clean up these resources
automatically.
&lt;/p&gt;

&lt;p&gt;
The experience of writing this telnet client suggests that the Conduit library
is certainly easier to use than the Enumerator or Iteratee libraries.
&lt;/p&gt;</content>
		<author>
			<name>Erik de Castro Lopo</name>
			<email>erikd@mega-nerd.com</email>
			<uri>http://www.mega-nerd.com/erikd/Blog</uri>
		</author>
		<source>
			<title type="html">m3ga blog</title>
			<subtitle type="html">An ocassional rant</subtitle>
			<link rel="self" href="http://www.mega-nerd.com/erikd/Blog/index.atom"/>
			<id>http://www.mega-nerd.com/erikd/Blog/index.atom</id>
			<updated>2012-01-29T09:30:23+00:00</updated>
			<rights type="html">Copyright 2006-2010 Erik de Castro Lopo</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Two new mixes</title>
		<link href="http://algorithm.com.au/blog/files/tes-lyric-stage-superior.php#unique-entry-id-614"/>
		<id>http://algorithm.com.au/blog/files/tes-lyric-stage-superior.php#unique-entry-id-614</id>
		<updated>2011-11-23T16:10:24+00:00</updated>
		<content type="html">I've been pretty dormant in my music for the past few years, but I have been working on two two mixes in my sparse spare time: &quot;Tes Lyric&quot;:/music/tes_lyric, a weird blend of electronica, classical and rock, and &quot;Stage Superior&quot;:/music/ss, a progressive house mix.  They're up on my &quot;music&quot;:/music page now; enjoy!</content>
		<author>
			<name>André Pang</name>
			<uri>http://algorithm.com.au/index.html</uri>
		</author>
		<source>
			<title type="html">Stay Hungry, Stay Foolish</title>
			<subtitle type="html">André Pang's Blog</subtitle>
			<link rel="self" href="http://algorithm.com.au/blog/files/rss.xml"/>
			<id>http://algorithm.com.au/blog/files/rss.xml</id>
			<updated>2011-11-23T18:30:22+00:00</updated>
			<rights type="html">© 2006-2007 André Pang</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Goanna 2.6 Released</title>
		<link href="http://redlizards.com/blog/release/goanna-26-released/"/>
		<id>http://redlizards.com/blog/?p=691</id>
		<updated>2011-11-02T00:46:21+00:00</updated>
		<content type="html">&lt;p&gt;Goanna 2.6 is now available from the download page. In this release we have focused on the usability of our Goanna Studio for Eclipse offering which at the same time increases stability and flexibility in the face of the many different configurations that are possible within the Eclipse CDT environment. Here is a summary of what has changed in this release:&lt;/p&gt;
&lt;p&gt;- All versions&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bounds checking for arrays of arbitrary dimension&lt;/li&gt;
&lt;li&gt;Bounds checking for arrays within classes, structs and unions&lt;/li&gt;
&lt;li&gt;Arrays of unspecified size are no longer considered to have size 0&lt;/li&gt;
&lt;li&gt;Constant global variables are now modelled with a value that does not change&lt;/li&gt;
&lt;li&gt;The constant &amp;#8220;-1U&amp;#8221; and others will now be modelled with an appropriately large value instead of -1&lt;/li&gt;
&lt;li&gt;Check FPT-misuse no longer warns about function pointers that are the result of the ternary operator (?:)&lt;/li&gt;
&lt;li&gt;Check ITR-uninit now works correctly for iterators that are initialized using operator=&lt;/li&gt;
&lt;li&gt;Check RED-unused-param no longer warns for parameters that have the GNU attribute (unused)&lt;/li&gt;
&lt;li&gt;Checks RED-cond-const-assign and EXP-cond-assign no longer consider &amp;#8220;+=&amp;#8221; and similar operators to be constant assignments&lt;/li&gt;
&lt;li&gt;Non-system #include files are now included in the analysis of a file that includes them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;- Goanna Studio for Visual Studio&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;preprocessor macros within parentheses are expanded&lt;/li&gt;
&lt;li&gt;macros in comments are not expanded&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;- Goanna Central&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cygwin support for windows, use &amp;#8211;compiler-sort=cygwin to create a cygwin configuration&lt;/li&gt;
&lt;li&gt;Other compiler sort added, use &amp;#8211;compiler-sort=other for an empty configuration&lt;/li&gt;
&lt;li&gt;Remove the dependencies on the hard to manage predefined_macro.txt files&lt;/li&gt;
&lt;li&gt;Predefined macros are now stored in the Goanna resource files, which are generated during configuration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;- Goanna Studio for Eclipse&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Completely re-organised configuration
&lt;ul&gt;
&lt;li&gt;Per project configuration&lt;/li&gt;
&lt;li&gt;File based (under a goanna directory in the project file system)&lt;/li&gt;
&lt;li&gt;User editable, or use the Goanna Project Properties dialogs. (two way synchronisation)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Menu item &amp;#8220;Run Goanna on Selected File(s)&amp;#8221; now appears when right-clicking on folders, and will analyse all files found in the selected folder.&lt;/li&gt;
&lt;li&gt;Cygwin toolchain support on windows&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Michael Man Ho Mak RIP.</title>
		<link href="http://www.mega-nerd.com/erikd/Blog/michael_mak.html"/>
		<id>http://www.mega-nerd.com/erikd/Blog/2011/10/09/michael_mak.atom</id>
		<updated>2011-10-09T01:07:00+00:00</updated>
		<content type="html">&lt;center&gt;
        &lt;img src=&quot;http://www.mega-nerd.com/erikd/Img/michael_mak.jpg&quot; border=&quot;0&quot; alt=&quot;Michael Mak&quot; /&gt;
&lt;/center&gt;

&lt;br /&gt;
&lt;p&gt;
On the same day that the computing world lost Steve Jobs, the company I work
for lost its own star, founder and CEO of bCODE, Michael Mak.
&lt;/p&gt;

&lt;p&gt;
I remember meeting Michael in late 2005 when I first came to interview for a job
with bCODE.
Michael impressed me immediately with his keen intelligence and his easy going
personality.
As I worked with him over the years, my respect grew.
I came to trust him and the rest of the management team far more than I had
ever trusted any other employer.
I always felt that Michael saw the employees as an important part of the company
and he wouldn't do anything to further the company at the expense of the
employees.
This was even true when he had to retrench a third of the workforce after the
global financial crisis of 2008.
I saw first hand how much distress this caused him and our COO.
&lt;/p&gt;

&lt;p&gt;
When Michael moved the business side of the enterprise to the US, he would still
make regular trips back to visit the Sydney office.
During these visits three or four of us would go out to lunch and he would
regale us with tales of people he met and deals that he was working on.
These were exciting times and Michael was a great motivator.
&lt;/p&gt;

&lt;p&gt;
The things I will remember about Michael was his enthusiasm, his integrity, his
leadership and just being a great all round guy.
&lt;/p&gt;

&lt;p&gt;
My condolences to his family and his girlfriend Emily.
No one will miss Michael as much as them.
&lt;/p&gt;

&lt;p&gt;
Michael was 37 years old.
&lt;/p&gt;</content>
		<author>
			<name>Erik de Castro Lopo</name>
			<email>erikd@mega-nerd.com</email>
			<uri>http://www.mega-nerd.com/erikd/Blog</uri>
		</author>
		<source>
			<title type="html">m3ga blog</title>
			<subtitle type="html">An ocassional rant</subtitle>
			<link rel="self" href="http://www.mega-nerd.com/erikd/Blog/index.atom"/>
			<id>http://www.mega-nerd.com/erikd/Blog/index.atom</id>
			<updated>2012-01-29T09:30:23+00:00</updated>
			<rights type="html">Copyright 2006-2010 Erik de Castro Lopo</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Video and slides of &quot;Data Parallelism in Haskell&quot; @ Brisbane FP Group</title>
		<link href="http://justtesting.org/video-and-slides-of-data-parallelism-in-haske"/>
		<id>http://justtesting.org/video-and-slides-of-data-parallelism-in-haske</id>
		<updated>2011-09-03T12:49:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;div&gt;&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;The&amp;nbsp;&lt;a href=&quot;http://www.bfpg.org/&quot;&gt;Brisbane FP Group (BFPG)&lt;/a&gt;&amp;nbsp;kindly invited me to give a talk about our work on data parallel programming in Haskell. The talk motivates the use of functional programming for parallel, and in particular, data parallel programming and explains the difference between regular and irregular (or nested) data parallelism. It also discusses the&amp;nbsp;&lt;a href=&quot;http://hackage.haskell.org/package/repa&quot;&gt;Repa&lt;/a&gt;&amp;nbsp;library (regular data parallelism for multicore CPUs), the embedded language&amp;nbsp;&lt;a href=&quot;https://github.com/mchakravarty/accelerate&quot;&gt;Accelerate&lt;/a&gt;&amp;nbsp;(regular data parallelism for GPUs), and Data Parallel Haskell (nested data parallelism for multicore CPUs).&amp;nbsp; The slides of the presentation are available in two formats:&amp;nbsp;&lt;a href=&quot;http://public.iwork.com/document/?d=dp-in-haskell_BFPG_Sep_2011.key&amp;a=p179149432&quot;&gt;HTML5 slideshow&lt;/a&gt;&amp;nbsp;and&amp;nbsp;&lt;a href=&quot;http://www.cse.unsw.edu.au/~chak/papers/dp-in-haskell.pdf&quot;&gt;PDF&lt;/a&gt;. Thank you to everybody who attended. Special thanks go to OJ Reeves and Tony Morris for organising everything, to Rob Manthey for producing the video, to Mincom for the venue, and to&amp;nbsp;&lt;a href=&quot;http://functional.io/&quot;&gt;Functional IO&lt;/a&gt;&amp;nbsp;for the sponsorship.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/video-and-slides-of-data-parallelism-in-haske&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/video-and-slides-of-data-parallelism-in-haske#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Goanna 2.5 released</title>
		<link href="http://redlizards.com/blog/uncategorized/goanna-25-released/"/>
		<id>http://redlizards.com/blog/?p=685</id>
		<updated>2011-08-17T02:00:12+00:00</updated>
		<content type="html">&lt;p&gt;Goanna 2.5 is now available from the download page.  Here&amp;#8217;s a summary of what&amp;#8217;s changed in this release.&lt;/p&gt;
&lt;p&gt;- All versions&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; stored filenames are now specified as relative paths, allowing the Goanna database to be used in multiple locations &lt;/li&gt;
&lt;li&gt; better support for Unicode source code&lt;/li&gt;
&lt;li&gt; the ARR-inv-index check now allows for unbounded subscripts &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &amp;#8211; Goanna Central&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; license server options can be specified on the command line&lt;/li&gt;
&lt;li&gt; the language choice, C or C++, can be given on the command line&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt; &amp;#8211; Visual Studio&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; clicking on a warning in a project summary navigates to the relevant code&lt;/li&gt;
&lt;li&gt; better support for Win64 targets&lt;/li&gt;
&lt;li&gt; partial compatibility with Intel Parallel Studio (on VS2005 and VS2008, Goanna does not work with projects converted to use the Intel C++ compiler)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As usual, feedback is welcome.&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Horms Solutions is Hiring</title>
		<link href="http://horms.org/pleb_blossom/permalink/2011/2011-08-15T16_41_34.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2011/2011-08-15T16_41_34.shtml</id>
		<updated>2011-08-15T07:41:34+00:00</updated>
		<content type="html">I am looking for an intern to work on a project with me
				as a Linux Kernel Developer focused on networking.
				For details please see
				&lt;a href=&quot;http://horms.net/employment/&quot;&gt;horms.net/employment/&lt;/a&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Meet Goanna at the Symposium of Cyber Terrorism</title>
		<link href="http://redlizards.com/blog/uncategorized/meet-goanna-at-the-symposium-of-cyber-terrorism/"/>
		<id>http://redlizards.com/blog/?p=681</id>
		<updated>2011-07-26T05:28:25+00:00</updated>
		<content type="html">&lt;p&gt;Do you want to know more about software security? Learn about cyber defense? Meet some of the team behind the Goanna technology from NCITA at DSR 2011 in Singapore, August 3-5. We will be giving an overview of at the &lt;a title=&quot;cyber security&quot; href=&quot;http://www.dsr2011.org/index.php?option=com_content&amp;view=article&amp;id=150&amp;Itemid=270&quot;&gt;Symposium on Cyber Terrorism&lt;/a&gt; titled &amp;#8220;Cyber Security at Software Development Time&amp;#8221; and highlighting some of our experiences from the NIST/SAMATE program.&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Ranking and Scoring Vulnerabilities</title>
		<link href="http://redlizards.com/blog/better-software/ranking-and-scoring-vulnerabilities/"/>
		<id>http://redlizards.com/blog/?p=667</id>
		<updated>2011-06-29T23:58:26+00:00</updated>
		<content type="html">&lt;p&gt;Recently, MITRE introduced the &lt;a title=&quot;CWSS&quot; href=&quot;http://cwe.mitre.org/cwss/index.html&quot; target=&quot;_blank&quot;&gt;Common Weakness Scoring System&lt;/a&gt; (CWSS) for classifying and ranking common vulnerabilities. This systems has around 18 dimensions comprising technical severity, business impact, authentication/security barriers and overall probability mentioning just a few. While this is certainly a detailed scoring system it raises the common question: &amp;#8220;Which of the detected issues should I fix first?&amp;#8221;.&lt;/p&gt;
&lt;p&gt;This is not an easy question to answer for any (automated) tool. While certain classes of bugs such as buffer overflows are likely more severe than, let&amp;#8217;s say, unused function parameters it is not guaranteed that they have a larger impact. Sometimes a buffer overflow might only happen in a very unlikely scenario in some abandoned part of the code base, while the unused function parameter stems from a copy&amp;amp;paste mistake within the function leading to an always wrong and potentially dangerous result.  Similarly, it is difficult for any tool to tell, which parts of the code base are more important than others.&lt;/p&gt;
&lt;p&gt;Having said that, we developed Goanna Studio and Goanna Central with openness in mind. This means all our detected issues can be easily exported and post-processed by the end user (you can even query our internal SQLite database if you really want to), filtered according to their needs and  ranked according to your system. Moreover, we provide a mapping of all issues to the common CWE criteria and we give you the following classification:&lt;/p&gt;
&lt;div id=&quot;attachment_668&quot; class=&quot;wp-caption aligncenter&quot;&gt;&lt;img class=&quot;size-full wp-image-668&quot; title=&quot;Bug Priorities&quot; src=&quot;http://redlizards.com/blog/wp-content/uploads/2011/06/bug-priorities.png&quot; alt=&quot;Goanna's Impact Guidance&quot; width=&quot;174&quot; height=&quot;183&quot; /&gt;&lt;p class=&quot;wp-caption-text&quot;&gt;Goanna's Impact Guidance&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;This 2-dimensional  classification is used for all issues detected by Goanna (see &lt;a title=&quot;Goanna User Manual&quot; href=&quot;http://redlizards.com/support&quot; target=&quot;_self&quot;&gt;user manuals&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Severity&lt;/strong&gt;: How serious is this issue &lt;em&gt;typically&lt;/em&gt;?&lt;br /&gt;
&lt;strong&gt;Certainty&lt;/strong&gt;: How confident are we that this will &lt;em&gt;likely&lt;/em&gt; happen?&lt;/p&gt;
&lt;p&gt;Both dimensions are based on our experience from having analyzed literally hundreds of millions of lines of code. Severity is ranked similarly to the above example, where a buffer overflow is deemed to be serious. Certainty on the other hand addresses a number of sub-dimensions: How likely is this from our experience to happen in real-life? How certain is Goanna, i.e., does the analysis conclude the issue will appear on every program part or just on a few? How sensitive is the issue to input data etc.? The combined dimensions should give you a good idea where to spend your time first. And while we are looking into integrating a CWSS ranking, we believe that less is sometimes more.&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Goanna Studio and Goanna Central 2.4</title>
		<link href="http://redlizards.com/blog/release/goanna-studio-and-goanna-central-24/"/>
		<id>http://redlizards.com/blog/?p=638</id>
		<updated>2011-06-15T06:54:14+00:00</updated>
		<content type="html">&lt;p&gt;In the latest round of development we aimed for the most rock solid and sane implementation of C/C++ static analysis that we could. We did this by working on three fronts: consistency, speed and features.&lt;/p&gt;
&lt;p&gt;As usual, all current users get the upgrade for free. If you were a trial user in the past and need a trial extension visit: &lt;a href=&quot;http://redlizards.com/trial-extension&quot;&gt;http://redlizards.com/trial-extension&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Whats new in 2.4?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;General improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We revamped the integer arithmetic interval analysis engine with a new algorithm which affords us increased speed and precision. So much speed that we have also added the ability to track pointer arithmetic as mentioned in the &lt;a href=&quot;http://redlizards.com/blog/development/bounds-checking-for-aliased-arrays/&quot;&gt;previous blog post&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Our interval analysis engine can handle new operations: Casts, Logical operators and shift operators.&lt;/li&gt;
&lt;li&gt;We have enabled floating licenses in our Studio and Central products; please contact us if you are interested.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Goanna Central improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The argument &amp;#8211;parse-error=0 is now a default, this will cause Goanna to exit with an exit code of 0 when a parse error is encountered. We have also revamped the way parse errors are handled.&lt;/li&gt;
&lt;li&gt;The interprocedural analysis in the Goanna Central command line is now even simpler to use and  manage by conveniently specifying a user-defined folder with the  argument &amp;#8211;ipa=&amp;lt;project name&amp;gt;.  All new database files are then stored in ~/.goanna_project_store/&amp;lt;project name&amp;gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Goanna Studio improvements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Eclipse there is now an option to not run the tool chain compiler during analysis.&lt;/li&gt;
&lt;li&gt;In Eclipse there is a new menu item to jump to the currently selected projects Goanna Studio Properties page.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Renamed checks for consistency:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ATH-div-0-aft-assign -&amp;gt; ATH-div-0-assign&lt;/li&gt;
&lt;li&gt;ATH-div-0-aft-cmp -&amp;gt; ATH-div-0-cmp-aft&lt;/li&gt;
&lt;li&gt;ATH-div-0-bef-cmp -&amp;gt; ATH-div-0-cmp-bef&lt;/li&gt;
&lt;li&gt;ATH-div-0-param-unchk -&amp;gt; ATH-div-0-unchk-param&lt;/li&gt;
&lt;li&gt;PTR-param-unchk -&amp;gt; PTR-unchk-param&lt;/li&gt;
&lt;li&gt; PTR-param-unchk-some -&amp;gt; PTR-unchk-param-some&lt;/li&gt;
&lt;li&gt; RED-const-assign-cond -&amp;gt; RED-cond-const-assign&lt;/li&gt;
&lt;li&gt; RED-const-expr-cond -&amp;gt; RED-cond-const-expr&lt;/li&gt;
&lt;li&gt; SPC-ret-stack -&amp;gt; MEM-stack&lt;/li&gt;
&lt;li&gt; builtin_ctor_dtor_leak -&amp;gt; COP-ctor-dtor-leak&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;New checks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; ARR-inv-index-ptr &amp;#8211; A pointer is assigned to an array, static or dynamic, and it is accessed with an index that is out of the array&amp;#8217;s bounds.&lt;/li&gt;
&lt;li&gt; ARR-inv-index-ptr-pos &amp;#8211; A pointer is assigned to an array, static or dynamic, and it is accessed with an index that may be out of the array&amp;#8217;s bounds.&lt;/li&gt;
&lt;li&gt; ATH-overflow-cast &amp;#8211; An expression is cast to a different type, resulting in an overflow or underflow of its value.&lt;/li&gt;
&lt;li&gt; ATH-shift-neg &amp;#8211; The left-hand side of a right shift operation may be a negative value.&lt;/li&gt;
&lt;li&gt; COP-dtor-throw &amp;#8211; An exception is thrown, or may be thrown, in a class&amp;#8217; destructor.&lt;/li&gt;
&lt;li&gt; CPU-delete-throw &amp;#8211; An exception is thrown, or may be thrown, in an overloaded delete or delete[] operator.&lt;/li&gt;
&lt;li&gt; FPT-arith-address &amp;#8211; Performing pointer arithmetic on the address of a function.&lt;/li&gt;
&lt;li&gt; FPT-literal &amp;#8211; Dereferencing a function pointer that refers to a literal address.&lt;/li&gt;
&lt;li&gt; FPT-misuse &amp;#8211; A function pointer is used in an invalid context.&lt;/li&gt;
&lt;li&gt; ITR-end-cmp-aft &amp;#8211; An iterator is used, then compared with end().&lt;/li&gt;
&lt;li&gt; ITR-invalidated &amp;#8211; An iterator is assigned to point into a container, but subsequent modifications to that container have possibly invalidated the iterator. The iterator is then used or dereferenced, which may be undefined behavior.&lt;/li&gt;
&lt;li&gt; ITR-mismatch-alg &amp;#8211; A pair of iterators passed to an STL algorithm function point to different containers.&lt;/li&gt;
&lt;li&gt; ITR-store &amp;#8211; A container&amp;#8217;s begin() or end() iterator is stored and subsequently used.&lt;/li&gt;
&lt;li&gt; MEM-malloc-diff-type &amp;#8211; A call to malloc tries to allocate memory based on a sizeof operator, but the target type of the call is of a different type.&lt;/li&gt;
&lt;li&gt; MEM-stack-ref &amp;#8211; A stack object is returned from a function as a reference.&lt;/li&gt;
&lt;li&gt; PTR-arith-field &amp;#8211; Direct access to a field of a struct using an offset from the address of the struct.&lt;/li&gt;
&lt;li&gt; PTR-arith-var &amp;#8211; Invalid pointer arithmetic with an automatic variable that is neither an array nor a pointer.&lt;/li&gt;
&lt;li&gt; RED-cond-var-always &amp;#8211; The value of the variable used as a condition will always evaluate to non-zero or true. This means the condition will always be met.&lt;/li&gt;
&lt;li&gt; RED-cond-var-never &amp;#8211; The value of the variable used as a condition will always evaluate to zero or false. This means the condition will never be met.&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">An Introduction to Open vSwitch</title>
		<link href="http://horms.org/pleb_blossom/permalink/2011/2011-06-03T11_17_23.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2011/2011-06-03T11_17_23.shtml</id>
		<updated>2011-06-03T02:17:23+00:00</updated>
		<content type="html">&lt;img src=&quot;http://www.horms.org/pleb_blossom/pics/5-8356.jpg&quot; height=&quot;76&quot; width=&quot;115&quot; /&gt;
				Yesterday afternoon I made a presentation
				introducing Open vSwitch at Linux Con Japan.
				This is an update on the presentation of the same title that
				I made at the Netfilter Workshop 2011.
				&lt;p&gt;
				&lt;a href=&quot;http://horms.net/projects/openvswitch/&quot;&gt;slides&lt;/a&gt;
				&lt;br clear=&quot;right&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Bounds checking for aliased arrays</title>
		<link href="http://redlizards.com/blog/development/bounds-checking-for-aliased-arrays/"/>
		<id>http://redlizards.com/blog/?p=629</id>
		<updated>2011-06-01T02:44:36+00:00</updated>
		<content type="html">&lt;p&gt;Over the last few months we&amp;#8217;ve been hard at work expanding our interval analysis and writing new checks for array bounds checking. I am happy to announce that we can now detect out-of-bounds array accesses for pointers to arrays, both automatic and dynamic. We also now fully handle pointers that offset arrays, allowing us to track their values and detect some extremely hard-to-find bugs.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-629&quot;&gt;&lt;/span&gt;For example:&lt;/p&gt;
&lt;pre&gt;int arr[15];

int example(int random){
  int *p = arr;
  p += 3;

  int offset = (random &amp;gt; 10 ? random : 10);
  return p[offset + 4];    //'p' points to 4th element, and index will be at least 14.
}&lt;/pre&gt;
&lt;p&gt;In this code sample, the pointer &amp;#8216;p&amp;#8217; is used to alias the global, automatic array of ints, &amp;#8216;arr&amp;#8217;. This pointer is then increased by 3, making it point to the 4th element of the array.  An int, &amp;#8216;offset&amp;#8217; , is set to be some unknown value, but we know it is at least 10. Finally, the pointer is accessed with index (offset + 4). Since the pointer already refers to the 4th element, and we are trying to access an at least 14 elements further along, Goanna will give the following warning:&lt;/p&gt;
&lt;pre&gt;&lt;strong&gt;8: warning: Goanna[ARR-inv-index-ptr] Array pointer `arr' is accessed with index [17,INF]
which is out of array bounds [0,14]&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;Similarly, we can perform the same analysis on dynamic arrays allocated with new or malloc. We also handle different syntactic forms of array access. The following example illustrates this, as well as our ability to warn for possible, as opposed to definite index violations, from a range of possible index values that may be out of bounds:&lt;/p&gt;
&lt;pre&gt;#include &amp;lt;malloc.h&amp;gt;
#include &amp;lt;assert.h&amp;gt;

int example2(int random){
  int *p = malloc(5 * sizeof(int));  //p is an array of size
  int offset = (random ? 7 : 3);
  return *(p + offset);    //'offset' will be either 7 or 3.
}&lt;/pre&gt;
&lt;p&gt;Here, &amp;#8216;p&amp;#8217; points to a dynamic array of ints, with 5 elements. The &amp;#8216;offset&amp;#8217; is set to be either 7 or 3. Accessing the index of value &amp;#8216;offset&amp;#8217;, by explicitly dereferencing the pointer, we know that the index may be within the bounds of the array, but it may be too large. Goanna will issue the following warning:&lt;/p&gt;
&lt;pre&gt;&lt;strong&gt;7: warning: Goanna[ARR-inv-index-ptr-pos] Array pointer `p' is accessed with index [3,7]
which may be out of array bounds [0,4]&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;Both these checks, along with some others we&amp;#8217;ve been working on, will appear in the upcoming 2.4 release.&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">SH-Mobile ARM zboot presentation</title>
		<link href="http://horms.org/pleb_blossom/permalink/2011/2011-05-20T14_58_27.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2011/2011-05-20T14_58_27.shtml</id>
		<updated>2011-05-20T05:58:27+00:00</updated>
		<content type="html">&lt;img src=&quot;http://www.horms.org/pleb_blossom/pics/4-8216.jpg&quot; width=&quot;76&quot; height=&quot;115&quot; alt=&quot;Hikari&quot; align=&quot;left&quot; /&gt;
				This afternoon I made a short presentation
				at Japan Technical Jamboree 37
				the work that I have been doing to allow
				booting Linux directly on the SH-Mobile ARM platform.
				This is an update on the presentation on the same topic
				in January at MobileFOSS Miniconf, part of linux.conf.au Brisbane 2011.
				&lt;p&gt;
				&lt;a href=&quot;http://horms.net/projects/zboot/&quot;&gt;slides, etc...&lt;/a&gt;
				&lt;br clear=&quot;left&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Data.Array.Accelerate now on GitHub</title>
		<link href="http://justtesting.org/dataarrayaccelerate-now-on-github"/>
		<id>http://justtesting.org/dataarrayaccelerate-now-on-github</id>
		<updated>2011-04-17T11:24:25+00:00</updated>
		<content type="html">&lt;p&gt;
	Prompted by GHC's move to Git and the unreliability of the &lt;a href=&quot;http://community.haskell.org&quot;&gt;community.haskell.org&lt;/a&gt; infrastructure, I decided to move&amp;nbsp;&lt;a href=&quot;http://www.cse.unsw.edu.au/~chak/project/accelerate/&quot;&gt;Data.Array.Accelerate&lt;/a&gt;&amp;nbsp;to GitHub:&amp;nbsp;&lt;a href=&quot;https://github.com/mchakravarty/accelerate&quot;&gt;mchakravarty/accelerate&lt;/a&gt;. The GitHub repository is now the main public repository for the project. I will also move the tickets of the old Trac bug tracker over to GitHub Issues.
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/dataarrayaccelerate-now-on-github&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/dataarrayaccelerate-now-on-github#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Goanna Studio for Eclipse and Goanna Central 2.3.1 – Linux 64-bit patch</title>
		<link href="http://redlizards.com/blog/release/goanna-studio-for-eclipse-and-goanna-central-231-linux-patch/"/>
		<id>http://redlizards.com/blog/?p=619</id>
		<updated>2011-04-06T04:46:56+00:00</updated>
		<content type="html">&lt;p&gt;Some of our users may have experienced a bug when using Goanna Studio for Eclipse or Goanna Central 2.3 on linux 64-bit systems.  This error looked something like this:&lt;/p&gt;
&lt;pre&gt;
internal error: assertion failed: conv_host_fp_to_double:
error on conversion of DBL_MAX: Numerical result out of range:
((double)1.7...e+308L) (float_pt.c, line 524)
&lt;/pre&gt;
&lt;p&gt;This bug was caused by us upgrading our release build infrastructure that defined DBL_MAX to a value that contained a cast, and our parser was not able to deal with this.  We are releasing a patch that will correct this issue.  Please download version 2.3.1 if you are using goanna on a 64-bit linux system.  Windows and 32-bit linux systems are not affected.&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Goanna Studio and Goanna Central 2.3</title>
		<link href="http://redlizards.com/blog/release/goanna-studio-and-goanna-central-23/"/>
		<id>http://redlizards.com/blog/?p=610</id>
		<updated>2011-04-06T03:59:05+00:00</updated>
		<content type="html">&lt;p&gt;For the past several months we have received a lot of great feedback and support requests which have helped us dramatically improve the stability of our products Goanna Studio and Central.  And yesterday we pushed a new version to our website which bear the fruits of our labor.  At the same time we are releasing a bunch of new features that we hope will help people understand what Goanna is doing and make people more effective at using Goanna.&lt;/p&gt;
&lt;p&gt;As usual, all current users get the upgrade for free. If you were a trial user in the past and need a trial extension visit: &lt;a href=&quot;http://redlizards.com/trial-extension&quot;&gt;http://redlizards.com/trial-extension&lt;br /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is new in 2.3?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;New Checks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; ATH-div-0-param-unchk: Dividing by a parameter value without first checking that it is not zero&lt;/li&gt;
&lt;li&gt; MEM-stack-global-field: storing the address of a field of a local struct in a global variable&lt;/li&gt;
&lt;li&gt; ITR-uninit: using (dereferencing or incrementing) an iterator that hasn&amp;#8217;t been initialized&lt;/li&gt;
&lt;li&gt; ITR-end-cmp-bef: using an iterator after it has been compared with end().  This can occur when using an iterator after it is used in a loop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;New Goanna Studio features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; access check descriptions and examples through the IDE&lt;/li&gt;
&lt;li&gt;added ability to manage warnings by suppressing/unsuppressing&lt;/li&gt;
&lt;li&gt; added ability to pass specific options to the Goanna command line that is used during analysis.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Goanna Studio for Eclipse:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; New ability to right-click on a file/project and run the Goanna analysis over just that item&lt;/li&gt;
&lt;li&gt;Project specific settings have been moved to the Properties of the project (out of the Goanna Preferences)&lt;/li&gt;
&lt;li&gt; Right-click menu now includes a link to the Goanna summary page for projects&lt;/li&gt;
&lt;li&gt; If you close the Goanna Warning view it can be reopened from the Goanna menu&lt;/li&gt;
&lt;li&gt;Improved stability of the Goanna warnings pane (with regards to close/open of Eclipse)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Goanna Studio for Visual Studio:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;redesign of menu structure, Goanna is now a top-level menu&lt;/li&gt;
&lt;li&gt;auto updating: no more uninstall-install updating.&lt;br /&gt;
Note: you cannot do this from version 2.2 -&amp;gt; 2.3.  It will work from now on.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;General:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt; Improved handling of floating point numbers in the data tracking analysis&lt;/li&gt;
&lt;li&gt;Warning suppression captured in the database structure&lt;/li&gt;
&lt;li&gt;Several bug fixes including handling of very large ASTs.&lt;/li&gt;
&lt;/ul&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Immutability and Blocks, Lambdas and Closures [UPDATE x2]</title>
		<link href="http://algorithm.com.au/blog/files/immutability-blocks-lambdas-closures.php#unique-entry-id-613"/>
		<id>http://algorithm.com.au/blog/files/immutability-blocks-lambdas-closures.php#unique-entry-id-613</id>
		<updated>2011-04-05T05:55:35+00:00</updated>
		<content type="html">&lt;p&gt;I recently ran into some &amp;#8220;interesting&amp;#8221; behaviour when using &lt;code&gt;lambda&lt;/code&gt; in Python.  Perhaps it&amp;#8217;s only interesting because I learnt lambdas from a functional language background, where I expect that they work a particular way, and the rest of the world that learnt lambdas through Python, Ruby or JavaScript disagree.  (Shouts out to you Objective-C developers who are discovering the wonders of blocks, too.)  Nevertheless, I thought this would be blog-worthy.  Here&amp;#8217;s some Python code that shows the behaviour that I found on &lt;a href=&quot;http://stackoverflow.com/q/938429&quot;&gt;Stack Overflow&lt;/a&gt;:&lt;/p&gt;



&lt;p&gt;Since I succumb to reading source code in blog posts by interpreting them as &amp;#8220;blah&amp;#8221;&lt;sup class=&quot;footnote&quot;&gt;&lt;a href=&quot;http://algorithm.com.au/blog/files/rss.xml#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;, a high-level overview of what that code does is:&lt;/p&gt;


&lt;ol&gt;
&lt;li&gt;iterate over a list of strings,&lt;/li&gt;
&lt;li&gt;create a new list of functions that prints out the strings, and then&lt;/li&gt;
&lt;li&gt;call those functions, which prints the strings.&lt;/li&gt;
&lt;/ol&gt;



&lt;p&gt;Simple, eh?  Prints &amp;#8220;do&amp;#8221;, then &amp;#8220;re&amp;#8221;, then &amp;#8220;mi&amp;#8221;, eh?  Wrong.  It prints out &amp;#8220;mi&amp;#8221;, then &amp;#8220;mi&amp;#8221;, then &amp;#8220;mi&amp;#8221;.  Ka-what?&lt;/p&gt;

&lt;p&gt;(I&amp;#8217;d like to stress that this isn&amp;#8217;t a theoretical example.  I hit this problem in production code, and boy, it was lots of fun to debug.  I hit the &lt;a href=&quot;http://stackoverflow.com/questions/938429/scope-of-python-lambda-functions-and-their-parameters&quot;&gt;solution&lt;/a&gt; right away thanks to the wonders of Google and Stack Overflow, but it took me a long time to figure out that something was going wrong at that particular point in the code, and not somewhere else in my logic.)&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://stackoverflow.com/questions/938429/scope-of-python-lambda-functions-and-their-parameters/938493#938493&quot;&gt;second answer&lt;/a&gt; to the Stack Overflow question is the clearest exposition of the problem, with a rather clever solution too.  I won&amp;#8217;t repeat it here since you all know how to follow links.  However, while that answer explains the problem, there&amp;#8217;s a deeper issue.  The &lt;a href=&quot;http://www.imdb.com/title/tt0093779/quotes?qt=qt0482717&quot;&gt;inconceivable&lt;/a&gt; &lt;a href=&quot;http://twitter.com/tacticalgrace&quot;&gt;Manuel Chakravarty&lt;/a&gt; provides a far more insightful answer when I emailed him to express my surprise at Python&amp;#8217;s lambda semantics:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This is a very awkward semantics for lambdas.  It is also probably almost impossible to have a reasonable semantics for lambdas in a language, such as Python.&lt;/p&gt;

&lt;p&gt;The behaviour that the person on &lt;span class=&quot;caps&quot;&gt;SO, &lt;/span&gt;and I guess you, found surprising is that the contents of the free variables of the lambdas body could change between the point in time where the closure for the lambda was created and when that closure was finally executed.  The obvious solution is to put a copy of the value of the variable (instead of a pointer to the original variable) into the closure.&lt;/p&gt;

&lt;p&gt;But how about a lambda where a free variable refers to a 100MB object graph?  Do you want that to be deep copied by default?  If not, you can get the same problem again.&lt;/p&gt;

&lt;p&gt;So, the real issue here is the interaction between mutable storage and closures.  Sometimes you want the free variables to be copied (so you get their value at closure creation time) and sometimes you don&amp;#8217;t want them copied (so you get their value at closure execution time or simply because the value is big and you don&amp;#8217;t want to copy it).  &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;And, indeed, since I love being categorised as a massive Apple fanboy, I found the same surprising behaviour with Apple&amp;#8217;s blocks semantics in C, too:&lt;/p&gt;



&lt;p&gt;You can see the &lt;a href=&quot;https://gist.github.com/899755&quot;&gt;Gist page for this sample code&lt;/a&gt; to see how to work around the problem in Objective-C (basically: copy the block), and also to see what it&amp;#8217;d look like in Haskell (with the correct behaviour).&lt;/p&gt;

&lt;p&gt;In Python, the Stack Overflow solution that I linked to has an extremely concise way of giving the programmer the option to either copy the value or simply maintain a reference to it, and the syntax is  clear enough&amp;#8212;once you understand what on Earth what the problem is, that is.  I don&amp;#8217;t understand Ruby or JavaScript well enough to comment on how they&amp;#8217;d capture the immediate value for lambdas or whether they considered this design problem.  C++0x will, unsurprisingly, give programmers full control over lambda behaviour that will no doubt confuse the hell out of people.  (See the &lt;a href=&quot;http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf&quot;&gt;C++0x language draft&lt;/a&gt;, section 5.1.2 on page 91.)&lt;/p&gt;

&lt;p&gt;In his usual incredibly didactic manner, Manuel then went on to explain something else insightful:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;I believe there is a deeper issue here.  Copying features of FP languages is the hip thing in language design these days.  That&amp;#8217;s fine, but many of the high-powered FP language features derive their convenience from being unspecific, or at least unconventional, about the execution time of a piece of code.  Lambdas delay code execution, laziness provides demand-dependent code execution plus memoisation, continuations capture closures including their environment (ie, the stack), etc.  Another instance of that problem was highlighted by Joe Duffy in his &lt;a href=&quot;http://www.bluebytesoftware.com/blog/2010/01/03/ABriefRetrospectiveOnTransactionalMemory.aspx&quot;&gt;&lt;span class=&quot;caps&quot;&gt;STM &lt;/span&gt;retrospective&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I would say, mutability and flexible control flow are fundamentally at odds in language design.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Indeed, I&amp;#8217;ve been doing some language exploration again lately as the lack of static typing in Python is really beginning to bug me, and almost all the modern languages that attempt to pull functional programming concepts into object-oriented land seem like a complete Frankenstein, partially due to mutability.  Language designers, please, this is 2011: multicore computing is the norm now, whether we like it or not.  If you&amp;#8217;re going to make an imperative language&amp;#8212;and that includes all your OO languages&amp;#8212;I&amp;#8217;ll paraphrase &lt;a href=&quot;http://lambda-the-ultimate.org/node/1277&quot;&gt;Tim Sweeney&lt;/a&gt;: in a concurrent world, mutable is the wrong default!  I&amp;#8217;d love a C++ or Objective-C where all variables are &lt;code&gt;const&lt;/code&gt; by default.&lt;/p&gt;

&lt;p&gt;One take-away point from all this is to try to keep your language semantics simple.  I love Dan Ingall&amp;#8217;s quote from &lt;a href=&quot;http://www.cs.virginia.edu/~evans/cs655/readings/smalltalk.html&quot;&gt;Design Principles Behind Smalltalk&lt;/a&gt;: &amp;#8220;if a system is to serve the creative spirit, it must be entirely comprehensible to a single individual&amp;#8221;.  I love Objective-C partially because its message-passing semantics are straightforward, and its runtime has a amazingly compact &lt;span class=&quot;caps&quot;&gt;API &lt;/span&gt;and implementation considering how powerful it is.  I&amp;#8217;ve been using Python for a while now, and I still don&amp;#8217;t really know the truly nitty-gritty details about subtle object behaviours (e.g. class variables, multiple inheritance).  And I mostly agree with Guido&amp;#8217;s assertion that &lt;a href=&quot;http://www.artima.com/weblogs/viewpost.jsp?thread=98196&quot;&gt;Python should not have included lambda nor reduce&lt;/a&gt;, given what Python&amp;#8217;s goals are.  After discovering this quirk about them, I&amp;#8217;m still using the lambda in production code because the code savings does justify the complexity, but you bet your ass there&amp;#8217;s a big comment there saying &amp;#8220;warning, pretentous code trickery be here!&amp;#8221;&lt;/p&gt;

&lt;p&gt;1. See point 13 of Knuth et al.&amp;#8217;s &lt;a href=&quot;http://tex.loria.fr/typographie/mathwriting.pdf&quot;&gt;Mathematical Writing&lt;/a&gt; report.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;UPDATE&lt;/span&gt;&lt;/strong&gt;: There&amp;#8217;s a lot more subtlety at play here than I first realised, and a couple of statements I&amp;#8217;ve made above are incorrect.  Please see the comments if you want to really figure out what&amp;#8217;s going on: I&amp;#8217;d summarise the issues, but the interaction between various language semantics are extremely subtle and I fear I&amp;#8217;d simply get it wrong again.  Thank you to all the commenters for both correcting me and adding a lot of value to this post.  (I like this Internet thing!  Other people do my work for me!)&lt;/p&gt;

&lt;h2&gt;Update #2&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;ve been overwhelmed by the comments, in both the workload sense and in the pleasantly-surprised-that-this-provoked-some-discussion sense.  Boy, did I get skooled in a couple of areas.  I&amp;#8217;ve had a couple of requests to try to summarise the issues here, so I&amp;#8217;ll do my best to do so.&lt;/p&gt;

&lt;h3&gt;Retrospective: Python&lt;/h3&gt;

&lt;p&gt;It&amp;#8217;s clear that my misunderstanding of Python&amp;#8217;s scoping/namespace rules is the underlying cause of the problem: in Python, variables declared in &lt;code&gt;for&lt;/code&gt;/&lt;code&gt;while&lt;/code&gt;/&lt;code&gt;if&lt;/code&gt; statements will be declared in the compound block&amp;#8217;s existing scope, and not create a new scope.  So in my example above, using a &lt;code&gt;lambda&lt;/code&gt; inside the for loop creates a closure that references the variable &lt;code&gt;m&lt;/code&gt;, but &lt;code&gt;m&lt;/code&gt;&amp;#8217;s value has changed by the end of the for loop to &amp;#8220;mi&amp;#8221;, which is why it prints &amp;#8220;mi, mi, mi&amp;#8221;.  I&amp;#8217;d prefer to link to the official Python documentation about this here rather than writing my own words that may be incorrect, but I can&amp;#8217;t actually find anything in the official documentation that authoritatively defines this.  I can find a lot of blog posts warning about it&amp;#8212;just Google for &amp;#8220;&lt;a href=&quot;http://www.google.com/search?q=python+for+while+if+scoping&quot;&gt;Python for while if scoping&lt;/a&gt;&amp;#8221; to see a few&amp;#8212;and I&amp;#8217;ve perused the entire chapter on &lt;a href=&quot;http://docs.python.org/reference/compound_stmts.html&quot;&gt;Python&amp;#8217;s compound statements&lt;/a&gt;, but I just can&amp;#8217;t find it.  Please let me know in the comments if you do find a link, in which case I&amp;#8217;ll retract half this paragraph and stand corrected, and also a little shorter.&lt;/p&gt;

&lt;p&gt;I stand by my assertion that Python&amp;#8217;s &lt;code&gt;for&lt;/code&gt;/&lt;code&gt;while&lt;/code&gt;/&lt;code&gt;if&lt;/code&gt; scoping is slightly surprising, and for some particular scenarios&amp;#8212;like this&amp;#8212;it can cause some problems that are very difficult to debug.  You may call me a dumbass for bringing assumptions about one language to another, and I will accept my dumbassery award.  I will happily admit that this semantics has advantages, such as being able to access the last value assigned in a &lt;code&gt;for&lt;/code&gt; loop, or not requiring definitions of variables before executing an &lt;code&gt;if&lt;/code&gt; statement that assigns to those variables and using it later in the same scope.  All language design decisions have advantages and disadvantages, and I respect Python&amp;#8217;s choice here.  However, I&amp;#8217;ve been using Python for a few years, consider myself to be at least a somewhat competent programmer, and only just found out about this behaviour.  I&amp;#8217;m surprised 90% of my code actually works as intended given these semantics.  In my defence, this behaviour was not mentioned at all in the excellent Python tutorials, and, as mentioned above, I can&amp;#8217;t a reference for it in the official Python documentation.  I&amp;#8217;d expect that this behaviour is enough of a difference vs other languages to at least be mentioned.  You may disagree with me and regard this as a minor issue that only shows up when you do crazy foo like use &lt;code&gt;lambda&lt;/code&gt; inside a &lt;code&gt;for&lt;/code&gt; loop, in which case I&amp;#8217;ll shrug my shoulders and go drink another beer.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d be interested to see if anyone can come up an equivalent for the &amp;#8220;Closures and lexical closures&amp;#8221; example at &lt;a href=&quot;http://c2.com/cgi/wiki?ScopeAndClosures&quot;&gt;http://c2.com/cgi/wiki?ScopeAndClosures&lt;/a&gt;, given another Python scoping rule that assignment to a variable automatically makes it a local variable.  (Thus, the necessity for Python&amp;#8217;s &lt;code&gt;global&lt;/code&gt; keyword.)  I&amp;#8217;m guessing that you can create the &lt;code&gt;createAdder&lt;/code&gt; closure example there with Python&amp;#8217;s lambdas, but my brain is pretty bugged out today so I can&amp;#8217;t find an equivalent for it right now.  You can simply write a callable class to do that and instantiate an object, of course, which I do think is about 1000x clearer.  There&amp;#8217;s no point using closures when the culture understands objects a ton better, and the resulting code is more maintainable.&lt;/p&gt;

&lt;p&gt;Python summary: understand how scoping in &lt;code&gt;for&lt;/code&gt;/&lt;code&gt;while&lt;/code&gt;/&lt;code&gt;if&lt;/code&gt; blocks work, otherwise you&amp;#8217;ll run into problems that can cost you hours, and get skooled publicly on the Internet for all your comrades to laugh at.  Even with all the language design decisions that I consider weird, I still respect and like Python, and I feel that Guido&amp;#8217;s answer to the stuff I was attempting would be &amp;#8220;don&amp;#8217;t do that&amp;#8221;.  Writing a callable class in Python is far less tricky than using closures, because a billion times more people understand their semantics.  It&amp;#8217;s always a design question of whether the extra trickiness is more maintainable or not.&lt;/p&gt;

&lt;h3&gt;Retrospective: Blocks in C&lt;/h3&gt;

&lt;p&gt;My C code with blocks failed for a completely different reason unrelated to the Python version, and this was a total beginner&amp;#8217;s error with blocks, for which I&amp;#8217;m slightly embarrassed.  The block was being stack-allocated, so upon exit of the &lt;code&gt;for&lt;/code&gt; loop that assigns the function list, the pointers to the blocks are effectively invalid.  I was a little unlucky that the program didn&amp;#8217;t crash.  The correct solution is to perform a &lt;code&gt;Block_copy&lt;/code&gt;, in which case things work as expected.&lt;/p&gt;

&lt;h3&gt;Retrospective: Closures&lt;/h3&gt;

&lt;p&gt;Not all closures are the same; or, rather, closures are closures, but their semantics can differ from language to language due to many different language design decisions&amp;#8212;such as how one chooses to define the lexical environment.  Wikipedia&amp;#8217;s article on closures has an excellent section on &lt;a href=&quot;http://en.wikipedia.org/wiki/Closure_(computer_science)#Differences_in_semantics&quot;&gt;differences in closure semantics&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Retrospective: Mutability&lt;/h3&gt;

&lt;p&gt;I stand by all my assertions about mutability.  This is where the Haskell tribe will nod their collective heads, and all the anti-Haskell tribes think I&amp;#8217;m an idiot.  Look, I use a lot of languages, and I love and hate many things about each of them, Haskell included.  I fought against Haskell for years and hated it until I finally realised that one of its massive benefits is that &lt;em&gt;things bloody well work an unbelievable amount of the time once your code compiles&lt;/em&gt;.  Don&amp;#8217;t underestimate how much of a revelation this is, because that&amp;#8217;s the point where the language&amp;#8217;s beauty, elegance and crazy type system fade into the background and, for the first time, you see one gigantic &lt;em&gt;pragmatic&lt;/em&gt; advantage of Haskell.&lt;/p&gt;

&lt;p&gt;One of the things that Haskell does to achieve this is the severe restriction on making things immutable.  Apart from the lovely checkbox reason that you can write concurrent-safe algorithms with far less fear, I truly believe that this makes for generally more maintainable code.  You can read code and think once about what value a variable holds, rather than keep it in the back of your mind all the time.  The human mind is better at keeping track of multiple names, rather than a single name with different states.&lt;/p&gt;

&lt;p&gt;The interaction of state and control flow is perhaps &lt;em&gt;the&lt;/em&gt; most complex thing to reason about in programming&amp;#8212;think concurrency, re-entrancy, disruptive control flow such as &lt;code&gt;longjmp&lt;/code&gt;, exceptions, co-routines&amp;#8212;and mutability complicates that by an order of magnitude.  The subtle difference in behaviour between all the languages discussed in the comments is exemplar that &amp;#8220;well-understood&amp;#8221; concepts such as lexical scoping, &lt;code&gt;for&lt;/code&gt; loops and closures can produce a result that many people still don&amp;#8217;t expect; at least for this simple example, these issues would have been avoided altogether if mutability was disallowed.  &lt;em&gt;Of course&lt;/em&gt; mutability has its place.  I&amp;#8217;m just advocating that we should restrict it where possible, and at least a smattering of other languages&amp;#8212;and hopefully everyone who has to deal with thread-safe code&amp;#8212;agrees with me.&lt;/p&gt;

&lt;h3&gt;Closing&lt;/h3&gt;

&lt;p&gt;I&amp;#8217;d truly like to thank everyone who added their voice and spent the time to comment on this post.  It&amp;#8217;s been highly enlightening, humbling, and has renewed my interest in discussing programming languages again after a long time away from it.  And hey, I&amp;#8217;m blogging again.  (Though perhaps after this post, you may not think that two of those things are good things.)  It&amp;#8217;s always nice when you learn something new, which I wouldn&amp;#8217;t have if not for the excellent peer review.  &lt;a href=&quot;http://xkcd.com/54/&quot;&gt;Science: it works, bitches!&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>André Pang</name>
			<uri>http://algorithm.com.au/index.html</uri>
		</author>
		<source>
			<title type="html">Stay Hungry, Stay Foolish</title>
			<subtitle type="html">André Pang's Blog</subtitle>
			<link rel="self" href="http://algorithm.com.au/blog/files/rss.xml"/>
			<id>http://algorithm.com.au/blog/files/rss.xml</id>
			<updated>2011-11-23T18:30:22+00:00</updated>
			<rights type="html">© 2006-2007 André Pang</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A New Command</title>
		<link href="http://horms.org/pleb_blossom/permalink/2011/2011-05-03T07_56_37.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2011/2011-05-03T07_56_37.shtml</id>
		<updated>2011-03-10T02:01:08+00:00</updated>
		<content type="html">&lt;a href=&quot;http://horms.org/gallery/hikari-2010-11/a/5_8872_s.shtml#nav&quot;&gt;
				&lt;img src=&quot;http://horms.org/pleb_blossom/pics/5_8872.jpg&quot; width=&quot;76&quot; height=&quot;115&quot; alt=&quot;[Hikari]&quot; align=&quot;left&quot; /&gt;&lt;/a&gt;
				&lt;p&gt;
				The following command is in my shell history
				&lt;p&gt;
				&lt;pre&gt;
				A青ポ0〜〜〜〜?
				&lt;/pre&gt;
				&lt;p&gt;
				I think we can assume that is the work of
				&lt;a href=&quot;http://horms.org/gallery/hikari/&quot;&gt;Hikari&lt;/a&gt;.
				&lt;p&gt;
				I think it translates as:
				&lt;p&gt;
				
				A blue &quot;po&quot; Oooooooooh?
				
				&lt;br clear=&quot;left&quot; /&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Mitigating Fork Disasters</title>
		<link href="http://horms.org/pleb_blossom/permalink/2011/2011-03-10T11_01_08.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2011/2011-03-10T11_01_08.shtml</id>
		<updated>2011-03-10T02:01:08+00:00</updated>
		<content type="html">&lt;img src=&quot;http://horms.org/pleb_blossom/pics/5-7178.jpg&quot; width=&quot;120&quot; height=&quot;79&quot; alt=&quot;[Coast]&quot; align=&quot;right&quot; /&gt;
				&lt;p&gt;
				I recently managed to make a bit of a mess of things while
				doing some multi-process programming using fork(). While the
				box was still semi-usable I was unable to kill off the processes
				faster than they were being created and I ended up resorting to a reboot.
				&lt;p&gt;
				At the time I wasn't entirely sure what the problem was and
				not cherishing the prospect of more reboots I used taskset to
				constrain my shell, its child processes including test runs
				of my program and of course its forked children to a single CPU.
				&lt;p&gt;
				&lt;tt&gt;# taskset -p 01 $$&lt;/tt&gt;
				&lt;p&gt;
				The result? A subsequent fork explosion was indeed constrained to
				one CPU and I was able to kill off all the processes quite easily.
				&lt;p&gt;
				My system is a single socket with four cores. I have disabled hyper-threading
				so there is only one thread per core.  I am unsure how well this technique
				would work in other situations, especially in the case of multiple threads
				but only one socket and one core.
				&lt;br clear=&quot;right&quot; /&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">SH-Mobile ARM zboot Presentation</title>
		<link href="http://horms.org/pleb_blossom/permalink/2011/2011-03-07T08_07_43.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2011/2011-03-07T08_07_43.shtml</id>
		<updated>2011-03-06T23:07:43+00:00</updated>
		<content type="html">&lt;img src=&quot;http://horms.org/pleb_blossom/pics/5-8985.jpg&quot; width=&quot;120&quot; height=&quot;79&quot; alt=&quot;[Building at Dusk. Hachobori, Tokyo]&quot; align=&quot;right&quot; /&gt;
				On the 18th of March I will be making a short presentation at &lt;a href=&quot;http://elinux.org/Japan_Technical_Jamboree_36&quot;&gt;Japan Technical
				Jamboree #36&lt;/a&gt;, on the work that I have been doing to allow booting Linux
				directly on the SH-Mobile ARM platform.
				&lt;p&gt;
				This will be a follow-up to a presentation I made on the same topic
				at the MobileFOSS Mini-Conf at Linux.conf.au 2011 in January.
				&lt;a href=&quot;http://horms.net/projects/zboot/&quot;&gt;Material from that presentation&lt;/a&gt;
				&lt;br clear=&quot;right&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Network Bandwidth Control in Virtualised Environments Presentation</title>
		<link href="http://horms.org/pleb_blossom/permalink/2011/2011-01-26T11_06_44.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2011/2011-01-26T11_06_44.shtml</id>
		<updated>2011-01-26T01:06:44+00:00</updated>
		<content type="html">This afternoon  I will be making a presentation at Linux.Conf.Au on
				Network Bandwidth Control in Virtualised Environments.
				This is primarily on work that I have done on network QoS with Xen.
				I the slides and related information are now available.
				&lt;a href=&quot;http://horms.net/projects/xen-bw-isolation/&quot;&gt;slides, etc...&lt;/a&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Online Goanna demo</title>
		<link href="http://redlizards.com/blog/uncategorized/online-goanna-demo/"/>
		<id>http://redlizards.com/blog/?p=599</id>
		<updated>2011-01-25T05:38:50+00:00</updated>
		<content type="html">&lt;p&gt;You don&amp;#8217;t have to download Goanna to try out Goanna.&lt;/p&gt;
&lt;p&gt;Once you have an account on redlizards.com, you can try out Goanna via the online demo at&lt;a href=&quot;http://redlizards.com/products/demo.html&quot;&gt; http://redlizards.com/products/demo.html&lt;/a&gt;.  Just log in, paste in your code in the text box and click the &amp;#8220;Analyze&amp;#8221; button.  The results will show up on the Web page.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve limited the amount of code you can analyze in the demo to 250 lines (so you still might want to download Goanna for serious work).&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">SH-Mobile ARM zboot Presentation</title>
		<link href="http://horms.org/pleb_blossom/permalink/2011/2011-01-25T11_53_58.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2011/2011-01-25T11_53_58.shtml</id>
		<updated>2011-01-25T01:53:58+00:00</updated>
		<content type="html">This morning I made a short presentation on
				the work that I have been doing to allow
				booting Linux directly on the SH-Mobile ARM platform.
				&lt;a href=&quot;http://horms.net/projects/zboot/&quot;&gt;slides, etc...&lt;/a&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Moving mail archives to MobileMe (or other Sun Java System Messaging Servers)</title>
		<link href="http://justtesting.org/moving-mail-archives-to-mobileme-or-other-sun"/>
		<id>http://justtesting.org/moving-mail-archives-to-mobileme-or-other-sun</id>
		<updated>2011-01-21T11:57:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;p&gt;I recently consolidated all my email on MobileMe (for easy access from both my Mac and iPad). However, I ran into a problem with the MobileMe IMAP server when I tried to move my old mail archives to the MobileMe IMAP server. MobileMe uses the&amp;nbsp;&lt;a href=&quot;http://wikis.sun.com/display/CommSuite6/Messaging+Server+7+Documentation&quot;&gt;Sun Java System Messaging Server&lt;/a&gt;&amp;nbsp;(which has since become the&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Oracle_Communications_Messaging_Exchange_Server&quot;&gt;Oracle Communications Messaging Exchange Server&lt;/a&gt;). It turns out that this IMAP server (like some others as well) is rather strict about the format of mail headers; hence, uploading old mail archives usually aborts with the following error message: &quot;The IMAP command &amp;ldquo;APPEND&amp;rdquo; (to &amp;hellip;) failed with server error: Message contains invalid header&quot;.&lt;/p&gt;
&lt;div&gt;Querying the Internets and some experimentation revealed that the problem are lines in email message headers that start with &quot;From &quot;, &quot;&amp;gt;From &quot;, and &quot;&amp;gt;&amp;gt;From &quot;. These are not proper message headers fields (whose names need to be delimited by a colon), but remnants from storage of these mail messages in the&amp;nbsp;&lt;a href=&quot;http://en.wikipedia.org/wiki/Mbox&quot;&gt;mbox format&lt;/a&gt;. The remedy is to delete or edit these invalid lines in all affected message headers.&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;Apple Mail stores mail messages in &quot;$USER/Library/Mail/Mailboxes/&quot;. Each mailbox directory (suffix &quot;.mbox&quot;) contains a directory &quot;Messages&quot; with one file per message. These files can easily be modified using your favourite command line tools that support matching of regular expressions or by loading them, en masse, into TextMate for project-wide search and replace. This is somewhat naughty as the files containing individual messages contain the message header and text as well as a property list (plist), used by Mail.app to store a few attributes. The start of that property list in the text file is marked by a character count in the first line of each message. By eliminating or modifying the offending lines, you invalidate that character count. &amp;nbsp;However, Mail.app seems to cope just fine with those slightly malformed messages. After fixing the headers, all my messages uploaded without problems (and no attributes seemed to get lost).&lt;/div&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/moving-mail-archives-to-mobileme-or-other-sun&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/moving-mail-archives-to-mobileme-or-other-sun#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Linux.Conf.Au Presentations</title>
		<link href="http://horms.org/pleb_blossom/permalink/2011/2011-01-18T08_25_54.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2011/2011-01-18T08_25_54.shtml</id>
		<updated>2011-01-17T23:25:54+00:00</updated>
		<content type="html">&lt;img src=&quot;http://horms.org/pleb_blossom/pics/4-3682.jpg&quot; width=&quot;120&quot; height=&quot;79&quot; alt=&quot;[A Wall in Montreal]&quot; align=&quot;left&quot; /&gt;
				&lt;p&gt;
				Over the past few weeks eastern Australia, including Brisbane, has been
				subjected to devastating floods.  My sympathy and condolences are with
				anyone adversely effected by these events.
				&lt;p&gt;
				Last night a decision was made by the organisers and 
				&lt;a href=&quot;http://www.linux.org.au/&quot;&gt;Linux&amp;nbsp;Australia&lt;/a&gt; that
				despite the floods
				&lt;a href=&quot;http://lca2011.linux.org.au/&quot;&gt;Linux.Conf.Au&amp;nbsp;2011&lt;/a&gt;
				will go ahead next week in Brisbane as scheduled. I am
				delighted to be able to be part of the event.
				&lt;p&gt;
				In Tuesday I will be making a presentation at the
				&lt;a href=&quot;http://lca2011.linux.org.au/programme/schedule/tuesday&quot;&gt;MobileFOSS
				miniconf&lt;/a&gt; on using zboot
				to boot Linux directly from flash or, SD or MMC cards on SH-Mobile ARM.
				&lt;p&gt;
				On Wednesday at 15:45 I will be making a presentation at the main conference on
				&lt;a href=&quot;https://conf.linux.org.au/programme/schedule/view_talk/62?day=wednesday&quot;&gt;Network
				Bandwidth Control in Virtualized Environments&lt;/a&gt;.  This covers the use of
				Linux's QoS facilities to control guest bandwidth usage.
				&lt;p&gt;
				Its going to be a great conference, I'm looking forward to it.
				&lt;br clear=&quot;left&quot; /&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">LLVM Backend for DDC : Very Nearly Done.</title>
		<link href="http://www.mega-nerd.com/erikd/Blog/CodeHacking/DDC/llvm_very_nearly_done.html"/>
		<id>http://www.mega-nerd.com/erikd/Blog/2011/01/01/llvm_very_nearly_done.atom</id>
		<updated>2011-01-01T02:54:00+00:00</updated>
		<content type="html">&lt;p&gt;
The LLVM backend for
	&lt;a href=&quot;http://disciple.ouroborus.net/&quot;&gt;
	DDC&lt;/a&gt;
that I've been working on sporadically
	&lt;a href=&quot;http://www.mega-nerd.com/erikd/Blog/CodeHacking/DDC/llvm_backend.html&quot;&gt;
	since June&lt;/a&gt;
is basically done.
When compiling via the LLVM backend, all but three of 100+ tests in the DDC
test suite pass.
The tests that pass when going via the C backend but fail via the LLVM backend
are of two kinds:
&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt;Use DDC's &lt;tt&gt;&lt;b&gt;foreign import&lt;/b&gt;&lt;/tt&gt; construct to name a C macro
		 to perform a type cast where the macro is defined in one of C header
		 files.
		&lt;/li&gt;
	&lt;li&gt;Use static inline functions in the C backend to do peek and poke
		operations on arrays of unboxed values.
		&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
In both of these cases, DDC is using features of the C language to make code
generation easier.
Obviously, the LLVM backend needs to do something else to get the same effect.
&lt;/p&gt;

&lt;p&gt;
Fixing the type casting problem should be relatively simple.
&lt;a href=&quot;http://www.cse.unsw.edu.au/~benl/&quot;&gt;
	Ben&lt;/a&gt;
is currently working on making type casts a primitive of the Core language
so that both the C and LLVM backends can easily generate code for them.
&lt;/p&gt;

&lt;p&gt;
The array peek and poke problem is little more complex.
I suspect that it too will require the addition of new Core language primitive
operations.
This is a much more complex problem than the type casting one and I've only just
begun to start thinking about it.
&lt;/p&gt;

&lt;p&gt;
Now that the backend is nearly done, its not unreasonable to look at its
performance.
The following table shows the compile and run times of a couple of tests in the
DDC test suite compiling via the C and the LLVM backend.
&lt;/p&gt;

&lt;br /&gt;

&lt;center&gt;
&lt;table class=&quot;simple&quot;&gt;
	&lt;tr&gt;
		&lt;th&gt;Test name&lt;/th&gt;
			&lt;th&gt;C Build Time&lt;/th&gt;
			&lt;th&gt;LLVM Build Time&lt;/th&gt;
			&lt;th&gt;C Run Time&lt;/th&gt;
			&lt;th&gt;LLVM Run Time&lt;/th&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th align=&quot;left&quot;&gt;93-Graphics/Circle&lt;/th&gt;
			&lt;td align=&quot;right&quot;&gt;3.124s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;3.260s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;1.701s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;1.536s&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th align=&quot;left&quot;&gt;93-Graphics/N-Body/Boxed&lt;/th&gt;
			&lt;td align=&quot;right&quot;&gt;6.126s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;6.526s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;7.649s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;4.899s&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th align=&quot;left&quot;&gt;93-Graphics/N-Body/UnBoxed&lt;/th&gt;
			&lt;td align=&quot;right&quot;&gt;3.559s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;4.017s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;9.843s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;6.162s&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th align=&quot;left&quot;&gt;93-Graphics/RayTracer&lt;/th&gt;
			&lt;td align=&quot;right&quot;&gt;12.890s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;13.102s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;13.465s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;8.973s&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
 		&lt;th align=&quot;left&quot;&gt;93-Graphics/SquareSpin&lt;/th&gt;
			&lt;td align=&quot;right&quot;&gt;2.699s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;2.889s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;1.609s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;1.604s&lt;/td&gt;
	&lt;/tr&gt;
	&lt;tr&gt;
		&lt;th align=&quot;left&quot;&gt;93-Graphics/Styrene&lt;/th&gt;
			&lt;td align=&quot;right&quot;&gt;13.685s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;14.349s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;11.312s&lt;/td&gt;
			&lt;td align=&quot;right&quot;&gt;8.527s&lt;/td&gt;
	&lt;/tr&gt;

&lt;/table&gt;
&lt;/center&gt;

&lt;br /&gt;

&lt;p&gt;
Although there is a small increase in compile times when compiling via LLVM, the
LLVM run times are significantly reduced.
The conceptual complexity of the LLVM backend is also low (the line count is
about 4500 lines, which will probably fall with re-factoring) and thanks to
LLVM's type checking being significantly better than C's, I think its reasonable
to be more confident in the quality of the LLVM backend than the existing C
backend.
Finally, implementing things like proper tail call optimisation will be far
easier in LLVM backend than in C.
&lt;/p&gt;

&lt;p&gt;
All in all, I think doing this LLVM backend has been an interesting challenge
and will definitely pay off in the long run.
&lt;/p&gt;</content>
		<author>
			<name>Erik de Castro Lopo</name>
			<email>erikd@mega-nerd.com</email>
			<uri>http://www.mega-nerd.com/erikd/Blog</uri>
		</author>
		<source>
			<title type="html">m3ga blog</title>
			<subtitle type="html">An ocassional rant</subtitle>
			<link rel="self" href="http://www.mega-nerd.com/erikd/Blog/index.atom"/>
			<id>http://www.mega-nerd.com/erikd/Blog/index.atom</id>
			<updated>2012-01-29T09:30:23+00:00</updated>
			<rights type="html">Copyright 2006-2010 Erik de Castro Lopo</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The Projectionist</title>
		<link href="http://algorithm.com.au/blog/files/9e11aa00c22b8d51b584f68e981ac71e-612.php#unique-entry-id-612"/>
		<id>http://algorithm.com.au/blog/files/9e11aa00c22b8d51b584f68e981ac71e-612.php#unique-entry-id-612</id>
		<updated>2010-12-08T08:38:42+00:00</updated>
		<content type="html">&lt;blockquote&gt;&lt;p&gt;There comes in the career of every motion picture that final occasion when all the artistry, all the earnest constructive endeavor of all the man-power and genius of the industry, and all the capital investment, too, must pour through the narrow gate of the projector on its way to the fulfilment of its purpose, the final delivery to the public.&lt;/p&gt;

&lt;p&gt;The delivery is a constant miracle of men and mechanism in the projection rooms of the world&amp;#8217;s fifty thousand theatres.  That narrow ribbon, thirty-five millimetres, flowing at twenty-four frames a second through the scintillating blaze of the spot at the picture aperture and coursing by at an exactingly-precise 90 feet a minute past the light slit of the sound system, demands a quality of skill and faithful, unfailing attention upon which the whole great industry depends.&lt;/p&gt;

&lt;p&gt;The projector lens is the neck in the bottle through which all must pass.  The projectionist presiding over that mechanism is responsible for the ultimate performance upon which we must all depend.&lt;/p&gt;

&lt;p&gt;The projector must not fail, and more importantly still, the man must not fail or permit it to waiver in its performance.  It is to the tremendous credit of the skill of the modern projectionist that perfect presentation of the motion picture upon the screen is today a commonplace, a perfection that is taken as a matter of course.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Adolph Zukor, Chairman of Paramount Pictures, 1935.  It still applies as much today as it did back then.&lt;/p&gt;</content>
		<author>
			<name>André Pang</name>
			<uri>http://algorithm.com.au/index.html</uri>
		</author>
		<source>
			<title type="html">Stay Hungry, Stay Foolish</title>
			<subtitle type="html">André Pang's Blog</subtitle>
			<link rel="self" href="http://algorithm.com.au/blog/files/rss.xml"/>
			<id>http://algorithm.com.au/blog/files/rss.xml</id>
			<updated>2011-11-23T18:30:22+00:00</updated>
			<rights type="html">© 2006-2007 André Pang</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Check descriptions</title>
		<link href="http://redlizards.com/blog/uncategorized/check-descriptions/"/>
		<id>http://redlizards.com/blog/?p=589</id>
		<updated>2010-12-08T03:28:01+00:00</updated>
		<content type="html">&lt;p&gt;New feature for Visual Studio:  For any Goanna warning in the VS ErrorList, right-click and choose &amp;#8220;Describe Check&amp;#8221;.  You&amp;#8217;ll get an editor tab filled with a description of the check that gave rise to the warning, the same text as in the User Guide.  Coming soon to Eclipse.&lt;br /&gt;
&lt;img src=&quot;http://www.redlizards.com/images/checkdescr.jpg&quot; alt=&quot;Check description&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Goanna Studio and Goanna Central 2.2</title>
		<link href="http://redlizards.com/blog/release/goanna-studio-and-goanna-central-22/"/>
		<id>http://redlizards.com/blog/?p=577</id>
		<updated>2010-12-02T04:41:06+00:00</updated>
		<content type="html">&lt;p&gt;I am thrilled to announce that Goanna Studio 2.2 is now the most stable version of Goanna Studio ever created.  Goanna Studio 2.1 was an impressive piece of software, but thanks to all the great feedback we have received, we have nailed down all the outstanding issues and we are ready to let you reap the benefits of our efforts.&lt;/p&gt;
&lt;p&gt;The major part of our efforts has been targeted at making the Goanna Studio experience much better.  This means more features and more stability.  On the Visual Studio front, Goanna Studio is now capable of fully handling the range of possible inputs that you can throw at it.  That means full &lt;strong&gt;Unicode support&lt;/strong&gt; in everything, from how we process filenames, to project names and folders names, even down to the default file name when you export your warnings to CSV format from the Goanna Summary web page.  This means, Goanna works reliably now with, e.g., &lt;strong&gt;Korean, Chinese and Japanese&lt;/strong&gt; &lt;strong&gt;Windows&lt;/strong&gt;. In addition we have introduced a feature we are calling &lt;strong&gt;Macro Visualisation&lt;/strong&gt;.  It is a way of presenting to you exactly what your source code looks like underneath all that macro mess.&lt;/p&gt;
&lt;p&gt;On the Eclipse side we have some amazing new features.  Goanna Studio can now handle various&lt;strong&gt; custom CDT Tool Chain tools&lt;/strong&gt;.  It&amp;#8217;s as simple as telling Goanna which Tool&amp;#8217;s it should be emulating, and then the Goanna analysis in your build environment is one step closer to perfection.  The long-standing annoyance that appears asking you to select a CDT Project when you first try to analyse something with Goanna is now fixed.  In addition, &lt;strong&gt;Goanna Studio for Eclipse now works in Windows-&lt;/strong&gt;based environments with the MinGW tool chain.&lt;/p&gt;
&lt;p&gt;Another major feature we are pleased to announce is &lt;strong&gt;Flexelint and PC-Lint integration&lt;/strong&gt; into the Goanna Studio for Eclipse package.  This allows you to run your version of lint and Goanna analysis at the same time, and have all the warnings presented to you in one simple interface.&lt;/p&gt;
&lt;p&gt;The fixed false positives and changes to checks include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ATH-div-0 - now warns for any expression that evaluates to 0&lt;/li&gt;
&lt;li&gt;ATH-div-0-* - these checks now only warn when there is a definite division by 0.&lt;/li&gt;
&lt;li&gt;ATH-neg-* - these checks no longer give warnings about floating point operations.&lt;/li&gt;
&lt;li&gt;ARR-inv-index - now warns about invalid global array accesses.&lt;/li&gt;
&lt;li&gt;COP-assign-op-ret - no longer warns about operator==.&lt;/li&gt;
&lt;li&gt;COP-copy-ctor - two false positives were fixed, no longer warns when the copy constructor is intentionally unimplemented, and now handles C++ structs properly.&lt;/li&gt;
&lt;li&gt;COP-member-uninit - now gives one warning for each uninitialised class member and now will also analyse assignment operators.&lt;/li&gt;
&lt;li&gt;LIB-* - we have added a number of new checks warning about the unsafe use of library functions&lt;/li&gt;
&lt;li&gt;RED-no-effect now has a more precise warning message.&lt;/li&gt;
&lt;li&gt;RED-unused-val - no longer warns when you return a value, and now warns more correctly and almost lines up with the MISRA coding standard rule: 0-1-6.&lt;/li&gt;
&lt;li&gt;SPC-ret-stack - no longer gives a warning when you return static local variables.&lt;/li&gt;
&lt;li&gt;MEM-double-free - gives less false positives due to assuming that delete operators can throw exceptions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Other minor improvements and bug fixes are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;better handling of gcc arguments (particularly include path specifications).&lt;/li&gt;
&lt;li&gt;Goanna Central now smoothly handles multiple files on the same command line.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As usual, all current users get the upgrade for free. If you were a trial user in the past and need a trial extension visit: &lt;a href=&quot;http://redlizards.com/trial-extension&quot;&gt;http://redlizards.com/trial-extension&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">LLVM Backend for DDC : Milestone #3.</title>
		<link href="http://www.mega-nerd.com/erikd/Blog/CodeHacking/DDC/llvm_milestone3.html"/>
		<id>http://www.mega-nerd.com/erikd/Blog/2010/12/01/llvm_milestone3.atom</id>
		<updated>2010-12-01T09:41:00+00:00</updated>
		<content type="html">&lt;p&gt;
After my
	&lt;a href=&quot;http://www.mega-nerd.com/erikd/Blog/CodeHacking/DDC/llvm_backend2.html&quot;&gt;
	last post&lt;/a&gt;
on this topic, I ran into some problems with the AST (abstract syntax tree) that
was being passed to my code for LLVM code generation.
After discussing the problem with Ben, he spent some time cleaning up the AST
definition, the result of which was that nearly all the stuff I already had,
stopped working.
This was a little disheartening.
That and the fact that I was really busy, meant that I didn't touch the LLVM
backend for a number of weeks.
&lt;/p&gt;

&lt;p&gt;
When I finally did get back to it, I found that it wasn't as broken as I had
initially thought.
Although the immediate interface between Ben's code and mine had changed
significantly, all the helper functions I had written were still usable.
Over a week and a bit, I managed to patch everything up again and get back to
where I was.
I also did a lot of cleaning up and came up with a neat solution to a problem
which was bugging me during my previous efforts.
&lt;/p&gt;

&lt;p&gt;
The problem was that structs defined via the LLVM backend needed to have exactly
the same memory layout as the structs defined via the C backend.
This is a strict requirement for proper interaction between code generated via
C and LLVM.
This was made a little difficult by David Terei's haskell LLVM wrapper code
	&lt;a href=&quot;http://www.mega-nerd.com/erikd/Blog/CodeHacking/DDC/llvm_backend.html&quot;&gt;
	(see previous post)&lt;/a&gt;
which makes all structs packed by default, while structs on the C side were
not packed.
Another dimension of this problem was finding an easy way to generate LLVM code
to access structs in a way that was easy to read and debug in the code generator
and also not require different code paths for generating 32 and 64 bit code.
&lt;/p&gt;

&lt;p&gt;
Struct layout is tricky.
Consider a really simple struct like this:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  struct whatever
  {   int32_t tag ;
      char * pointer ;
  } ;

&lt;/pre&gt;

&lt;p&gt;
On a 32 bit system, that struct will take up 8 bytes; 4 bytes for the
&lt;tt&gt;&lt;b&gt;int32_t&lt;/b&gt;&lt;/tt&gt; and 4 for the pointer.
However, on a 64 bit system, where pointers are 8 bytes in size, the struct
will take up 16 bytes.
Why not 12 bytes?
Well, some 64 bit CPUs (Alpha and Sparc64 are two I can think of) are not
capable of unaligned memory accesses; a read from memory into a CPU register
where the memory address (in bytes) is not an integer multiple of the size of
the register.
Other CPUs like x86_64 can read unaligned data, but reading unaligned data is
usually slower than reading correctly aligned data.
&lt;/p&gt;

&lt;p&gt;
In order to avoid unaligned, the compiler assumes that the start address of the
struct will be aligned to the correct alignment for the biggest CPU register
element in the struct, in this case the pointer.
It then adds 4 bytes of padding between the &lt;tt&gt;&lt;b&gt;int32_t&lt;/b&gt;&lt;/tt&gt; and the
pointer to ensure that if the struct is correctly aligned then the pointer will
also be correctly aligned.
&lt;/p&gt;

&lt;p&gt;
Because structs are packed in the David Terei's code, the above struct would
require a different definition on 32 and 64 bit systems, ie
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  ; 32 bit version of the struct
  %struct.whatever.32 = type { i32, i8 * }&gt;

  ; 64 bit version of the struct
  %struct.whatever.64 = type { i32, [4 * i8], i8 * }&gt;

&lt;/pre&gt;

&lt;p&gt;
where the 64 bit version contains 4 padding bytes.
However, the difference between these two definitions causes another problem.
To access fields within a struct, LLVM code uses the
	&lt;a href=&quot;http://llvm.org/docs/LangRef.html#i_getelementptr&quot;&gt;
	&lt;tt&gt;&lt;b&gt;getelementptr&lt;/b&gt;&lt;/tt&gt;&lt;/a&gt;
operator which addresses fields by index.
Unfortunately, the index (zero based) of the pointer is 1 for the 32 bit version
and 2 for the 64 bit version.
That would make code generation a bit of a pain in the neck.
&lt;/p&gt;

&lt;p&gt;
The solution is allow the specification of LLVM structs in Haskell as a list of
&lt;tt&gt;&lt;b&gt;LlvmStructField&lt;/b&gt;&lt;/tt&gt; elements, using
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  data LlvmStructField
        = AField String LlvmType    -- Field name and type.
        | APadTo2                   -- Pad next field to a 2 byte offset.
        | APadTo4                   -- Pad next field to a 4 byte offset.
        | APadTo8                   -- Pad next field to a 8 byte offset.

        | APadTo8If64               -- Pad next field to a 8 byte offset only
                                    -- for 64 bit.

&lt;/pre&gt;

&lt;p&gt;
Note that the &lt;tt&gt;&lt;b&gt;AField&lt;/b&gt;&lt;/tt&gt; constructor requires both a name and the
&lt;tt&gt;&lt;b&gt;LlvmType&lt;/b&gt;&lt;/tt&gt;.
I then provide functions to convert the &lt;tt&gt;&lt;b&gt;LlvmStructField&lt;/b&gt;&lt;/tt&gt; list
into an opaque &lt;tt&gt;&lt;b&gt;LlvmStructDesc&lt;/b&gt;&lt;/tt&gt; type and provide the following
functions:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  -- | Turn an struct specified as an LlvmStructField list into an
  -- LlvmStructDesc and give it a name. The LlvmStructDesc may
  -- contain padding to make it conform to the definition.
  mkLlvmStructDesc :: String -&gt; [LlvmStructField] -&gt; LlvmStructDesc

  -- | Retrieve the struct's LlvmType from the LlvmStructDesc.
  llvmTypeOfStruct :: LlvmStructDesc -&gt; LlvmType

  -- | Given and LlvmStructDesc and the name of a field within the
  -- LlvmStructDesc, retrieve a field's index with the struct and its
  -- LlvmType.
  structFieldLookup :: LlvmStructDesc -&gt; String -&gt; (Int, LlvmType)

&lt;/pre&gt;

&lt;p&gt;
Once the &lt;tt&gt;&lt;b&gt;LlvmStructDesc&lt;/b&gt;&lt;/tt&gt; is built for a given struct, fields
within the struct can be addressed in the LLVM code generator by name, making
the Haskell code generator code far easier to read.
&lt;/p&gt;

&lt;p&gt;
Pretty soon after I got the above working I also managed to get enough LLVM
code generation working to compile a complete small program which then runs
correctly.
I consider that to be milestone 3.
&lt;/p&gt;</content>
		<author>
			<name>Erik de Castro Lopo</name>
			<email>erikd@mega-nerd.com</email>
			<uri>http://www.mega-nerd.com/erikd/Blog</uri>
		</author>
		<source>
			<title type="html">m3ga blog</title>
			<subtitle type="html">An ocassional rant</subtitle>
			<link rel="self" href="http://www.mega-nerd.com/erikd/Blog/index.atom"/>
			<id>http://www.mega-nerd.com/erikd/Blog/index.atom</id>
			<updated>2012-01-29T09:30:23+00:00</updated>
			<rights type="html">Copyright 2006-2010 Erik de Castro Lopo</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Functional Programing, Tail Call Recursion and Javascript.</title>
		<link href="http://www.mega-nerd.com/erikd/Blog/CodeHacking/fp-tail-js.html"/>
		<id>http://www.mega-nerd.com/erikd/Blog/2010/11/30/fp-tail-js.atom</id>
		<updated>2010-11-30T10:47:00+00:00</updated>
		<content type="html">&lt;p&gt;
About 6 weeks ago, I got an email from
	&lt;a href=&quot;http://blogs.atlassian.com/developer/csharkie/&quot;&gt;
	Craig Sharkie&lt;/a&gt;,
who runs the Sydney Javascript group,
	&lt;a href=&quot;http://sydjs.com/&quot;&gt;
	SydJS&lt;/a&gt;.
He was contacting me because I run the
	&lt;a href=&quot;http://groups.google.com/group/fp-syd&quot;&gt;
	Sydney functional programing group&lt;/a&gt;
and he was asking if I knew anyone who might be able to give a presentation
about tail call recursion at SydJS.
In the spirit of FP-Syd outreach I volunteered to do it, even though I haven't
really done all that much Javascript.
&lt;/p&gt;

&lt;p&gt;
On the night, I showed up, had a beer and then presented
	&lt;a href=&quot;http://www.mega-nerd.com/erikd/Blog/files/js-tail-call.pdf&quot;&gt;
	my slides&lt;/a&gt;.
I started off explaining what functional programming is and why its is
interesting (hint; common language features like garbage collection, dynamic
typing, lambda expression and type inference all started in functional
languages).
&lt;/p&gt;

&lt;p&gt;
I used the factorial function as an example of function that can be implemented
recursively and I demoed the
	&lt;a href=&quot;http://www.mega-nerd.com/erikd/Blog/files/js-demo/&quot;&gt;
	Javascript versions&lt;/a&gt;
in a web browser.
I gave the standard recursive form whose stack usage grows linearly with
&lt;tt&gt;&lt;b&gt;n&lt;/b&gt;&lt;/tt&gt;:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  function factorial (n)
  {
      /* Termination condition. */
      if (n &amp;lt;= 1)
          return 1 ;

    /* Recursion. */
      return n * factorial (n - 1) ;
  }

&lt;/pre&gt;

&lt;p&gt;
followed by the tail recursive form:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  function factorial (n)
  {
      function fac_helper (n, fac)
      {
          if (n &amp;lt;= 1)
              return fac ;
          return fac_helper (n - 1, n * fac) ;
      }

      return fac_helper (n, 1) ;
  }

&lt;/pre&gt;

&lt;p&gt;
Unfortunately even though this is written in tail recursive form, it still doesn't
run in constant stack space.
That's because neither the ECMAScript 3 and 5 standards mandate tail call
optimisation and few of the Javascript engines implement it.
&lt;/p&gt;

&lt;p&gt;
For languages whose compilers do implement the TCO, the above function will
run in constant stack space and I demonstrated this using the same function
	&lt;a href=&quot;http://www.mega-nerd.com/erikd/Blog/files/mlfactorial.ml&quot;&gt;
	written in Ocaml&lt;/a&gt;:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  (* Compile using: ocamlopt nums.cmxa mlfactorial.ml -o mlfactorial *)

  open Big_int

  (*
      val mult_int_big_int : int -&gt; big_int -&gt; big_int
          Multiplication of a big integer by a small integer
  *)
  let ($*) = mult_int_big_int

  let factorial n =
      let rec fac_helper x fac =
          if x &amp;lt;= 1 then
              fac
          else
              fac_helper (x - 1) (x $* fac)
      in
      fac_helper n unit_big_int

  let () =
      let n = int_of_string Sys.argv.(1) in
      let facn = factorial n in
      Printf.printf &quot;factorial %d = %s\n&quot; n (string_of_big_int facn)

&lt;/pre&gt;

&lt;p&gt;
When this program is run through the Ocaml compiler, the compiler detects that
the factorial function is written in tail recursive form and that it can
therefore use the Tail Call Optimisation and create a executable that runs in
constant stack space.
I demostrated the constant stack space usage by running it under valgrind using
valgrind's DRD tool:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  &lt;b&gt;&amp;gt;&lt;/b&gt; valgrind --quiet --tool=drd --show-stack-usage=yes ./factorial 5
  factorial 5 = 120
  ==3320== thread 1 finished and used 11728 bytes out of 8388608 on its stack. Margin: 8376880 bytes.
  &lt;b&gt;&amp;gt;&lt;/b&gt; valgrind --quiet --tool=drd --show-stack-usage=yes ./factorial 10
  factorial 10 = 3628800
  ==3323== thread 1 finished and used 11728 bytes out of 8388608 on its stack. Margin: 8376880 bytes.
  &lt;b&gt;&amp;gt;&lt;/b&gt; valgrind --quiet --tool=drd --show-stack-usage=yes ./factorial 20
  factorial 20 = 2432902008176640000
  ==3326== thread 1 finished and used 11728 bytes out of 8388608 on its stack. Margin: 8376880 bytes.

&lt;/pre&gt;

&lt;p&gt;
Regardless of the value of &lt;tt&gt;&lt;b&gt;n&lt;/b&gt;&lt;/tt&gt; the stack space used is constant
(although, for much larger values of &lt;tt&gt;&lt;b&gt;n&lt;/b&gt;&lt;/tt&gt;, the
&lt;tt&gt;&lt;b&gt;Big_int&lt;/b&gt;&lt;/tt&gt; calculations start easting a little more stack, but
thats much less of a problem).
&lt;/p&gt;

&lt;p&gt;
Finally, I showed a way of doing TCO by hand using a technique I found in
Spencer Tipping's
	&lt;a href=&quot;https://github.com/spencertipping/js-in-ten-minutes/&quot;&gt;
	&lt;i&gt;&quot;Javascipt in Ten Minutes&quot;&lt;/i&gt;&lt;/a&gt;.
The solution adds a couple of new properties to the prototype of the
&lt;tt&gt;&lt;b&gt;Function&lt;/b&gt;&lt;/tt&gt; object to provide delimited continuations (another
idea from functional programming).
See the
	&lt;a href=&quot;http://www.mega-nerd.com/erikd/Blog/files/js-demo/demo5-factorial.js&quot;&gt;
	the code&lt;/a&gt;
for the details.
Suffice to say that this solution is really elegant and should be safe to run
in just about any browser whose Javascript implementation is not completely
broken.
&lt;/p&gt;

&lt;p&gt;
As far as I am concerned, my presentation was received very well and the Twitter
responses (all two of them) ranged from
	&lt;a href=&quot;https://twitter.com/sydjs/status/4821816115728384&quot;&gt;
	&lt;i&gt;&quot;brain melting&quot;&lt;/i&gt;&lt;/a&gt;
to
	&lt;a href=&quot;https://twitter.com/pamelafox/status/4884534680092672&quot;&gt;
	&lt;i&gt;&quot;awesome&quot;&lt;/i&gt;&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
I then hung around for the rest of the meeting, had another beer and chatted to
people.
One interesting part of the meeting was called &quot;Di-&lt;i&gt;script&lt;/i&gt;-ions&quot;, where a
member of the audience would put up small 4-10 line snippets of Javascript code
and asked the audience what they did and why.
What was surprising to me that for some cases the semantics of a small piece of
Javascript code is completely non-obvious.
Javascript seems to have some very weird interactions between scoping rules,
whether functions are defined directly or as a variable and the sequence of
initialisation.
Strange indeed.
&lt;/p&gt;

&lt;p&gt;
Anyway, thanks to Craig Sharkie for inviting me.
I had a great time.
&lt;/p&gt;</content>
		<author>
			<name>Erik de Castro Lopo</name>
			<email>erikd@mega-nerd.com</email>
			<uri>http://www.mega-nerd.com/erikd/Blog</uri>
		</author>
		<source>
			<title type="html">m3ga blog</title>
			<subtitle type="html">An ocassional rant</subtitle>
			<link rel="self" href="http://www.mega-nerd.com/erikd/Blog/index.atom"/>
			<id>http://www.mega-nerd.com/erikd/Blog/index.atom</id>
			<updated>2012-01-29T09:30:23+00:00</updated>
			<rights type="html">Copyright 2006-2010 Erik de Castro Lopo</rights>
		</source>
	</entry>

	<entry>
		<title type="html">Final version of the Accelerate paper (GPGPU in Haskell)</title>
		<link href="http://justtesting.org/final-version-of-the-accelerate-paper-gpgpu-i"/>
		<id>http://justtesting.org/final-version-of-the-accelerate-paper-gpgpu-i</id>
		<updated>2010-11-25T23:45:35+00:00</updated>
		<content type="html">&lt;p&gt;
	We will present our paper&amp;nbsp;&lt;a href=&quot;http://www.cse.unsw.edu.au/~chak/papers/CKLM+11.html&quot;&gt;Accelerating Haskell Array Codes with Multicore GPUs&lt;/a&gt;&amp;nbsp;at&amp;nbsp;&lt;a href=&quot;http://damp2011.cs.uchicago.edu/&quot;&gt;ACM SIGLAN&amp;nbsp;Declarative Aspects of Multicore Programming (DAMP 2011)&lt;/a&gt;, which is co-located with POPL'11 in Austin, TX, in January. The final version of our paper is&amp;nbsp;&lt;a href=&quot;http://www.cse.unsw.edu.au/~chak/papers/CKLM+11.html&quot;&gt;now available&lt;/a&gt;, and we plan to soon release a significantly improved version of the&amp;nbsp;&lt;a href=&quot;http://hackage.haskell.org/package/accelerate&quot;&gt;Accelerate library&lt;/a&gt;&amp;nbsp;(matching the API used in the paper), which enables high-level GPGPU programming in Haskell based on NVIDIA's CUDA environment.
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/final-version-of-the-accelerate-paper-gpgpu-i&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/final-version-of-the-accelerate-paper-gpgpu-i#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Final version of the Singleton paper</title>
		<link href="http://justtesting.org/final-version-of-the-singleton-paper"/>
		<id>http://justtesting.org/final-version-of-the-singleton-paper</id>
		<updated>2010-11-25T03:32:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;p&gt;Our paper&amp;nbsp;&lt;a href=&quot;http://www.cse.unsw.edu.au/~chak/papers/WC11.html&quot;&gt;Singleton: A General-Purpose Dependently-Typed Assembly Language&lt;/a&gt;&amp;nbsp;will be presented at the&amp;nbsp;&lt;a href=&quot;http://www.mpi-sws.org/~dreyer/tldi2011/&quot;&gt;ACM&amp;nbsp;SIGPLAN&amp;nbsp;Workshop on&lt;br /&gt;Types in Language Design and Implementation (TLDI'11)&lt;/a&gt;&amp;nbsp;co-located with POPL'11 in&amp;nbsp;Austin, TX,&amp;nbsp;in January. The final version of the paper is now&amp;nbsp;&lt;a href=&quot;http://www.cse.unsw.edu.au/~chak/papers/singleton.pdf&quot;&gt;available&lt;/a&gt;. See &lt;a href=&quot;http://justtesting.org/singleton-a-general-purpose-dependently-typed&quot;&gt;this previous post&lt;/a&gt; for some more information and proof scripts.&lt;/p&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/final-version-of-the-singleton-paper&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/final-version-of-the-singleton-paper#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">It Gets Better</title>
		<link href="http://algorithm.com.au/blog/files/it-gets-better-pixar.php#unique-entry-id-611"/>
		<id>http://algorithm.com.au/blog/files/it-gets-better-pixar.php#unique-entry-id-611</id>
		<updated>2010-11-23T22:00:01+00:00</updated>
		<content type="html">&lt;p&gt;Pixar&amp;#8217;s latest short film.  I&amp;#8217;m so proud and honoured to be working with such an amazing group of people.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;</content>
		<author>
			<name>André Pang</name>
			<uri>http://algorithm.com.au/index.html</uri>
		</author>
		<source>
			<title type="html">Stay Hungry, Stay Foolish</title>
			<subtitle type="html">André Pang's Blog</subtitle>
			<link rel="self" href="http://algorithm.com.au/blog/files/rss.xml"/>
			<id>http://algorithm.com.au/blog/files/rss.xml</id>
			<updated>2011-11-23T18:30:22+00:00</updated>
			<rights type="html">© 2006-2007 André Pang</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Learning Photography with the Panasonic GF1</title>
		<link href="http://algorithm.com.au/blog/files/gf1.php#unique-entry-id-610"/>
		<id>http://algorithm.com.au/blog/files/gf1.php#unique-entry-id-610</id>
		<updated>2010-11-22T06:13:48+00:00</updated>
		<content type="html">&lt;p&gt;Thanks to several evil friends of mine, I started to take an interest in photography at the end of last year.  I&amp;#8217;ve always wanted to have a &amp;#8220;real&amp;#8221; camera instead of a point and shoot, so at the start of 2010, I bit the bullet and bought myself a &lt;a href=&quot;http://www.amazon.com/Panasonic-DMC-GF1-Four-Thirds-Interchangeable-Aspherical/dp/B002MUAEX4/ref=sr_1_1?ie=UTF8&amp;qid=1290394343&amp;sr=8-1&quot;&gt;Panasonic Lumix &lt;span class=&quot;caps&quot;&gt;DMC&lt;/span&gt;-GF1&lt;/a&gt;, usually just called The &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;amongst the camera geeks.&lt;/p&gt;&lt;img class=&quot;imageStyle&quot; alt=&quot;panasonic-gf1-la20-800&quot; src=&quot;http://algorithm.com.au/blog/files/panasonic-gf1-la20-800.jpg&quot; width=&quot;480&quot; height=&quot;347&quot; /&gt;&lt;p&gt;I tossed up between the &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;and the then-just-released &lt;a href=&quot;http://www.amazon.com/Canon-T2i-3-0-Inch-18-135mm-Standard/dp/B003MAKXMA/ref=sr_1_3?s=electronics&amp;ie=UTF8&amp;qid=1290394358&amp;sr=1-3&quot;&gt;Canon &lt;span class=&quot;caps&quot;&gt;EOS&lt;/span&gt; 550D&lt;/a&gt; (a.k.a. the Rebel T2i in the &lt;span class=&quot;caps&quot;&gt;USA&lt;/span&gt;) for a long time.  I figured that getting a compact camera would make me tote it around a lot more, and after ten months of using it, I think I was right.  I recently went to a wedding in Sydney, and I literally kept the camera in my suit pocket instead of having to lug it around strapped to my body or neck.  I definitely wouldn&amp;#8217;t be able to do that with a Canon or Nikon &lt;span class=&quot;caps&quot;&gt;DSLR. &lt;/span&gt; The camera&amp;#8217;s so small with the kit 20mm &lt;em&gt;f&lt;/em&gt;/1.7 lens that I stopped using the UV filter with it, because I didn&amp;#8217;t like the 2-3mm that the filter added to the camera depth.  Here&amp;#8217;s a size comparison of the Nikon &lt;span class=&quot;caps&quot;&gt;D3000 &lt;/span&gt;vs the &lt;span class=&quot;caps&quot;&gt;GF1.&lt;/span&gt;&lt;/p&gt;&lt;img class=&quot;imageStyle&quot; alt=&quot;gf1vsd3000v2-001&quot; src=&quot;http://algorithm.com.au/blog/files/gf1vsd3000v2-001.jpg&quot; width=&quot;480&quot; height=&quot;284&quot; /&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;(Image stolen from dpreview.com&amp;#8217;s review.)&lt;/p&gt;

&lt;p&gt;I won&amp;#8217;t write up a comprehensive review of the &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;here; other sites have done that, in much more depth than I can be bothered to go into.  If you&amp;#8217;re after a good review, the three articles that swayed me to the &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;in the end were &lt;a href=&quot;http://www.dpreview.com/reviews/panasonicgf1/&quot;&gt;DPreview&amp;#8217;s review&lt;/a&gt;, and &lt;a href=&quot;http://craigmod.com/journal/gf1-fieldtest/&quot;&gt;Craig Mod&amp;#8217;s &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;photo field test article&lt;/a&gt; and &lt;a href=&quot;http://craigmod.com/journal/gf1-fieldtest-video/&quot;&gt;video tests&lt;/a&gt;.  What follows is my own impressions and experiences of using the camera.  The one-sentence summary: the &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;perfect for a &lt;span class=&quot;caps&quot;&gt;DSLR &lt;/span&gt;newbie like me, the micro four-thirds lens system it uses looks like it has enough legs that your lens investments will be good for the future, and learning photography with the &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;is great and deserves a Unicode snowman: ☃.&lt;/p&gt;

&lt;p&gt;The reason you want the camera is to use the 20mm &lt;em&gt;f&lt;/em&gt;/1.7 lens.  For the non-photography geeks, that means that it&amp;#8217;s not a zoom lens, i.e. you can&amp;#8217;t zoom in and out with it, and the &lt;em&gt;f&lt;/em&gt;/1.7 means that it can take pretty good shots in low light without a flash.  All the reviews of it are right: that lens is what makes the camera so fantastic.  Do not even bother with 14-45mm kit lens.  The 20mm lens is fast enough that you can shoot with it at night, and the focal length&amp;#8217;s versatile enough to take both close-up/portrait shots (whee food porn), and swing out a bit wider for landscape photos or group photos.  It&amp;#8217;s no wide-angle nor zoom and it&amp;#8217;s not a super-fast &lt;em&gt;f&lt;/em&gt;/1.4, but it&amp;#8217;s versatile enough and so tiny that you will end up using it almost all the time.  It feels weird to get a &lt;span class=&quot;caps&quot;&gt;DSLR &lt;/span&gt;and only have one lens for it, but the pancake 20mm lens is so damn good that it&amp;#8217;s all you really need.  The only thing it really can&amp;#8217;t do at all is go super-zoomalicious, for wildlife/distance shots.&lt;/p&gt;&lt;img class=&quot;imageStyle&quot; alt=&quot;APANALE205152951&quot; src=&quot;http://algorithm.com.au/blog/files/apanale205152951.jpg&quot; width=&quot;300&quot; height=&quot;300&quot; /&gt;&lt;p&gt;The 20mm non-zoom (a.k.a. &amp;#8220;prime&amp;#8221;) lens has another advantage: it teaches you to compose.  Despite all the technology and all the geek speak, photography is ultimately about your composition skills.  Prime lenses force you to move around to find the perfect framing for the shot you&amp;#8217;re trying to do; I think learning with a prime lens moves your composition skills along much faster than it would if you were using a standard zoom lens.  If you&amp;#8217;re a photography beginner, like me, shoot with a prime.  It&amp;#8217;s a totally different experience than shooting with a zoom, and you learn a lot more.  Plus, primes are cheap: the &lt;a href=&quot;http://www.amazon.com/Canon-50mm-1-8-Camera-Lens/dp/B00007E7JU/ref=sr_1_1?ie=UTF8&amp;qid=1290392860&amp;sr=8-1&quot;&gt;Canon 50mm &lt;em&gt;f&lt;/em&gt;/1.8&lt;/a&gt; is &lt;span class=&quot;caps&quot;&gt;USD&lt;/span&gt;$100, and Canon&amp;#8217;s near top-of-the-line &lt;a href=&quot;http://www.amazon.com/Canon-Standard-Medium-Telephoto-Cameras/dp/B00009XVCZ/ref=sr_1_1?ie=UTF8&amp;qid=1290392857&amp;sr=8-1&quot;&gt;50mm &lt;em&gt;f&lt;/em&gt;/1.4&lt;/a&gt; is &lt;span class=&quot;caps&quot;&gt;USD&lt;/span&gt;$350.  The &lt;a href=&quot;http://www.amazon.com/Canon-35mm-Wide-Angle-Cameras/dp/B00009XVCU/ref=sr_1_4?ie=UTF8&amp;qid=1290392867&amp;sr=8-4&quot;&gt;Canon 35mm &lt;em&gt;f&lt;/em&gt;/2&lt;/a&gt;, for something that&amp;#8217;s similar in focal length to the Panasonic 20mm prime, is &lt;span class=&quot;caps&quot;&gt;USD&lt;/span&gt;$300.  (You need to multiply the 20mm by 2 to convert between micro four-thirds and 35mm framing, so the actual focal length of the 20mm in traditional camera speak is 20mm*2=40mm.)&lt;/p&gt;

&lt;p&gt;After playing it for a few months, you realise that the &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;is a &lt;em&gt;fun&lt;/em&gt; camera to use.  The combination of the 20mm prime lens, the super-fast focus, the size, and the great UI design just &lt;em&gt;begs&lt;/em&gt; you to take pictures with it.  You &lt;em&gt;feel&lt;/em&gt; like you&amp;#8217;re wielding a real camera rather than a toy: one that wants you to shoot with it.  It&amp;#8217;s not imposing like a bigger &lt;span class=&quot;caps&quot;&gt;DSLR &lt;/span&gt;so it doesn&amp;#8217;t feel like the camera is with you all the time, but it&amp;#8217;s not so small that you feel like you&amp;#8217;re just snipping super-casually with something that&amp;#8217;s cheap.  And did I mention the excellent UI?  It&amp;#8217;s excellent.  The better controls are a good reason to get the &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;over its rivals, the Olympus EP series.&lt;/p&gt;

&lt;p&gt;One big bonus: I&amp;#8217;ve found that the full-auto mode (&amp;#8220;iAuto&amp;#8221; as Panasonic brands it) &lt;em&gt;very&lt;/em&gt; rarely gets stuff wrong.  This is useful if you hand the camera over to someone else who doesn&amp;#8217;t know how to use &lt;span class=&quot;caps&quot;&gt;DSLR&lt;/span&gt;s so that they can take a picture of you&amp;hellip; or, like me, if you just don&amp;#8217;t know quite what aperture/shutter speeds to use for the particular shot you&amp;#8217;re taking.  The full-auto just adds to the joy of using it.  I usually shoot in full-auto or aperture priority mode, but honestly, I could probably shoot on full-auto mode all the time.  I can&amp;#8217;t recall a single occasion where it didn&amp;#8217;t guess &lt;em&gt;f&lt;/em&gt;/1.7 or a landscape correctly.&lt;/p&gt;

&lt;p&gt;Do follow DPreview and Craig Mod&amp;#8217;s advice and shoot &lt;span class=&quot;caps&quot;&gt;RAW, &lt;/span&gt;not &lt;span class=&quot;caps&quot;&gt;JPEG. &lt;/span&gt; Honestly, I&amp;#8217;d prefer to shoot &lt;span class=&quot;caps&quot;&gt;JPEG &lt;/span&gt;if I could, but &lt;span class=&quot;caps&quot;&gt;RAW &lt;/span&gt;lets you turn some bad shots into good shots.  I use it because gives you a second chance, not because I want to maximise picture quality.  Here&amp;#8217;s one photo that was accidentally taken with the wrong settings: I had the camera on full-manual mode, and didn&amp;#8217;t realise that the shutter speed and &lt;span class=&quot;caps&quot;&gt;ISO &lt;/span&gt;settings were totally incorrect.&lt;/p&gt;&lt;img class=&quot;imageStyle&quot; alt=&quot;Screen shot 2010-11-16 at 10.08.56 PM&quot; src=&quot;http://algorithm.com.au/blog/files/screen-shot-2010-11-16-at-10.08.56-pm.png&quot; width=&quot;398&quot; height=&quot;640&quot; /&gt;&lt;p&gt;However, since I shot it in &lt;span class=&quot;caps&quot;&gt;RAW,&lt;/span&gt; I could lift up the exposure up two stops, pulled up the shadows and pulled down the highlights, and here&amp;#8217;s the result:&lt;/p&gt;&lt;img class=&quot;imageStyle&quot; alt=&quot;Screen shot 2010-11-16 at 10.08.44 PM&quot; src=&quot;http://algorithm.com.au/blog/files/screen-shot-2010-11-16-at-10.08.44-pm.png&quot; width=&quot;396&quot; height=&quot;640&quot; /&gt;&lt;p&gt;Seriously, that&amp;#8217;s just frickin&amp;#8217; amazing.  Sure, that photo might not be super-awesome: it&amp;#8217;s a little grainy, and it looks a bit post-processed if you squint right, but it&amp;#8217;s still a photo of a precious memory that I wouldn&amp;#8217;t have otherwise had, and you know what?  That photo&amp;#8217;s just &lt;em&gt;fine&lt;/em&gt;.  If I shot &lt;span class=&quot;caps&quot;&gt;JPEG,&lt;/span&gt; I would&amp;#8217;ve had no choice but to throw it away.  &lt;span class=&quot;caps&quot;&gt;RAW&amp;#8217;&lt;/span&gt;s a small pain in the arse since the file sizes are far bigger and you need to wait a long time for your computer to do the &lt;span class=&quot;caps&quot;&gt;RAW &lt;/span&gt;processing if you&amp;#8217;ve taken hundreds of photos, but boy, it&amp;#8217;s worth it.&lt;/p&gt;

&lt;p&gt;I did finally buy a wide-angle lens for the &lt;span class=&quot;caps&quot;&gt;GF1&lt;/span&gt;&amp;#8212;the &lt;a href=&quot;http://www.amazon.com/Olympus-ED-9-18mm-Panasonic-Interchangeable/dp/B0035LBRM6/ref=sr_1_2?s=electronics&amp;ie=UTF8&amp;qid=1290393299&amp;sr=1-2&quot;&gt;Olympus 9-18mm &lt;em&gt;f&lt;/em&gt;/4-5.6&lt;/a&gt;&amp;#8212;and have been using it a lot for landscape shots.  I bought the Olympus 9-18mm over the &lt;a href=&quot;http://www.amazon.com/Panasonic-7-14mm-Micro-Four-Thirds/dp/B0028Y5GKK/ref=sr_1_1?s=electronics&amp;ie=UTF8&amp;qid=1290393368&amp;sr=1-1&quot;&gt;Panasonic 7-14 &lt;em&gt;f&lt;/em&gt;/4.0&lt;/a&gt; because it was cheaper, and also smaller.  I figured that if I was getting a &lt;span class=&quot;caps&quot;&gt;GF1, &lt;/span&gt;it was because I wanted something compact, so I wanted to keep the lenses as small as possible.  (Otherwise, if you don&amp;#8217;t care about size, then a full-blown Canon or Nikon &lt;span class=&quot;caps&quot;&gt;DSLR &lt;/span&gt;would probably serve you much better.)  I&amp;#8217;ve always wanted a wide-angle lens from the first day that I asked &amp;#8220;how do those real estate agents make those rooms look so bloody large?&amp;#8221;, so now I have one, woohoo.  The next lens on my shopping will probably be the &lt;a href=&quot;http://www.amazon.com/gp/product/B001ISKNKA/ref=ord_cart_shr?ie=UTF8&amp;m=ATVPDKIKX0DER&quot;&gt;Panasonic 45-200mm&lt;/a&gt;.  (Never mind the quality, feel the price!)  Here&amp;#8217;s a shot taken with the Olympus 9-18mm; click through to see the original picture on Flickr.&lt;/p&gt;&lt;a href=&quot;http://www.flickr.com/photos/andrepang/5184066974/sizes/l/in/set-72157625407002566/&quot; rel=&quot;self&quot;&gt;&lt;img class=&quot;imageStyle&quot; alt=&quot;5184066974_c47f169921_z&quot; src=&quot;http://algorithm.com.au/blog/files/5184066974_c47f169921_z.jpg&quot; width=&quot;480&quot; height=&quot;321&quot; /&gt;&lt;/a&gt;&lt;p&gt;The main thing that I wish for in a future version of the camera would be image stabilisation.  Panasonic follow the Canon path and put image stabilisation in the lens, rather than in the body.  I think Olympus made the right decision by putting image stabilisation in the body for their compact &lt;span class=&quot;caps&quot;&gt;DSLR&lt;/span&gt;s; you can keep the lenses smaller that way, and you then get image stabilisation with all your lenses instead of the ones that only support it explicitly, e.g. the 20mm &lt;em&gt;f&lt;/em&gt;/1.7 prime doesn&amp;#8217;t have image stabilision, boo.  In-body image stabilisation just seems more in-line with the size reduction goal for micro four-thirds cameras.  I&amp;#8217;d love to get my hands on an Olympus EP for a week and shoot with the 20mm to see if image stabilisation makes a difference when it&amp;#8217;s dark and the environment is starting to challenge the &lt;em&gt;f&lt;/em&gt;/1.7 speeds.&lt;/p&gt;

&lt;p&gt;The only other thing I wish for would be a better sensor.  The &lt;span class=&quot;caps&quot;&gt;GF1&amp;#8217;&lt;/span&gt;s great up to &lt;span class=&quot;caps&quot;&gt;ISO&lt;/span&gt; 800: at &lt;span class=&quot;caps&quot;&gt;ISO&lt;/span&gt; 1600+, it starts getting grainy.  1600 is acceptable, and you can do wondrous things with the modern noise reduction algorithms that are in Lightroom if you really need to save a shot.  Shoot at &lt;span class=&quot;caps&quot;&gt;ISO&lt;/span&gt; 3200+ though, and it&amp;#8217;s just too grainy.  This is the main advantage that more traditional &lt;span class=&quot;caps&quot;&gt;DSLR&lt;/span&gt;s have: their larger sensors are simply better than the &lt;span class=&quot;caps&quot;&gt;GF1&amp;#8217;&lt;/span&gt;s.  I&amp;#8217;ve seen shots taken with a Nikon &lt;span class=&quot;caps&quot;&gt;D50 &lt;/span&gt;at &lt;span class=&quot;caps&quot;&gt;ISO&lt;/span&gt; 6400 in the dark because a slower &lt;em&gt;f&lt;/em&gt;/4 lens was being used, and bam, the shot comes out fine.  Don&amp;#8217;t even try to compare this thing to a Canon 5D Mk &lt;span class=&quot;caps&quot;&gt;II. &lt;/span&gt; The &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;just can&amp;#8217;t do high &lt;span class=&quot;caps&quot;&gt;ISO. &lt;/span&gt; Here&amp;#8217;s an &lt;span class=&quot;caps&quot;&gt;ISO&lt;/span&gt; 3200 shot, which is just starting to get a little too grainy.  It&amp;#8217;s fine for Facebook-sized images, but if you click through to the original, you&amp;#8217;ll see it&amp;#8217;s noisy.&lt;/p&gt;&lt;a href=&quot;http://www.flickr.com/photos/andrepang/4272427230/sizes/l/in/set-72157623076226769/&quot; rel=&quot;self&quot;&gt;&lt;img class=&quot;imageStyle&quot; alt=&quot;4272427230_c249fcdf92_z&quot; src=&quot;http://algorithm.com.au/blog/files/4272427230_c249fcdf92_z.jpg&quot; width=&quot;480&quot; height=&quot;321&quot; /&gt;&lt;/a&gt;&lt;p&gt;But y&amp;#8217;know, despite the two nitpicks above, the &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;is a fine camera, and the 20mm &lt;em&gt;f&lt;/em&gt;/1.7 lens is an amazing do-it-all lens that&amp;#8217;s absolutely perfect to learn with.  There&amp;#8217;s really nothing else out there like it except for the Olympus EP range (the &lt;a href=&quot;http://www.amazon.com/Olympus-Interchangeable-Lens-14-42mm-Silver/dp/B002CGSYKS/ref=sr_1_1?ie=UTF8&amp;qid=1290406838&amp;sr=8-1&quot;&gt;EP-1&lt;/a&gt;, &lt;a href=&quot;http://www.amazon.com/Olympus-Interchangeable-Digital-14-42mm-Electronic/dp/B002UXRG8Y/ref=sr_1_1?ie=UTF8&amp;qid=1290406841&amp;sr=8-1&quot;&gt;EP-2&lt;/a&gt; and &lt;a href=&quot;http://www.amazon.com/Olympus-Interchangeable-Digital-14-42mm-Black/dp/B0035LBRJO/ref=sr_1_1?ie=UTF8&amp;qid=1290406844&amp;sr=8-1&quot;&gt;&lt;span class=&quot;caps&quot;&gt;EPL&lt;/span&gt;-1&lt;/a&gt;), which you should definitely consider, but get it with the 20mm &lt;em&gt;f&lt;/em&gt;/1.7 lens if you do.  I&amp;#8217;ve had a total blast learning photography with the &lt;span class=&quot;caps&quot;&gt;GF1, &lt;/span&gt;and I&amp;#8217;ve captured hundreds of memories in the past year that made the investment completely worthwhile.  I don&amp;#8217;t think I&amp;#8217;m at the point yet where I feel like I need another camera yet, but it feels good knowing that the micro four-thirds format will be around for a while so that I can use my existing lenses with future cameras I buy.  If you&amp;#8217;re interested in learning photography, the &lt;span class=&quot;caps&quot;&gt;GF1 &lt;/span&gt;is a fantastic starting point.&lt;/p&gt;</content>
		<author>
			<name>André Pang</name>
			<uri>http://algorithm.com.au/index.html</uri>
		</author>
		<source>
			<title type="html">Stay Hungry, Stay Foolish</title>
			<subtitle type="html">André Pang's Blog</subtitle>
			<link rel="self" href="http://algorithm.com.au/blog/files/rss.xml"/>
			<id>http://algorithm.com.au/blog/files/rss.xml</id>
			<updated>2011-11-23T18:30:22+00:00</updated>
			<rights type="html">© 2006-2007 André Pang</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Photo Gallery Augmented</title>
		<link href="http://horms.org/pleb_blossom/permalink/2010/2010-11-21T17_15_30.shtml"/>
		<id>http://horms.org/pleb_blossom/permalink/2010/2010-11-21T17_15_30.shtml</id>
		<updated>2010-11-21T08:15:30+00:00</updated>
		<content type="html">&lt;a href=&quot;http://horms.org/gallery/hikari-2010-11/a/5_8459_s.shtml&quot;&gt;
				&lt;img src=&quot;http://horms.org/pleb_blossom/pics/5_8459.jpg&quot; width=&quot;79&quot; height=&quot;120&quot; alt=&quot;[Hikari]&quot; align=&quot;right&quot; /&gt;&lt;/a&gt;
				&lt;p&gt;
				After a bit of a hiatus
				I have updated my &lt;a href=&quot;http://horms.org/gallery/&quot;&gt;photo gallery&lt;/a&gt;.
				&lt;ul&gt;
				&lt;li&gt; &lt;a href=&quot;http://horms.org/gallery/hikari-2010-11/&quot;&gt;Hikari November 2010&lt;/a&gt; - Happy first birthday!
				&lt;li&gt; &lt;a href=&quot;http://horms.org/gallery/hikari-2010-10/&quot;&gt;Hikari October 2010&lt;/a&gt;
				&lt;li&gt; &lt;a href=&quot;http://horms.org/gallery/hikari-2010-10/&quot;&gt;Hikari October 2009&lt;/a&gt;
				&lt;li&gt; &lt;a href=&quot;http://horms.org/gallery/nikko-2010-11/&quot;&gt;Nikko&lt;/a&gt; (Featuring Hikari)
				&lt;li&gt; &lt;a href=&quot;http://horms.org/gallery/shirakawa-go-2010-10/&quot;&gt;Shirakawa-go&lt;/a&gt; (With special guest, Hikari)
				&lt;li&gt; &lt;a href=&quot;http://horms.org/gallery/seville-2010-10/&quot;&gt;Seville&lt;/a&gt;
				&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ul&gt;
				&lt;br clear=&quot;right&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>Simon Horman</name>
			<uri>http://horms.org/</uri>
		</author>
		<source>
			<title type="html">Horms</title>
			<subtitle type="html">Themable Horms!</subtitle>
			<link rel="self" href="http://www.vergenet.net/~horms/pleb_blossom/rss.xml"/>
			<id>http://www.vergenet.net/~horms/pleb_blossom/rss.xml</id>
			<updated>2012-03-20T13:30:41+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">FP-Syd #29.</title>
		<link href="http://www.mega-nerd.com/erikd/Blog/FP-Syd/fp-syd-29.html"/>
		<id>http://www.mega-nerd.com/erikd/Blog/2010/11/16/fp-syd-29.atom</id>
		<updated>2010-11-16T11:12:00+00:00</updated>
		<content type="html">&lt;p&gt;
On Thursday October 21st, we held the 29th meeting of the Sydney Functional
Programming group.
The meeting was held at Google's Sydney offices and we had about 22 people show
up to hear our two presenters.
&lt;/p&gt;

&lt;p&gt;
First up we had
	&lt;a href=&quot;http://benjaminjohnston.com.au/&quot;&gt;
	Benjamin Johnston&lt;/a&gt;
with a presentation titled &lt;i&gt;&quot;How to Dance the Robot&quot;&lt;/i&gt;.
As part of his work an University of Technology here in Sydney, Ben gets to
program robots.
One of the results, is robots that dance (thanks to Mark Wotton for capturing
this video on his iPhone):
&lt;/p&gt;

&lt;br /&gt;&lt;br /&gt;

&lt;center&gt;

	
	

&lt;/center&gt;

&lt;br /&gt;&lt;br /&gt;

&lt;p&gt;
Ben's language of choice is Prolog (not functional but definitely
	&lt;a href=&quot;http://c2.com/cgi/wiki?DeclarativeProgramming&quot;&gt;
	declarative&lt;/a&gt;)
and he used Prolog to tackle the problem of making the programming of a
robot dance easier.
A complete dance might last 3 minutes or more, the music is likely to have a
tempo of around 100 beats per minute and the dance moves are usually timed down
to the half beat.
That means some 600 odd half beat events for a 3 minute dance.
Entering 600 odd events manually would be somewhat tedious.
&lt;/p&gt;

&lt;p&gt;
Ben's solution to this problem was a compiler for a domain specific language
(DSL) which allowed easier specification of the dance in terms of musical
sections, repeated moves etc.
Writing the compiler was made easier by making good use of Prolog's search and
backtracking capabilities and the compiler generated Python output code that
was uploaded to the robot.
&lt;/p&gt;

&lt;p&gt;
Our second presenter for the evening was
	&lt;a href=&quot;http://seanseefried.com/&quot;&gt;
	Sean Seefried&lt;/a&gt;
on the subject of the &lt;i&gt;&quot;The Expression Problem&quot;&lt;/i&gt;, in Haskell.
In Sean's paper (with Manuel M. T. Chakravarty),
	&lt;a href=&quot;http://www.cse.unsw.edu.au/~chak/papers/exp-problem.pdf&quot;&gt;
	&lt;i&gt;&quot;Solving the expression problem with true separate compilation&quot;&lt;/i&gt;&lt;/a&gt;
he describes the expression problem as:
&lt;/p&gt;

&lt;blockquote&gt;&lt;i&gt;
&quot;the difficulty of extending the variants and methods on a data type without
modifying existing code and while respecting separate compilation&quot;
&lt;/i&gt;&lt;/blockquote&gt;

&lt;p&gt;
There are a number of other languages which have solutions to the expression
problem, but Sean's work was the first real Haskell solution.
With the use of multi-parameter type classes, scoped type variables, kind
annotations, zero constructor data types and recursive dictionaries, Sean was
able to make it work with GHC 6.4 and later.
At the end, Sean also presented some ideas to make the solution of this problem
easier and more practical.
&lt;/p&gt;

&lt;p&gt;
A big thanks to Ben and Sean for presenting and Google for providing the
meeting venue and refreshments.
&lt;/p&gt;</content>
		<author>
			<name>Erik de Castro Lopo</name>
			<email>erikd@mega-nerd.com</email>
			<uri>http://www.mega-nerd.com/erikd/Blog</uri>
		</author>
		<source>
			<title type="html">m3ga blog</title>
			<subtitle type="html">An ocassional rant</subtitle>
			<link rel="self" href="http://www.mega-nerd.com/erikd/Blog/index.atom"/>
			<id>http://www.mega-nerd.com/erikd/Blog/index.atom</id>
			<updated>2012-01-29T09:30:23+00:00</updated>
			<rights type="html">Copyright 2006-2010 Erik de Castro Lopo</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">CWE items mapped to Goanna checks</title>
		<link href="http://redlizards.com/blog/uncategorized/cwe-items-mapped-to-goanna-checks/"/>
		<id>http://redlizards.com/blog/?p=568</id>
		<updated>2010-11-15T00:02:36+00:00</updated>
		<content type="html">&lt;p&gt;Common Weakness Enumeration (CWE) is a widely accepted, community-developed list of general software vulnerabilities. The CWE website, which contains detailed definitions of each weakness, is &lt;a title=&quot;CWE&quot; href=&quot;http://cwe.mitre.org/index.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Over the last couple of weeks, I&amp;#8217;ve been looking into how Goanna maps to the current CWE list. That is, for each of Goanna&amp;#8217;s (currently) 100 checks, I&amp;#8217;ve reported the CWE items that may be the cause of a warning. I&amp;#8217;ve also reported on the mapping in the other direction: for each CWE item, the checks that may report on it are listed. These two mappings are tabulated below.&lt;/p&gt;
&lt;p&gt;The table on the left lists all the CWE items that are identified by Goanna, along with each check that may warn about code with each weakness. Code with one of the listed weaknesses will not necessarily fail each associated check, but it may fail some. This table is useful for identifying the checks that are designed to find certain weaknesses. This may help identify the checks that should be enabled or disabled, in order to get the most useful feedback from Goanna.&lt;/p&gt;
&lt;p&gt;The table on the right lists each check performed by Goanna, along with each CWE item that may cause the check to fail and yield a warning. The table can be useful for identifying the potential weaknesses in code, based on the warning that Goanna provides.&lt;/p&gt;
&lt;p&gt;In the Goanna userguides with the next release, the relevant CWE IDs (from the table on the right) will appear with the detailed descriptions of each check. These two tables will also be included, and updated as more checks are added.&lt;/p&gt;
&lt;p&gt;These results are comparable to thosee market-leading analysis tools, and while there is some overlap, there are many CWE items that some leading tools don&amp;#8217;t find, such as mismatching the standard and array versions of the new and delete operators, dismissing return values of certain library functions, and the use of uninitialized pointers, just to name a few.&lt;/p&gt;
&lt;p&gt;Goanna can currently identify 41 CWE items, including many of the most serious (null pointer dereferences, memory leaks and array index violations), and 61% of our current checks identify the existence of at least one of these vulnerabilities.  Combine this with our relatively low rate of false positives compared to competing tools, and it&amp;#8217;s easy to see that Goanna is essential for efficiently finding the most serious vulnerabilities in any software project.&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-568&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table border=&quot;0&quot; cellspacing=&quot;0&quot; frame=&quot;VOID&quot; rules=&quot;NONE&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;60&quot; height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;strong&gt;CWE ID&lt;/strong&gt;&lt;/td&gt;
&lt;td width=&quot;157&quot; align=&quot;LEFT&quot;&gt;&lt;strong&gt;Goanna check name&lt;/strong&gt;&lt;/td&gt;
&lt;td width=&quot;166&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td width=&quot;160&quot; align=&quot;LEFT&quot;&gt;&lt;strong&gt;Goanna check name&lt;/strong&gt;&lt;/td&gt;
&lt;td width=&quot;123&quot; align=&quot;LEFT&quot;&gt;&lt;strong&gt;CWE mapping&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;120&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-inv-index&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-inv-index&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;120, 121, 805&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-inv-index-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-inv-index-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;120, 121, 119, 805&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;121&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-inv-index&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-neg-index&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;124&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-inv-index-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-cmp-float&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;124&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-neg-index&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-cmp-unsign-neg&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;193&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-inv-index-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-cmp-unsign-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;252&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;LIB-return-leak&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-div-0&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;369&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;369&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-div-0&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-div-0-aft-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;369&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-div-0-aft-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-div-0-aft-cmp&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;369&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-div-0-aft-cmp&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-div-0-bef-cmp&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;369&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-div-0-bef-cmp&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-div-0-interval&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;369&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-div-0-interval&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-inc-bool&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;394&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;LIB-return-leak&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-neg-check-nonneg&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;401&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-lose-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-neg-check-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-unused-val-ptr&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-shift-bounds&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;404&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-delete-array-op&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-shift-bounds-zero&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-delete-op&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-sizeof-by-sizeof&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-free-op&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;COP-alloc-ctor&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;415&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-double-free&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;COP-assign-op&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;416&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-use-free-all&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;COP-assign-op-ret&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-use-free-some&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;COP-assign-op-self&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;456&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;COP-member-uninit&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;COP-copy-ctor&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;457&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-uninit-arr-all&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;COP-dealloc-dtor&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-uninit-struct&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;COP-dtor&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-uninit-struct-field&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;COP-init-order&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-uninit-var-all&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;COP-member-uninit&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;456&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-uninit-var-some&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;builtin_ctor_dto_leak&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;466&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-stack-global&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;CPU-ctor-call-virt&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-stack-param&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;CPU-dtor-call-virt&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-stack-param-ref&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;CPU-malloc-class&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;467&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-malloc-sizeof-ptr&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;CPU-nonvirt-dtor&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;476&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-free-some&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;EXP-cond-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;481&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;EXP-dangling-else&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;483&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-assign-fun-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;EXP-loop-exit&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-assign-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;EXP-loop-var-mod&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-cmp-aft&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;EXP-loop-var-uninit&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-cmp-bef&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;EXP-main-ret-int&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-cmp-bef-fun&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;EXP-null-stmt&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-const-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;FPT-arith&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-pos-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;FPT-cmp-null&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;480&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-cmp-float&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;LIB-return-leak&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;252, 394&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-inc-bool&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-delete-array-op&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;404, 762&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ATH-sizeof-by-sizeof&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-delete-op&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;404, 762&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;EXP-null-stmt&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-double-free&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;415&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;FPT-arith&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-free-op&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;404, 762&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;FPT-cmp-null&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-free-some&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-self-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-free-variable&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;590&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;481&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;EXP-cond-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-lose-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;401, 772&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;482&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-no-effect&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-malloc-arith&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;483&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;EXP-dangling-else&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-malloc-sizeof&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;561&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-dead&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-malloc-sizeof-ptr&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;467&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;562&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-ret-stack&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-stack-global&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;466&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;563&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-unused-val&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-stack-param&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;466&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-unused-val-ptr&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-stack-param-ref&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;466&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-unused-var-all&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-use-free-all&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;416&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;570&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-cmp-never&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-use-free-some&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;416&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;571&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-cmp-always&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;POR-imp-cast-subscript&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-const-assign-cond&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;POR-imp-cast-ternary&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-const-expr-cond&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-cmp-str-lit&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;597&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;572&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-const-assign-cond&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-const-expr-cond&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-assign-fun-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;587&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-const-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-assign-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;590&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-free-variable&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-cmp-aft&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;597&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-cmp-str-lit&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-cmp-bef&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;665&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-uninit&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-cmp-bef-fun&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-uninit-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-const-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;476, 587&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;696&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-order&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-null-pos-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;476&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;762&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-delete-array-op&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-param-unchk&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;822&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-delete-op&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-param-unchk-some&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;822&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-free-op&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-uninit&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;665, 824&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;772&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;MEM-lose-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-uninit-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;665, 824&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;805&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-inv-index&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-case-reach&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;ARR-inv-index-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-cmp-always&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;571&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;822&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-param-unchk&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-cmp-never&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;570&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-param-unchk-some&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-const-assign-cond&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;571, 572&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;824&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-uninit&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-const-expr-cond&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;571, 572&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;PTR-uninit-pos&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-dead&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;561&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-expr&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-local-hides-global&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-local-hides-local&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-local-hides-member&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-local-hides-param&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-no-effect&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;482&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-self-assign&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;480&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-unused-param&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-unused-val&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;563&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-unused-val-ptr&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;401, 563&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;RED-unused-var-all&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;563&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SEM-const-call&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SME-const-global&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SEM-pure-call&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SEM-pure-global&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-order&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;696&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-ret-stack&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;562&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;16&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-return&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-uninit-arr-al&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;457&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-uninit-struct&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;457&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-uninit-struct-field&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;457&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-uninit-var-all&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;457&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td height=&quot;17&quot; align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;SPC-uninit-var-some&lt;/td&gt;
&lt;td align=&quot;LEFT&quot;&gt;457&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Why Static Analysis is Not Another Episode of CSI</title>
		<link href="http://redlizards.com/blog/uncategorized/why-static-analysis-is-not-another-episode-of-csi/"/>
		<id>http://redlizards.com/blog/?p=564</id>
		<updated>2010-11-10T01:24:27+00:00</updated>
		<content type="html">&lt;p&gt;Static analysis of the past has been like an episode of CSI. Some guys in specially marked uniforms enter the scene and photograph memory leaks, establish attack vectors and scrape some dangling pointers off the ceiling. Then they go back to the lab and try to figure out what happened. It&amp;#8217;s a post-mortem investigation of something that went horribly wrong.&lt;/p&gt;
&lt;p&gt;This could be the tale of a real mission critical bug in the wild or just something that slipped through until final system testing. By any means it probably indicates that someone or something got burned. While many of our customers use our Goanna static analysis tools to establish final code quality or to do some forensic analysis, there are also many opportunities for prevention available that are often overlooked.&lt;/p&gt;
&lt;p&gt;We carefully designed Goanna Central and Goanna Studio for two different purposes: Goanna Central can be quickly integrated into the build process and invoked either nightly or at the finish of a project. In any case it gives you an accurate snapshot of your code confidence. This is a must. But ideally, you want your code as clean as possible before it moves upstream in the SDLC. Just imagine how much could be saved by only committing &amp;#8220;non-lethal&amp;#8221; code to your project; If developers are empowered and can fix code right when they produce it. No more blame games.&lt;/p&gt;
&lt;p&gt;We at Red Lizard Software really believe that the maximum value of static analysis tools comes from their usage by developers on an everyday and even every minute base. We try to make deep static analysis ridiculously easy. Checks that still required dedicated severs a few years ago will run on simple laptops with Goanna Studio today.&lt;/p&gt;
&lt;p&gt;The advantages are clear: Developers can fix bugs before they are committed, development-testing periods are drastically reduced and products can hit the market sooner with higher quality. Maybe one day we will not need the CSI guys at all.&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Quickly searching Hackage and Hoogle on Mac OS X</title>
		<link href="http://justtesting.org/quickly-searching-hackage-and-hoogle-on-mac-o"/>
		<id>http://justtesting.org/quickly-searching-hackage-and-hoogle-on-mac-o</id>
		<updated>2010-11-04T11:45:00+00:00</updated>
		<content type="html">&lt;p&gt;
	&lt;div&gt;Haskellers on Macs should check out&amp;nbsp;&lt;a href=&quot;http://www.alfredapp.com/&quot;&gt;Alfred App&lt;/a&gt;. &amp;nbsp;It's a launcher application that also does web searches and a few other things. &amp;nbsp;In particular, it enables you to define custom searches that you can quickly access with a hot key from wherever you are. &amp;nbsp;I am using the two following custom searches to quickly search through Hackage and Hoogle:&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;hackage &lt;a href=&quot;http://www.google.com/search?hl=en&amp;as_sitesearch=hackage.haskell.org%2Fpackage&amp;as_q={query}&quot;&gt;http://www.google.com/search?hl=en&amp;amp;as_sitesearch=hackage.haskell.org%2Fpackage&amp;amp;as_q={query}&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;hoogle &amp;nbsp;&lt;a href=&quot;http://www.haskell.org/hoogle/?hoogle={query}&quot;&gt;http://www.haskell.org/hoogle/?hoogle={query}&lt;/a&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div&gt;The strings &quot;hackage&quot; and &quot;hoogle&quot; are the keywords, followed by the query strings.&lt;/div&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/quickly-searching-hackage-and-hoogle-on-mac-o&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/quickly-searching-hackage-and-hoogle-on-mac-o#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">A Call For A Filesystem Abstraction Layer</title>
		<link href="http://algorithm.com.au/blog/files/filesystem-abstraction.php#unique-entry-id-609"/>
		<id>http://algorithm.com.au/blog/files/filesystem-abstraction.php#unique-entry-id-609</id>
		<updated>2010-10-24T22:53:11+00:00</updated>
		<content type="html">&lt;p&gt;Filesystems are fundamental things for computer systems: after all, you need to store your data somewhere, somehow.  Modern operating systems largely use the same concepts for filesystems: a file&amp;#8217;s just a bucket that holds some bytes, and files are organised into directories, which can be hierarchical.  Some fancier filesystems keep track of file versions and have record-based I/O, and many filesystems now have multiple streams and extended attributes.  However, filesystem organisation ideas have stayed largely the same over the past few decades.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;d argue that the most important stuff on your machine is your data.  There are designated places to put this data.  On Windows, all the most important stuff on my computer should really live in &lt;code&gt;C:\Documents and Settings\Andre Pang\My Documents&lt;/code&gt;.  In practice, because of lax permissions, almost everyone I know &lt;em&gt;doesn&amp;#8217;t&lt;/em&gt; store their documents there: they splatter it over a bunch of random directories hanging off &lt;code&gt;C:\&lt;/code&gt;, resulting in a giant lovely mess of directories where some are owned by applications and the system, and some are owned by the user.&lt;/p&gt;

&lt;p&gt;Mac OS X is better, but only because I have discipline: &lt;code&gt;/Users/andrep&lt;/code&gt; is where I put my stuff.  However, I&amp;#8217;ve seen plenty of Mac users have data and personal folders hanging off their root directory.  I&amp;#8217;m pretty sure that my parents have no idea that &lt;code&gt;/Users/your-name-here&lt;/code&gt; is where you are &lt;em&gt;meant&lt;/em&gt; to put your stuff, and to this day, I&amp;#8217;m not quite sure where my dad keeps all his important documents on his Mac.  I hope it&amp;#8217;s in &lt;code&gt;~/Documents&lt;/code&gt;, but if not, can I blame him?  (UNIX only gets this right because it enforces permissions on you.  Try saving to &lt;code&gt;/&lt;/code&gt; and it won&amp;#8217;t work.  If you argue that this is a good thing, you&amp;#8217;re missing the point of this entire article.)&lt;/p&gt;

&lt;p&gt;One OS that actually got this pretty much correct was classic Mac OS: &lt;em&gt;all&lt;/em&gt; system stuff went into the System folder (which all the Cool Kids named &amp;#8220;System &amp;fnof;&amp;#8221;, of course).  The entire system essentials were contained in just two files: System, and Finder, and you could even copy those files to any floppy disk and make a bootable disk (wow, imagine that).  The entire rest of the filesystem was yours: with the exception of the System folder, you organised the file system as you pleased, rather than the filesystem enforcing a hierarchy on you.  The stark difference in filesystem organisation between classic Mac OS and Mac OS X is largely due to a user-centric approach for Mac OS from the ground-up, whereas Mac OS X had to carry all its UNIX weight with it, so it had to compromise and use a more traditionally organised computer filesystem.&lt;/p&gt;

&lt;p&gt;As an example, in Mac OS X, if you want to delete Photoshop&amp;#8217;s preferences, you delete the &lt;code&gt;~/Library/Preferences/com.adobe.Photoshop.plist&lt;/code&gt; file.  Or; maybe you should call it the Biblioth&amp;egrave;que folder in France (because that&amp;#8217;s what it&amp;#8217;s displayed as in the Finder if you switch to French)&amp;#8230; and why isn&amp;#8217;t the Preferences folder name localised too, and what mere mortal is going to understand why it&amp;#8217;s called com.adobe.Photoshop.plist?  On a technical level, I completely understand why the Photoshop preferences file is in the &lt;code&gt;~/Library/Preferences/&lt;/code&gt; directory.  But at a user experience level, this is a giant step backwards from Mac OS, where you simply went to the System folder and you trashed the Adobe Photoshop Preferences file there.  How is this progress?&lt;/p&gt;

&lt;p&gt;I think the fundamental problem is that Windows Explorer, Finder, Nautilus and all the other file managers in the world are designed, by definition, to browse the filesystem.  However, what we really want is an abstraction level for users that hides the filesystem from them, and only shows them relevant material, organised in a way that&amp;#8217;s sensible for them.  The main &amp;#8220;file managers&amp;#8221; on desktop OSs (Finder and Windows Explorer) should be operating at an abstraction level above the filesystem.  The operating system should figure out where to put files on a technical (i.e. filesystem) level, but the filesystem hierarchy should be completely abstracted so that a user doesn&amp;#8217;t even realise their stuff is going into &lt;code&gt;/Users/joebloggs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;iTunes and iPhoto are an example of what I&amp;#8217;m advocating, because they deal with all the file management for you.  You don&amp;#8217;t need to worry where your music is or how your photos are organised on the filesystem: you just know about songs and photos.  There&amp;#8217;s no reason why this can&amp;#8217;t work for other types of documents too, and there&amp;#8217;s no reason why such an abstracted view of the filesystem can&amp;#8217;t work on a systemwide basis.  It&amp;#8217;s time for the operating system to completely abstract out the filesystem from the user experience, and to turn our main interaction with our documents&amp;#8212;i.e. the Finder, Windows Explorer et al&amp;#8212;into something that abstracts away the geek details to a sensible view of the documents that are important to us.&lt;/p&gt;

&lt;p&gt;One modern operating system has already done this: iOS.  iOS is remarkable for being an OS that I often forget is a full-fledged UNIX at its heart.  In the iOS user experience, the notion of files is completely gone: the only filenames you ever see are usually email attachments.  You think about things as photos, notes, voice memos, mail, and media; not files.  I&amp;#8217;d argue that this is a huge reason that users find an iPhone and iPad much more &lt;em&gt;simple&lt;/em&gt; than a &amp;#8220;real&amp;#8221; computer: the OS organises the files for them, so they don&amp;#8217;t have to think that a computer deals with files.  A computer deal with photos and music instead.&lt;/p&gt;

&lt;p&gt;There are problems with the iOS approach: the enforced sandboxing per app means that you can&amp;#8217;t share files between apps, which is one of the most powerful (and useful) aspects of desktop operating systems.  This is a surmountable goal, though, and I don&amp;#8217;t think it&amp;#8217;d be a difficult task to store documents that can be shared between apps.  After all, it&amp;#8217;s what desktop OSs do today: the main challenge is in presenting a view of the files that are sensible for the user.  I don&amp;#8217;t think we can&amp;#8212;nor should&amp;#8212;banish files, since we still need to serialise all of a document&amp;#8217;s data into a form that&amp;#8217;s easily transportable.  However, a file manager should be metadata-centric and display document titles, keywords, and tags rather than filenames.  For many documents, you can derive a filename from its metadata that you can then use to transport the file around.&lt;/p&gt;

&lt;p&gt;We&amp;#8217;ve tried making the filesystem more amenable to a better user experience by adding features such as extended attributes (think Mac OS type/creator information), and querying and indexing features, ala BFS.  However, with the additional complexity of issues such as display names (i.e. localisation), requiring  directory hierarchies that should remain invisible to users, and the simple but massive baggage of supporting traditional filesystem structures (&lt;code&gt;/bin/&lt;/code&gt; and &lt;code&gt;/lib/&lt;/code&gt; aren&amp;#8217;t going away anytime soon, and make good technical sense), I don&amp;#8217;t think we can shoehorn a filesystem browser anymore into something that&amp;#8217;s friendly for users.  We need a filesystem abstraction layer that&amp;#8217;s system-wide.  iOS has proven that it can be done.  With Apple&amp;#8217;s relentless progress march and willingness to change system APIs, Linux&amp;#8217;s innovation in the filesystem arena and experimentation with the desktop computing metaphor, and Microsoft&amp;#8217;s ambitious plans for Windows 8, maybe we can achieve this sometime in the next decade.&lt;/p&gt;</content>
		<author>
			<name>André Pang</name>
			<uri>http://algorithm.com.au/index.html</uri>
		</author>
		<source>
			<title type="html">Stay Hungry, Stay Foolish</title>
			<subtitle type="html">André Pang's Blog</subtitle>
			<link rel="self" href="http://algorithm.com.au/blog/files/rss.xml"/>
			<id>http://algorithm.com.au/blog/files/rss.xml</id>
			<updated>2011-11-23T18:30:22+00:00</updated>
			<rights type="html">© 2006-2007 André Pang</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">libsndfile Malware on Windows.</title>
		<link href="http://www.mega-nerd.com/erikd/Blog/CodeHacking/libsndfile/malware.html"/>
		<id>http://www.mega-nerd.com/erikd/Blog/2010/10/16/malware.atom</id>
		<updated>2010-10-16T01:11:00+00:00</updated>
		<content type="html">&lt;p&gt;
I just found a very suspicious bit torrent download available here:
&lt;/p&gt;

&lt;center&gt;
&lt;p&gt;
&lt;a href=&quot;http://www.torrentzap.com/torrent/1581031/Libsndfile+%2864-Bit%29+1.0.23&quot;&gt;
    http://www.torrentzap.com/torrent/1581031/Libsndfile+%2864-Bit%29+1.0.23&lt;/a&gt;
&lt;/p&gt;
&lt;/center&gt;

&lt;p&gt;
The file being shared is intended to look like the Windows 64 bit installer for
libsndfile-1.0.23 and seems to be widely available on this and a number of other
torrent sites.
&lt;/p&gt;

&lt;p&gt;
However, the file on the torrent sites is called
&lt;b&gt;&lt;tt&gt;libsndfile-64-bit-1.0.23.exe&lt;/tt&gt;&lt;/b&gt; while the one I distribute is
called
	&lt;a href=&quot;http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.23-w64-setup.exe&quot;&gt;
	&lt;b&gt;&lt;tt&gt;libsndfile-1.0.23-w64-setup.exe&lt;/tt&gt;&lt;/b&gt;&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
I haven't analyzed the torrent version of the file; I simply don't have the
tools or the knowledge to investigate it.
I don't even have access to a machine that runs 64 bit Windows.
The setup file on my website was cross compiled from Linux to 64 bit Windows
using the very wonderful
	&lt;a href=&quot;http://sourceforge.net/projects/mingw-w64/&quot;&gt;
	MinGW w64&lt;/a&gt;
tools and the setup installer created using
	&lt;a href=&quot;http://www.jrsoftware.org/isinfo.php&quot;&gt;
	INNO Setup&lt;/a&gt;
running under
	&lt;a href=&quot;http://www.winehq.org/&quot;&gt;
	Wine&lt;/a&gt;.
However, the file is named differently and has a different md5sum.
That in itself is more than enough reason to be suspicious.
&lt;/p&gt;

&lt;p&gt;
The valid file that I distribute has the following md5 and sha256 sums:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;

    md5sum    : efe73b7cb52724e7db7bb7d6ce145929
    sha256sum : 30896dac1002a7b509b6f4620317dad730d8ad761e4ff0402db5a94b0d4c09a2

&lt;/pre&gt;

&lt;p&gt;
I'm not really aware of how problems like this are addressed on Windows.
Is there a safe, secure, verifiable way of distributing Windows software
packages?
If so, I'd appreciate it if someone could let me know how its done.
&lt;/p&gt;

&lt;p&gt;
For Linux this is much easier.
Firstly, the vast majority of people on Linux install libsndfile via their Linux
distribution.
The person who packages libsndfile for any given distribution grabs the source
code tarball from my
	&lt;a href=&quot;http://www.mega-nerd.com/libsndfile/#Download&quot;&gt;
	web site&lt;/a&gt;.
At the same time they should also grab the GPG signature file and verify that
the source code tarball is correct and valid.
&lt;/p&gt;

&lt;p&gt;
I don't know what happens in all distributions, but in Debian, the person doing
the packaging GPG signs the package before uploading to the Debian servers.
Once the GPG signed package is uploaded, the packager's GPG signature is checked
before it goes into the unstable distribution.
From there the validity of the package is tracked all the way to where an end
user installs it on a machine via the
	&lt;a href=&quot;http://www.debian.org/doc/manuals/securing-debian-howto/ch7#s7.4.1&quot;&gt;
	process documented here&lt;/a&gt;.
This process means that its very difficult to get malware onto a Linux machine
via the distribution's package manager.
&lt;/p&gt;

&lt;p&gt;
I suppose this in one more reason why people should be running Linux rather than
Windows.
&lt;/p&gt;</content>
		<author>
			<name>Erik de Castro Lopo</name>
			<email>erikd@mega-nerd.com</email>
			<uri>http://www.mega-nerd.com/erikd/Blog</uri>
		</author>
		<source>
			<title type="html">m3ga blog</title>
			<subtitle type="html">An ocassional rant</subtitle>
			<link rel="self" href="http://www.mega-nerd.com/erikd/Blog/index.atom"/>
			<id>http://www.mega-nerd.com/erikd/Blog/index.atom</id>
			<updated>2012-01-29T09:30:23+00:00</updated>
			<rights type="html">Copyright 2006-2010 Erik de Castro Lopo</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Unicode support</title>
		<link href="http://redlizards.com/blog/uncategorized/unicode-support/"/>
		<id>http://redlizards.com/blog/?p=560</id>
		<updated>2010-10-15T05:43:23+00:00</updated>
		<content type="html">&lt;p&gt;Goanna now supports Unicode filenames in a principled way.  Until now, we allowed Latin-1 names in the Visual Studio versions of Goanna by using an ad hoc encoding.  While that approach was effective for many languages, it left us unable to support languages with non-Latin-1 character sets.&lt;/p&gt;
&lt;p&gt;Thanks to the authors of the &lt;a href=&quot;http://camomile.sourceforge.net/&quot;&gt;Camomile library&lt;/a&gt; for the OCaml language, which allows us to work with Unicode directly.&lt;/p&gt;
&lt;p&gt;For Eclipse and command-line users of Goanna, you get Unicode support if your terminal program is set to use UTF-8.  That seems to be the default in recent Linux distros.&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">Accelerating Haskell Array Codes with Multicore GPUs</title>
		<link href="http://justtesting.org/accelerating-haskell-array-codes-with-multico"/>
		<id>http://justtesting.org/accelerating-haskell-array-codes-with-multico</id>
		<updated>2010-10-12T05:26:54+00:00</updated>
		<content type="html">&lt;p&gt;
	In the paper&amp;nbsp;&lt;a href=&quot;http://www.cse.unsw.edu.au/~chak/papers/CKLM+10.html&quot;&gt;Accelerating Haskell Array Codes with Multicore GPUs&lt;/a&gt;, we describe &lt;i&gt;Accelerate&lt;/i&gt;, embedded language for array computations in Haskell, as well as a dynamic code generator targeting NVIDIA's CUDA GPGPU programming environment. &amp;nbsp;Our CUDA code generator is based on the idea of algorithmic skeletons for parallel programming, minimises re-compilation overheads, and overlaps host-to-device data transfers, code generation, and kernel execution.&lt;p&gt;&lt;/p&gt;&lt;div&gt;The paper outlines our embedding in Haskell, details the design and implementation of the dynamic code generator, and reports on initial benchmark results. &amp;nbsp;These results indicate that we can compete with moderately optimised native CUDA code, while enabling much simpler source programs.&lt;/div&gt;
	
&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://justtesting.org/accelerating-haskell-array-codes-with-multico&quot;&gt;Permalink&lt;/a&gt; 

	| &lt;a href=&quot;http://justtesting.org/accelerating-haskell-array-codes-with-multico#comment&quot;&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt;

&lt;/p&gt;</content>
		<author>
			<name>Manuel Chakravarty</name>
			<uri>http://justtesting.org</uri>
		</author>
		<source>
			<title type="html">Just Testing</title>
			<subtitle type="html">Lambda Science</subtitle>
			<link rel="self" href="http://justtesting.org/rss"/>
			<id>http://justtesting.org/rss</id>
			<updated>2012-05-14T22:30:24+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">The (Problems with the) RF64 File Specification.</title>
		<link href="http://www.mega-nerd.com/erikd/Blog/CodeHacking/libsndfile/rf64_specs.html"/>
		<id>http://www.mega-nerd.com/erikd/Blog/2010/10/07/rf64_specs.atom</id>
		<updated>2010-10-07T10:36:00+00:00</updated>
		<content type="html">&lt;p&gt;
One of the very common sound file formats that
	&lt;a href=&quot;http://www.mega-nerd.com/libsndfile/&quot;&gt;
	libsndfile&lt;/a&gt;
reads and writes is the
	&lt;a href=&quot;http://en.wikipedia.org/wiki/WAV&quot;&gt;
	WAV&lt;/a&gt;
format.
This format uses unsigned 32 bit integers internally to specify chunk lengths
which limits the total size of well formed file to be about 4 gigabytes in size.
On modern systems with high bit widths, multiple channels and high sample rates,
this 4Gig limit can be run into very easily.
For instance at a sample rate of 96kHz, with 24 bit samples, a 5.1 surround
sound recording will run into the 4Gig limit after about 41 minutes.
&lt;/p&gt;

&lt;p&gt;
In order to overcome the limitations of WAV, the
	&lt;a href=&quot;http://www.ebu.ch/&quot;&gt;
	European Broadcasting Union&lt;/a&gt;
decided in 2006 to start the specification of an extended WAV file format
capable of handling 64 bit file offsets.
The document that resulted from this specification process was first released in
2006 and the latest update was made in 2009 and is
	&lt;a href=&quot;http://tech.ebu.ch/docs/tech/tech3306-2009.pdf&quot;&gt;
	available here&lt;/a&gt;.
I have a number of problems with this specification document.
&lt;/p&gt;

&lt;p&gt;
First and foremost, in section 3.5, the document states:
&lt;/p&gt;

&lt;blockquote&gt;&lt;i&gt;
In spite of higher sampling frequencies and multi-channel audio, some production
audio files will inevitably be smaller than 4 Gbyte and they should therefore
stay in Broadcast Wave Format.
&lt;br /&gt;&lt;br /&gt;
The problem arises that a recording application cannot know in advance whether
the recorded audio it is compiling will exceed 4 Gbyte or not at end of
recording (i.e. whether it needs to use RF64 or not).
&lt;br /&gt;&lt;br /&gt;
The solution is to enable the recording application to switch from BWF to RF64
on the fly at the 4 Gbyte size-limit, while the recording is still going on.
&lt;br /&gt;&lt;br /&gt;
This is achieved by reserving additional space in the BWF by inserting a 'JUNK'
chunk 3 that is of the same size as a 'ds64' chunk. This reserved space has no
meaning for Broadcast Wave, but will become the 'ds64' chunk, if a transition
to RF64 is necessary.
&lt;/i&gt;&lt;/blockquote&gt;

&lt;p&gt;
In short, the suggestion above for writing a file boils down to:
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the file and write a RIFF/WAV file header with a JUNK section big
	enough to allow the header to be replaced with an RF64 header if needed.
	&lt;/li&gt;
&lt;li&gt;If the file ends up bigger than 4 gigabytes, go back and replace the
	existing header with an RF64 header.
	&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
There are two problems with this suggestion; it makes testing difficult and it
makes the software more complex which means its more likely to contain bugs.
The testing problem arises because testing that the RF64 header is written
correctly can only be done by writing a 4 gigabyte file.
Programmers can then either choose not to test this (which means the software is
is highly unlikely to work as specified) or test write a full 4 Gig file.
However, programmers also want their tests to run quickly (so that they can be
run often) and writing 4 gigabytes of data to disk is definitely not going to
be quick.
Of course, a smaller unit test might be able to bypass the requirement of
writing 4 gigabytes, but it would still be prudent to do a real test at the
WAV to RF64 switch over point.
The complexity problem is simply that writing a WAV file header first and then
overwriting it with an RF64 header later is far more complicated than just
writing an RF64 header to begin with.
Complexity breeds bugs.
&lt;/p&gt;

&lt;p&gt;
The libsndfile project has had, from the very beginning, a pretty comprehensive
test suite and the running of that test suite takes about 30 seconds on current
hardware.
In order to comprehensively test the reading and writing of RF64 files,
libsndfile disregards the rather silly suggestion of the EBU to convert on the
fly between WAV and RF64 files.
If the software calling libsndfile specifies that an RF64 file be generated,
libsndfile will write an RF64 file, even if that file only contains 100 bytes.
&lt;/p&gt;

&lt;p&gt;
A second problem with the RF64 specification is that the specification is
ambiguous in a very subtle way.
The problem is with how the binary chunks within the file are specified.
For WAV files, chunks are specified in
	&lt;a href=&quot;http://www-mmsp.ece.mcgill.ca/documents/audioformats/wave/Docs/riffmci.pdf&quot;&gt;
	this document&lt;/a&gt;
as:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  typedef unsigned long DWORD ;
  typedef unsigned char BYTE ;

  typedef DWORD FOURCC ;            // Four-character code
  typedef FOURCC CKID ;             // Four-character-code chunk identifier
  typedef DWORD CKSIZE ;            // 32-bit unsigned size value

  typedef struct {                  // Chunk structure
      CKID        ckID ;                   // Chunk type identifier
      CKSIZE      ckSize ;                 // Chunk size field (size of ckData)
      BYTE        ckData [ckSize] ;        // Chunk data
  } CK;

&lt;/pre&gt;

&lt;p&gt;
This specifies that a chunk has a 4 byte identifier, followed by a 4 byte chunk
size, followed by the chunk data.
The important thing to note here is that the chunk size does not include the
4 byte chunk identifier and the 4 byte chunk size field.
Inspecting real WAV files found in the wild will confirm that this is the case
for all common chunks found in WAV files.
&lt;/p&gt;

&lt;p&gt;
Now contrast the above with how the chunks are specified in the EBU document.
Ror instance the &lt;b&gt;&lt;tt&gt;'fmt '&lt;/tt&gt;&lt;/b&gt; chunk (which is common to both WAV and
RF64) is specified as:
&lt;/p&gt;

&lt;pre class=&quot;code&quot;&gt;

  struct FormatChunk5                // declare FormatChunk structure
  {
      char           chunkId[4];     // 'fmt '
      unsigned int32 chunkSize;      // 4 byte size of the 'fmt ' chunk
      unsigned int16 formatType;     // WAVE_FORMAT_PCM = 0x0001, etc.
      unsigned int16 channelCount;   // 1 = mono, 2 = stereo, etc.
      unsigned int32 sampleRate;     // 32000, 44100, 48000, etc.
      unsigned int32 bytesPerSecond; // only important for compressed formats
      unsigned int16 blockAlignment; // container size (in bytes) of one set of samples
      unsigned int16 bitsPerSample;  // valid bits per sample 16, 20 or 24
      unsigned int16 cbSize;         // extra information (after cbSize) to store
      char           extraData[22];  // extra data of WAVE_FORMAT_EXTENSIBLE when necessary
  };

&lt;/pre&gt;

&lt;p&gt;
Here, the &lt;b&gt;&lt;tt&gt;chunkSize&lt;/tt&gt;&lt;/b&gt; field is simply the &lt;i&gt;&quot;size of the 'fmt '
chunk&quot;&lt;/i&gt; and nowhere in the EBU document is it specified exactly how that
&lt;b&gt;&lt;tt&gt;chunkSize&lt;/tt&gt;&lt;/b&gt; field should be calculated.
However, if you give the EBU documentation to any experienced software engineer
with no previous knowledge of RIFF/WAV files, they would almost certainly assume
that the &lt;b&gt;&lt;tt&gt;chunkSize&lt;/tt&gt;&lt;/b&gt; field should be the size of the whole chunk,
including the &lt;b&gt;&lt;tt&gt;chunkID&lt;/tt&gt;&lt;/b&gt; and &lt;b&gt;&lt;tt&gt;chunkSize&lt;/tt&gt;&lt;/b&gt; fields.
However, someone who knows about RIFF/WAV files will be less likely to follow
that path.
&lt;/p&gt;

&lt;p&gt;
This leaves the programmer implementing code to read and write this format with
a couple of possibilities:
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assume that the document is right and should be followed to the letter.
	&lt;/li&gt;
&lt;li&gt;Assume the document is wrong and that the &lt;b&gt;&lt;tt&gt;'fmt '&lt;/tt&gt;&lt;/b&gt; chunk of
	an RF64 file should be identical to that of a WAV file.
	&lt;/li&gt;
&lt;li&gt;&lt;s&gt;Give up and go home.&lt;/s&gt;
	&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
However, the last part of section 3.5 of the EBU/RF64 document describes how a
WAV file is to be upgraded to an RF64 file, and that description makes no
mention of the &lt;b&gt;&lt;tt&gt;'fmt '&lt;/tt&gt;&lt;/b&gt; chunk being modified during that upgrade.
One can only assume from this, that the &lt;b&gt;&lt;tt&gt;'fmt '&lt;/tt&gt;&lt;/b&gt; chunk in an RF64
file should be identical to that of a WAV file and that the EBU/RF64
specification is misleading.
&lt;/p&gt;

&lt;p&gt;
For libsndfile, I have decided to assume that the specification is indeed
misleading.
Unfortunately, I'm pretty sure that at some point I will be asked to at least
&lt;i&gt;read&lt;/i&gt; files which strictly adhere to the literal interpretation of the
document.
I'm also pretty sure that implementing code to read files written to conform to
both interpretations of the spec will be a very painful exercise.
&lt;/p&gt;

&lt;!--
http://www-mmsp.ece.mcgill.ca/documents/audioformats/wave/Docs/riffmci.pdf
http://www-mmsp.ece.mcgill.ca/documents/audioformats/wave/Docs/RIFFNEW.pdf
--&gt;</content>
		<author>
			<name>Erik de Castro Lopo</name>
			<email>erikd@mega-nerd.com</email>
			<uri>http://www.mega-nerd.com/erikd/Blog</uri>
		</author>
		<source>
			<title type="html">m3ga blog</title>
			<subtitle type="html">An ocassional rant</subtitle>
			<link rel="self" href="http://www.mega-nerd.com/erikd/Blog/index.atom"/>
			<id>http://www.mega-nerd.com/erikd/Blog/index.atom</id>
			<updated>2012-01-29T09:30:23+00:00</updated>
			<rights type="html">Copyright 2006-2010 Erik de Castro Lopo</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Distros and Test Suites.</title>
		<link href="http://www.mega-nerd.com/erikd/Blog/CodeHacking/libsndfile/distros_and_test_suites.html"/>
		<id>http://www.mega-nerd.com/erikd/Blog/2010/10/03/distros_and_test_suites.atom</id>
		<updated>2010-10-03T11:58:00+00:00</updated>
		<content type="html">&lt;p&gt;
libsndfile is cross platform and is expected to run on 32 and 64 bit CPUs on
any system that is reasonably POSIX compliant (ie even Windows).
It also has a lot of low level code that does things like endian swapping and
bit shifting etc.
Although I compile and test the code on all the systems I have access to, I
don't have access to everything.
That's why libsndfile has a test suite.
&lt;/p&gt;

&lt;p&gt;
The libsndfile test suite is as comprehensive as I can make it.
Its taken a lot or work, over man years to get to where it is, but has saved me
many times that amount of work tracking obscure bugs.
&lt;/p&gt;

&lt;p&gt;
The test suite is important.
That's why I suggest that anyone building libsndfile from source should run the
test suite before using the library.
This is especially true for people packaging libsndfile for distributions.
That's why is so disappointing to see something like this
	&lt;a href=&quot;https://bugs.gentoo.org/335728&quot;&gt;
	Gentoo bug&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
Gentoo managed to mess up their build meta-data resulting in a libsndfile binary
that was horribly broken on 32 bit systems.
It was broken in such a way that just about every single test in the libsndfile
test suite would have failed.
Unfortunately, since Gentoo didn't run the test suite they distributed their
broken build meta-data to users.
And the users started emailing me with weird bug reports.
&lt;/p&gt;

&lt;p&gt;
Fortunately, other distributions like Debian get it right.
Debian even keeps
	&lt;a href=&quot;https://buildd.debian.org/&quot;&gt;
	build logs&lt;/a&gt;
for all releases of all packages on all architectures and makes them available
on the web.
For instance, the build log for libsndfile version 1.0.21-3 on the MIPS can be
	&lt;a href=&quot;https://buildd.debian.org/fetch.cgi?&amp;pkg=libsndfile&amp;ver=1.0.21-3&amp;arch=mips&amp;stamp=1280847502&amp;file=log&quot;&gt;
	found here&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
If anyone is using a distro which does not routinely run the test suite when
building packages which supply a test suite, I recommend that they switch to
a distro that does.
&lt;/p&gt;</content>
		<author>
			<name>Erik de Castro Lopo</name>
			<email>erikd@mega-nerd.com</email>
			<uri>http://www.mega-nerd.com/erikd/Blog</uri>
		</author>
		<source>
			<title type="html">m3ga blog</title>
			<subtitle type="html">An ocassional rant</subtitle>
			<link rel="self" href="http://www.mega-nerd.com/erikd/Blog/index.atom"/>
			<id>http://www.mega-nerd.com/erikd/Blog/index.atom</id>
			<updated>2012-01-29T09:30:23+00:00</updated>
			<rights type="html">Copyright 2006-2010 Erik de Castro Lopo</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">DevWorld 2010 Keynote Aftermath</title>
		<link href="http://algorithm.com.au/blog/files/3014b4866289a6b891525465154b547e-608.php#unique-entry-id-608"/>
		<id>http://algorithm.com.au/blog/files/3014b4866289a6b891525465154b547e-608.php#unique-entry-id-608</id>
		<updated>2010-09-29T08:02:46+00:00</updated>
		<content type="html">&lt;p&gt;As GLaDOS would say, It&amp;#8217;s been a long time.  How have you been?&lt;/p&gt;

&lt;p&gt;I was invited a few weeks ago to keynote at &lt;a href=&quot;http://www.auc.edu.au/DevWorld+2010&quot;&gt;/dev/world 2010&lt;/a&gt;, a conference for Mac developers in Australia.  It was my first-ever keynote, and you know, inspirational talks turn out to be kinda harder to give than technical talks.  For those who didn&amp;#8217;t attend, the talk intended to address the two most frequent questions I get asked about Pixar (&amp;#8220;how did you get there?&amp;#8221; and &amp;#8220;what do you, uhh, actually do?&amp;#8221;), and provide some insight into Pixar&amp;#8217;s culture.&lt;/p&gt;

&lt;p&gt;Two videos that I referred to in the talk and I think are an absolute must-see&amp;#8212;whether you&amp;#8217;re an engineer, &lt;span class=&quot;caps&quot;&gt;CEO, &lt;/span&gt;manager, designer, artist or otherwise&amp;#8212;are&lt;/p&gt;


&lt;ul&gt;
&lt;li&gt;Ed Catmull&amp;#8217;s talk at Stanford Business School: &lt;a href=&quot;http://www.youtube.com/watch?v=k2h2lvhzMDc&quot;&gt;Keep Your Crises Small&lt;/a&gt; (~40 minutes, minus question time)&lt;/li&gt;
&lt;li&gt;Randy Nelson&amp;#8217;s &lt;a href=&quot;http://www.youtube.com/watch?v=QhXJe8ANws8&quot;&gt;Learning and Working in the Collaborative Age&lt;/a&gt; (~10 minutes)&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;They complement Steve Jobs&amp;#8217;s amazing &lt;a href=&quot;http://www.youtube.com/watch?v=Hd_ptbiPoXM&quot;&gt;commencement speech at Stanford in 2005&lt;/a&gt;.  The number of insightful, genuine sound bites you can take away from those three talks are off the charts.&lt;/p&gt;

&lt;p&gt;For all those who attended my keynote, I hope it was worthwhile.  Thank you to everyone in the audience for giving me such a warm reception and for making me feel back at home, and thank you to the &lt;span class=&quot;caps&quot;&gt;AUC &lt;/span&gt;for putting on a great conference.&lt;/p&gt;

&lt;p&gt;Also, new website look, oooooo.  It almost looks like it was made after 2000.  Hopefully this will mean more regular updates on my blog than once per decade.  I guess we&amp;#8217;ll find out!&lt;/p&gt;</content>
		<author>
			<name>André Pang</name>
			<uri>http://algorithm.com.au/index.html</uri>
		</author>
		<source>
			<title type="html">Stay Hungry, Stay Foolish</title>
			<subtitle type="html">André Pang's Blog</subtitle>
			<link rel="self" href="http://algorithm.com.au/blog/files/rss.xml"/>
			<id>http://algorithm.com.au/blog/files/rss.xml</id>
			<updated>2011-11-23T18:30:22+00:00</updated>
			<rights type="html">© 2006-2007 André Pang</rights>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Macro visualization</title>
		<link href="http://redlizards.com/blog/uncategorized/macro-visualization/"/>
		<id>http://redlizards.com/blog/?p=550</id>
		<updated>2010-09-22T04:58:24+00:00</updated>
		<content type="html">&lt;p&gt;When Goanna reports a warning, sometimes a C preprocessor macro makes it hard to know what&amp;#8217;s really going on in the code.  I&amp;#8217;ve added a new feature to the Visual Studio implementation that highlights each preprocessor macro invocation with a blue &amp;#8220;squiggly&amp;#8221;; the associated tooltip shows the (one-level) expansion of the macro.  The context menu for the code document allows you to toggle between the macro markers and purple squigglies associated with Goanna warnings.&lt;/p&gt;
&lt;p&gt;In the Goanna Central version, you&amp;#8217;ll be able to dump all preprocessor macros in a file with an appropriate flag.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;https://redlizards.com/images/screenshots/macroviz.jpg&quot; title=&quot;Macro squigglies&quot; class=&quot;alignnone&quot; width=&quot;594&quot; height=&quot;269&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>Goanna</name>
			<uri>http://redlizards.com</uri>
		</author>
		<source>
			<title type="html">Comments on: Blog</title>
			<subtitle type="html">Static Code Analysis for C/C++</subtitle>
			<link rel="self" href="http://redlizards.com/blog/feed/"/>
			<id>http://redlizards.com/blog/feed/</id>
			<updated>2012-05-10T06:30:27+00:00</updated>
		</source>
	</entry>

</feed>

