<?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>Code Emporium</title>
	<atom:link href="http://www.codeemporium.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.codeemporium.com</link>
	<description>Coding eclecticism, and other large words</description>
	<lastBuildDate>Mon, 31 May 2010 13:30:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>The Australian Internet Filter &#8211; A Proposal for a Zero-Click Workaround</title>
		<link>http://www.codeemporium.com/2010/05/31/the-australian-internet-filter-a-proposal-for-a-zero-click-workaround/</link>
		<comments>http://www.codeemporium.com/2010/05/31/the-australian-internet-filter-a-proposal-for-a-zero-click-workaround/#comments</comments>
		<pubDate>Mon, 31 May 2010 13:30:52 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=612</guid>
		<description><![CDATA[As many of you may know, dating back to 2008, there&#8217;s been a lot of talk about implementing a mandatory Internet filter in Australia.  If your primary interest in the filter is political and not technological, search Google for Australian Internet Filter and go to town with it.  What I wanted to propose [...]]]></description>
			<content:encoded><![CDATA[<p>As many of you may know, dating back to 2008, there&#8217;s been a lot of talk about implementing a <a href="http://en.wikipedia.org/wiki/Internet_censorship_in_Australia">mandatory Internet filter</a> in Australia.  If your primary interest in the filter is political and not technological, search Google for <a href="http://www.google.com.au/search?hl=en&#038;q=australian+internet+filter&#038;btnG=Search&#038;aq=f&#038;aqi=&#038;aql=&#038;oq=&#038;gs_rfai=">Australian Internet Filter</a> and go to town with it.  What I wanted to propose here however is a simple technical (or actually, not so technical) approach to bypassing the Internet filter if it ever does actually come into play.  </p>
<p>There&#8217;s been much talk on the Internet about how easy it will be to circumvent the filter by going through a proxy, tunneling, or other tricks that the government may or may not fully understand.  Claims of &#8220;bypassing the filter takes just one click&#8221; abound on the Internet.  Most of these &#8220;one click&#8221; solutions refer to going to a web proxy, typing in the address you want there and having the proxy return the results to you.  To me, &#8220;one-click&#8221; here sounds like a little bit of an oversimplification, and even then, a lot of effort.  Firstly, I have to establish whether the reason I&#8217;m not seeing a page is because it&#8217;s broken or because the government doesn&#8217;t want me to.  Given that the web page blacklist isn&#8217;t going to be publicly disclosed, you can&#8217;t simply consult your friendly government official on this one.  Sure, for every broken page you find, you could try loading it up by going through a proxy, but this is what I&#8217;d refer to as &#8220;a pain in the arse&#8221;.  The solution I&#8217;m thinking of is one whereby I never have to visit a web proxy and &#8220;test out&#8221; whether or not a page has been blocked.  If a page has been blocked, I want my browser to seamlessly transfer the request over to a proxy and have the page brought up in front of me as normal.</p>
<p>Enter <a href="http://autoproxy.org/">AutoProxy</a>.  AutoProxy is an add-on for Firefox.  The way AutoProxy works is that you give it a list of addresses which are known to be blocked and whenever you visit one of these addresses, AutoProxy automatically transfers the request over to your proxy server of choice.  &#8220;That&#8217;s nice&#8221; you say, &#8220;but how does that prevent me from having to know which sites are blocked and adding these sites to the AutoProxy list manually?&#8221;.  Good question &#8211; I&#8217;m glad you asked.  AutoProxy has a &#8220;subscriptions&#8221; feature whereby you can subscribe to a list of addresses that you&#8217;d like to have redirected through your proxy of choice.  This means you can subscribe to <em>someone else&#8217;s</em> list of blocked addresses and even get regular updates when that list of addresses change.  So, instead of everyone trying to figure out on their own or through some kind of convoluted Internet search mayhem exactly what addresses have been blocked, a centralised list of addresses could be maintained by the community.  You use AutoProxy to subscribe to this list and that way, you&#8217;ve always got seamless access to blocked addresses, even as the list changes (grows) over time.</p>
<p>I&#8217;d considered writing another post about how people could collaboratively compile a list of potentially blocked addresses, but there&#8217;s probably not that much in it.  I&#8217;m not thinking of anything fancy or illegal.  None of this hacking in and stealing the blacklist, just good old fashion &#8220;it doesn&#8217;t work from all these user&#8217;s addresses in Australia, but it does through a proxy &#8211; probably blocked&#8221; style collaboration.  AutoProxy puts the icing on the cake, by hooking into what a small portion of the community uncover to give everyone seamless access to blocked sites.  In the simplest implementation, the AutoProxy subscription list could just be a wiki-like list that trusted users can edit based on verifying community submissions for what appears to have been blocked.  </p>
<p>Perhaps what scares me most about this is that I&#8217;m not convinced it will be particularly hard to reconstruct a fairly accurate list of what&#8217;s being blocked by the government.  Having such a list publicly compiled could inadvertently draw <em>more</em> attention to the content that I imagine most people wouldn&#8217;t mind filtered such as rape and child pornography.  Because of this, I wonder whether such content will garner more views when it&#8217;s &#8220;blocked&#8221; than when it&#8217;s openly accessible.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2010/05/31/the-australian-internet-filter-a-proposal-for-a-zero-click-workaround/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bill Gates and YSlow</title>
		<link>http://www.codeemporium.com/2010/02/04/bill-gates-and-yslow/</link>
		<comments>http://www.codeemporium.com/2010/02/04/bill-gates-and-yslow/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 06:55:32 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Digressions]]></category>
		<category><![CDATA[Bloatware]]></category>
		<category><![CDATA[The Gates Notes]]></category>
		<category><![CDATA[YSlow]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=557</guid>
		<description><![CDATA[Just a brief post this time and I almost guarantee you won&#8217;t be any smarter by the end of it.  &#8220;Much like every other post you&#8217;ve ever written&#8221; you retort.  Anyway, on with it.  For those of you who don&#8217;t know, Bill Gates now has an official site The Gates Notes where [...]]]></description>
			<content:encoded><![CDATA[<p>Just a brief post this time and I almost guarantee you won&#8217;t be any smarter by the end of it.  &#8220;Much like every other post you&#8217;ve ever written&#8221; you retort.  Anyway, on with it.  For those of you who don&#8217;t know, Bill Gates now has an official site <a href="http://www.thegatesnotes.com/">The Gates Notes</a> where he talks about stuff.  You know how Microsoft are always getting bashed and accused of making bloatware and having slow and clunky apps?  Well, I thought it&#8217;d be fun to test the performance of The Gates Notes using <a href="http://developer.yahoo.com/yslow/">YSlow</a>.  Here&#8217;s the result:</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2010/02/thegatesnotesyslow.png"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2010/02/thegatesnotesyslow-500x335.png" alt="" title="thegatesnotesyslow" width="500" height="335" class="alignnone size-large wp-image-558" /></a></p>
<p>That&#8217;s right chaps, a big old <strong>E</strong> for The Gates Notes with an overall performance score of 59 out of 100.  So what does this prove about Microsoft and bloatware?  Nothing really.  About all it proves is that The Gates Notes got 59 out of 100 on YSlow and could probably use some optimisation.  Considering that The Gates Notes probably doesn&#8217;t draw all <em>that</em> much traffic, it&#8217;s probably not a huge problem in reality.  For such a high profile person in software though, I was a little surprised to see that <em>someone</em> hadn&#8217;t done some more optimisation on it.  I&#8217;ve got plenty of <a href="http://www.urbandictionary.com/define.php?term=restecp">restecp</a> for Bill Gates.  Nonetheless, I thought this would be a fun little test to run.  </p>
<p>Before you ask, Code Emporium scores as low as 64 out of 100 on YSlow, which is pretty bad too.  Difference is, Code Emporium probably draws about as much traffic as that site you made for your pet cat back in 1999.  As soon as I overtake your pet cat in popularity I&#8217;ll get optimising.  Told you you wouldn&#8217;t be any smarter.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2010/02/04/bill-gates-and-yslow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I Get the Feeling that the Debugging Discipline has a Bright Future Ahead</title>
		<link>http://www.codeemporium.com/2010/01/31/i-get-the-feeling-that-the-debugging-discipline-has-a-bright-future-ahead/</link>
		<comments>http://www.codeemporium.com/2010/01/31/i-get-the-feeling-that-the-debugging-discipline-has-a-bright-future-ahead/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 08:22:17 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Reviews]]></category>
		<category><![CDATA[andreas]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[delta]]></category>
		<category><![CDATA[historical debugging]]></category>
		<category><![CDATA[program slices]]></category>
		<category><![CDATA[zeller]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=512</guid>
		<description><![CDATA[When I debug, I use what I&#8217;d consider to be a set of pretty stock standard tools and strategies.  We&#8217;re talking breakpoints, conditional breakpoints, stepping into code, stepping out of code, stepping over code, variable watches, stack traces, you know the likes&#8230;  
Just recently though I finished reading Why Programs Fail, Second Edition: [...]]]></description>
			<content:encoded><![CDATA[<p>When I debug, I use what I&#8217;d consider to be a set of pretty stock standard tools and strategies.  We&#8217;re talking breakpoints, conditional breakpoints, stepping into code, stepping out of code, stepping over code, variable watches, stack traces, you know the likes&#8230;  </p>
<p>Just recently though I finished reading <a href="http://www.amazon.com/gp/product/0123745152?ie=UTF8&#038;tag=codeempo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0123745152">Why Programs Fail, Second Edition: A Guide to Systematic Debugging</a><img src="http://www.assoc-amazon.com/e/ir?t=codeempo-20&#038;l=as2&#038;o=1&#038;a=0123745152" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /> by Andreas Zeller.</p>
<p><a href="http://www.amazon.com/gp/product/0123745152?ie=UTF8&#038;tag=codeempo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0123745152"><img border="0" src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2010/01/why_programs_fail.jpg"></a><img src="http://www.assoc-amazon.com/e/ir?t=codeempo-20&#038;l=as2&#038;o=1&#038;a=0123745152" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p>This is no &#8220;Learn to Debug in 24 Hours Using Visual Studio&#8221;; it&#8217;s an entirely different treatment of debugging.  Just when you thought you knew everything there was to know about debugging, Andreas Zeller came along and unleashed this little gem.  The debugging concepts and techniques presented in this book are way ahead of the curve compared to what is commonplace in industry right now.  I wanted to dedicate this post to going over just a few of the concepts presented in this book, to give you a taste of all that is still left to come for mainstream debugging.  So here we go.</p>
<p><strong>1. Debugging Backwards In Time</strong><br />
The traditional way to conduct a debugging session is to set some breakpoints, fire up your debugger, wait until a breakpoint is hit then start inspecting the program&#8217;s variables and execution, stepping through the code line at a time.  If you&#8217;re anything like me, you rarely find the problem cause on the first run through.  By the time you reach a line of code where you notice your variables aren&#8217;t as they should be, you&#8217;ve gone too far.  Time to set some more breakpoints, fire up a new debugging session and see how many more times you can overstep the problem before you actually get it right.</p>
<p>Enter Backwards Debugging.  Wouldn&#8217;t it be great if you could run your debugging session once, realise when you&#8217;ve stuffed up and stepped too far ahead in your code and be able to press rewind?  Even better, being able to replay that mangled piece of code back again as many times as you like without ever having to start a new debugging session?  It&#8217;d be like getting to listen to the 6 minutes of The Verve&#8217;s <em>Bitter Sweet Symphony</em> on track repeat without ever having to subject yourself to the other 69 minutes of torture that is the remainder of the album.</p>
<p>Well, guess what?  Backwards debugging tools already exist (for some languages at least).  In fact, the first experimental backwards Java debugger, or &#8220;Omniscient Debugger&#8221; (as coined by Bill Lewis) seems to have been released all the way <a href="http://www.lambdacs.com/debugger/Article.html">back in 2002</a> (Yes, 8 years is a long time in the world of technology).  <a href="http://www.lambdacs.com/debugger/debugger.html">Here is a more recent page</a> about the Omniscient Java Debugger.</p>
<p>For the Microsofties among us (myself partially included), you&#8217;ll be pleased to know that Microsoft Visual Studio 2010 is going to come equipped with a &#8220;<a href="http://channel9.msdn.com/posts/VisualStudio/Historical-Debugger-and-Test-Impact-Analysis-in-Visual-Studio-Team-System-2010/">Historical Debugger</a>&#8221; that lets you step backwards in time through your program.  Hopefully this will give backwards in time debugging the exposure it needs to get people excited enough to demand it from other non-.NET programming languages.</p>
<p><strong>2. Program Slices</strong><br />
A program slice is a subset of a program that influences a particular program statement or the subset of a program that is influenced by a particular program statement.  Now you&#8217;re confused.  It&#8217;s really very simple.  Let&#8217;s give an example.  Imagine for a moment that you have the following function (this one happens to be written in Python):</p>
<pre name="code" class="python">
def summul(a, b):
    sum = 0
    mul = 1
    while (a <= b):
        sum = sum + a
        a = a + 1
        mul = mul * a
    print(sum)
    print(mul)
</pre>
<p>Don't worry too much about what this function does.  It's really not important.  Now though, say that the value we see printed for <code>mul</code> when calling this function isn't what we expected it to be.  For a small sample of code like this, it's easy enough to look back over the whole piece of code and figure out what's wrong.  For a larger piece of code though, it'd be nice to be able to look at only those statements which influence the value being printed out for <code>mul</code> without all of the noise from the other statements that are completely irrelevant.  So how would we go about isolating only those statements that affect the value printed for <code>mul</code>?  Well, we can manually do it by looking back through the code and finding which lines <em>directly</em> and also <em>indirectly</em> influence the value of <code>mul</code>.  Let's give that a go.</p>
<p>- Obviously line #9 influences what is printed for <code>mul</code> because it's what does the printing.<br />
- Line #8 in no way influences the value of <code>mul</code> and so in no way influences the value printed for <code>mul</code>.<br />
- Looking back we see that the value of <code>mul</code> is influenced by line #7, as it multiplies <code>mul</code> by <code>a</code>.  So line #7 influences what is printed for <code>mul</code>.<br />
- Now we have an indirect or <em>transitive</em> dependency between line #6 and the value of <code>mul</code>, because line #6 affects the value of <code>a</code>, and <code>a</code> affects the value of <code>mul</code> in line #7.  So line #6 influences the value printed for <code>mul</code>.<br />
- Line #5 reads the value of <code>a</code>, but doesn't modify it, so <code>mul</code> is <em>not</em> dependent on line #5 and therefore the value printed for <code>mul</code> is not dependent on line #5.<br />
- Line #4 affects <code>mul</code> as the <code>while</code> statement controls the execution of other statements affecting <code>mul</code>.  Therefore line #4 influences what is printed for <code>mul</code>.<br />
- Line #3 is where the value of <code>mul</code> is initially set.  So line #3 influences what is printed for <code>mul</code>.<br />
- Line #2 has no influence over <code>mul</code> as <code>sum</code> is neither directly nor indirectly connected to <code>mul</code>.  Therefore line #2 in no way influences the value printed for <code>mul</code>.<br />
- Line #1 influences <code>mul</code>, as the arguments for both <code>a</code> and <code>b</code> are passed in here; both of which affect the value of <code>mul</code>.  Therefore line #1 influences what is printed for <code>mul</code>.  </p>
<p>So if we are debugging a misprinted value of <code>mul</code>, we can trace the problem back to somewhere in lines 1, 3, 4, 6, 7 and 9.  So we only need be looking at:</p>
<pre name="code" class="python">
def summul(a, b):

    mul = 1
    while (a <= b):

        a = a + 1
        mul = mul * a

    print(mul)
</pre>
<p>That was kind of tedious you say, and it only eliminated 3 lines of code.  Yep, but 3 lines is 33% of the code and you've been able to completely rule out those 3 lines as the cause.  Really though, the important thing to note here is that creating program slices like these is a great candidate for automation.  For those of us (un)?lucky enough to be writing code in C/C++, there's a tool called <a href="http://www.grammatech.com/products/codesurfer/overview.html">CodeSurfer</a> that does just this, with the ability to automatically generate program slices and highlight the lines of code that influence any given statement.  I'd love to see this kind of functionality built into Visual Studio or Eclipse.  I can envisage rolling my mouse over a variable during a paused debug session and having it show not only the variable's value, but fade out all of the lines of code which had no bearing on how that value came to be.</p>
<p>I haven't gone into too much detail on all of the program slice variants; they're covered in much more depth in the text.  Particularly interesting is the difference between static slices and dynamic slices though.  The idea behind a static slice is that you cover all of your bases (all possible execution paths), regardless of what variable values your program actually executes with.  Dynamic slices however are a further refinement that narrow down the number of dependent lines of code based on known variable values in a given run of a program.  Take this basic (and pointless) piece of code for example:</p>
<pre name="code" class="python">
def pointless(c,d):
    if c > 5:
        d = d + 3
    d = d + 1
    print(d)
</pre>
<p>Assume we execute this function passing in the value <code>4</code> for <code>c</code> and <code>2</code> for <code>d</code>.  If we wanted to know which lines could influence the value printed for <code>d</code>, a static program slice would say lines 5, 4, 3, 2 and 1 (all of them).  A static slice has no knowledge of the values being passed in for <code>c</code> and <code>d</code> and so covers its bases saying that it's quite possible that lines #2 and #3 may affect the value printed for <code>d</code> if the <code>if</code> statement evaluates to <code>True</code>.  </p>
<p>A dynamic program slice on the other hand looks at a specific execution of the program.  The dynamic slice would realise that the value of <code>c</code> is not greater than 5, and so lines #2 and #3 would have no bearing on the value printed for <code>d</code>, at least not under this specific execution.  Therefore the dynamic slice would only include lines 1, 4 and 5 as those capable of influencing what is printed for <code>d</code>.  </p>
<p><strong>3. Delta Debugging</strong><br />
Delta Debugging is a fancy (and in retrospect more concise) way of saying "find the difference between an old working version of my program and a new broken version of my program and narrow down the change(s) within that difference that is causing my new version to be broken".  Much like program slices, delta debugging is all about automation.  It's about saying to the computer "here's my old working code, here's my new broken code, figure out what part of the difference between the two is giving me a headache".  </p>
<p>It's worth noting here that we're not just talking about doing a diff between the new and old version of the program code and having a programmer manually read through all of the changed lines looking for potential problem causes.  No, delta debugging is more advanced than that.  Delta debugging says "I'm going to use a binary search to automatically narrow down what part of the diff is giving you problems".  By executing the program multiple times with only <em>some</em> of the new changes applied, delta debugging aims to find out <em>which</em> of those new changes is causing the problem.</p>
<p>That all sounds nice you say, but how the hell does this all work?  Well, delta debugging does assume a few things.  The first assumption is that you have your code under version control.  It's pretty hard to compare an old version against a new version if the old version no longer exists.  The other assumption is that you have a test suite of some sort so that the computer has some way of determining which executions qualify as "passing" and which executions qualify as "failing".  It can be hard to convince people of the merits of unit testing, especially when so much of the supporting evidence is empirical and given the unprecedented levels of fanboyism surrounding it.  To anyone who preaches unit testing, here's my advice: start your sermon with "unit testing lets you automate debugging".  From here on it should be mostly smooth sailing.</p>
<p>Back to delta debugging though.  Time for an example.  You've got your version control and your test suite in place.  Your old version of code is committed after passing the test suite and you've just now added 100 new lines of "enhancements" for your program.  You run the test suite again and it now reports EPIC FAIL (by the way, I don't know of any testing frameworks that report this, but if you work on one, please consider it, at least for say > 80% test failure rate).  So now all you know is that something in that 100 lines of code is causing your test suite to fail.  </p>
<p>You throw delta debugging at it.  Your delta debugger splits those 100 lines in half, takes 50 of them, mixes them in with your old working code and runs it through the test suite again.  Does the test suite now pass?  If it does, then those 50 lines of code aren't causing the problem, so trying running the program through the test suite again with the other 50 lines of code.  If it doesn't pass, then split those 50 lines of code in half again and try running the program through the test suite with only 25 lines of code changes applied.  You probably get the idea from here.  It's basically a binary search for the problem in your code changes.</p>
<p>You can see how this process can be automated to isolate which line(s) of code amongst all those changed lines of code cause the test suite to fail.  My example is of course highly contrived.  In fact, there is only a very small class of problems where you can simply split a piece of code in half and expect it not to break.  There's dependencies between variables on different lines and many of these splits would result in compile errors.  There's further discussion in the book about more advanced methods that build on the same principles, including automated techniques that are syntax aware and not quite so brutish about where splits are made.  The example I presented here was only designed to demonstrate how automation can be used to try a large number of program variants to establish what code changes cause the program to fail.</p>
<p>A delta debugging plugin by the name of <a href="http://ddchange.martin-burger.de/wiki/moin.cgi/DdchangeEclipse">DDCHANGE</a> exists for Eclipse which helps automate debugging using some of the concepts described here.  There's also a nice little <a href="http://ddchange.martin-burger.de/samples/DDchangeEclipse-in-action/001/">Flash video</a> demonstrating it.  I haven't tried DDCHANGE myself, but it certainly looks promising.</p>
<p>One of the things which is nice about backwards in time debugging and program slices is that they don't require any special supporting infrastructure.  If you want your program to do anything, you have to write the code for it, so everything a backwards debugger/program slicer needs is kind of already there for it.  With delta debugging, you need some kind of versioning system as well as a test suite in order for it to be of any use.  If you develop with these anyway then it's really not a problem.  It does however present a bit more of a barrier to simple experimentation.</p>
<p><em>And a bit of a wrap up...</em>  I'm tempted to say this book is up there in the same league as <a href="http://www.amazon.com/gp/product/0735619670?ie=UTF8&#038;tag=codeempo-20&#038;linkCode=as2&#038;camp=1789&#038;creative=9325&#038;creativeASIN=0735619670">Code Complete</a><img src="http://www.assoc-amazon.com/e/ir?t=codeempo-20&#038;l=as2&#038;o=1&#038;a=0735619670" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />.  Sure, it doesn't cover the same breadth of topics, but the writing style is straight forward and methodical and you can tell that the author knows the subject matter extremely well.  It's just got that same feel to it.  For some languages/IDEs the tools are still quite immature/non-existent, but it wouldn't surprise me if most of these debugging techniques become commonplace over the next 5 years or so.  Either way, it's a book that's definitely worth checking out and the best I've read in some time.    </p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2010/01/31/i-get-the-feeling-that-the-debugging-discipline-has-a-bright-future-ahead/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convincing .flac files to play in Windows Media Player 12</title>
		<link>http://www.codeemporium.com/2009/11/26/convincing-flac-files-to-play-in-windows-media-player-12/</link>
		<comments>http://www.codeemporium.com/2009/11/26/convincing-flac-files-to-play-in-windows-media-player-12/#comments</comments>
		<pubDate>Thu, 26 Nov 2009 13:44:06 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[.flac]]></category>
		<category><![CDATA[codecs]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[windows media player 12]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=462</guid>
		<description><![CDATA[For quite some time, whenever I wanted to play .flac files I resorted to using Winamp.  Winamp is a perfectly good piece of software, but at the end of the day my preference has always been with Windows Media Player.  I recently installed Windows 7 and decided that now was as good a [...]]]></description>
			<content:encoded><![CDATA[<p>For quite some time, whenever I wanted to play .flac files I resorted to using Winamp.  Winamp is a perfectly good piece of software, but at the end of the day my preference has always been with Windows Media Player.  I recently installed Windows 7 and decided that now was as good a time as any to see if I could do away with Winamp and listen to all my music through Windows Media Player 12.  </p>
<p>I&#8217;m happy to say that getting .flac files playing in Windows Media Player wasn&#8217;t actually all that difficult.  Still, there seems to be some confusion regarding the process and everything I&#8217;ve read online makes it out to be more difficult than it needs to be.  So I thought I&#8217;d write a quick guide that I&#8217;m hoping will have a better signal-to-noise ratio than what&#8217;s already out there.  I suspect the instructions I&#8217;m providing here work equally as well on some older versions of Windows Media Player, though I&#8217;ve only tested this out on version 12 and your mileage may vary.</p>
<p><b>The short version of getting .flac files to play in Windows Media Player 12</b></p>
<blockquote>
<ol>
<li>Close Windows Media Player 12.</li>
<li>Go to <a href="http://xiph.org/dshow/">http://xiph.org/dshow/</a> and download the <i>Windows 32-bit Installer</i> of the codecs.  Do this, <i>regardless</i> of whether you have a 32 or 64-bit operating system.  Install it.</li>
<li>Restart your computer.</li>
<li>Open Windows Media Player 12.</li>
<li>Try opening one of your .flac files through Windows Media Player 12.</li>
</ol>
</blockquote>
<p>If at this point you&#8217;ve got your .flac files playing through Windows Media Player, then rejoice in whatever way you see fit (if you lack imagination, a cheque in the mail would be fine).  If your .flac files aren&#8217;t playing, then by the power vested in me by my <a href="http://www.codinghorror.com/blog/archives/000818.html">Works On My Machine</a> certificate, I hereby abdicate myself of all responsibility for your stuff not working and redirect you back to <a href="http://www.google.com">Google</a> to seek further assistance.</p>
<p>So you&#8217;ve got your .flac files playing, but they&#8217;re not showing up in your media library.  Fear not!  There&#8217;s <del datetime="2009-11-26T07:43:39+00:00">an emacs command</del> a plugin for that!  </p>
<p><b>Getting your .flac files to show up in Windows Media Player 12 library</b></p>
<blockquote>
<ol>
<li>Close Windows Media Player 12</li>
<li>Go to <a href="http://www.softpointer.com/WMPTagSupport.htm">http://www.softpointer.com/WMPTagSupport.htm</a> and download the tag support plugin. Install it.</li>
<li>Restart your computer.</li>
<li>Open Windows Media Player 12.</li>
<li>Reimport your music library.</li>
</ol>
</blockquote>
<p>Now the last step there, &#8220;reimporting&#8221; your music library &#8211; I don&#8217;t know of any new fan dangle way of doing this and if a &#8220;reimport&#8221; button does exist then I sure haven&#8217;t found it.  The way I &#8220;reimport&#8221; my music library is to first remove all of my library folders (press <em>Ctrl + M</em> to show the menu bar and then go <em>File > Manage Libraries > Music</em> and remove all of the library location folders that you keep your music in).  Then I add my music folders back again; believe it or not, using the &#8220;Add&#8230;&#8221; button.  This should force Windows Media Player to repopulate your music library, this time including any .flac files.</p>
<p>And really that&#8217;s all there is to it.  Now you can play your .flac files through Windows Media Player and even access them through the media player library.  </p>
<p>For those interested, here&#8217;s a few quick notes on some of the things I glossed over in the instructions:</p>
<ul>
<li>I&#8217;ve recommended restarting your computer after installing both the codecs and the library tag plugin.  You might actually be able to get away without doing any restarts.  The only reason I recommend restarting your computer is that when I installed the codecs/library tag plugin, Windows Media Player froze on me when I tried to pause one of the .flac files I was listening to.  I suspect this was caused by having not restarted my computer after installing the codecs, although I could be wrong.</li>
<li>I&#8217;ve said to download the 32-bit version of the codecs, regardless of whether you have a 32 or 64-bit operating system.  If you have a 32-bit version of Windows, of course this makes sense.  If you have a 64-bit version of Windows, then your computer actually has two versions of Windows Media Player installed on it; a 32-bit version and a 64-bit version.  The thing is, by default, Windows uses the 32-bit version of Windows Media Player whenever you launch it and not the 64-bit version (I don&#8217;t know for sure why, but I imagine it&#8217;s to do with some aspect of compatibility).  The 64-bit version of the codecs don&#8217;t work with the default (32-bit) version of Windows Media Player.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2009/11/26/convincing-flac-files-to-play-in-windows-media-player-12/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Beautiful Souped Up &#8211; A Beautiful Soup GUI Utility to make Screen Scraping Even Easier</title>
		<link>http://www.codeemporium.com/2009/10/10/beautiful-souped-up-a-beautiful-soup-gui-utility-to-make-screen-scraping-even-easier/</link>
		<comments>http://www.codeemporium.com/2009/10/10/beautiful-souped-up-a-beautiful-soup-gui-utility-to-make-screen-scraping-even-easier/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 10:41:11 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=406</guid>
		<description><![CDATA[Quick Download:
BeautifulSoupedUp.py
Recently I&#8217;ve been doing some screen scraping in Python using Beautiful Soup, the great HTML/XML parser library written by Leonard Richardson.  For those not familiar with Beautiful Soup, you give it a HTML/XML document and what you get back is a nice data structure which allows you to easily query for the elements [...]]]></description>
			<content:encoded><![CDATA[<p><b>Quick Download:</b><br />
<a href='http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/10/BeautifulSoupedUp.py'>BeautifulSoupedUp.py</a></p>
<p>Recently I&#8217;ve been doing some screen scraping in Python using <a href="http://www.crummy.com/software/BeautifulSoup/">Beautiful Soup</a>, the great HTML/XML parser library written by Leonard Richardson.  For those not familiar with Beautiful Soup, you give it a HTML/XML document and what you get back is a nice data structure which allows you to easily query for the elements of a document you&#8217;re after.  Taken from the <a href="http://www.crummy.com/software/BeautifulSoup/documentation.html">Beautiful Soup documentation</a>, here&#8217;s a basic example of some of the stuff you can do with Beautiful Soup:</p>
<pre name="code" class="python">
from BeautifulSoup import BeautifulSoup

doc = ['&lt;html>&lt;head>&lt;title>Page title&lt;/title>&lt;/head>',
       '&lt;body>&lt;p id="firstpara" align="center">This is paragraph &lt;b>one&lt;/b>.',
       '&lt;p id="secondpara" align="blah">This is paragraph &lt;b>two&lt;/b>.',
       '&lt;/html>']
soup = BeautifulSoup(''.join(doc))

print soup.prettify()
# &lt;html>
#  &lt;head>
#   &lt;title>
#    Page title
#   &lt;/title>
#  &lt;/head>
#  &lt;body>
#   &lt;p id="firstpara" align="center">
#    This is paragraph
#    &lt;b>
#     one
#    &lt;/b>
#    .
#   &lt;/p>
#   &lt;p id="secondpara" align="blah">
#    This is paragraph
#    &lt;b>
#     two
#    &lt;/b>
#    .
#   &lt;/p>
#  &lt;/body>
# &lt;/html>

soup.contents[0].name
# u'html'

soup.contents[0].contents[0].name
# u'head'

head = soup.contents[0].contents[0]
head.parent.name
# u'html'

head.next
# &lt;title>Page title&lt;/title>

head.nextSibling.name
# u'body'

head.nextSibling.contents[0]
# &lt;p id="firstpara" align="center">This is paragraph &lt;b>one&lt;/b>.&lt;/p>

head.nextSibling.contents[0].nextSibling
# &lt;p id="secondpara" align="blah">This is paragraph &lt;b>two&lt;/b>.&lt;/p>
</pre>
<p>So Beautiful Soup works pretty well as is.  It&#8217;s possible to test out different queries fairly quickly using the Python interactive interpreter.  The problem with testing out queries in the interactive interpreter, especially with larger documents, is that you don&#8217;t get to see the results within the overall context of the document.  What I thought would be useful is if there were a means of testing out Beautiful Soup style queries in a way that let you see precisely where the results fitted in within the broader context of the entire document.  Inspired by the find feature found in most text editors, I&#8217;ve developed a GUI that highlights Beautiful Soup matches within a document.  Difference being, instead of typing in a search term that is a string of characters to look for, you type in a Beautiful Soup style query.  The parts of the text that the Beautiful Soup query matches are then highlighted.  Take a look:</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/10/beautifulsoupedupwindows.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/10/beautifulsoupedupwindows-400x500.jpg" alt="beautifulsoupedupwindows" title="beautifulsoupedupwindows" width="400" height="500" class="alignnone size-large wp-image-427" /></a></p>
<p>So a typical use case for such a tool goes a little something like this:</p>
<ol>
<li>You start out with a HTML document that you want to scrape.  You&#8217;re using Beautiful Soup and you want to establish what kind of query you&#8217;re going to have to give it to extract the pieces of information you&#8217;re after.</li>
<li>You fire up the Beautiful Souped Up GUI and copy the HTML document into the textbox in the middle of the window.</li>
<li>You enter your soup query at the top of the window and run it.  Any parts of the HTML document that your query matches get highlighted, allowing you to quickly determine whether you&#8217;ve written a query that&#8217;s extracting the pieces of information you&#8217;re actually after.</li>
<li>Once you&#8217;ve found a query that does highlight the pieces of information you&#8217;re after, you take the same query and use it in your own Python program wherever it&#8217;s needed.</li>
</ol>
<p>The Beautiful Souped Up GUI is just a single file that you can run from the command prompt/terminal (e.g. <code>python BeautifulSoupedUp.py</code>).  There&#8217;s no fancy installer or anything at this point; I&#8217;ll wait and see how much demand there is for an installer first.  I&#8217;ve tested it on both Windows Vista and also Ubuntu Linux 9.04.  Note that if you&#8217;re running it on Ubuntu, you&#8217;ll probably need to install <code>python-tk</code> first (e.g. <code>sudo apt-get install python-tk</code>).  Other than Beautiful Soup, I don&#8217;t think you&#8217;ll need anything additional installed on a Windows installation of Python.  </p>
<p>I&#8217;ve tested Beautiful Souped Up under Python 2.5.4 and Beautiful Soup version 3.0.7a.  If you&#8217;re running Python version 2.5.2 or earlier and get an error message about Tkinter, you&#8217;ll probably need to upgrade to Python 2.5.4.  I haven&#8217;t had the opportunity to test Beautiful Souped Up with any other version of Python or Beautiful Soup, so if you have a different version of either, please leave a comment and let me know how it goes.  </p>
<p>Beautiful Souped Up is shown running on Vista above.  Here&#8217;s what it looks like running on Ubuntu below:</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/10/beautifulsoupedupubuntu.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/10/beautifulsoupedupubuntu-407x500.jpg" alt="beautifulsoupedupubuntu" title="beautifulsoupedupubuntu" width="407" height="500" class="alignnone size-large wp-image-433" /></a></p>
<p>For anyone interested in contributing to Beautiful Souped Up, I&#8217;ve set up a public repository over on GitHub at <a href="http://github.com/brycethomas/BeautifulSoupedUp">http://github.com/brycethomas/BeautifulSoupedUp</a>.  Leave a comment and let me know what you think.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2009/10/10/beautiful-souped-up-a-beautiful-soup-gui-utility-to-make-screen-scraping-even-easier/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>I got Scammed, but at least they were good (kind of)</title>
		<link>http://www.codeemporium.com/2009/09/12/i-got-scammed-but-at-least-they-were-good-kind-of/</link>
		<comments>http://www.codeemporium.com/2009/09/12/i-got-scammed-but-at-least-they-were-good-kind-of/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 07:00:32 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=383</guid>
		<description><![CDATA[I was in the market for a copy of Adobe Acrobat the other week for the work I&#8217;ve been doing over on Centreleak.  I didn&#8217;t really know where to get a copy at a good price, so I headed over to Google.  
I soon found a site topsoftshop that were selling Adobe Acrobat [...]]]></description>
			<content:encoded><![CDATA[<p>I was in the market for a copy of Adobe Acrobat the other week for the work I&#8217;ve been doing over on <a href="http://www.centreleak.com">Centreleak</a>.  I didn&#8217;t really know where to get a copy at a good price, so I headed over to Google.  </p>
<p>I soon found a site <a href="http://www.topsoftshop.com">topsoftshop</a> that were selling Adobe Acrobat for the bargain price of $88 USD (and yes, for Adobe Acrobat, that is a bargain).  I did my usual preliminary test for determining whether a deal is legitimate or not by looking at the website.  If it looks like it could have been put together in under an hour, it&#8217;s probably not legit.  Historically this rule has served me well and screened out 99% of the bad eggs.  Anyway, topsoftshop passed the test.  As you&#8217;ll see if you visit the site, it all looks very professional and there&#8217;s not any obvious hints that it would be a scam.  Even if you read the terms and conditions or take a look around other pages on the site, there&#8217;s far fewer spelling and grammatical errors than you would find on your average scam site.</p>
<p>Anyway, after taking a look around I was pretty confident it was legitimate and so went ahead and purchased a copy of Adobe Acrobat.  Might I add, payment was through Paypal, which also boosted my confidence.  Admittedly I didn&#8217;t bother to check whether I was actually covered by Paypal against fraud, but for an $88 purchase, I couldn&#8217;t be bothered trying to make sense of their rules surrounding the matter.  So everything was going smoothly, and then an alarm bell went off:</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/payment_to_wu_chao_hop.JPG"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/payment_to_wu_chao_hop.JPG" alt="payment_to_wu_chao_hop" title="payment_to_wu_chao_hop" width="190" height="92" class="alignnone size-full wp-image-385" /></a></p>
<p>That&#8217;s a print screen from the Paypal transaction.  The transaction all seemed normal at first.  Topsoftshop asks me to enter all my shipping details, it all looks legit, I&#8217;m taken to Paypal and I enter an email address (yes, an English sounding one) to send money to and an amount of $88 USD and click pay.  Only then does Paypal inform me of the name of the recipient that I&#8217;ve sent my $88 USD to.  It&#8217;s old mate off in Asia; <em>Wu Chao-Hop</em> according to Google translate.  So at this point I figure I&#8217;ve probably done my dough, and get ready to report the matter to Paypal in a few weeks time when my copy of Adobe Acrobat has predictably not turned up.  So I forget about it all for now.</p>
<p>A few days later though, I receive an email from my friends at topsoftshop letting me know that my copy of Adobe Acrobat has shipped and they&#8217;ve even given me a tracking number.  I go to the postage site they&#8217;ve linked me to (a Chinese site) and enter my tracking number and sure enough there&#8217;s a record there in the system.  I&#8217;m starting to think this is legitimate again.  I mean I&#8217;ve heard of elaborate scams, but going to the effort to create your own postage site and rig it up with order tracking is just way too much effort.  Anyway, the postage site and tracking number were both real and they had shipped at least something.</p>
<p>A few days later, a knock on my door and sure enough, I&#8217;ve got a package, direct from China.  It kinda looks like the size of box you&#8217;d expect software to come in, so I figure its all good and open it up.  Inside there&#8217;s a nice &#8220;Adobe Acrobat 9 Pro&#8221; cardboard box and inside that is a perfectly legitimate looking disc and even little Adobe pamphlets. Take a look.</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/adobe_acrobat_scam_boxing.JPG"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/adobe_acrobat_scam_boxing-500x375.jpg" alt="adobe_acrobat_scam_boxing" title="adobe_acrobat_scam_boxing" width="500" height="375" class="alignnone size-large wp-image-389" /></a></p>
<p>So I chuck the CD into my computer.  Being sceptical,  I decide to first check out the directory structure on the CD before installing.  Here&#8217;s what I find:</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/directory_structure_highlighted.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/directory_structure_highlighted-499x375.jpg" alt="directory_structure_highlighted" title="directory_structure_highlighted" width="499" height="375" class="alignnone size-large wp-image-391" /></a></p>
<p>Low and behold, what do I find in the completely inconspicuous &#8220;Serial Fix&#8221; directory?  A cracked .dll and directions on how to install it.  I&#8217;ve got to say topsoftshop, 10 out of 10 for effort put into creating a fake that appears very real.  But why go to so much effort when you&#8217;d need to use a crack to get the software to work anyway?  I think by the time you&#8217;re installing a crack it would be preeeetty obvious that your software is not legit, which kind of negates all of the effort that went into replicating the fancy packaging.  I don&#8217;t know, perhaps they&#8217;ve rigged up the installer so that the crack gets applied automatically and they just hope that some sucker doesn&#8217;t look in the directory structure.</p>
<p>So by this point I assume my money is probably long gone and that the topsoftshop site will evaporate within a day or two.  I figure I should let Paypal know about it anyway, so I log on and lodge a dispute.  The first step of lodging a dispute on Paypal is very hands-off from Paypal&#8217;s point of view.  You go on and lodge a dispute that contains a message that gets sent to the person you bought the stuff from, but Paypal doesn&#8217;t look at it at this point.  So this is what I do.  I go on, write a message to topsoftshop explaining that there was a crack folder in the software they sent me (as if they didn&#8217;t know) and submit the dispute.  Then it&#8217;s off to bed.  </p>
<p>Here&#8217;s where it gets brilliant.  The next day I wake up and check my email and I&#8217;ve got a message from Paypal saying my dispute has been closed.  There&#8217;s no mention of why it&#8217;s been closed, so I log onto Paypal to checkout what&#8217;s happened.  Here&#8217;s what I see:</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/paypal_refund.JPG"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/paypal_refund-500x47.jpg" alt="paypal_refund" title="paypal_refund" width="500" height="47" class="alignnone size-large wp-image-393" /></a></p>
<p>Topsoftshop had refunded my money!  No message, no email or explanation, they&#8217;ve just refunded my money.  That&#8217;s like the worst scam ever.  You take peoples money, give them pirated software and then later on when they point it out to you, you just hand the money straight back over?  Doesn&#8217;t that sort of defeat the purpose of scamming people in the first place?</p>
<p>The best I can surmise is that they hope that they sell enough pirate software to people who couldn&#8217;t be bothered complaining and for those who do complain, they quietly refund the money in the hope that they just shut up about the whole issue and don&#8217;t notify Paypal.  Well guess what topsoftshop?  Up yours!  I&#8217;m going to dob on you to Paypal anyway.</p>
<p>So there you have it.  I&#8217;ve got my money back and I&#8217;m now the proud owner of a strikingly good looking fake of Adobe Acrobat Pro.  The whole episode has been as hilarious as it has saddening.  Whatever you do, please don&#8217;t buy software from topsoftshop and do the best you can to avoid other professional looking fakes.  After all, they might not all happily refund your money!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2009/09/12/i-got-scammed-but-at-least-they-were-good-kind-of/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Visual Studio &#8211; Programmer&#8217;s Edition</title>
		<link>http://www.codeemporium.com/2009/09/06/visual-studio-programmers-edition/</link>
		<comments>http://www.codeemporium.com/2009/09/06/visual-studio-programmers-edition/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 12:32:59 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=338</guid>
		<description><![CDATA[If you&#8217;ve ever installed Visual Studio, you&#8217;ll have seen the generic models that the installer cycles through on your screen.  They all look exactly that; like models, with little resemblance to the average Visual Studio user.  If you haven&#8217;t ever installed Visual Studio, here&#8217;s a taste:

Personally I find this to be the worst [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve ever installed Visual Studio, you&#8217;ll have seen the generic models that the installer cycles through on your screen.  They all look exactly that; like models, with little resemblance to the average Visual Studio user.  If you haven&#8217;t ever installed Visual Studio, here&#8217;s a taste:</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_2.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_2-500x383.jpg" alt="vs_install_2" title="vs_install_2" width="500" height="383" class="alignnone size-large wp-image-341" /></a><br />
Personally I find this to be the worst offender.  When I saw this, I figured Ikea must be selling sweaters now.  I&#8217;d hire him as an interior designer, but not as a software developer.</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_3.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_3-500x383.jpg" alt="vs_install_3" title="vs_install_3" width="500" height="383" class="alignnone size-large wp-image-342" /></a><br />
This guy you could conceivably find actually writing code, though I&#8217;d say he&#8217;d be in the top 1% presentation wise amongst the programming community, so hardly representative.  I never noticed, but <a href="http://www.secretgeek.net/vs2008_bugeye.asp">according to some</a>, he has a face too small for his head also.</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_1.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_1-500x383.jpg" alt="vs_install_1" title="vs_install_1" width="500" height="383" class="alignnone size-large wp-image-340" /></a><br />
This picture isn&#8217;t actually too unrealistic, apart from the Colgate smile.  I would however say that her presentation is still probably well above average for programmers.  She is also a she, and lets face it, sad but true, most programmers are male.</p>
<p>All in all, they&#8217;re the usual suspects of corporate software installs; clean shaven, well dressed and in this particular case, look like they&#8217;ve probably never written a line of code before in their life.  To Microsoft&#8217;s credit, the models they&#8217;ve used are far closer to reality than those shown in many other stock photos.  I&#8217;m sure I could have chosen a much better example of an installer with superficial models, but I&#8217;m lazy.  I was installing Visual Studio at the time, and you know the install is going to take long enough that you&#8217;ll have plenty of print screen opportunities.</p>
<p>I&#8217;ve always felt as though people would have more respect for a product if the models they used actually looked remotely like the people that use the product.  So with my sub par photo editing skills, I drew up some prototypes for the programmer&#8217;s edition of Visual Studio, now featuring real programmers!  With a bit of luck, you&#8217;ll see these babies in the Visual Studio 2010 installer.  See if you can pick the characters.</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_1_mod.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_1_mod-500x384.jpg" alt="vs_install_1_mod" title="vs_install_1_mod" width="500" height="384" class="alignnone size-large wp-image-344" /></a><br />
See, it&#8217;s not so bad when you include an actual programmer in the photo.  The expression is a little bit used car salesman, but I think this can be overlooked.  I mean hey, he&#8217;s even wearing a suit (of sorts).  Surely that&#8217;s enough to keep the corporate types happy.  </p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_3_mod.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_3_mod-500x381.jpg" alt="vs_install_3_mod" title="vs_install_3_mod" width="500" height="381" class="alignnone size-large wp-image-346" /></a><br />
Ok, so he&#8217;s wearing flannel.  He might not win any fashion awards, but if you knew who he was you&#8217;d have huge <a href="http://www.urbandictionary.com/define.php?term=restecp">restecp</a>.  Actually, the idea of getting to wear flannel while you work already earns my respect, even if you are just some hobo off the street.</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_2_mod.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_2_mod-499x382.jpg" alt="vs_install_2_mod" title="vs_install_2_mod" width="499" height="382" class="alignnone size-large wp-image-347" /></a><br />
Ok, so conceivably it would be a little more difficult pitching this one to Microsoft for the Visual Studio 2010 installer.  I don&#8217;t even know what to say about this one.  It either shows the stark contrast that occurs when you combine the head of a programmer with the body of a model, or the stark contrast that occurs when you do a particularly poor job of editing photos.</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_3_mod_2.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_3_mod_2-500x381.jpg" alt="vs_install_3_mod_2" title="vs_install_3_mod_2" width="500" height="381" class="alignnone size-large wp-image-357" /></a><br />
Once again, getting this one into the Visual Studio 2010 installer would be somewhat of a challenge.  I&#8217;m not going to add anything to that, the picture says enough.</p>
<p>Truth be told, I suspect (and in some cases know) that the programmers above wouldn&#8217;t use Visual Studio anyway.  Their photos just happened to be handy.  Still, I imagine there&#8217;s plenty of .NET programmers out there whose appearance is a far stretch from the models you see in the installer.  Nonetheless, it seemed only fitting to add one more concept image for the Visual Studio 2010 installer of someone who I&#8217;m sure would use Visual Studio if they were still programming on a daily basis.</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_3_mod_3.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/09/vs_install_3_mod_3-500x381.jpg" alt="vs_install_3_mod_3" title="vs_install_3_mod_3" width="500" height="381" class="alignnone size-large wp-image-361" /></a></p>
<p>On second thoughts, let&#8217;s just stick with using models&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2009/09/06/visual-studio-programmers-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Viewing Patterns of YouTube Lecture Series</title>
		<link>http://www.codeemporium.com/2009/08/30/viewing-patterns-of-youtube-lecture-series/</link>
		<comments>http://www.codeemporium.com/2009/08/30/viewing-patterns-of-youtube-lecture-series/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 09:26:19 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Statistics]]></category>
		<category><![CDATA[YouTube]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=296</guid>
		<description><![CDATA[It&#8217;s amazing to see the kind of educational resources that are starting to crop up for free online.  If you look on YouTube today, you&#8217;ll find channels from some of the top universities in the states like Stanford and MIT that feature entire lecture series taken from some of the courses taught there.  [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s amazing to see the kind of educational resources that are starting to crop up for free online.  If you look on YouTube today, you&#8217;ll find channels from some of the top universities in the states like <a href="http://www.youtube.com/user/stanforduniversity">Stanford</a> and <a href="http://www.youtube.com/mit">MIT</a> that feature entire lecture series taken from some of the courses taught there.  About a month ago I was browsing through some of these series and noticed a kind of quaint pattern in how the number of views a lecture had received related to how far it was into the lecture series.  I&#8217;m using this post as an excuse to get acquainted with <a href="http://www.r-project.org/">R</a> and so created some graphs to plot the number of views of five prominent lecture series available on YouTube:</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/linear_dynamical_systems.png"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/linear_dynamical_systems-500x499.png" alt="linear_dynamical_systems" title="linear_dynamical_systems" width="500" height="499" class="alignnone size-large wp-image-309" /></a></p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/stat_aspects_of_data_mining.png"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/stat_aspects_of_data_mining-500x499.png" alt="stat_aspects_of_data_mining" title="stat_aspects_of_data_mining" width="500" height="499" class="alignnone size-large wp-image-313" /></a></p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/convex_optimization.png"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/convex_optimization-500x499.png" alt="convex_optimization" title="convex_optimization" width="500" height="499" class="alignnone size-large wp-image-314" /></a></p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/classical_mechanics.png"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/classical_mechanics-500x499.png" alt="classical_mechanics" title="classical_mechanics" width="500" height="499" class="alignnone size-large wp-image-315" /></a></p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/intro_to_robotics.png"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/intro_to_robotics-500x499.png" alt="intro_to_robotics" title="intro_to_robotics" width="500" height="499" class="alignnone size-large wp-image-316" /></a></p>
<p>Notice how the number of views drops radically between the first lecture and the second lecture in each series.  The number of views continues to fall for a few more lectures, but at a much slower rate.  I had to lol at the déjà vu when thinking back to some of the classes I took at university, where lecture attendance seemed to follow a somewhat similar pattern.    </p>
<p>There&#8217;s way too little information in this data to draw any meaningfully accurate conclusions, but in true <a href="http://en.wikipedia.org/wiki/Today_Tonight">Today Tonight</a> style, let&#8217;s try and do so anyway.  Here&#8217;s some conjecture about what the data could mean:</p>
<p><strong>People can&#8217;t be bothered learning stuff in any depth</strong><br />
Could the large drop off after the first video in a series be an indication that few people can muster up the will power to learn more than a lectures worth of information on any topic without losing motivation and moving onto something else?  This conclusion would fit in nicely with proponents of the &#8220;kid&#8217;s these days don&#8217;t know anything/can&#8217;t stick with anything&#8221; school of thought.  I&#8217;d put it as plausible, but I wouldn&#8217;t necessarily argue that people not bothering to watch a whole lecture series is a bad thing, depending on the circumstances.</p>
<p><strong>Most people find the lecture videos boring</strong><br />
People watch the first video, only to find that it&#8217;s about as fun as watching paint dry.  If the videos were truly boring though, you&#8217;d think that people would close them in the first few minutes, rather than subjecting themselves to 45 minutes or more of torture.  It looks as though YouTube standards require a video to be <a href="http://www.masternewmedia.org/news/2008/02/29/internet_video_metrics_when_a.htm">watched in full</a> for it to count as a view.  If this holds true, then you can rule out the possibility of a whole load of people who watch only the first few minutes being registered as a view.  Therefore all those who were counted as a &#8220;view&#8221; didn&#8217;t find it boring enough to end the video prematurely.</p>
<p>Although all the lecture series show a rapid decline in number of views after the first lecture, some have a decline more rapid than others.  The following summarises the percentage drop in views between the first lecture and second lecture of each series.</p>
<table>
<tr>
<td><a href="http://www.youtube.com/view_play_list?p=06960BA52D0DB32B&#038;search_query=linear+dynamic+systems">Linear Dynamical Systems</a> </td>
<td>-47.94%</td>
</tr>
<tr>
<td><a href="http://www.youtube.com/view_play_list?p=3C9A24BC27426F65&#038;search_query=statistical+aspects+of+data+mining">Statistical Aspects of Data Mining</a> </td>
<td>-61.25%</td>
</tr>
<tr>
<td><a href="http://www.youtube.com/view_play_list?p=3940DD956CDF0622&#038;search_query=convex+optimization">Convex Optimisation</a> </td>
<td>-64.63%</td>
</tr>
<tr>
<td><a href="http://www.youtube.com/view_play_list?p=F688ECB2FF119649">Classical Mechanics</a> </td>
<td>-66.93%</td>
</tr>
<tr>
<td><a href="http://www.youtube.com/view_play_list?p=65CC0384A1798ADF&#038;search_query=introduction+to+robotics">Introduction to Robotics</a> </td>
<td>-78.26%</td>
</tr>
</table>
<p>This information could perhaps be a reflection of how &#8220;accessible&#8221; each individual course is, with a greater relative drop in views indicating that a course is harder to follow along with (hence people stop watching after the first lecture).  I haven&#8217;t watched either the Linear Dynamical Systems or Introduction to Robotics series which are at the two extremes of the data, so I can&#8217;t provide any opinion on one being any more accessible than the other.  Still, it would be interested to know if the hypothesis had any merit to it.</p>
<p>Anyway, this analysis is hardly scientific and the statistics should be filed under descriptive at best.  Still, it&#8217;s interesting to see how the different lecture series follow a similar viewing pattern.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2009/08/30/viewing-patterns-of-youtube-lecture-series/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Justifying an Expensive Quality Computer Chair</title>
		<link>http://www.codeemporium.com/2009/08/18/justifying-an-expensive-quality-computer-chair/</link>
		<comments>http://www.codeemporium.com/2009/08/18/justifying-an-expensive-quality-computer-chair/#comments</comments>
		<pubDate>Tue, 18 Aug 2009 06:48:23 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=251</guid>
		<description><![CDATA[About one year ago, I was introduced to the Herman Miller Aeron chair.  For anyone not familiar with it, it&#8217;s a chair that is said to have grossed over $1 billion in sales and is considered by many to be one of the most comfortable ergonomic chairs on the planet.  According to Internet [...]]]></description>
			<content:encoded><![CDATA[<p>About one year ago, I was introduced to the Herman Miller <em>Aeron</em> chair.  For anyone not familiar with it, it&#8217;s a chair that is said to have grossed over $1 billion in sales and is considered by many to be one of the most comfortable ergonomic chairs on the planet.  According to Internet folk lore, it&#8217;s mandatory that I at this point include the phrase &#8220;dot com excess&#8221; in my post about the Aeron chair, and mention that it was hugely popular among high-tech start-ups, right before reality set in and the bubble burst.  So why the hell am I crapping on about a chair?  Well, it&#8217;s the price.  Or perhaps more importantly, why I think it&#8217;s perfectly justifiable for basically any full-time programmer.</p>
<p><a href="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/aeron_side_view.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/aeron_side_view-500x400.jpg" alt="aeron_side_view" title="aeron_side_view" width="500" height="400" class="alignnone size-large wp-image-285" /></a></p>
<p>Here in Australia, a fully loaded Aeron, shipped to your door, will set you back around $1600 AUD (~$1300 USD).  Most people completely rule out any possibility of owning a chair like the Aeron after hearing a price tag like this.  I suspect that like most things in life, it&#8217;s the upfront cost that deters people the most.  Like any other investment, buying an expensive chair requires that you postpone consumption now for greater consumption in the future.  The chair of course pays out its dividends daily, but unless you&#8217;ve been sitting on a steel rod up until now, it&#8217;s unlikely to make you $1600 better off in 24 hours.</p>
<p>I finally bit the bullet and bought myself an Aeron chair at the beginning of this year.  Retrospecting all the way back to my last sentence, &#8220;bit the bullet&#8221; is a little melodramatic &#8211; buying an Aeron was a complete no-brainer.  When you spend around 10 hours a day at the computer, $1600 amortised over the life of a chair doesn&#8217;t look so bad.  Speaking of the life of a chair, the Aeron comes with a 12 year warranty.  I don&#8217;t think any of my other possessions will still be under warranty by the time I&#8217;m 33 years old.</p>
<p>So justifying an expensive computer chair for myself was easy &#8211; it brings me comfort and satisfaction every single day, for many hours a day.  It&#8217;s likely to do so for quite some time. But it did get me thinking; how justifiable is an expensive computer chair at work?  All the work I do at the moment is from home, so it&#8217;s not like I have to seek approval to buy furniture here.  Between me, myself and I, things get approved fast.  They&#8217;ll almost certainly be a point in time though where I&#8217;m working in an office, at which point I&#8217;ll want to be able to determine a) whether or not an expensive computer chair is justifiable and b) how I&#8217;d go about proving it.  So I came up with a hypothetical scenario of a full-time worker.  Here&#8217;s how it goes:</p>
<p><strong>Scenario</strong></p>
<p>You&#8217;re a full-time worker, working 40 hours a week over 5 days.  Without subtracting days off, you therefore work 260 days a year (52 weeks * 5 days).  You get 4 weeks annual leave (4 weeks * 5 days = 20 days), 11 public holidays and take 5 sick days in a year, for a total of 36 additional days off.  This means you actually work 260 &#8211; 36 = 224 days a year (less than it feels like I&#8217;m sure).  Over a 12 year period (warranty of chair), you work 2688 days (12 years * 224 days).  In true business style, let&#8217;s break it down, cost/benefit.</p>
<p><strong>Cost</strong></p>
<p>Ok.  So your company spends $1500 AUD on buying you an Aeron (assuming they get it $100 cheaper by being a business or buying in bulk).  Let&#8217;s assume they would have otherwise bought you a $200 chair, so the additional cost to them is $1300.  Now at this point it&#8217;s attractive to say &#8220;so it&#8217;s costing the company $1300&#8243;.  To be fair though, there is a hidden cost &#8211; the opportunity cost.  </p>
<p>The opportunity cost is the next best option the company would have to forego to buy you a quality computer chair.  Unless they were really bad with finances, they wouldn&#8217;t just leave the money sit there doing nothing if they didn&#8217;t buy you a quality chair; they&#8217;d have it earning interest or being invested in some other productive activity.  To keep things simple, let&#8217;s assume their best alternate use of the money is to invest it into an index fund, with a long-term compounded rate of return of 10% annually.  Also assume long-term inflation of 2.5% per/year, calling it even at 7.5% interest per year.  $1300 compounding for 12 years at 7.5% comes out to $3096.31, which is the opportunity cost of buying you a quality computer chair.  </p>
<p>So at this point, the company has two options:</p>
<ol>
<li>invest their $1300 in the index fund and come out with $3096.31 in 12 years time, measured in today&#8217;s dollars.</li>
<li>invest $1300 in an expensive chair for you in anticipation that it results in an additional $3096.31 of production/saving or more over 12 years.</li>
</ol>
<p>Squeezing $3096.31 of value out of a quality chair upgrade sounds a little lofty at first.  But let&#8217;s not forget, this is over 12 years.  Another way to view the cost of a quality chair is to look at it amortised over the 2688 days you work over those 12 years.  $3096.31/2688 days = $1.15 AUD (~ $0.95 USD) per day in order for you to sit in a fancy pants chair.  So $1.15 AUD per day, or $257.60 AUD a year ($1.15 * 224 days), is the price a business pays to notably improve your seating.  If you earn $50,000 per year, that&#8217;s equivalent to asking for a one half of one percent pay rise.  It becomes an even smaller percentage of your income as time goes by and your pay increases.</p>
<p>But hold on you say; an employee will rarely stick with a single company for 12 years, and the company might not even exist for that long.  A counterargument to the former is that the chair would be transferred over to the person replacing them.  To the latter I&#8217;d say that high quality chairs like the Aeron appear to hold their value fairly well and so some of the cost would be recouped when the chair is liquidated.  The precise figures I&#8217;ve used in this example are also debatable and you could tweak them for better or worse to calculate your own situation.  Either way, I like to think the provided scenario is indicative of the kind of money it costs a company to provide employees with a high quality chair.  And now to the benefit&#8230;</p>
<p><strong>Benefit</strong></p>
<p>It&#8217;s really hard to put a dollars and cents figure on the benefit of a quality chair, but here&#8217;s what I imagine would be some of the benefits for a company: </p>
<ul>
<li><u><em>Greater productivity</em></u>: now you can focus on your work, rather than how sore your arse is getting.</li>
<li><u><em>Higher morale</em></u>: you&#8217;re left believing that your employer cares about you (even if they don&#8217;t).</li>
<li><u><em>Lower turnover</em></u>: see higher morale.</li>
<li><u><em>Fewer sick days</em></u>: fewer mangled spines means fewer sick days (and fewer law suits).</li>
<li><u><em>Attract new employees</em></u>: nothing speaks geek like an Aeron chair.  If I were to walk into a job interview and they sat me down in an Aeron or similar, I&#8217;d have more respect for the company and be under the impression that they treat their people well.</li>
</ul>
<p>At $1.15 a day, your employer could easily be spending more money providing you with cups of coffee and biscuits than with a quality computer chair.  I&#8217;m going to argue that if you&#8217;re a full-time programmer, it&#8217;s not over indulgent or opulent for a company to buy you an expensive quality computer chair &#8211; it&#8217;s a sound investment.  You shouldn&#8217;t have to be a freakin&#8217; genius programmer earning a 6 figure salary before it becomes justifiable either.  The benefits might not be 100% quantifiable, but I think if you achieve even one of those listed above, a quality chair will pay for itself over its lifetime.  Does <em>your</em> job justify a chair upgrade?</p>
<p><u>Note</u>: If you&#8217;re living in the United States, consider yourself lucky.  High quality computer chairs like the Aeron can be picked up for notably less than they can here in Australia, making them even easier to justify on a cost/benefit basis.  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2009/08/18/justifying-an-expensive-quality-computer-chair/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grocery Shopping Gives Me GoldenEye Nostalgia</title>
		<link>http://www.codeemporium.com/2009/08/09/grocery-shopping-gives-me-goldeneye-nostalgia/</link>
		<comments>http://www.codeemporium.com/2009/08/09/grocery-shopping-gives-me-goldeneye-nostalgia/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 06:57:49 +0000</pubDate>
		<dc:creator>Bryce Thomas</dc:creator>
				<category><![CDATA[Digressions]]></category>
		<category><![CDATA[45 degree angle]]></category>
		<category><![CDATA[goldeneye]]></category>
		<category><![CDATA[nintendo 64]]></category>
		<category><![CDATA[nostalgia]]></category>
		<category><![CDATA[run faster]]></category>
		<category><![CDATA[shopping]]></category>
		<category><![CDATA[trolley]]></category>

		<guid isPermaLink="false">http://www.codeemporium.com/?p=224</guid>
		<description><![CDATA[Every time I go grocery shopping I can&#8217;t help but reminisce about the good old days playing GoldenEye on Nintendo 64.  For anyone that never played it, don&#8217;t worry &#8211; you only missed out on like one of the best games ever, but no biggie.  For those of you who have forgotten, or [...]]]></description>
			<content:encoded><![CDATA[<p>Every time I go grocery shopping I can&#8217;t help but reminisce about the good old days playing GoldenEye on Nintendo 64.  For anyone that never played it, don&#8217;t worry &#8211; you only missed out on like one of the best games ever, but no biggie.  For those of you who have forgotten, or were unfortunate enough to never learn, when you run at a 45 degree angle in GoldenEye, you go faster.  Realistic, I know.</p>
<p><a href="http://www.codeemporium.com/wp-content/uploads/2009/08/golden_eye_007_in_game.jpg"><img src="http://www.codeemporium.com/http://www.codeemporium.com/wp-content/uploads/2009/08/golden_eye_007_in_game.jpg" alt="golden_eye_007_in_game" title="golden_eye_007_in_game" width="400" height="277" class="alignnone size-full wp-image-241" /></a></p>
<p>Anyway, what I&#8217;m getting at here is that I think there may have been a carefully thought out plan to design shopping trolleys as a secret tribute to GoldenEye.  I&#8217;ve found you generally achieve optimum momentum and control when you push it at around a 45 degree angle.  It&#8217;s as if there is an unspoken understanding between shopping trolley designer and the initiated few.  Once your hands grasp that shopping trolley bar, all you need do is angle it at 45 degrees, push it just a little and think of GoldenEye.  Soon enough you&#8217;ll come to accept that you&#8217;re actually James Bond!  You didn&#8217;t even have to work out at Globo Gym or get cosmetic surgery.  </p>
<p>If you go shopping late at night like I do, you also avoid the mum and three kids network congestion.  This lets you really get into it as you run the trolley through the isles, frantically searching for the golden <del datetime="2009-08-08T04:59:08+00:00">gun</del> syrup.  Depending on your dedication, you could probably even syrup-shoot a few <del datetime="2009-08-08T05:12:22+00:00">russians</del> checkout assistants with it once you find it.  Try this on the wrong person though and your health could quickly become depleted, especially if they don&#8217;t die in one hit after all.  Either way, shopping centre security would probably bar you from ever playing that level again, so you&#8217;d have to find yourself another supermarket.    I&#8217;m yet to wear a suit grocery shopping, but one day I&#8217;ll have to try it, just to see if it enhances the experience (without having to find a new supermarket every Monday).</p>
<p>What things back in the real world induce your gaming nostalgia?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.codeemporium.com/2009/08/09/grocery-shopping-gives-me-goldeneye-nostalgia/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
