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

<channel>
	<title>Richard O&#039;Neill &#187; PHP</title>
	<atom:link href="http://richardoneill.com.au/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://richardoneill.com.au</link>
	<description>Web developer / Web designer / Photographer</description>
	<lastBuildDate>Tue, 03 Apr 2012 10:08:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>My LOLCode Interpreter</title>
		<link>http://richardoneill.com.au/2007/10/my-lolcode-interpreter/</link>
		<comments>http://richardoneill.com.au/2007/10/my-lolcode-interpreter/#comments</comments>
		<pubDate>Wed, 31 Oct 2007 15:35:33 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I had 2 hours to kill so I thought I&#8217;d write a LOLCode interpreter. I know there&#8217;s already a few LOLCode interpreters around, but I couldn&#8217;t help myself. Plus I&#8217;ve always been interested in interpreter design. It&#8217;s still a work in progress at this stage, so a lot of the language hasn&#8217;t been fully implemented. [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><img src="/img/articles/lolcodebook.jpg" style="float: right;" alt="LOLCode Book" />
<p>I had 2 hours to kill so I thought I&#8217;d write a <a href="http://lolcode.com">LOLCode</a> <a href="http://en.wikipedia.org/wiki/Interpreter_(computing)">interpreter</a>.</p>
<p>I know there&#8217;s already a few LOLCode interpreters around, but I couldn&#8217;t help myself. Plus I&#8217;ve always been interested in <a href="http://en.wikipedia.org/wiki/Interpreter_(computing)">interpreter</a> design.</p>
<p>It&#8217;s still a work in progress at this stage, so a lot of the language hasn&#8217;t been fully implemented.</p>
<p>Here are two working programs&#8230;</p>
<h3>Hello World</h3>
<p><code><br />
BTW the classic hello world program<br />
HAI<br />
	VISIBLE "Hello world!"<br />
KTHXBAI<br />
</code>
<p>Output:</p>
<p><img src="/img/articles/lolcode1.jpg" alt="LOLCode Hello World" /><br />
<h3>Accepting User Input</h3>
<p><code><br />
HAI<br />
	VISIBLE "Hello there, what is your name?!"<br />
	I HAS A NAME ""</p>
<p>	BTW ask for the users name<br />
	GIMMEH NAME</p>
<p>	BTW welcome the user<br />
	VISIBLE "Welcome to LOLCode " N NAME N "!"<br />
KTHXBAI</code>
<p>Output:</p>
<p><img src="/img/articles/lolcode2.jpg" alt="LOLCode Accepting User Input" /></p>
]]></content:encoded>
			<wfw:commentRss>http://richardoneill.com.au/2007/10/my-lolcode-interpreter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Command Line Tip</title>
		<link>http://richardoneill.com.au/2007/09/php-command-line-tip/</link>
		<comments>http://richardoneill.com.au/2007/09/php-command-line-tip/#comments</comments>
		<pubDate>Tue, 11 Sep 2007 13:43:47 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Here&#8217;s a quick tip for working with the command line in PHP. If you&#8217;ve ever run a PHP script via the command line, you would have noticed that output from the script is not printed until the script has finished. If you need your output displayed in real time, you can open a stream to [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Here&#8217;s a quick tip for working with the command line in PHP.</p>
<p>If you&#8217;ve ever run a PHP script via the command line, you would have noticed that output from the script is not printed until the script has finished.</p>
<p>If you need your output displayed in real time, you can open a stream to the command line&#8230;</p>
<p><code>$stdout = fopen('php://stdout', 'w');</code>
<p>Simply write any output to the stream and it will be printed on the command line in real time&#8230;</p>
<p><code>fwrite($stdout, "Hello CLIn");</code></p>
]]></content:encoded>
			<wfw:commentRss>http://richardoneill.com.au/2007/09/php-command-line-tip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook Code Analysis</title>
		<link>http://richardoneill.com.au/2007/08/facebook-code-analysis/</link>
		<comments>http://richardoneill.com.au/2007/08/facebook-code-analysis/#comments</comments>
		<pubDate>Thu, 16 Aug 2007 13:57:18 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Most developers have now heard about Facebook&#8217;s leaked index.php source code, which was anonymously posted here. If you haven&#8217;t seen it already, there are a number of links listed on Techcrunch. I&#8217;ve seen a few bloggers criticize Facebook developers for using procedural programming rather than classes and object oriented techniques. I&#8217;m not exactly sure why [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://facebook.com"><img src="/img/articles/facebook.jpg" alt="Facebook Code Analysis" style="float: right; margin: 10px; border: 0px;" /></a>
<p>Most developers have now heard about <a href="http://facebook.com">Facebook&#8217;s</a> leaked <em>index.php</em> source code, which was anonymously posted <a href="http://facebooksecrets.blogspot.com">here</a>. If you haven&#8217;t seen it already, there are a number of links listed on <a href="http://www.techcrunch.com/2007/08/11/facebook-source-code-leaked/">Techcrunch</a>.</p>
<p>I&#8217;ve seen a few bloggers criticize Facebook developers for using procedural programming rather than classes and object oriented techniques. I&#8217;m not exactly sure why they&#8217;ve chosen to develop the site like this; but I am going to take a guess and say it was to improve speed and efficiency.</p>
<p>Object oriented programming was first introduced to PHP in version 4. However, the language wasn&#8217;t originally designed around objects and classes, so the implementation was clunky and awkward. This meant that procedural code was often much faster than object oriented code.</p>
<p>Considering the size and popularity of social networks, I&#8217;m not surprised they chose procedural code over objects. That tiny boost in performance would easily outweigh the advantages of using classes.</p>
<p>Fortunately, most (if not all) issues with objects have been solved in PHP 5, which is now closer to a truly object oriented language.</p>
]]></content:encoded>
			<wfw:commentRss>http://richardoneill.com.au/2007/08/facebook-code-analysis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Filtering Empty Values from an Array</title>
		<link>http://richardoneill.com.au/2007/07/filtering-empty-values-from-an-array/</link>
		<comments>http://richardoneill.com.au/2007/07/filtering-empty-values-from-an-array/#comments</comments>
		<pubDate>Thu, 05 Jul 2007 17:52:17 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Here&#8217;s an easy way of filtering empty variables from an array, without using a loop or multiple if statements. &#60;?php $var1 = &#8221;; $var2 = &#8216;dog&#8217;; $var3 = &#8221;; $var4 = &#8216;fish&#8217;; $my_array = array($var1, $var2, $var3, $var4); print_r(array_filter($my_array)); ?&#62; Output: Array ( [1] =&#62; dog [3] =&#62; fish )]]></description>
			<content:encoded><![CDATA[<p></p><p>Here&#8217;s an easy way of filtering empty variables from an array, without using a loop or multiple if statements.</p>
<div class="code"><span style="color: #000000;"><br />
<span style="color: #0000bb;">&lt;?php</span></span><br />
<span style="color: #000000;"><span style="color: #0000bb;"> $var1 </span><span style="color: #007700;">= </span><span style="color: #dd0000;">&#8221;</span><span style="color: #007700;">;<br />
</span><span style="color: #0000bb;">$var2 </span><span style="color: #007700;">= </span><span style="color: #dd0000;">&#8216;dog&#8217;</span><span style="color: #007700;">;<br />
</span><span style="color: #0000bb;">$var3 </span><span style="color: #007700;">= </span><span style="color: #dd0000;">&#8221;</span><span style="color: #007700;">;<br />
</span><span style="color: #0000bb;">$var4 </span><span style="color: #007700;">= </span><span style="color: #dd0000;">&#8216;fish&#8217;</span><span style="color: #007700;">;</span></span><span style="color: #000000;"><span style="color: #007700;"> </span></span></p>
<p><span style="color: #000000;"><span style="color: #0000bb;">$my_array </span><span style="color: #007700;">= array(</span><span style="color: #0000bb;">$var1</span><span style="color: #007700;">, </span><span style="color: #0000bb;">$var2</span><span style="color: #007700;">, </span><span style="color: #0000bb;">$var3</span><span style="color: #007700;">, </span><span style="color: #0000bb;">$var4</span><span style="color: #007700;">);</span></span><span style="color: #000000;"><span style="color: #007700;"> </span></span></p>
<p><span style="color: #000000;"><span style="color: #0000bb;">print_r</span><span style="color: #007700;">(</span><span style="color: #0000bb;">array_filter</span><span style="color: #007700;">(</span><span style="color: #0000bb;">$my_array</span><span style="color: #007700;">));</span></span></p>
<p><span style="color: #000000;"><span style="color: #007700;"> </span></span><span style="color: #000000;"><span style="color: #0000bb;">?&gt;</span><br />
</span></p>
</div>
<p>Output:<br />
<em>Array ( [1] =&gt; dog [3] =&gt; fish )</em></p>
]]></content:encoded>
			<wfw:commentRss>http://richardoneill.com.au/2007/07/filtering-empty-values-from-an-array/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Handling Errors in PHP</title>
		<link>http://richardoneill.com.au/2007/06/handling-errors-in-php/</link>
		<comments>http://richardoneill.com.au/2007/06/handling-errors-in-php/#comments</comments>
		<pubDate>Wed, 27 Jun 2007 15:04:40 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[PHP errors are ugly and should never be shown to your users. Luckily with PHP we can handle errors our own way using the set_error_handler function. I&#8217;ll start by defining the error handling function which will write the error to a log file and stop execution. function handleError($level, $error, $file, $line) { &#160;&#160;if ($logfile = [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>PHP errors are ugly and should never be shown to your users. Luckily with PHP we can handle errors our own way using the <a href="http://php.net/manual/en/function.set-error-handler.php">set_error_handler</a> function.</p>
<p>I&#8217;ll start by defining the error handling function which will write the error to a log file and stop execution.</p>
<p><code><br />
function handleError($level, $error, $file, $line)<br />
{</p>
<p>&nbsp;&nbsp;if ($logfile = fopen('log.txt', 'a'))<br />
&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;fwrite($logfile, date("F j, Y, g:i a") ." $error on line $line in $filen");<br />
&nbsp;&nbsp;&nbsp;&nbsp;fclose($logfile);<br />
&nbsp;&nbsp;}	</p>
<p>&nbsp;&nbsp;die('An error has occured.');	</p>
<p>}<br />
</code>
<p>Then set it as the error handling function.</p>
<p><code>set_error_handler('handleError');</code>
<p>Trigger an error to see if it works.</p>
<p><code>echo 100 / 0;</code>
<p>You could also get your function to notify you via email. Or you could forget about logging, and just display better looking errors&#8230;</p>
<p><code><br />
function handleError($level, $error, $file, $line)<br />
{</p>
<p>&nbsp;&nbsp;$errorhtml = '&lt;div style="border: 4px solid #bfbfbf; font-size: 12px; font-family: arial, sans-serif; padding: 1px"&gt;';<br />
&nbsp;&nbsp;$errorhtml .= '&lt;div style="background-color: #a3503f; color: #ffffff; padding: 3px;">ERROR&lt;/strong&gt;&lt;/div&gt;';<br />
&nbsp;&nbsp;$errorhtml .= $error.'&lt;br /&gt;';<br />
&nbsp;&nbsp;$errorhtml .= 'Line: '.$line.'&lt;br /&gt;';<br />
&nbsp;&nbsp;$errorhtml .= 'File: '.$file;<br />
&nbsp;&nbsp;$errorhtml .= '&lt;/div&gt;';</p>
<p>&nbsp;&nbsp;echo $errorhtml;</p>
<p>}<br />
</code><br /><img src="/img/articles/phperror.jpg" alt="php error" /></p>
]]></content:encoded>
			<wfw:commentRss>http://richardoneill.com.au/2007/06/handling-errors-in-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Function Argument Lists</title>
		<link>http://richardoneill.com.au/2007/06/php-function-argument-lists/</link>
		<comments>http://richardoneill.com.au/2007/06/php-function-argument-lists/#comments</comments>
		<pubDate>Thu, 21 Jun 2007 17:47:46 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[A lot of PHP developer&#8217;s don&#8217;t know about PHP&#8217;s support for variable-length argument lists. This is a quite an easy feature to use and can be useful when you&#8217;re not sure how many arguments a function should accept. To declare a function with a variable-length argument list, declare it with an empty argument list. function [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>A lot of PHP developer&#8217;s don&#8217;t know about PHP&#8217;s support for variable-length argument lists.</p>
<p>This is a quite an easy feature to use and can be useful when you&#8217;re not sure how many arguments a function should accept.</p>
<p>To declare a function with a variable-length argument list, declare it with an empty argument list.</p>
<p><code>function add_scores()</code>
<p>Calling the function with multiple arguments is easy&#8230;</p>
<p><code>add_scores(88, 37, 99, 32);</code>
<p>Processing the arguments inside the function is also an easy task using the <a href="http://php.net/manual/en/function.func-get-arg.php">func_get_arg()</a>, <a href="http://php.net/manual/en/function.func-get-args.php">func_get_args()</a> and <a href="http://php.net/manual/en/function.func-num-args.php">func_num_args()</a> functions.</p>
<p><code>function add_scores()<br />
		{<br />
			   return array_sum(func_get_args());<br />
		}</code>
<p>Output: 256</p>
]]></content:encoded>
			<wfw:commentRss>http://richardoneill.com.au/2007/06/php-function-argument-lists/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Use AJAX Sparingly</title>
		<link>http://richardoneill.com.au/2007/06/use-ajax-sparingly/</link>
		<comments>http://richardoneill.com.au/2007/06/use-ajax-sparingly/#comments</comments>
		<pubDate>Wed, 20 Jun 2007 15:40:17 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[AJAX is a only great technique when used in moderation. It belongs in forms and page widgets, but should never be used for navigational purposes. Call me a traditionalist, but webpages are pages, not desktop applications. Changing the way a UI component works on your website is unnecessary and confusing for your users. Normal links [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><img src="/img/articles/appwindow.jpg" style="float: left;" alt="AJAX" />
<p>AJAX is a only great technique when used in moderation. It belongs in forms and page widgets, but should never be used for navigational purposes. </p>
<p>Call me a traditionalist, but webpages are pages, not desktop applications. Changing the way a UI component works on your website is unnecessary and confusing for your users.</p>
<p>Normal links shouldn&#8217;t change page content without warning and pages shouldn&#8217;t extend when you reach the bottom.</p>
<p>Use AJAX sparingly if you want to make a better user experience.</p>
]]></content:encoded>
			<wfw:commentRss>http://richardoneill.com.au/2007/06/use-ajax-sparingly/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Regular Expressions in Ruby and PHP</title>
		<link>http://richardoneill.com.au/2007/06/regular-expressions-in-ruby-and-php/</link>
		<comments>http://richardoneill.com.au/2007/06/regular-expressions-in-ruby-and-php/#comments</comments>
		<pubDate>Thu, 14 Jun 2007 14:39:17 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Here is a short comparison between Ruby and PHP. The task was to print the location of all HTML links in a webpage using regular expressions. If anyone knows of a cleaner or more efficient way to do this in Ruby or PHP, please post it in the comments! Ruby require 'net/http' #connect and get [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="/tags/ruby"><img src="/img/articles/ruby.jpg" style="border: 0px; float: left;" alt="Ruby" /></a>
<p>Here is a short comparison between Ruby and PHP. The task was to print the location of all HTML links in a webpage using regular expressions. </p>
<p>If anyone knows of a cleaner or more efficient way to do this in Ruby or PHP, please post it in the comments!</p>
<p>
<h3>Ruby</h3>
</p>
<p><code>require 'net/http'</p>
<p>#connect and get the webpage<br />
host = Net::HTTP.new('www.site.com.au', 80)<br />
body = host.get('/index.php', nil ).body</p>
<p>puts "Links found..."</p>
<p>#find link URIs<br />
links = body.scan(/&lt;a(.*?)href="(.*?)"(.*?)&gt;(.*?)&lt;/a&gt;/)</p>
<p>#print all link URIs<br />
links.each {|id,uri| puts uri}</code><br />
<h3>PHP</h3>
</p>
<p><code>&lt;?php</p>
<p>	$page = file_get_contents('http://www.site.com.au/index.php');</p>
<p>	// find links</p>
<p>	preg_match_all('/&lt;a(.*?)href="(.*?)"(.*?)&gt;(.*?)&lt;/a&gt;/', $page, $links);	</p>
<p>	// links found</p>
<p>	foreach($links[2] as $link)<br />
	{<br />
		&nbsp;&nbsp;&nbsp;print "$linkn";<br />
	}</p>
<p>?&gt;</code></p>
]]></content:encoded>
			<wfw:commentRss>http://richardoneill.com.au/2007/06/regular-expressions-in-ruby-and-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MD5 Encryption</title>
		<link>http://richardoneill.com.au/2007/05/md5-encryption/</link>
		<comments>http://richardoneill.com.au/2007/05/md5-encryption/#comments</comments>
		<pubDate>Tue, 29 May 2007 17:44:21 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[MD5 is a popular hash function which is often used to encrypt passwords in web applications. In most applications, when a user enters their password, it is encrypted and compared to the one stored in the database. If both md5 hashes match, the user is granted access. This approach is generally considered to be quite [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><img src="/img/articles/lock.jpg" style="float: left;" alt="MD5 Encryption" />
<p><a href="http://en.wikipedia.org/wiki/Md5">MD5</a> is a popular hash function which is often used to encrypt passwords in web applications. In most applications, when a user enters their password, it is encrypted and compared to the one stored in the database. If both md5 hashes match, the user is granted access.</p>
<p>This approach is generally considered to be quite secure for authenticating users. However, it still has it&#8217;s weaknesses.</p>
<p>MD5 hashes are vulnerable to <a href="http://en.wikipedia.org/wiki/Dictionary_attack">dictionary</a> and <a href="http://en.wikipedia.org/wiki/Brute_force_attack">brute force</a> attacks using rainbow tables; which store millions of passwords and their hashed values.</p>
<p> Which means if your database is compromised there&#8217;s a good chance that your passwords can be recovered by an experienced cracker.</p>
<p>Here are a few tips for protecting your passwords&#8230;</p>
<ul>
<li>Use <a href="http://en.wikipedia.org/wiki/Password_salting">password salting</a>, which makes rainbow tables useless in recovering passwords. </li>
<li><a href="http://en.wikipedia.org/wiki/Key_strengthening">Strengthen your passwords</a> by encrypting them multiple times.</li>
</ul>
<p>Also make sure you&#8217;re using <a href="http://en.wikipedia.org/wiki/Ssl">SSL</a> if your web application has any importance. It&#8217;s extremely easy to intercept passwords using <a href="http://en.wikipedia.org/wiki/Packet_sniffer">packet sniffers</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://richardoneill.com.au/2007/05/md5-encryption/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data Visualization</title>
		<link>http://richardoneill.com.au/2007/05/data-visualization/</link>
		<comments>http://richardoneill.com.au/2007/05/data-visualization/#comments</comments>
		<pubDate>Thu, 24 May 2007 13:18:17 +0000</pubDate>
		<dc:creator>Richard</dc:creator>
				<category><![CDATA[Design]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web Design]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Data visualisation isn&#8217;t a new concept. For decades, scientists and geographers have been been relying on data visualisations to present their huge amounts of data. Only recently has it started gaining interest on the web, and I believe we have Digg Labs to thank for that. Since releasing their API, a number of great visualisations [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><a href="http://en.wikipedia.org/wiki/Data_visualization">Data visualisation</a> isn&#8217;t a new concept. For decades, scientists and geographers have been been relying on data visualisations to present their huge amounts of data.</p>
<p>Only recently has it started gaining interest on the web, and I believe we have <a href="http://labs.digg.com/">Digg Labs</a> to thank for that.</p>
<p>Since releasing their <a href="http://apidoc.digg.com/">API</a>, a number of great visualisations have surfaced. Two of my favourites are <a href="http://brian.shaler.name/digg/radar/">Digg RADAR</a> and <a href="http://labs.digg.com/swarm/">Digg Swarm</a>.</p>
<p><a href="http://labs.digg.com/swarm/"><img src="/img/articles/diggswarm.jpg" style="border: 0px;" alt="User product Clusters" /></a>
<p>There are also some great visualizations in the <a href="http://www.visualcomplexity.com/vc/index.cfm?domain=Knowledge%20Networks">networking industry</a>. You can even monitor your network traffic in <a href="http://www.techcrunch.com/2007/04/10/watch-your-network-play-space-invaders/">video game style with Netcosm</a>.</p>
<p>Visit <a href="http://www.visualcomplexity.com">Visual Complexity</a> for hundreds more examples.</p>
<p>I thought it would be fun to make a visualization of my own, and here&#8217;s what I came up with.</p>
<p> <img src="/img/articles/starclusters.jpg" alt="User product Clusters" />
<p>Each &#8220;star&#8221; represents a product, and is grouped in a cluster which represents the user it belongs to. The end result is an interesting star field.</p>
<p>Obviously it&#8217;s not as impressive as the <a href="http://infosthetics.com/archives/2007/05/wikipedia_history_mosaic.html">Wikipedia activity image mosaic</a>, but I had fun making it.</p>
]]></content:encoded>
			<wfw:commentRss>http://richardoneill.com.au/2007/05/data-visualization/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

