<?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>andymadge.com</title>
	<atom:link href="http://www.andymadge.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andymadge.com</link>
	<description>Nothing to see here, move along…</description>
	<lastBuildDate>Sat, 24 Nov 2012 12:03:24 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>HTML/CSS/JavaScript Reference Sites</title>
		<link>http://www.andymadge.com/2012/11/htmlcssjavascript-reference-sites/</link>
		<comments>http://www.andymadge.com/2012/11/htmlcssjavascript-reference-sites/#comments</comments>
		<pubDate>Sat, 24 Nov 2012 11:59:47 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Useful Links]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.andymadge.com/?p=263</guid>
		<description><![CDATA[Stay well away from W3schools (why? &#8211; see http://w3fools.com/) Better References http://www.w3.org/community/webed/wiki/HTML/Elements http://reference.sitepoint.com/ https://developer.mozilla.org/en-US/docs Good Tutorials http://www.htmldog.com/ http://code.google.com/edu/submissions/html-css-javascript/ http://www.html-5-tutorial.com/]]></description>
				<content:encoded><![CDATA[<p>Stay well away from W3schools (why? &#8211; see <a href="http://w3fools.com/">http://w3fools.com/</a>)</p>
<h3>Better References</h3>
<ul>
<li><a href="http://www.w3.org/community/webed/wiki/HTML/Elements">http://www.w3.org/community/webed/wiki/HTML/Elements</a></li>
<li><a href="http://reference.sitepoint.com/">http://reference.sitepoint.com/</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs">https://developer.mozilla.org/en-US/docs</a></li>
</ul>
<h3>Good Tutorials</h3>
<ul>
<li><a href="http://www.htmldog.com/">http://www.htmldog.com/</a></li>
<li><a href="http://code.google.com/edu/submissions/html-css-javascript/">http://code.google.com/edu/submissions/html-css-javascript/</a></li>
<li><a href="http://www.html-5-tutorial.com/">http://www.html-5-tutorial.com/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2012/11/htmlcssjavascript-reference-sites/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nagios Error &#8220;HTTP WARNING: HTTP/1.1 403 Forbidden&#8221;</title>
		<link>http://www.andymadge.com/2011/05/nagios-error-http-warning-http1-1-403-forbidden/</link>
		<comments>http://www.andymadge.com/2011/05/nagios-error-http-warning-http1-1-403-forbidden/#comments</comments>
		<pubDate>Wed, 18 May 2011 22:55:02 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://www.andymadge.com/?p=243</guid>
		<description><![CDATA[When monitoring websites with Nagios, it&#8217;s common to get the error &#8220;HTTP WARNING: HTTP/1.1 403 Forbidden&#8220;. Quick Solution Use the -H option to specify the host name for the web site e.g. define service{ use generic-service host_name andymadge.com service_description HTTP check_command check_http!-H www.andymadge.com } Explanation The default definition for the check_http command uses the -I option [...]]]></description>
				<content:encoded><![CDATA[<p>When monitoring websites with Nagios, it&#8217;s common to get the error &#8220;<strong>HTTP WARNING: HTTP/1.1 403 Forbidden</strong>&#8220;.</p>
<h3>Quick Solution</h3>
<p>Use the <code>-H</code> option to specify the host name for the web site e.g.</p>
<pre>define service{
	use                     generic-service
	host_name               andymadge.com
	service_description     HTTP
	check_command           check_http!<strong>-H www.andymadge.com</strong>
}</pre>
<pre><span id="more-243"></span></pre>
<h3>Explanation</h3>
<p>The default definition for the check_http command uses the -I option for the address:</p>
<pre># 'check_http' command definition
define command{
	command_name	check_http
	command_line	$USER1$/check_http -I $HOSTADDRESS$ $ARG1$
}</pre>
<p>According to the help (<code>check_http --help</code>) this option is used to specify the IP address or DNS name of the server to be checked.  If you specify a DNS name then Nagios does a lookup to convert it to the corresponding IP address.  In other words, the -I option will <em>always </em>send the request to an IP address rather than a host name.</p>
<p>Since a single IP address can be home to many web sites, an IP address is often not enough to identify a particular website.  In this situation, web sites are identified by the <em>host header</em> part of the HTTP request<em>.</em></p>
<p>So, the default check_http command contacts the correct web server, however the lack of host header in the request means the server doesn&#8217;t know which actual web site to direct it to, therefore it responds with the 403 error.</p>
<p>To resolve this we need to use the -H option which specifies the hostname for the web site.  We could change the default command definition to use -H instead of -I however there are good reasons not to do this (see below)</p>
<p>The best solution is to specify the -H option in the service definition:</p>
<pre>define service{
	use                     generic-service
	host_name               andymadge.com
	service_description     HTTP
	check_command           check_http!-H www.andymadge.com
}</pre>
<p>Since the -I option is already specified in the command definition, we end up with the expanded check command:<br />
<code>check_http -I 72.52.225.30 -H www.andymadge.com</code></p>
<p>This means the request is sent to IP address 72.52.225.30 but the request header also includes <code>host: www.andymadge.com</code></p>
<p>In this case, the web server directs the request to the correct website, and responds with a HTTP OK 200  response.</p>
<h3>Why not change the default?</h3>
<p>The advantage to leaving the default is that it allows you to do http checks without relying on DNS.</p>
<p>In the example above, DNS is not used at all, therefore Nagios is still able to monitor the website even if our DNS is down.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2011/05/nagios-error-http-warning-http1-1-403-forbidden/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Fixing Extra Newlines in Text Files</title>
		<link>http://www.andymadge.com/2010/09/fixing-extra-newlines-in-text-files/</link>
		<comments>http://www.andymadge.com/2010/09/fixing-extra-newlines-in-text-files/#comments</comments>
		<pubDate>Sat, 11 Sep 2010 17:56:16 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.andymadge.com/?p=193</guid>
		<description><![CDATA[When editing source code you often come across files with additional blank lines that shouldn&#8217;t be there. The problem is generally caused by someone editing the file with a text editor which doesn&#8217;t understand and maintain the different newline types. You then end up with a file containing a mix of different line endings. Mixed [...]]]></description>
				<content:encoded><![CDATA[<p>When editing source code you often come across files with additional blank lines that shouldn&#8217;t be there.</p>
<p><img class="size-full wp-image-196" title="Extra blank lines" src="http://www.andymadge.com/blog/wp-content/uploads/Screenshot-11_09_2010-17_31_28.png" alt="Extra blank lines" width="629" height="501" /></p>
<p>The problem is generally caused by someone editing the file with a text editor which doesn&#8217;t understand and maintain the different newline types. You then end up with a file containing a mix of different line endings.<span id="more-193"></span></p>
<p>Mixed line endings can have all sorts of unexpected consequences in your  applications.  Also, editing is really annoying since you have to do a  lot more scrolling.</p>
<p>The common newline types are:</p>
<table border="0">
<tbody>
<tr>
<td>LF</td>
<td>Unix, Linux and Mac OS X</td>
</tr>
<tr>
<td>CR</td>
<td>Mac OS up to 9</td>
</tr>
<tr>
<td>CR+LF</td>
<td>Windows</td>
</tr>
</tbody>
</table>
<p>There&#8217;s more info in <a href="http://en.wikipedia.org/wiki/Newline">Wikipedia</a>.</p>
<h2>Removing the Additional Lines</h2>
<p>The solution is to to use search and replace to get rid of the extra lines, and then convert all the line ending in the file to the same type.</p>
<p>First you need a text editor that can display the different types and also search for each of them separately.  I recommend <a href="http://www.flos-freeware.ch/notepad2.html">Notepad2</a> since it&#8217;s very good and also free.</p>
<p>If you open the file in Notepad2 then go to View &#8211;&gt; &#8220;Show Line Endings&#8221; you&#8217;ll see the line endings:</p>
<p><img class="size-full wp-image-194" title="Mixed line ending" src="http://www.andymadge.com/blog/wp-content/uploads/Screenshot-11_09_2010-17_27_59.png" alt="Mixed line ending" width="648" height="466" /></p>
<p>Now that you know which line endings are in the file, you can bring up the Replace dialog:</p>
<p><img class="size-full wp-image-206" title="Replace dialog" src="http://www.andymadge.com/blog/wp-content/uploads/Screenshot-11_09_2010-17_54_08.png" alt="Replace dialog" width="515" height="305" /><br />
To search for the line endings, you need to tick &#8220;Transform backslahes&#8221;</p>
<p>Then search for the corresponding line end type:</p>
<table border="0">
<tbody>
<tr>
<td>\r</td>
<td>CR</td>
</tr>
<tr>
<td>\n</td>
<td>LF</td>
</tr>
<tr>
<td>\r\n</td>
<td>CR+LF</td>
</tr>
</tbody>
</table>
<p>In this example I&#8217;m going to search for all the CR+LF and replace them with nothing.  Hit &#8220;Replace All&#8221; and your file is magically back to normal.</p>
<p>The only thing left to do is convert all the line endings to the correct type. Go to File &#8211;&gt; &#8220;Line Endings&#8221; and chose whichever type you need (do this even if it&#8217;s already selected)</p>
<p>You have now got a file with consistent line endings and no extraneous blank lines:</p>
<p><img class="alignnone size-full wp-image-208" title="Screenshot - 11_09_2010 , 18_03_38" src="http://www.andymadge.com/blog/wp-content/uploads/Screenshot-11_09_2010-18_03_38.png" alt="Screenshot - 11_09_2010 , 18_03_38" width="629" height="501" /></p>
<h2>Alternative Method</h2>
<p>An alternative method is to convert the newlines first and then swap all the double newlines for singles.</p>
<p>After converting the line endings you get:</p>
<p><img class="alignnone size-full wp-image-210" title="Screenshot - 11_09_2010 , 18_07_54" src="http://www.andymadge.com/blog/wp-content/uploads/Screenshot-11_09_2010-18_07_54.png" alt="Screenshot - 11_09_2010 , 18_07_54" width="629" height="501" /></p>
<p>Next do the following Replace:</p>
<p><img class="alignnone size-full wp-image-211" title="Screenshot - 11_09_2010 , 18_09_46" src="http://www.andymadge.com/blog/wp-content/uploads/Screenshot-11_09_2010-18_09_46.png" alt="Screenshot - 11_09_2010 , 18_09_46" width="515" height="305" /></p>
<p>Now you should have the same result as above.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2010/09/fixing-extra-newlines-in-text-files/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Password Salting Techniques</title>
		<link>http://www.andymadge.com/2009/08/password-salting-techniques/</link>
		<comments>http://www.andymadge.com/2009/08/password-salting-techniques/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 18:36:52 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://www.andymadge.com/?p=163</guid>
		<description><![CDATA[This article is about using salting techniques to improve the security of authentication for websites.  Examples are in PHP but the techniques apply to any language. Caveat Before I continue, I just want to make an important point: The single best piece of advice I can give when building your own authentication system is&#8230; Don&#8217;t [...]]]></description>
				<content:encoded><![CDATA[<p>This article is about using salting techniques to improve the security of authentication for websites.  Examples are in PHP but the techniques apply to any language.<span id="more-163"></span></p>
<blockquote>
<h2>Caveat</h2>
<p>Before I continue, I just want to make an important point:</p>
<p>The single best piece of advice I can give when building your own authentication system is&#8230;</p>
<ul>
<li>Don&#8217;t do it.</li>
</ul>
<p>I don&#8217;t mean don&#8217;t use authentication, what I mean is that cryptographic techniques are complicated.  Actually they&#8217;re extremely complicated.  If you don&#8217;t have years of experience as a cryptographer, you&#8217;re going to make mistakes that will leave security holes.  Guaranteed.</p>
<p>The alternative is to use a well respected authentication framework such as:</p>
<ul>
<li><a href="http://www.openwall.com/phpass/">PHPass</a></li>
<li><a href="http://framework.zend.com/manual/en/zend.auth.html">Zend_Auth</a> (requires Zend Framework)</li>
<li><a href="http://codeigniter.com/wiki/Category:Libraries::Authentication/">CodeIgniter Authentication Libraries</a> (require CodeIgniter)</li>
</ul>
<p><a href="http://www.openwall.com/phpass/"></a>Frameworks such as this are developed by people who really do know what they are doing, and any security holes are generally quickly discovered and plugged.</p>
<p>I&#8217;m certainly no cryptographer, and this article is based on my current understanding.</p>
<p>That said, assuming you&#8217;re going ahead anyway, let&#8217;s get back to the article&#8230;</p></blockquote>
<h2>Attacks</h2>
<p>Lets look at the type of attacks we want to protect against.</p>
<h3>Dictionary</h3>
<p>This involves having a list of common passwords and trying every one in turn.  Most dictionaries would contain millions of possibilities starting with obvious stuff like &#8220;password&#8221;, &#8220;123456&#8243; and more obscure ones such as &#8220;pa$$wOrD&#8221; (<a href="http://en.wikipedia.org/wiki/Dictionary_attack">wikipedia entry</a>)</p>
<h3>Brute Force</h3>
<p>This involves trying every possible password and in theory will always work against any system.  The problem is that it takes a LONG time to do.  As computing speed improves, obviously the time taken reduces.  Since you can&#8217;t make brute force attacks impossible, what you want to achieve is to make them take an infeasibly long time &#8211; like years. (<a href="http://en.wikipedia.org/wiki/Brute_force_attack">wikipedia entry</a>)</p>
<h3>Rainbow Tables</h3>
<p>This is a way of attacking hashed passwords.  The idea is that instead of calculating the hash of each password you want to try, you use a list of pre-calculated hashes, thus saving computation time. (<a href="http://en.wikipedia.org/wiki/Rainbow_table">wikipedia entry</a>)</p>
<p>Bearing those in mind, let&#8217;s look at the different ways you could store the password in your database:</p>
<h2 style="font-size: 1.5em;">Plain Text</h2>
<p>This is a massively bad idea.  If someone gets hold of your database, they know everybody&#8217;s password.</p>
<p>NEVER EVER STORE PASSWORDS AS PLAIN TEXT.  ANYWHERE.  EVER.</p>
<p>One argument against this is &#8220;The spec requires that the password be stored in case someone forgets it.&#8221;  If that&#8217;s the case, then you should use reversible encryption and DON&#8217;T STORE THE ENCRYPTION KEY IN THE DATABASE.</p>
<h2>Hashed Passwords</h2>
<p>A hash is a one-way algorithm that is commonly used in cryptography.  The idea is that there is no way to work backward to find out the password from the hash value.  There are many different hash algorithms, each with their own strengths and weaknesses. (<a href="http://uk3.php.net/manual/en/function.hash-algos.php">list of hash algorithms supported by PHP</a>)</p>
<p>The most commonly used hash functions are MD5 and SHA1:</p>
<pre style="padding-left: 30px; ">$password_hash = MD5( $password );</pre>
<p>Lots of people will tell you that MD5 is sufficient for most uses, others will say that SHA1 is more secure so you should use that instead.</p>
<p>While these are two of the least-secure hashing algorithms, they are still secure enough for any normal website (i.e. not a bank etc.)</p>
<p>Other more secure hash algorithms are SHA256 or Whirlpool, but these have the disadvantage of taking longer to calculate.</p>
<p>So at this point, we&#8217;re recommending:</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$password_hash = SHA1( $password );</pre>
<h3>Vulnerabilities</h3>
<p>Hashed passwords will provide complete protection against dictionary attacks.  They also protect effectively against brute force attacks since the operation would take an infeasibly long time, however they are still vulnerable to rainbow table attacks.</p>
<h2>Salting</h2>
<p><span style="font-weight: normal; font-size: 13px; ">Salting is a technique used to protect hashes against rainbow table attacks.  The idea is that an additional string &#8211; known as &#8216;salt&#8217; &#8211; is introduced into the hash value:</span></p>
<pre style="padding-left: 30px; ">$salt = "abcd";
$password_hash = SHA1( $salt . $password );</pre>
<p>So, if a rainbow table attack is successful, the attacker now still doesn&#8217;t know the password, they know <code>$salt.$password</code>.  In this trivial example, the attacker would soon work out what the salt was &#8211; especially if they break another account &#8211; and then they would know the password.</p>
<p>Let&#8217;s improve the salt&#8230;</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$salt = "<span style="font-family: 'courier new';">ZvmLcZMXw3WIA78uudt9SFysSGocIF</span>";
$password_hash = SHA1( $salt . $password );</pre>
<p>Here we are using a random static string as the salt, which is definitely an improvement, but since the salt is static (i.e. the same for every user) then they still only need to work it out once.  After that, every user&#8217;s account it vulnerable to the same attack.</p>
<p>Note that we could also hash the salt as follows:</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$salt = SHA1( "<span style="font-family: 'courier new';">ZvmLcZMXw3WIA78uudt9SFysSGocIF</span>" );</pre>
<p>However, all this does is increase the computation time without significantly increasing the security.  The attacker only needs to find the value of <code>$salt</code> &#8211; it&#8217;s completely irrelevant how it&#8217;s calculated.</p>
<p>We need to make the salt different for each user.  One way is to use something that will be different for each user.  The most obvious thing is the username (or maybe email):</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$password_hash = SHA1( $username . $password );</pre>
<p>This means that if two people have the same password, they will still have different password hashes.  If an attacker is successful with a rainbow table attack for one account, they know nothing about any of the other accounts on the system.</p>
<p>Better still, lets use a different randomly generated string as the salt for each user.  NOTE: In this case we&#8217;re going to need to store the salt alongside the user in the database otherwise we have no way of checking it.</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$salt = random_string();
$password_hash = SHA1( $salt . $password );</pre>
<p><code>random_string</code> is a function defined elsewhere in your code.  There are good examples <a href="http://stackoverflow.com/questions/48124/generating-pseudorandom-alpha-numeric-strings">here</a> and <a href="http://911-need-code-help.blogspot.com/2009/06/generate-random-strings-using-php.html">here</a>.</p>
<p>Finally, let&#8217;s combine some of the above into our best-yet version:</p>
<pre style="font: normal normal normal 12px/18px Consolas, Monaco, 'Courier New', Courier, monospace; padding-left: 30px;">$salt = random_string();
$password_hash = SHA1( $salt . MD5($email) . $password );</pre>
<p>I know I said above that there&#8217;s no point in hashing twice, but in this case it does have an effect &#8211; we don&#8217;t want the salting algorithm to be obvious and now password hash doesn&#8217;t contain anything that is recognizable as a word or email address.</p>
<p>It is important thing is that an attacker doesn&#8217;t know exactly how you have introduced the salt.  As a result you need to be careful with Open Source software, since the salting algorithm will be plainly visible in the source code &#8211; although this is mitigated if the salt contains a random string.</p>
<p>There are many different approaches to salting &#8211; this is just one fairly simple version.  For anything that requires a higher level of security, you&#8217;ll need to look at additional techniques.</p>
<p>As I mentioned above, I&#8217;m no security expert and I may have missed something.  If you think so, please let me know in the comment.</p>
<h2>Also&#8230;</h2>
<p>This hasn&#8217;t been the focus of the article but it&#8217;s relevant &#8211; whenever someone creates an account, changes their password or logs in, you&#8217;re going to be sending their password over the internet.  Unless you&#8217;re using HTTPS/SSL, then the password will be sent IN THE CLEAR i.e. as plain text.</p>
<p>Anyone who is listening in with a packet sniffer will be able to see the password so all of your back-end security goes out the window.</p>
<p>You may think &#8220;OK, so I&#8217;ll hash the password at the client using JavaScript before I send it.&#8221;   This actually doesn&#8217;t help at all &#8211; the attacker doesn&#8217;t know the password, but he does know the hash, so he can use a replay attack which in most cases is good enough for their needs.</p>
<p>You can improve the security by using <a href="http://en.wikipedia.org/wiki/Challenge_response">Challenge-Response</a> but the best alternative is to use SSL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2009/08/password-salting-techniques/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Missing tooltips in Firefox 3.5 and IE8</title>
		<link>http://www.andymadge.com/2009/07/missing-tooltips-in-firefox-35-and-ie8/</link>
		<comments>http://www.andymadge.com/2009/07/missing-tooltips-in-firefox-35-and-ie8/#comments</comments>
		<pubDate>Sun, 05 Jul 2009 23:24:37 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://andymadge.com/blog/?p=128</guid>
		<description><![CDATA[I&#8217;ve just upgraded to Firefox 3.5 and noticed that tooltips had stopped working.  I then checked Internet Explorer 8 and found tooltips were not working there either. On investigation it seems that the two problems were unrelated, but here are the solutions to both of them&#8230; Firefox 3.5 It seems there&#8217;s a bug in the [...]]]></description>
				<content:encoded><![CDATA[<p>I&#8217;ve just upgraded to Firefox 3.5 and noticed that tooltips had stopped working.  I then checked Internet Explorer 8 and found tooltips were not working there either.</p>
<p>On investigation it seems that the two problems were unrelated, but here are the solutions to both of them&#8230;<span id="more-128"></span></p>
<h3>Firefox 3.5</h3>
<p>It seems there&#8217;s a bug in the Google Toolbar which can stop tooltips from working (you just get a small square instead). The fix is to uninstall Google Toolbar, then re-install it.</p>
<h3>Internet Explorer 8</h3>
<p>Bizarrely, this isn&#8217;t a bug.  It&#8217;s a rare occasion when IE does the right thing according to the W3C spec.  Basically, the HTML &#8220;alt&#8221; attribute has long been used to display tooltips over images, where in fact, it&#8217;s only supposed to be shown if the image doesn&#8217;t load.  The correct attribute for displaying tooltips is actually the &#8220;title&#8221; attribute.  Internet Explorer 8 has changed so that it works correctly according to the HTML spec.</p>
<p>What this means is that if a web page has only alt tags then in IE8 normal mode, you won&#8217;t see any tooltips.  If however the page is in IE8 compatibility mode, you <em>will</em> see the tooltips.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2009/07/missing-tooltips-in-firefox-35-and-ie8/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Run SysInternals tools direct from the web</title>
		<link>http://www.andymadge.com/2009/01/run-sysinternals-tools-direct-from-the-web/</link>
		<comments>http://www.andymadge.com/2009/01/run-sysinternals-tools-direct-from-the-web/#comments</comments>
		<pubDate>Thu, 22 Jan 2009 17:23:31 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/computers/2009/01/22/run-sysinternals-tools-direct-from-the-web/</guid>
		<description><![CDATA[SysInternals tools are a fantastic set of free utilities written by Mark Russinovich and Bryce Cogswell.  There are invaluable for system admins and Windows Power Users. There is now a website that allows you to run most of the SysInternals tools directly, so you don&#8217;t have to find the right page, download it and unzip.  [...]]]></description>
				<content:encoded><![CDATA[<p>SysInternals tools are a fantastic set of free utilities written by <a id="ctl00_mainContentContainer_ctl03" onclick="javascript:Track('ctl00_mainContentContainer_ctl00|ctl00_mainContentContainer_ctl03',this);" href="http://blogs.technet.com/markrussinovich/about.aspx">Mark Russinovich</a> and Bryce Cogswell.  There are invaluable for system admins and Windows Power Users.<br />
There is now a website that allows you to run most of the SysInternals tools directly, so you don&#8217;t have to find the right page, download it and unzip.  You just run it directly from:</p>
<p>http://live.sysinternals.com/&lt;tool&gt;.exe</p>
<p>e.g.</p>
<p><a href="http://live.sysinternals.com/procexp.exe" target="_blank">http://live.sysinternals.com/procexp.exe</a></p>
<p>This works better in Internet Explorer than Firefox, since you can run the tool without saving it first.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2009/01/run-sysinternals-tools-direct-from-the-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DOS Equivalent of GREP</title>
		<link>http://www.andymadge.com/2008/09/dos-equivalent-to-grep/</link>
		<comments>http://www.andymadge.com/2008/09/dos-equivalent-to-grep/#comments</comments>
		<pubDate>Mon, 22 Sep 2008 14:40:18 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/uncategorized/2008/09/22/dos-equivalent-to-grep/</guid>
		<description><![CDATA[In Unix you can pipe the output of a command into the GREP command in order to only display the lines that contain a required string.  This is means you don&#8217;t have to scroll through pages of output to find the bit you&#8217;re interested in.  The DOS equivalent of GREP is FIND: Searches for a [...]]]></description>
				<content:encoded><![CDATA[<p>In Unix you can pipe the output of a command into the GREP command in order to only display the lines that contain a required string.  This is means you don&#8217;t have to scroll through pages of output to find the bit you&#8217;re interested in.  The DOS equivalent of GREP is FIND:</p>
<pre>Searches for a text string in a file or files.

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

/V         Displays all lines NOT containing the specified string.
/C         Displays only the count of lines containing the string.
/N         Displays line numbers with the displayed lines.
/I         Ignores the case of characters when searching for the string.
/OFF[LINE] Do not skip files with offline attribute set.
"string"   Specifies the text string to find.
[drive:][path]filename
Specifies a file or files to search.

<em>If a path is not specified, FIND searches the text typed at the prompt
or piped from another command.</em></pre>
<p>this can be useful with the netstat command:</p>
<pre>netstat -ano | find /i ":80"</pre>
<p>or when viewing the DNS cache:</p>
<pre>ipconfig /displaydns | find /i "google"</pre>
<p>Although that isn&#8217;t ideal since the output of ipconfig isn&#8217;t really formatted to play nicely with the find command.</p>
<p>Reference: <a href="http://nzpcmad.blogspot.com/2007/07/dos-grep-equivalent-find-command.html">http://nzpcmad.blogspot.com/2007/07/dos-grep-equivalent-find-command.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/09/dos-equivalent-to-grep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows XP DNS Cache</title>
		<link>http://www.andymadge.com/2008/08/windows-xp-dns-cache/</link>
		<comments>http://www.andymadge.com/2008/08/windows-xp-dns-cache/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 10:34:10 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/computers/2008/08/27/windows-xp-dns-cache/</guid>
		<description><![CDATA[Windows caches DNS responses to speed up network access, but sometimes this can cause a problem.  Positive responses (i.e. successful lookups) are cached for 24 hours, and negative responses (i.e. failed lookups) for 5 minutes. If you make changes to DNS and want to test the results straight away, you need to clear the cache [...]]]></description>
				<content:encoded><![CDATA[<p>Windows caches DNS responses to speed up network access, but sometimes this can cause a problem.  Positive responses (i.e. successful lookups) are cached for 24 hours, and negative responses (i.e. failed lookups) for 5 minutes.</p>
<p>If you make changes to DNS and want to test the results straight away, you need to clear the cache with:</p>
<pre>ipconfig /flushdns</pre>
<p>You can view the current cache with:</p>
<pre>ipconfig /displaydns</pre>
<p>or</p>
<pre>ipconfig /displaydns | more</pre>
<p>to see a screen at a time</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/08/windows-xp-dns-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Misc iPhone Tips</title>
		<link>http://www.andymadge.com/2008/07/misc-iphone-tips/</link>
		<comments>http://www.andymadge.com/2008/07/misc-iphone-tips/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 15:40:05 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/mobile-phone/iphone/2008/07/21/misc-iphone-tips/</guid>
		<description><![CDATA[Slow Response, especially in Contacts or Text Some suggestions from around the web: It is probably caused by memory leaks in 3rd party apps.  You can close any app by holding Home button for 6 seconds. iPhone 3G was released with firmware 5a345 but iTunes 7.7 contains firmware 5a347.  Do a restore from iTunes to [...]]]></description>
				<content:encoded><![CDATA[<h3>Slow Response, especially in Contacts or Text</h3>
<p>Some suggestions from around the web:</p>
<ol>
<li>It is probably caused by memory leaks in 3rd party apps.  You can close any app by holding Home button for 6 seconds.</li>
<li>iPhone 3G was released with firmware 5a345 but iTunes 7.7 contains firmware 5a347.  Do a restore from iTunes to get the newer version. Make sure you have synced and backed up before doing this, since you are completely wiping the iPhone.  Lots of people are saying that helps.</li>
<li>Rebooting the phone &#8211; hold power button for several seconds, it will ask you to slide to turn off.  Hold power button to turn it back on.  This is the same as rebooting any computer &#8211; you&#8217;re cleaning up the memory.</li>
</ol>
<h3>Battery Life</h3>
<p>To extend the battry life, switch off WiFi, 3G and Bluetooth when you&#8217;re no using them. Hopefully someone will soon write a utility to do this easily and quickly from one place. I may even give it a go myself&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/07/misc-iphone-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Take screenshot on iPhone 2.0</title>
		<link>http://www.andymadge.com/2008/07/take-screenshot-on-iphone-20/</link>
		<comments>http://www.andymadge.com/2008/07/take-screenshot-on-iphone-20/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 08:22:14 +0000</pubDate>
		<dc:creator>AndyM</dc:creator>
				<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://blog.andymadge.com/uncategorized/2008/07/21/take-screenshot-on-iphone-20/</guid>
		<description><![CDATA[Hold Home button Press Lock button The screen will flash and image will be saved to Camera Roll]]></description>
				<content:encoded><![CDATA[<ol>
<li>Hold Home button</li>
<li>Press Lock button</li>
</ol>
<p>The screen will flash and image will be saved to Camera Roll</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andymadge.com/2008/07/take-screenshot-on-iphone-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
