<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns: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/" version="2.0">

<channel>
	<title>Wayne Koorts' Blog</title>
	
	<link>http://www.wkoorts.com/wkblog</link>
	<description>Geek</description>
	<lastBuildDate>Sun, 12 Jul 2009 00:30:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/wkoorts" type="application/rss+xml" /><item>
		<title>CSS auto reload with Django templates</title>
		<link>http://www.wkoorts.com/wkblog/2009/07/12/css-auto-reload-with-django-templates/</link>
		<comments>http://www.wkoorts.com/wkblog/2009/07/12/css-auto-reload-with-django-templates/#comments</comments>
		<pubDate>Sun, 12 Jul 2009 00:28:52 +0000</pubDate>
		<dc:creator>Wayne</dc:creator>
				<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[templates]]></category>

		<guid isPermaLink="false">http://www.wkoorts.com/wkblog/?p=133</guid>
		<description><![CDATA[Have you ever been in the situation where you&#8217;ve updated your CSS file but users&#8217; web browsers haven&#8217;t automatically loaded the new one?  The reason is because many web browsers cache the stylesheet for faster future reloading.  Obviously you don&#8217;t want to have to get your users to Ctrl-F5 every time you update [...]]]></description>
			<content:encoded><![CDATA[<p>Have you ever been in the situation where you&#8217;ve updated your CSS file but users&#8217; web browsers haven&#8217;t automatically loaded the new one?  The reason is because many web browsers cache the stylesheet for faster future reloading.  Obviously you don&#8217;t want to have to get your users to Ctrl-F5 every time you update your stylesheet so here&#8217;s a little tip for making this automatic in your Django templates.</p>
<p>Let&#8217;s say you have a template with the following line:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p133code5'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p1335"><td class="code" id="p133code5"><pre class="html" style="font-family:monospace;">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/site_media/css/style.css&quot; /&gt;</pre></td></tr></table></div>

<p>Every time the page loads the browser cache will think it&#8217;s seen the file before and reload the cached version from disk.  One solution is to dynamically generate the link so that the browser thinks it is loading a new file every time.  One way to do this without actually making a new file every time (you could just rename your CSS file every time you update it, but that&#8217;s painful) is to pretend you&#8217;re passing some parameters to the CSS file, like this:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p133code6'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p1336"><td class="code" id="p133code6"><pre class="html" style="font-family:monospace;">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/site_media/css/style.css?12345&quot; /&gt;</pre></td></tr></table></div>

<p>The trick is to generate a new fake parameter every time the page loads.  Django templates make this easy by allowing us to generate a <a href="http://en.wikipedia.org/wiki/Unix_timestamp">Unix timestamp</a> (the number of seconds since a specific point in history) which we can attach to our link.</p>
<p>To do this we use the <a href="http://docs.djangoproject.com/en/dev/ref/templates/builtins/#ttag-now">&#8220;now&#8221; template tag</a>.  In your template file, update the stylesheet line to the following:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p133code7'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p1337"><td class="code" id="p133code7"><pre class="html" style="font-family:monospace;">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/site_media/css/style.css?{% now &quot;U&quot; %}&quot; /&gt;</pre></td></tr></table></div>

<p>This will generate a line like the following every time the page is loaded:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p133code8'); return false;">View Code</a> HTML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p1338"><td class="code" id="p133code8"><pre class="html" style="font-family:monospace;">&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;/site_media/css/style.css?1249948982&quot; /&gt;</pre></td></tr></table></div>

<p>Voila!  Automatically-refreshing stylesheets.  You don&#8217;t have to make any changes to your stylesheet to use this.</p>
<p>This is a little inefficient, and if you have a super busy site and a very big stylesheet this could add an extra fair bit of bandwidth usage to your server(s).  To get around this you could just change the &#8220;now&#8221; tag usage to generate a daily stamp (see the <a href="http://docs.djangoproject.com/en/dev/ref/templates/builtins/#ttag-now">&#8220;now&#8221; tag docs</a>), e.g. style.css?20090712, in which case the client browser should only reload it once per day.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wkoorts.com/wkblog/2009/07/12/css-auto-reload-with-django-templates/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SourceForge drops IE 6 support</title>
		<link>http://www.wkoorts.com/wkblog/2009/05/20/sourceforge-drops-ie-6-support/</link>
		<comments>http://www.wkoorts.com/wkblog/2009/05/20/sourceforge-drops-ie-6-support/#comments</comments>
		<pubDate>Wed, 20 May 2009 08:56:32 +0000</pubDate>
		<dc:creator>Wayne</dc:creator>
				<category><![CDATA[Systems Administration]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[ie6]]></category>
		<category><![CDATA[internet explorer]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.wkoorts.com/wkblog/?p=117</guid>
		<description><![CDATA[SourceForge has changed its appearance more often in the past 6 months than Joan Rivers&#8217; face.  Not in small ways either.  I host Tubecaster on SourceForge and recently it seemed that every time I logged into the site they had completely re-themed.
Yesterday I was at work and trying to track down an Open Source hex [...]]]></description>
			<content:encoded><![CDATA[<p><a title="SourceForge homepage" href="http://sourceforge.net" target="_blank">SourceForge</a> has changed its appearance more often in the past 6 months than Joan Rivers&#8217; face.  Not in small ways either.  I host <a title="Tubecaster.org - download YouTube videos to your PC." href="http://www.tubecaster.org" target="_blank">Tubecaster</a> on SourceForge and recently it seemed that every time I logged into the site they had completely re-themed.</p>
<p>Yesterday I was at work and trying to track down an Open Source hex editor so I thought I&#8217;d pop into SourceForge and browse their extensive software database.  Even though other Open Source project hosting services have been gaining a lot of momentum lately SourceForge is still the first place I turn to when looking for Open Source apps.  It still has the largest legacy range of software of any similar site.  Anyway, I happened to be using IE 6 because it was part of the particular build on the PC I was using and, to my surprise, up popped a little information bar at the top of the screen, stating:</p>
<blockquote><p><em>Your browser isn&#8217;t supported, so some things might not work as expected.  Please upgrade to a newer version of IE, or to Firefox.</em></p></blockquote>
<p>The web developer in me shrieked with joy, but the objective observer quickly overruled and made me think of all the corporates out there still on IE6.  I can certainly speak for most of the clients I&#8217;ve worked with at the company I work for.  Browser usage is a reasonably difficult metric to measure accurately in a big-picture sense, but I think it&#8217;s fair to say that we should still make some attempt at supporting it.  It seems that the good folks at SourceForge quite literally haven&#8217;t even tried their site in IE6, even once:</p>
<p style="text-align: center;">
<div id="attachment_119" class="wp-caption aligncenter" style="width: 410px"><a href="http://www.wkoorts.com/wkblog/wp-content/uploads/2009/05/sourceforge_ie6_full.png" target="_blank"><img class="size-full wp-image-119" title="sourceforge_ie6_thumb" src="http://www.wkoorts.com/wkblog/wp-content/uploads/2009/05/sourceforge_ie6_thumb.png" alt="SourceForge.net in IE6 - Click to enlarge" width="400" height="289" /></a><p class="wp-caption-text">SourceForge.net in IE6 - Click to enlarge</p></div>
<p>Compare that to IE 7 &amp; 8 (it looks the same in both):</p>
<div id="attachment_120" class="wp-caption aligncenter" style="width: 410px"><a href="http://www.wkoorts.com/wkblog/wp-content/uploads/2009/05/sourceforge_ie7_full.png" target="_blank"><img class="size-full wp-image-120" title="sourceforge_ie7_thumb" src="http://www.wkoorts.com/wkblog/wp-content/uploads/2009/05/sourceforge_ie7_thumb.png" alt="sourceforge_ie7_thumb" width="400" height="289" /></a><p class="wp-caption-text">SourceForge.net in IE7 - Click to enlarge</p></div>
<p>I should point out that it is somewhat hypocritical of me to condemn this sort of behaviour, since I explicitly do not support any version of IE lower than 7 on <a title="Tubecaster homepage" href="http://www.tubecaster.org" target="_blank">the new Tubecaster site</a>, but I would only do that on my own personal sites and never for a business or any other client.</p>
<p>Believe me when I say that I understand the pain of developing for IE6 &#8211; the constant hair pulling, beating and maiming of web standards, and horrors such as <a title="MSDN hasLayout explanation" href="http://msdn.microsoft.com/en-us/library/bb250481.aspx" target="_blank">HasLayout</a> &#8211; but I really believe that with the tools and knowledge available to us now, like these sites[1], which detail common known IE bugs and layout quirks, to Microsoft&#8217;s <a title="Virtual PC 2007 download" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=04D26402-3199-48A3-AFA2-2DC0B40A73B6&amp;displaylang=en" target="_blank">free Virtual PC 2007</a> and their <a title="VPC 2007 IE images" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=21EABB90-958F-4B64-B5F1-73D0A413C8EF&amp;displaylang=en" target="_blank">free Virtual PC Windows XP IE images</a>[2], there is little excuse for web developers to not make <em>at least some </em>effort to get their sites behaving reasonably well in IE6.</p>
<p>I&#8217;m not talking about getting everything pixel-perfect.  Nobody that uses your websites for their intended purposes is going to notice the 2px misalignment on that floating image, or slightly overweight sidebar.  As much as those extra pixels will scream at you, taunt you, every time you see them in IE6, just spare a thought for those users who, for one reason or another, cannot yet upgrade.</p>
<p>Don&#8217;t despair &#8211; Microsoft is <a title="IE 8 released as critical update on Windows XP" href="http://tech.slashdot.org/article.pl?sid=09/04/28/2322248" target="_blank">well on the way</a> to giving IE6 the boot, once and for all.</p>
<div style="font-size: 0.9em;"><span style="color: #808080;">[1]:</span><span style="color: #808080;"><br />
</span></p>
<ul>
<li> <span style="color: #808080;"><a href="http://www.quirksmode.org/" target="_blank">www.quirksmode.org</a></span></li>
<li><span style="color: #808080;"><a href="http://www.positioniseverything.net/explorer.html" target="_blank">www.positioniseverything.net</a></span></li>
<li><span style="color: #808080;"><a href="http://css-tricks.com/ie-css-bugs-thatll-get-you-every-time/" target="_blank">http://css-tricks.com common IE bugs</a></span></li>
</ul>
<p><span style="color: #808080;">[2]:</span></p>
<p style="padding-left: 30px;"><span style="color: #808080;">These images expire every few months, after which new ones are released.  They seem to be valid for about 3-4 months at a time.</span></p>
</div>
<p style="text-align: left;">
]]></content:encoded>
			<wfw:commentRss>http://www.wkoorts.com/wkblog/2009/05/20/sourceforge-drops-ie-6-support/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Server Fault Private Beta</title>
		<link>http://www.wkoorts.com/wkblog/2009/05/09/server-fault-private-beta/</link>
		<comments>http://www.wkoorts.com/wkblog/2009/05/09/server-fault-private-beta/#comments</comments>
		<pubDate>Fri, 08 May 2009 22:07:10 +0000</pubDate>
		<dc:creator>Wayne</dc:creator>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[Operating Systems]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[Systems Administration]]></category>
		<category><![CDATA[jeff atwood]]></category>
		<category><![CDATA[joel spolsky]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[serverfault]]></category>
		<category><![CDATA[stackoverflow]]></category>
		<category><![CDATA[sysadmin]]></category>

		<guid isPermaLink="false">http://www.wkoorts.com/wkblog/?p=105</guid>
		<description><![CDATA[Following on from the wildly successful Stack Overflow programming questions and answers website, Jeff Atwood and Joel Spolsky have launched Server Fault, a questions and answers site following the same format but now for &#8220;system administrators and IT professionals&#8221; (currently in Private Beta, click here for sign-up instructions).


I&#8217;ve been using Stack Overflow for about 5 [...]]]></description>
			<content:encoded><![CDATA[<p>Following on from the wildly successful <a title="Stack Overflow" href="http://stackoverflow.com/" target="_blank">Stack Overflow</a> programming questions and answers website, <a title="Jeff Atwood's profile on his blog." href="http://www.codinghorror.com/blog/archives/000021.html" target="_blank">Jeff Atwood</a> and <a title="Joel Spolsky's profile on his blog." href="http://joelonsoftware.com/AboutMe.html" target="_blank">Joel Spolsky</a> have launched <a title="Server Fault" href="http://serverfault.com/" target="_blank">Server Fault</a>, a questions and answers site following the same format but now for &#8220;system administrators and IT professionals&#8221; (currently in Private Beta, <a title="Server Fault private beta sign-up instructions." href="http://blog.stackoverflow.com/2009/04/server-fault-private-beta-begins/" target="_blank">click here for sign-up instructions</a>).</p>
<p><a href="http://stackoverflow.com"><img class="aligncenter size-full wp-image-107" title="stackoverflow_logo" src="http://www.wkoorts.com/wkblog/wp-content/uploads/2009/05/stackoverflow_logo.png" alt="stackoverflow_logo" width="250" height="61" /></a></p>
<p><a href="http://serverfault.com"><img class="aligncenter size-full wp-image-106" title="serverfault_logo" src="http://www.wkoorts.com/wkblog/wp-content/uploads/2009/05/serverfault_logo.png" alt="serverfault_logo" width="250" height="48" /></a></p>
<p>I&#8217;ve been using Stack Overflow for <a title="My profile on Stack Overflow" href="http://stackoverflow.com/users/38403/wayne-koorts" target="_blank">about 5 months</a> and I absolutely love it.  It has become the definitive, and I dare say de facto standard, questions and answers one-stop-shop for programmers.  You can post a question for just about any programming topic and receive an answer within minutes, sometimes even seconds.  This removes an old hassle with posting questions on <a title="Love ya Phpbb ;-)" href="http://en.wikipedia.org/wiki/Phpbb" target="_blank">Web 1.0-style forums</a> where you had to wait impractically long lengths of time to receive answers.</p>
<p>These sites don&#8217;t just follow any standard Q&amp;A format either.  Just take a look at <a title="SO/SF circle(?) diagram." href="http://stackoverflow.com/Content/Img/stackoverflow-venn-diagram.png" target="_blank">the diagram</a> on <a title="Server Fault about page" href="http://stackoverflow.com/about" target="_blank">the about page</a> of either site and you&#8217;ll see that they&#8217;re a deliciously freakish Wiki/Blog/Forum blend.</p>
<p>One of the things I love about boths sites is their innovative karma and badge system, where users are rewarded by the community for making valuable contributions.  This gives users a reputation score which appears next to their name wherever it appears on the site.  This can be used as an assessment of someone&#8217;s overall standing in the community.  Badges are awarded for special achievements like providing an especially highly-rated answer or for being recognised as an expert in a particular technology.</p>
<p>Of course possibly the most important feature of boths sites is that you don&#8217;t need to be logged in to ask or answer questions.  This removes yet another annoying hurdle for the casual help-seeker.</p>
<p>I encourage everyone in IT, be it programming or otherwise, to sign up to at least one of these &#8211; you won&#8217;t look back.</p>
<p>-Wayne</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wkoorts.com/wkblog/2009/05/09/server-fault-private-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tubecaster.org live</title>
		<link>http://www.wkoorts.com/wkblog/2009/04/27/tubecasterorg-live/</link>
		<comments>http://www.wkoorts.com/wkblog/2009/04/27/tubecasterorg-live/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 21:37:18 +0000</pubDate>
		<dc:creator>Wayne</dc:creator>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tubecaster]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.wkoorts.com/wkblog/?p=86</guid>
		<description><![CDATA[


.
I&#8217;ve just launched a new website for Tubecaster.  The new site was created with Django, with which I&#8217;m extremely impressed.
The new site also contains bug reporting and feature request links.
-Wayne
]]></description>
			<content:encoded><![CDATA[<dl id="attachment_89" class="wp-caption alignright" style="width: 275px;">
<dt class="wp-caption-dt"><a href="http://www.tubecaster.org"><img class="size-medium wp-image-89" title="Tubecaster.org homepage" src="http://www.wkoorts.com/wkblog/wp-content/uploads/2009/04/tubecasterorg2-265x300.png" alt="Tubecaster.org homepage" width="265" height="300" /></a></dt>
</dl>
<p><span style="color: #ffffff;">.</span></p>
<p>I&#8217;ve just launched a new website for Tubecaster.  The new site was created with <a title="Django project homepage" href="http://www.djangoproject.com" target="_blank">Django</a>, with which I&#8217;m extremely impressed.</p>
<p>The new site also contains bug reporting and feature request links.</p>
<p>-Wayne</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wkoorts.com/wkblog/2009/04/27/tubecasterorg-live/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Firefox Tip: More room on your Bookmarks Toolbar</title>
		<link>http://www.wkoorts.com/wkblog/2009/04/20/firefox-tip-more-room-on-your-bookmarks-toolbar/</link>
		<comments>http://www.wkoorts.com/wkblog/2009/04/20/firefox-tip-more-room-on-your-bookmarks-toolbar/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 08:01:32 +0000</pubDate>
		<dc:creator>Wayne</dc:creator>
				<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[browsers]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.wkoorts.com/wkblog/?p=79</guid>
		<description><![CDATA[I&#8217;m a huge fan of the Windows Quick Launch bar.  Mine is two lines high and contains 20 shortcuts, all of which I use almost every day.  Similarly, I have also become accustomed to using the Bookmarks Toolbar in Firefox.  Unfortunately even with a widescreen monitor the bar fills up quickly thanks to the horrendous [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m a huge fan of the Windows Quick Launch bar.  Mine is two lines high and contains 20 shortcuts, all of which I use almost every day.  Similarly, I have also become accustomed to using the Bookmarks Toolbar in Firefox.  Unfortunately even with a widescreen monitor the bar fills up quickly thanks to the horrendous amount of web browsing I do.</p>
<p>I&#8217;ve discovered a neat trick for making better use of the limited space available on the Bookmarks Toolbar: <a title="Favicon Wikipedia entry." href="http://en.wikipedia.org/wiki/Favicon" target="_blank">Favicons</a>.  When you add a link to the Bookmarks Toolbar and have visited the link at least once (and let the page load fully) Firefox will retrieve the favicon from the website and attach it to the bookmark.  What you can do now is rename the bookmark (right-click -&gt; Properties -&gt; Name) and just remove the name altogether.  Thus:</p>
<p style="text-align: center;"><img class="size-full wp-image-80 aligncenter" title="bookmarks_toolbar_before" src="http://www.wkoorts.com/wkblog/wp-content/uploads/2009/04/bookmarks_toolbar_before.png" alt="Bookmarks Toolbar before iconisation" width="552" height="24" /></p>
<p style="text-align: center;">becomes&#8230;</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-81" title="bookmarks_toolbar_after" src="http://www.wkoorts.com/wkblog/wp-content/uploads/2009/04/bookmarks_toolbar_after.png" alt="bookmarks_toolbar_after" width="210" height="22" /></p>
<p style="text-align: center;">&#8230;reducing it to less than half the width!</p>
<p style="text-align: left;">
<p style="text-align: left;">Now you fit more than twice as many links on the toolbar!  Unfortunately there are still many sites that don&#8217;t publish favicons but most medium to large websites do.</p>
<p style="text-align: left;">-Wayne</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wkoorts.com/wkblog/2009/04/20/firefox-tip-more-room-on-your-bookmarks-toolbar/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Balsamiq Mockups, donated license</title>
		<link>http://www.wkoorts.com/wkblog/2009/04/06/balsamiq-mockups-donated-license/</link>
		<comments>http://www.wkoorts.com/wkblog/2009/04/06/balsamiq-mockups-donated-license/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 07:59:23 +0000</pubDate>
		<dc:creator>Wayne</dc:creator>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[balsamiq mockups]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[ui]]></category>

		<guid isPermaLink="false">http://www.wkoorts.com/wkblog/?p=75</guid>
		<description><![CDATA[The wonderful folks at Balsamiq have graciously donated a license for their Mockups user interface design software to the Tubecaster project to help with future improvements.  I just want to say a huge thank you to Mariah and the Balsamiq team for this, and to encourage everyone to check out this fantastic piece of software.
]]></description>
			<content:encoded><![CDATA[<p>The wonderful folks at <a title="Balsamiq homepage" href="http://www.balsamiq.com" target="_blank">Balsamiq</a> have graciously donated a license for their <a title="Balsamiq Mockups homepage" href="http://www.balsamiq.com/products/mockups" target="_blank">Mockups</a> user interface design software to the Tubecaster project to help with future improvements.  I just want to say a huge thank you to Mariah and the Balsamiq team for this, and to encourage everyone to check out this fantastic piece of software.</p>
<div id="attachment_76" class="wp-caption aligncenter" style="width: 660px"><img class="size-full wp-image-76" title="tubecaster_balsamiq" src="http://www.wkoorts.com/wkblog/wp-content/uploads/2009/04/tubecaster_balsamiq.png" alt="Tubecaster Balsamiq interface" width="650" height="274" /><p class="wp-caption-text">Tubecaster Balsamiq interface</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.wkoorts.com/wkblog/2009/04/06/balsamiq-mockups-donated-license/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python Line Counter</title>
		<link>http://www.wkoorts.com/wkblog/2009/03/31/python-line-counter/</link>
		<comments>http://www.wkoorts.com/wkblog/2009/03/31/python-line-counter/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 07:09:20 +0000</pubDate>
		<dc:creator>Wayne</dc:creator>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.wkoorts.com/wkblog/?p=71</guid>
		<description><![CDATA[Yesterday I was looking for a Python source code line counter to give me a summary of some source files, but I couldn&#8217;t find a free one that would do the job as I wanted.  So I created one.  And you can have it for free (GNU GPL) &#8211; download it here:
Download Python [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I was looking for a Python source code line counter to give me a summary of some source files, but I couldn&#8217;t find a free one that would do the job as I wanted.  So I created one.  And you can have it for free (GNU GPL) &#8211; download it here:</p>
<p><a href="http://www.wkoorts.com/files/python_line_counter.zip">Download Python Line Counter</a></p>
<p>Sample usage:</p>
<pre>cmd> plc.py tubecore.py tubewx.py tubewxdialogs.py

Input files:
tubecore.py
tubewx.py
tubewxdialogs.py

Total lines:   1510
Code lines:    1111
Comment lines: 139
Blank lines:   260</pre>
<p>-Wayne</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wkoorts.com/wkblog/2009/03/31/python-line-counter/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tubecaster 2.0.1 Released!</title>
		<link>http://www.wkoorts.com/wkblog/2009/02/24/tubecsater-201-released/</link>
		<comments>http://www.wkoorts.com/wkblog/2009/02/24/tubecsater-201-released/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 21:39:19 +0000</pubDate>
		<dc:creator>Wayne</dc:creator>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tubecaster]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.wkoorts.com/wkblog/?p=68</guid>
		<description><![CDATA[I&#8217;m pleased to report that Tubecaster 2.0.1 for Windows is now available for download.  Click here to go to the downloads page on the Tubecaster homepage.
Highlights of this release:

Supported media formats:

MP3
FLAC
WAV
Ogg Vorbis
AVI
MPG
MP4
3GP


Additional language support: Afrikaans
Automatically downloads HD version of the chosen video if available
Proxy server support
Login support &#8211; for downloading videos marked as private or [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m pleased to report that Tubecaster 2.0.1 for Windows is now available for download.  <a title="Tubecaster downloads page" href="http://www.wkoorts.com/tubecaster/node/2" target="_blank">Click here</a> to go to the downloads page on the Tubecaster homepage.</p>
<p>Highlights of this release:</p>
<ul>
<li>Supported media formats:
<ul>
<li>MP3</li>
<li>FLAC</li>
<li>WAV</li>
<li>Ogg Vorbis</li>
<li>AVI</li>
<li>MPG</li>
<li>MP4</li>
<li>3GP</li>
</ul>
</li>
<li>Additional language support: Afrikaans</li>
<li>Automatically downloads HD version of the chosen video if available</li>
<li>Proxy server support</li>
<li>Login support &#8211; for downloading videos marked as private or age restricted</li>
</ul>
<p>I&#8217;m keen to get feedback on what people would like to see in the next release.  You can report bugs or request new features <a title="Report bugs or request features for Tubecaster" href="http://tubecaster.uservoice.com" target="_blank">here</a>.  On that same site you can also vote for features that have already been requested.  The more votes a feature gets the more likely and quickly it is to be implemented.</p>
<p>-Wayne</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wkoorts.com/wkblog/2009/02/24/tubecsater-201-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DPAPI user-mode access in Python</title>
		<link>http://www.wkoorts.com/wkblog/2009/02/22/dpapi-user-mode-access-in-python/</link>
		<comments>http://www.wkoorts.com/wkblog/2009/02/22/dpapi-user-mode-access-in-python/#comments</comments>
		<pubDate>Sun, 22 Feb 2009 10:45:59 +0000</pubDate>
		<dc:creator>Wayne</dc:creator>
				<category><![CDATA[Geeky]]></category>
		<category><![CDATA[Operating Systems]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[cryptology]]></category>
		<category><![CDATA[dpapi]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://www.wkoorts.com/wkblog/?p=64</guid>
		<description><![CDATA[In the latest version of Tubecaster I&#8217;ve come to the point of needing to give users the option of storing passwords on disk.  Needless to say the very thought sent shivers down my spine.  I was stressing over the problem of how to store passwords for automatic retrieval and use by the software, [...]]]></description>
			<content:encoded><![CDATA[<p>In the latest version of Tubecaster I&#8217;ve come to the point of needing to give users the option of storing passwords on disk.  Needless to say the very thought sent shivers down my spine.  I was stressing over the problem of how to store passwords for automatic retrieval and use by the software, but at the same time making them secure enough that they can&#8217;t easily be retrieved by nasty people.  This led me to make <a href="http://stackoverflow.com/questions/463768/encryption-of-passwords-on-disk-for-open-source-desktop-applications">this post on Stack Overflow</a>.</p>
<p>Basically the given solution I thought best (at least for Windows platforms at this stage) is to use Windows&#8217; built-in <a href="http://en.wikipedia.org/wiki/DPAPI">Data Protection API</a>.  This led to a <a href="http://stackoverflow.com/questions/463832/using-dpapi-with-python">follow-up question on Stack Overflow</a> where the user &#8220;dF&#8221; pointed me to an example which uses Python&#8217;s ctypes library.  This works really well and I&#8217;ve tidied up the example and added a couple of functions to make it more user friendly and play nicely as a library.  You can view and download it below.  Thanks again to &#8220;dF&#8221; and &#8220;Crusher Joe&#8221;.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p64code10'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table width="100%" ><tr id="p6410"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
</pre></td><td class="code" id="p64code10"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;"># DPAPI access library</span>
<span style="color: #808080; font-style: italic;"># This file uses code originally created by Crusher Joe:</span>
<span style="color: #808080; font-style: italic;"># http://article.gmane.org/gmane.comp.python.ctypes/420</span>
<span style="color: #808080; font-style: italic;">#</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> ctypes <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #66cc66;">*</span>
<span style="color: #ff7700;font-weight:bold;">from</span> ctypes.<span style="color: black;">wintypes</span> <span style="color: #ff7700;font-weight:bold;">import</span> DWORD
&nbsp;
LocalFree = windll.<span style="color: black;">kernel32</span>.<span style="color: black;">LocalFree</span>
memcpy = cdll.<span style="color: #dc143c;">msvcrt</span>.<span style="color: black;">memcpy</span>
CryptProtectData = windll.<span style="color: black;">crypt32</span>.<span style="color: black;">CryptProtectData</span>
CryptUnprotectData = windll.<span style="color: black;">crypt32</span>.<span style="color: black;">CryptUnprotectData</span>
CRYPTPROTECT_UI_FORBIDDEN = 0x01
extraEntropy = <span style="color: #483d8b;">&quot;cl;ad13 <span style="color: #000099; font-weight: bold;">\0</span>al;323kjd #(adl;k$#ajsd&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> DATA_BLOB<span style="color: black;">&#40;</span>Structure<span style="color: black;">&#41;</span>:
    _fields_ = <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;cbData&quot;</span>, DWORD<span style="color: black;">&#41;</span>, <span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;pbData&quot;</span>, POINTER<span style="color: black;">&#40;</span>c_char<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> getData<span style="color: black;">&#40;</span>blobOut<span style="color: black;">&#41;</span>:
    cbData = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>blobOut.<span style="color: black;">cbData</span><span style="color: black;">&#41;</span>
    pbData = blobOut.<span style="color: black;">pbData</span>
    buffer = c_buffer<span style="color: black;">&#40;</span>cbData<span style="color: black;">&#41;</span>
    memcpy<span style="color: black;">&#40;</span>buffer, pbData, cbData<span style="color: black;">&#41;</span>
    LocalFree<span style="color: black;">&#40;</span>pbData<span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> buffer.<span style="color: black;">raw</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> Win32CryptProtectData<span style="color: black;">&#40;</span>plainText, entropy<span style="color: black;">&#41;</span>:
    bufferIn = c_buffer<span style="color: black;">&#40;</span>plainText, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>plainText<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    blobIn = DATA_BLOB<span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>plainText<span style="color: black;">&#41;</span>, bufferIn<span style="color: black;">&#41;</span>
    bufferEntropy = c_buffer<span style="color: black;">&#40;</span>entropy, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>entropy<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    blobEntropy = DATA_BLOB<span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>entropy<span style="color: black;">&#41;</span>, bufferEntropy<span style="color: black;">&#41;</span>
    blobOut = DATA_BLOB<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> CryptProtectData<span style="color: black;">&#40;</span>byref<span style="color: black;">&#40;</span>blobIn<span style="color: black;">&#41;</span>, u<span style="color: #483d8b;">&quot;python_data&quot;</span>, byref<span style="color: black;">&#40;</span>blobEntropy<span style="color: black;">&#41;</span>,
                       <span style="color: #008000;">None</span>, <span style="color: #008000;">None</span>, CRYPTPROTECT_UI_FORBIDDEN, byref<span style="color: black;">&#40;</span>blobOut<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> getData<span style="color: black;">&#40;</span>blobOut<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> Win32CryptUnprotectData<span style="color: black;">&#40;</span>cipherText, entropy<span style="color: black;">&#41;</span>:
    bufferIn = c_buffer<span style="color: black;">&#40;</span>cipherText, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>cipherText<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    blobIn = DATA_BLOB<span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>cipherText<span style="color: black;">&#41;</span>, bufferIn<span style="color: black;">&#41;</span>
    bufferEntropy = c_buffer<span style="color: black;">&#40;</span>entropy, <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>entropy<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    blobEntropy = DATA_BLOB<span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>entropy<span style="color: black;">&#41;</span>, bufferEntropy<span style="color: black;">&#41;</span>
    blobOut = DATA_BLOB<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> CryptUnprotectData<span style="color: black;">&#40;</span>byref<span style="color: black;">&#40;</span>blobIn<span style="color: black;">&#41;</span>, <span style="color: #008000;">None</span>, byref<span style="color: black;">&#40;</span>blobEntropy<span style="color: black;">&#41;</span>, <span style="color: #008000;">None</span>, <span style="color: #008000;">None</span>,
                              CRYPTPROTECT_UI_FORBIDDEN, byref<span style="color: black;">&#40;</span>blobOut<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> getData<span style="color: black;">&#40;</span>blobOut<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> cryptData<span style="color: black;">&#40;</span>text<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> Win32CryptProtectData<span style="color: black;">&#40;</span>text, extraEntropy<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> decryptData<span style="color: black;">&#40;</span>cipher_text<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">return</span> Win32CryptUnprotectData<span style="color: black;">&#40;</span>cipher_text, extraEntropy<span style="color: black;">&#41;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.wkoorts.com/wkblog/2009/02/22/dpapi-user-mode-access-in-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Troubleshooting 101</title>
		<link>http://www.wkoorts.com/wkblog/2009/01/23/troubleshooting-101/</link>
		<comments>http://www.wkoorts.com/wkblog/2009/01/23/troubleshooting-101/#comments</comments>
		<pubDate>Fri, 23 Jan 2009 03:57:30 +0000</pubDate>
		<dc:creator>Wayne</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[problem solving]]></category>
		<category><![CDATA[troubleshooting]]></category>

		<guid isPermaLink="false">http://www.wkoorts.com/wkblog/?p=62</guid>
		<description><![CDATA[The most likely cause of the problem usually is the cause.
That mantra sounds deceptively simple and obvious, but remember it when you&#8217;re diagnosing a problem, programming or otherwise.
-Wayne
]]></description>
			<content:encoded><![CDATA[<p>The most likely cause of the problem usually <strong>is</strong> the cause.</p>
<p>That mantra sounds deceptively simple and obvious, but remember it when you&#8217;re diagnosing a problem, programming or otherwise.</p>
<p>-Wayne</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wkoorts.com/wkblog/2009/01/23/troubleshooting-101/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
