<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9025736111713624877</id><updated>2011-10-11T17:22:55.304-07:00</updated><category term='emc'/><category term='bug'/><category term='dbcs'/><category term='denialofservice'/><category term='applehater'/><category term='fonts'/><category term='storage'/><category term='interfaces'/><category term='pronounspronounspronouns'/><category term='xssflaw'/><category term='nunit'/><category term='technicalwriting'/><category term='webbrowers'/><category term='idleprocess'/><category term='firefox'/><category term='queries'/><category term='css'/><category term='japanese'/><category term='windowsvista'/><category term='printer'/><category term='spam'/><category term='coolhack'/><category term='damn'/><category term='email'/><category term='℘'/><category term='nerds'/><category term='3'/><category term='unicode'/><category term='hellfreezesover'/><category term='vodafone'/><category term='dotnet'/><category term='crazypeople'/><category term='varchar(max)'/><category term='warnings'/><category term='montypython'/><category term='facebook'/><category term='nbn'/><category term='dvorak'/><category term='java'/><category term='security'/><category term='humour'/><category term='markovchain'/><category term='reply-all'/><category term='memory'/><category term='algorithm'/><category term='bash'/><category term='activedirectory'/><category term='windowsxphater'/><category term='networking'/><category term='suv'/><category term='australia'/><category term='oracle'/><category term='c'/><category term='segfault'/><category term='windowsxp'/><category term='boundaryconditionfailure'/><category term='joins'/><category term='linuxandmicrosoft'/><category term='charactersets'/><category term='baby'/><category term='asshat'/><category term='stupidnettricks'/><category term='visualstudio2010'/><category term='rbar'/><category term='statistics'/><category term='ubuntu'/><category term='freebooks'/><category term='powerset'/><category term='designpatterns'/><category term='compiler'/><category term='sqlserver2008'/><category term='dontdothisathome'/><category term='futurama'/><category term='debugging'/><category term='mousedenier'/><category term='apple'/><category term='oops'/><category term='iso'/><category term='oxymoron'/><category term='classpath'/><category term='youtube'/><category term='steamers'/><category term='sqlite3'/><category term='ado'/><category term='gnome'/><category term='congestion'/><category term='3g'/><category term='grammar'/><category term='reminder'/><category term='green'/><category term='pointless'/><category term='ecma'/><category term='sound'/><category term='perfmon'/><category term='uac'/><category term='richardsimmons'/><category term='tuning'/><category term='debian'/><category term='forkbomb'/><category term='windows'/><category term='irc'/><category term='services'/><category term='dora'/><category term='johncdvorak'/><category term='pua'/><category term='linux'/><category term='slate'/><category term='math'/><category term='sequencetables'/><category term='gdb'/><category term='zune'/><category term='music'/><category term='knuth'/><category term='stevejobs'/><category term='book'/><category term='freescale'/><category term='ascii'/><category term='cutie'/><category term='bah'/><category term='notestomyself'/><category term='databases'/><category term='wikipedia'/><category term='supportgonemad'/><category term='letterman'/><category term='sqlserver2005'/><category term='sql'/><category term='conspicuousconsumption'/><category term='twitter'/><category term='microsoft'/><category term='gcc'/><category term='coffee'/><category term='fail'/><category term='slashdot'/><category term='ssds'/><category term='kfc'/><category term='sets'/><category term='failagain'/><title type='text'>Random technical stuff</title><subtitle type='html'>Don't expect romance, you only get computing here.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>71</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-3954054564471898513</id><published>2011-02-22T04:03:00.000-08:00</published><updated>2011-02-22T04:41:08.138-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='visualstudio2010'/><category scheme='http://www.blogger.com/atom/ns#' term='nunit'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>How to use NUnit in Visual Studio 2010</title><content type='html'>To run NUnit, you need to add the following to the NUnit.exe.config file:&lt;br /&gt;&lt;br /&gt;Under C:\Program Files\NUnit 2.5.9\bin\net-2.0\nunit.exe.config (replace version with whatever you have installed) add the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;lt;startup&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- the below is WRONG! &lt;/span&gt;&lt;a style="font-family: courier new;" href="http://msdn.microsoft.com/en-us/library/w4atty68.aspx"&gt;See here for why.&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;requiredruntime version="v4.0.30319"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;supportedruntime version="v4.0"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;nbsp;&amp;lt;/startup&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Also add the following in the &amp;lt;runtime&gt; block:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&amp;lt;loadfromremotesources enabled="true"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The reason is that in .NET v3.5 and below, remote assemblies were loaded partially trusted. Starting with .NET v4, unless you add this directive then you will get a &lt;a href="http://msdn.microsoft.com/en-us/library/dd409252.aspx"&gt;runtime exception&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Once you have done this, add another dll project and add a reference to NUnit.Framework.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-3954054564471898513?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/3954054564471898513/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2011/02/how-to-use-nunit-in-visual-studio-2010.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3954054564471898513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3954054564471898513'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2011/02/how-to-use-nunit-in-visual-studio-2010.html' title='How to use NUnit in Visual Studio 2010'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-7124488593578646726</id><published>2011-01-11T04:38:00.000-08:00</published><updated>2011-01-11T04:43:36.319-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='congestion'/><category scheme='http://www.blogger.com/atom/ns#' term='vodafone'/><category scheme='http://www.blogger.com/atom/ns#' term='3'/><category scheme='http://www.blogger.com/atom/ns#' term='3g'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>What does Vodafone 3G and the Sydney city bus system have in common?</title><content type='html'>A note to the NSW government. Adding more buses does not decrease travel times. It actually &lt;span style="font-style: italic;"&gt;increases &lt;/span&gt;travel times. This is called "&lt;a href="http://gettys.wordpress.com/2011/01/03/aggregate-bufferbloat-802-11-and-3g-networks/"&gt;bufferbloat&lt;/a&gt;" in network systems. Why? Because if you have a limited capacity on a road, and it gets blocked, adding MORE vehicles makes things slower. The only way to fix the issue is to increase the capacity of the roads.&lt;br /&gt;&lt;br /&gt;It's the same for train lines. Adding MORE trains won't help anything. You need to add more platforms to stations, and with more platforms you need to lay more rail track. Then you distribute the current number of trains on these tracks and make them go faster than they do. If you then add enough platforms and rail tracks, then you can start adding more trains.&lt;br /&gt;&lt;br /&gt;Congestion theory 101. If only the dimwitted politicians would know it. Or perhaps the public? :-)&lt;br /&gt;&lt;br /&gt;On that note: Vodafone and 3 - please pay attention! I suspect that this is partly the cause of your incredibly crap service.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-7124488593578646726?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/7124488593578646726/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2011/01/what-does-vodafone-3g-and-sydney-city.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7124488593578646726'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7124488593578646726'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2011/01/what-does-vodafone-3g-and-sydney-city.html' title='What does Vodafone 3G and the Sydney city bus system have in common?'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-8364241243099254610</id><published>2010-12-28T14:19:00.000-08:00</published><updated>2010-12-28T14:22:04.336-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><title type='text'>My greatest claim to fame</title><content type='html'>Sadly, my greatest claim to fame is that I invented the [citation needed] tag. I'll stop sobbing in a corner one day.&lt;br /&gt;&lt;br /&gt;P.S. if anyone writes [Citation needed], then &lt;a href="http://en.wikipedia.org/w/index.php?title=Template:Citation_needed&amp;amp;diff=391625026&amp;amp;oldid=17662960"&gt;[Citation provided]&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-8364241243099254610?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/8364241243099254610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/12/my-greatest-claim-to-fame.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8364241243099254610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8364241243099254610'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/12/my-greatest-claim-to-fame.html' title='My greatest claim to fame'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6038659817137963402</id><published>2010-12-28T01:43:00.001-08:00</published><updated>2010-12-28T02:08:39.904-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='markovchain'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithm'/><title type='text'>Markov Chain generator</title><content type='html'>As it turns out, with a sufficiently dense input text, a Markov Chain generator is actually reasonably easy to implement.&lt;br /&gt;&lt;br /&gt;From page 62 of &lt;a href="http://books.google.com/books?id=to6M9_dbjosC&amp;amp;lpg=PP1&amp;amp;ots=3YP0Kfy27a&amp;amp;dq=The%20Practice%20of%20Programming&amp;amp;pg=PA62#v=onepage&amp;amp;q&amp;amp;f=false"&gt;The Practice of Programming&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: courier new; line-height: 100%;"&gt;&lt;dl&gt;&lt;br /&gt;&lt;dt&gt;set &lt;i&gt;w1&lt;/i&gt; and &lt;i&gt;w2&lt;/i&gt; to the first two words in the text&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;print &lt;i&gt;w1&lt;/i&gt; and &lt;i&gt;w2&lt;/i&gt;&lt;/dt&gt;&lt;br /&gt;&lt;dt&gt;loop:&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;randomly choose w3, one of the successors of prefix &lt;i&gt;w1&lt;/i&gt; &lt;i&gt;w2&lt;/i&gt; in the text&lt;br /&gt;print &lt;i&gt;w3&lt;/i&gt;&lt;br /&gt;print &lt;i&gt;w1&lt;/i&gt; and &lt;i&gt;w2&lt;/i&gt; by &lt;i&gt;w2&lt;/i&gt; and &lt;i&gt;w3&lt;/i&gt;&lt;br /&gt;repeat loop&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6038659817137963402?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6038659817137963402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/12/markov-chain-generator.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6038659817137963402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6038659817137963402'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/12/markov-chain-generator.html' title='Markov Chain generator'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-8568078712801737176</id><published>2010-12-26T07:03:00.000-08:00</published><updated>2010-12-26T07:08:30.491-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><title type='text'>Sargability of monotonic functions in SQL</title><content type='html'>An &lt;a href="http://explainextended.com/2010/02/19/things-sql-needs-sargability-of-monotonic-functions/"&gt;excellent writeup&lt;/a&gt; by Quassnoi about search arguments of monotonic functions and how most query engines don't handle them, and how they should.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-8568078712801737176?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/8568078712801737176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/12/sargability-of-monotonic-functions-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8568078712801737176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8568078712801737176'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/12/sargability-of-monotonic-functions-in.html' title='Sargability of monotonic functions in SQL'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-5519675627298389453</id><published>2010-12-01T01:24:00.000-08:00</published><updated>2010-12-01T01:25:41.460-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2008'/><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><title type='text'>SQL Server Management Studio 2008 R2</title><content type='html'>While it's a great idea to include a debugger to step through T-SQL code, it's not very well done. I frequently get a window handle error, and then I either need to reboot client or restart SSMS.&lt;br /&gt;&lt;br /&gt;Microsoft - do some QA testing before release cool new features like this. It's tantamount to baiting me!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-5519675627298389453?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/5519675627298389453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/12/sql-server-management-studio-2008-r2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5519675627298389453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5519675627298389453'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/12/sql-server-management-studio-2008-r2.html' title='SQL Server Management Studio 2008 R2'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6320943041094845722</id><published>2010-10-21T04:33:00.000-07:00</published><updated>2010-10-21T04:35:05.552-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='sequencetables'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2008'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2005'/><title type='text'>Sequence tables in SQL Server 2005</title><content type='html'>Interesting post by Paul White about &lt;a href="http://sqlblog.com/blogs/paul_white/archive/2010/10/19/sequence-tables.aspx"&gt;Sequence Tables&lt;/a&gt; in SQL Server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6320943041094845722?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6320943041094845722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/10/sequence-tables-in-sql-server-2005.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6320943041094845722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6320943041094845722'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/10/sequence-tables-in-sql-server-2005.html' title='Sequence tables in SQL Server 2005'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6092698180605535929</id><published>2010-10-19T02:30:00.000-07:00</published><updated>2010-10-19T02:39:37.538-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='designpatterns'/><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><title type='text'>Mistake in Wikipedia article on the Builder pattern</title><content type='html'>The following article on the &lt;a href="http://en.wikipedia.org/wiki/Builder_pattern"&gt;Builder Design Pattern&lt;/a&gt; on Wikipedia, is sort of OK, except that the Java example provided is inaccurate.&lt;br /&gt;&lt;br /&gt;The abstract PizzaBuilder class uses abstract functions. That's not really recommended - if you subclass this then it means that you have to implement &lt;span style="font-style: italic;"&gt;all&lt;/span&gt; the functions.  But really, the pattern is meant to be more flexible than that - if you don't want to use the function then you shouldn't have to use it. Therefore, as the &lt;a href="http://www.c2.com/cgi/wiki?GangOfFour"&gt;Gang of Four&lt;/a&gt; say in their &lt;a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612"&gt;book&lt;/a&gt; on page 101, the build methods should be left intentionally empty and not declared as abstract functions, "letting clients override only the operations they are interested in".&lt;br /&gt;&lt;br /&gt;Note that I as I have no interest in having my user pages undeleted, I'm totally unable to correct this mistake. Thanks &lt;a href="http://en.wikipedia.org/wiki/User:DuncanHill"&gt;DuncanHill&lt;/a&gt;, you magnificent twat, great contribution to Wikipedia!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6092698180605535929?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6092698180605535929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/10/mistake-in-wikipedia-article-on-builder.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6092698180605535929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6092698180605535929'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/10/mistake-in-wikipedia-article-on-builder.html' title='Mistake in Wikipedia article on the Builder pattern'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-1198420925752825756</id><published>2010-10-18T03:16:00.000-07:00</published><updated>2010-10-18T03:21:07.863-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='interfaces'/><category scheme='http://www.blogger.com/atom/ns#' term='dotnet'/><title type='text'>ICloneable: Microsoft's big mistake</title><content type='html'>So here's the deal: if you implement &lt;a href="http://msdn.microsoft.com/en-us/library/system.icloneable.aspx"&gt;ICloneable &lt;/a&gt;in a public API, you are a making a &lt;span style="font-style: italic;"&gt;big mistake&lt;/span&gt;. Why? Because there's no way of knowing if the Clone() function will do a &lt;a href="http://msdn.microsoft.com/en-us/library/system.icloneable.clone.aspx"&gt;deep or shallow copy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;As it turns out, even Microsoft know that they have &lt;a href="http://blogs.msdn.com/b/brada/archive/2004/05/03/125427.aspx"&gt;made a mistake&lt;/a&gt; with this interface. Oopsy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-1198420925752825756?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/1198420925752825756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/10/icloneable-microsofts-big-mistake.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1198420925752825756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1198420925752825756'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/10/icloneable-microsofts-big-mistake.html' title='ICloneable: Microsoft&apos;s big mistake'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-257942974072099592</id><published>2010-10-11T02:53:00.000-07:00</published><updated>2010-10-11T02:55:08.568-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2008'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2005'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>SQL Server indexing...</title><content type='html'>There's a series of articles called SQL Server Index Black Ops... and indeed they are!&lt;br /&gt;&lt;br /&gt;Posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.jasonstrate.com/index.php/2010/09/index-black-ops-part-1-locks-and-blocking/"&gt;Index Black Ops Part 1 – Locking and Blocking&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jasonstrate.com/index.php/2010/09/index-black-ops-part-2-page-io-latch-page-latch"&gt;Index Black Ops Part 2 – Page IO Latch, Page Latch&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jasonstrate.com/index.php/2010/09/index-black-ops-part-3-index-usage"&gt;Index Black Ops Part 3 – Index Usage&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jasonstrate.com/index.php/2010/09/index-black-ops-part-4-index-overhead-and-maintenance"&gt;Index Black Ops Part 4 – Index Overhead and Maintenance&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jasonstrate.com/index.php/2010/10/index-black-ops-part-5-page-splits"&gt;Index Black Ops Part 5 – Page Splits&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jasonstrate.com/index.php/2010/10/index-black-ops-part-6-%E2%80%93-fill-factor-vs-page-splits"&gt;Index Black Ops Part 6 – Fill Factor vs. Page Splits&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-257942974072099592?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/257942974072099592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/10/sql-server-indexing.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/257942974072099592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/257942974072099592'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/10/sql-server-indexing.html' title='SQL Server indexing...'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-8416250612359605176</id><published>2010-09-15T06:48:00.001-07:00</published><updated>2010-09-15T06:49:16.117-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><title type='text'>Poor man's LAG() and LEAD()</title><content type='html'>How to do LAG() and LEAD() in &lt;a href="http://www.rafael-salas.com/2008/05/t-sql-lead-and-lag-functions.html"&gt;SQL Server 2008&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-8416250612359605176?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/8416250612359605176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/09/poor-mans-lag-and-lead.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8416250612359605176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8416250612359605176'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/09/poor-mans-lag-and-lead.html' title='Poor man&apos;s LAG() and LEAD()'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-902329460129019453</id><published>2010-09-15T04:15:00.000-07:00</published><updated>2010-09-15T04:21:21.393-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Recursive queries vs. nonrecursive queries; and consistent reads vs. currently reads</title><content type='html'>Recursive reads vs. non-recursive reads: best to quote &lt;a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:969160000346108326"&gt;Tom Kyte&lt;/a&gt; on this one!&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;non-recursive statements are statements issued by the client to the  server. &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-style: italic;"&gt;recursive statements are statements executed by that non-recursive  call. &lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;span style="font-style: italic;"&gt;non-recursive statements can be sql, or plsql - they are just "a  statement submitted by client to server" &lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="font-style: italic;"&gt;recursive statements can be plsql, or sql - they are just "a  statement executed by the statement submitted by the client to the  server" &lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Consistent reads vs. current reads - got the following from the &lt;a href="http://www.orafaq.com/maillist/oracle-l/2003/12/18/1452.htm"&gt;Oracle-l mailing list&lt;/a&gt; from Mark Boback:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;A 'db block get' is a current mode  get.  That is, it's    the most up-to-date&lt;br /&gt;copy of the data in that block, as it is right  now, or    currently.  There&lt;br /&gt;can only be one current copy of a block in the    buffer cache at any time.&lt;br /&gt;Db block gets generally are used when DML  changes    data in the database.&lt;br /&gt;In that case, row-level locks are implicitly  taken on    the updated rows.&lt;br /&gt;There is also at least one well-known case where a  select    statement does&lt;br /&gt;a db block get, and does not take a lock.  That is,    when it does a full&lt;br /&gt;table scan or fast full index scan, Oracle will  read    the segment header&lt;br /&gt;in current mode (multiple times, the number  varies based    on Oracle version).&lt;br /&gt;&lt;br /&gt;A 'consistent get' is when Oracle gets the  data in    a block which is consistent&lt;br /&gt;with a given point in time, or SCN.   The    consistent get is at the heart of&lt;br /&gt;Oracle's read consistency  mechanism.     When blocks are fetched in order to&lt;br /&gt;satisfy a query result set,  they    are fetched in consistent mode.  If no&lt;br /&gt;block in the buffer cache is     consistent to the correct point in time, Oracle&lt;br /&gt;will (attempt to)    reconstruct that block using the information in the rollback&lt;br /&gt;segments.      If it fails to do so, that's when a query errors out with the&lt;br /&gt;much     dreaded, much feared, and much misunderstood ORA-1555 "snapshot too    old".&lt;/span&gt;&lt;/blockquote&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-902329460129019453?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/902329460129019453/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/09/recursive-queries-vs-nonrecursive.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/902329460129019453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/902329460129019453'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/09/recursive-queries-vs-nonrecursive.html' title='Recursive queries vs. nonrecursive queries; and consistent reads vs. currently reads'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-1368368685046670540</id><published>2010-08-31T07:56:00.001-07:00</published><updated>2010-08-31T08:06:26.174-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='segfault'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>My app in Ubuntu crashed, but I didn't have debugsymbols...</title><content type='html'>Say you've enabled apport on Ubuntu, and you dutifully report segfaults to Launchpad.&lt;br /&gt;&lt;br /&gt;Well, normally they won't do you much good with debug symbols. But the bug is already filed! What do you do?&lt;br /&gt;&lt;br /&gt;Easy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ sudo apt-get install apport-retrace&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;$ sudo apport-retrace -o /tmp/trash \&lt;br /&gt;&gt; /var/crash/_usr_lib_openoffice_program_soffice.bin.1000.crash&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-1368368685046670540?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/1368368685046670540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/my-app-in-ubuntu-crashed-but-i-didnt.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1368368685046670540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1368368685046670540'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/my-app-in-ubuntu-crashed-but-i-didnt.html' title='My app in Ubuntu crashed, but I didn&apos;t have debugsymbols...'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-8945970917678566031</id><published>2010-08-14T07:56:00.001-07:00</published><updated>2010-08-14T07:59:17.456-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='activedirectory'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Active Directory trusts</title><content type='html'>An excellent article on AD trusts can be found at &lt;a href="http://articles.techrepublic.com.com/5100-22_11-5160515.html"&gt;Tech Republic&lt;/a&gt;. Another one can be found at &lt;a href="http://redmondmag.com/articles/2003/09/01/trust-in-windows-server-2003.aspx"&gt;Redmond Magazine&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-8945970917678566031?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/8945970917678566031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/active-directory-trusts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8945970917678566031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8945970917678566031'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/active-directory-trusts.html' title='Active Directory trusts'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-4497018503321415604</id><published>2010-08-13T19:42:00.001-07:00</published><updated>2010-08-13T19:43:42.284-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slashdot'/><category scheme='http://www.blogger.com/atom/ns#' term='nbn'/><category scheme='http://www.blogger.com/atom/ns#' term='networking'/><title type='text'>For posterity</title><content type='html'>The following is a very interesting slashdot post on the issues of the NBN and Gigabit speeds...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://politics.slashdot.org/comments.pl?sid=1752928&amp;amp;threshold=0&amp;amp;commentsort=0&amp;amp;mode=nested&amp;amp;cid=33237702"&gt;Expensive, if done right.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-4497018503321415604?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/4497018503321415604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/for-posterity.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/4497018503321415604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/4497018503321415604'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/for-posterity.html' title='For posterity'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6628512440516785796</id><published>2010-08-12T05:44:00.000-07:00</published><updated>2010-08-13T05:35:06.701-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Pearson Product Moment Correlation Coefficient</title><content type='html'>So finally I understand how the Pearson Product Moment Correlation Coefficient, or also known simply as the correlation coefficient, works.&lt;br /&gt;&lt;br /&gt;Firstly, you need to understand the definition of the term &lt;span style="font-style: italic;"&gt;correlation&lt;/span&gt;. A correlation is a statistical association or relationship between two variables.&lt;br /&gt;&lt;br /&gt;A correlation coefficient measures the strength and direction of a linear (think: straight line graph) relationship between two variables using population data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;How do we get the correlation coefficient?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;So down to business: the correlation coefficient is the sum of the product of the z-scores over the number of samples.&lt;br /&gt;&lt;br /&gt;In other words, it is:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPuL71rVNI/AAAAAAAAIN4/HPm46tbPMEM/s1600/correlation+coefficient+2.png"&gt;&lt;img style="cursor: pointer; width: 250px; height: 46px;" src="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPuL71rVNI/AAAAAAAAIN4/HPm46tbPMEM/s400/correlation+coefficient+2.png" alt="" id="BLOGGER_PHOTO_ID_5504505058385679570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;What does this mean?&lt;br /&gt;&lt;br /&gt;Well, firstly, the standard deviation allows us to see the variability of data in a dataset. It is the square root of the variance.&lt;br /&gt;&lt;br /&gt;Assuming that we know all the values in the sample, then the variance is actually given by taking the deviation of each value from the mean (&lt;span style="font-style: italic;"&gt;x - x̄&lt;/span&gt;) and squaring it (to ensure that the signs don't cancel themselves out...). Each squared deviation is then summed and the sum is then divided by the number of values in the sample.&lt;br /&gt;&lt;br /&gt;In other words, the standard deviation is defined like so:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPyBHzKwWI/AAAAAAAAIOA/uAK9bbNOIZU/s1600/std_dev.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 51px;" src="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPyBHzKwWI/AAAAAAAAIOA/uAK9bbNOIZU/s400/std_dev.png" alt="" id="BLOGGER_PHOTO_ID_5504509270664331618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now a z score is a way of saying how many standard deviations a value is above or below from the mean value of a particular data set.&lt;br /&gt;&lt;br /&gt;You calculate the z score of a value by taking the value (&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;) and subtract it from the mean (&lt;span style="font-style: italic;"&gt;x̄&lt;/span&gt;) — this gives you how far from the mean the value is — and then divide by the standard deviation (&lt;span style="font-style: italic;"&gt;σ&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Thus, the z-score is:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RyR_zJsOOl0/TGPztDgLm0I/AAAAAAAAIOI/PBvX8wlot-s/s1600/z-score.png"&gt;&lt;img style="cursor: pointer; width: 86px; height: 36px;" src="http://1.bp.blogspot.com/_RyR_zJsOOl0/TGPztDgLm0I/AAAAAAAAIOI/PBvX8wlot-s/s400/z-score.png" alt="" id="BLOGGER_PHOTO_ID_5504511124936825666" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So if you take the sum of the product of the z scores of the two variables and divide by the number of values, you get:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RyR_zJsOOl0/TGP4t3KZsXI/AAAAAAAAIOQ/BBXz6eip2Ek/s1600/coefficient_mostbasic.png"&gt;&lt;img style="cursor: pointer; width: 142px; height: 41px;" src="http://2.bp.blogspot.com/_RyR_zJsOOl0/TGP4t3KZsXI/AAAAAAAAIOQ/BBXz6eip2Ek/s400/coefficient_mostbasic.png" alt="" id="BLOGGER_PHOTO_ID_5504516636362256754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now if you expand the Z scores for the two variables, then you get:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGP6TR_JVuI/AAAAAAAAIOY/HrnMs6qD11M/s1600/coefficient_subst1.png"&gt;&lt;img style="cursor: pointer; width: 295px; height: 46px;" src="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGP6TR_JVuI/AAAAAAAAIOY/HrnMs6qD11M/s400/coefficient_subst1.png" alt="" id="BLOGGER_PHOTO_ID_5504518378729592546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is the same as:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPuL71rVNI/AAAAAAAAIN4/HPm46tbPMEM/s1600/correlation+coefficient+2.png"&gt;&lt;img style="cursor: pointer; width: 250px; height: 46px;" src="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPuL71rVNI/AAAAAAAAIN4/HPm46tbPMEM/s400/correlation+coefficient+2.png" alt="" id="BLOGGER_PHOTO_ID_5504505058385679570" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now if you take the standard deviation of a value x... (also apply this with the variable y)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPyBHzKwWI/AAAAAAAAIOA/uAK9bbNOIZU/s1600/std_dev.png"&gt;&lt;img style="cursor: pointer; width: 200px; height: 51px;" src="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPyBHzKwWI/AAAAAAAAIOA/uAK9bbNOIZU/s400/std_dev.png" alt="" id="BLOGGER_PHOTO_ID_5504509270664331618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And then substitute this into the equation (and while doing so also change &lt;span style="font-style: italic;font-size:100%;" &gt;µ&lt;/span&gt;&lt;span style="font-style: italic;font-size:78%;" &gt;&lt;sub&gt;X&lt;/sub&gt;&lt;/span&gt; to X̄ &lt;span style="font-style: italic;"&gt;µ&lt;/span&gt;&lt;span style="font-style: italic;font-size:78%;" &gt;&lt;sub&gt;Y&lt;/sub&gt;&lt;/span&gt; and to Ȳ), then you get:&lt;span class="texhtml"&gt;&lt;span style="font-size:85%;"&gt;&lt;sub&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/sub&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_RyR_zJsOOl0/TGP8hiN56pI/AAAAAAAAIOo/cKqmFg1_bLo/s1600/correlation+coefficient.png"&gt;&lt;img style="cursor: pointer; width: 326px; height: 59px;" src="http://1.bp.blogspot.com/_RyR_zJsOOl0/TGP8hiN56pI/AAAAAAAAIOo/cKqmFg1_bLo/s400/correlation+coefficient.png" alt="" id="BLOGGER_PHOTO_ID_5504520822627887762" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6628512440516785796?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6628512440516785796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/pearson-product-moment-correlation.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6628512440516785796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6628512440516785796'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/pearson-product-moment-correlation.html' title='Pearson Product Moment Correlation Coefficient'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPuL71rVNI/AAAAAAAAIN4/HPm46tbPMEM/s72-c/correlation+coefficient+2.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-7593180407331273812</id><published>2010-08-12T04:08:00.000-07:00</published><updated>2010-08-12T07:36:56.565-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='statistics'/><category scheme='http://www.blogger.com/atom/ns#' term='wikipedia'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>And down the rabbit hole I go...</title><content type='html'>Currently I am reading the book "Statistics for the Utterly Confused". So far it's been excellent - for instance, I now have a good understanding of standard deviation, variability, percentiles and even box-plots.&lt;br /&gt;&lt;br /&gt;And so now I start learning about bivariate data, and of course I get to learning about the correlation coefficient. Or more specifically the &lt;span style="font-style: italic;"&gt;Pearson product-moment correlation coefficient&lt;/span&gt;, of which they present the following spectacular and complex formula:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPX1YuxkeI/AAAAAAAAINw/Uc6pTmkG2VM/s1600/correlation+coefficient.png"&gt;&lt;img style="cursor: pointer; width: 326px; height: 59px;" src="http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPX1YuxkeI/AAAAAAAAINw/Uc6pTmkG2VM/s400/correlation+coefficient.png" alt="" id="BLOGGER_PHOTO_ID_5504480481748554210" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Of course, there is no attempt to explain &lt;span style="font-style: italic;"&gt;why&lt;/span&gt; this formula works. So now I'm looking up Wikipedia on this topic. Sadly, Wikipedia does not have a good broad overview of this that I can see, and assumes prior knowledge, so I'm now in the process of following a trail of topics (from bottom to top):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient"&gt;Pearson product-moment correlation coefficient&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Covariance"&gt;Covariance&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Random_variable"&gt;Random Variable&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Second_moment"&gt;Second moment&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Expected_value"&gt;Expected value&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Random_vector"&gt;Random vector&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Vector_space"&gt;Vector space&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Plane_%28geometry%29"&gt;Plane&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/Vector_%28geometry%29"&gt;Euclidean vector&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;And, as Wikipedia doesn't seem to want to explain Vectors well, I'm also reading the following &lt;a href="http://www.marco-learningsystems.com/pages/roche/introvectors.htm"&gt;introduction to vectors&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; When I did a Google search, as it turns out there is actually a much simpler version of this formula (who knew?) that is explained &lt;a href="http://www.mnstate.edu/wasson/ed602pearsoncorr.htm"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-7593180407331273812?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/7593180407331273812/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/and-down-rabbit-hole-i-go.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7593180407331273812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7593180407331273812'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/and-down-rabbit-hole-i-go.html' title='And down the rabbit hole I go...'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RyR_zJsOOl0/TGPX1YuxkeI/AAAAAAAAINw/Uc6pTmkG2VM/s72-c/correlation+coefficient.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-2027671252637095989</id><published>2010-08-10T07:21:00.000-07:00</published><updated>2010-08-10T07:22:46.699-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2008'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2005'/><title type='text'>Undocumented optimizer feature in SQL Server 2005/2008</title><content type='html'>An interesting series of posts has been done by Paul White...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sqlblog.com/blogs/paul_white/archive/2010/07/31/inside-the-optimiser-constructing-a-plan-part-4.aspx"&gt;This is the most interesting...&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-2027671252637095989?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/2027671252637095989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/undocumented-optimizer-feature-in-sql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/2027671252637095989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/2027671252637095989'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/08/undocumented-optimizer-feature-in-sql.html' title='Undocumented optimizer feature in SQL Server 2005/2008'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6587678059584301480</id><published>2010-07-31T08:51:00.000-07:00</published><updated>2010-07-31T08:54:44.499-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='oops'/><title type='text'>Wow, I got that wrong!</title><content type='html'>I &lt;a href="http://randomtechnicalstuff.blogspot.com/2008/12/mysterious-world-of-joins.html"&gt;wrote the following&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;A relational database is so named because the data it stores relates to each other. In SQL, the relationships between data is expressed in a query by what is known as a join.&lt;/blockquote&gt;&lt;br /&gt;What I meant was that the tables relate to each other. &lt;br /&gt;&lt;br /&gt;That is wrong. &lt;br /&gt;&lt;br /&gt;A relational database is so named because of the mathematic concept of the &lt;a href="http://en.wikipedia.org/wiki/Binary_relation"&gt;binary relation&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6587678059584301480?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6587678059584301480/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/07/wow-i-got-that-wrong.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6587678059584301480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6587678059584301480'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/07/wow-i-got-that-wrong.html' title='Wow, I got that wrong!'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-7993044289484112325</id><published>2010-07-30T07:57:00.000-07:00</published><updated>2010-09-01T06:40:43.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlite3'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='gdb'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>How to debug segfaults in Ubuntu</title><content type='html'>Actually, turns out it's not that hard!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You need to do the following:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Firstly, create a build folder.&lt;br /&gt;&lt;pre&gt;chris@ubuntu:~/src$ mkdir sqlitebuild&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Now download the source package:&lt;br /&gt;&lt;pre&gt;chris@ubuntu:~/src$ cd sqlitebuild&lt;br /&gt;chris@ubuntu:~/src/sqlitebuild$ sudo apt-get source sqlite3&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Now you need to build any package dependencies:&lt;br /&gt;&lt;pre&gt;chris@ubuntu:~/src/sqlitebuild$ sudo apt-get build-dep sqlite3&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Now extract the source files from the dsc file:&lt;br /&gt;&lt;pre&gt;chris@ubuntu:~/src/sqlitebuild$ dpkg-source -x foo_version-revision.dsc&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;We don't want to strip the debug symbols, we don't really need to worry about build tests, and we don't want optimizations (they get in the way of the backtrace), so we need to set the&lt;a href="http://www.debian.org/doc/debian-policy/ch-source.html#s-debianrules-options"&gt;DEB_BUILD_OPTIONS&lt;/a&gt;:&lt;br /&gt;&lt;pre&gt;chris@ubuntu:~/src/sqlitebuild$ cd sqlite3-3.6.22&lt;br /&gt;chris@ubuntu:~/src/sqlitebuild/sqlite3-3.6.22$ sudo /&lt;br /&gt;&gt; DEB_BUILD_OPTIONS="nocheck noopt nostrip" /&lt;br /&gt;&gt; fakeroot debian/rules binary&lt;br /&gt;&lt;br /&gt;sudo DEB_BUILD_OPTIONS="nocheck noopt nostrip" fakeroot debian/rules binary&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;It will now spit out lots of compilation info.&lt;/li&gt;&lt;/ol&gt;Now you need to actually install the package, which can be tricky if you've already got it installed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Most Ubuntu/Debian packages have dependencies. You'll need to force the uninstallation of the package:&lt;br /&gt;&lt;pre&gt;chris@ubuntu:~/src/sqlitebuild/sqlite3-3.6.22$ cd ..&lt;br /&gt;chris@ubuntu:~/src/sqlitebuild$ sudo dpkg --purge --force-depends sqlite3&lt;br /&gt;[sudo] password for chris:&lt;br /&gt;(Reading database ... 333636 files and directories currently installed.)&lt;br /&gt;Removing sqlite3 ...&lt;br /&gt;Processing triggers for man-db ...&lt;br /&gt;chris@ubuntu:~/src/sqlitebuild$ sudo dpkg --purge --force-depends libsqlite3&lt;br /&gt;dpkg: warning: ignoring request to remove libsqlite3 which isn't installed.&lt;br /&gt;chris@ubuntu:~/src/sqlitebuild$ sudo dpkg --purge --force-depends libsqlite3-0&lt;br /&gt;dpkg: libsqlite3-0: dependency problems, but removing anyway as you requested:&lt;br /&gt;libsqlite3-0-dbg depends on libsqlite3-0 (= 3.6.22-1).&lt;br /&gt;libmono-sqlite2.0-cil depends on libsqlite3-0 (&gt;= 3.6.13).&lt;br /&gt;libsqlite3-dev depends on libsqlite3-0 (= 3.6.22-1).&lt;br /&gt;evolution-indicator depends on libsqlite3-0 (&gt;= 3.6.22); however:&lt;br /&gt;Package libsqlite3-0 is to be removed.&lt;br /&gt;libmono-sqlite1.0-cil depends on libsqlite3-0 (&gt;= 3.6.13).&lt;br /&gt;evolution-couchdb depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libpackagekit-glib2-12 depends on libsqlite3-0 (&gt;= 3.6.22); however:&lt;br /&gt;Package libsqlite3-0 is to be removed.&lt;br /&gt;evolution depends on libsqlite3-0 (&gt;= 3.6.22); however:&lt;br /&gt;Package libsqlite3-0 is to be removed.&lt;br /&gt;libedata-book1.2-2 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libwebkit-1.0-2 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;evolution-plugins depends on libsqlite3-0 (&gt;= 3.6.22); however:&lt;br /&gt;Package libsqlite3-0 is to be removed.&lt;br /&gt;evolution-exchange depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libcamel1.2-14 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libnss3-1d depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libedataserverui1.2-8 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libopensync0 depends on libsqlite3-0 (&gt;= 3.6.16).&lt;br /&gt;python2.6-dbg depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libqt4-webkit depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;python2.6 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libsvn1 depends on libsqlite3-0 (&gt;= 3.6.16).&lt;br /&gt;packagekit depends on libsqlite3-0 (&gt;= 3.6.22); however:&lt;br /&gt;Package libsqlite3-0 is to be removed.&lt;br /&gt;evolution-data-server depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libebook1.2-9 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;bibledit depends on libsqlite3-0 (&gt;= 3.6.16).&lt;br /&gt;xulrunner-1.9.2 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libaprutil1-dbd-sqlite3 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;telepathy-gabble depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libgpod4 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libqt4-sql-sqlite depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libgda-4.0-4 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;libsoup-gnome2.4-1 depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;banshee depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;python-gpod depends on libsqlite3-0 (&gt;= 3.6.22).&lt;br /&gt;opensyncutils depends on libsqlite3-0 (&gt;= 3.6.16).&lt;br /&gt;(Reading database ... 333630 files and directories currently installed.)&lt;br /&gt;Removing libsqlite3-0 ...&lt;br /&gt;Purging configuration files for libsqlite3-0 ...&lt;br /&gt;Processing triggers for libc-bin ...&lt;br /&gt;ldconfig deferred processing now taking place&lt;br /&gt;/sbin/ldconfig.real: /usr/lib/debug/usr/lib/libpython2.6.so.1.0-gdb.py is not an ELF file - it has the wrong magic bytes at the start.&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Next, you install the newly built debs:&lt;br /&gt;&lt;pre&gt;chris@ubuntu:~/src/sqlitebuild$ sudo dpkg -i libsqlite3-0_3.6.22-1_i386.deb&lt;br /&gt;Selecting previously deselected package libsqlite3-0.&lt;br /&gt;(Reading database ... 333625 files and directories currently installed.)&lt;br /&gt;Unpacking libsqlite3-0 (from libsqlite3-0_3.6.22-1_i386.deb) ...&lt;br /&gt;Setting up libsqlite3-0 (3.6.22-1) ...&lt;br /&gt;&lt;br /&gt;Processing triggers for libc-bin ...&lt;br /&gt;ldconfig deferred processing now taking place&lt;br /&gt;/sbin/ldconfig.real: /usr/lib/debug/usr/lib/libpython2.6.so.1.0-gdb.py is not an ELF file - it has the wrong magic bytes at the start.&lt;br /&gt;&lt;br /&gt;chris@ubuntu:~/src/sqlitebuild$ sudo dpkg -i libsqlite3-0-dbg_3.6.22-1_i386.deb&lt;br /&gt;(Reading database ... 333632 files and directories currently installed.)&lt;br /&gt;Preparing to replace libsqlite3-0-dbg 3.6.22-1 (using libsqlite3-0-dbg_3.6.22-1_i386.deb) ...&lt;br /&gt;Unpacking replacement libsqlite3-0-dbg ...&lt;br /&gt;Setting up libsqlite3-0-dbg (3.6.22-1) ...&lt;br /&gt;chris@ubuntu:~/src/sqlitebuild$ sudo dpkg -i sqlite3_3.6.22-1_i386.deb&lt;br /&gt;Selecting previously deselected package sqlite3.&lt;br /&gt;(Reading database ... 333627 files and directories currently installed.)&lt;br /&gt;Unpacking sqlite3 (from sqlite3_3.6.22-1_i386.deb) ...&lt;br /&gt;Setting up sqlite3 (3.6.22-1) ...&lt;br /&gt;Processing triggers for man-db ...&lt;br /&gt;chris@ubuntu:~/src/sqlitebuild$ sudo dpkg -i sqlite3-doc_3.6.22-1_all.deb&lt;br /&gt;(Reading database ... 333633 files and directories currently installed.)&lt;br /&gt;Preparing to replace sqlite3-doc 3.6.22-1 (using sqlite3-doc_3.6.22-1_all.deb) ...&lt;br /&gt;Unpacking replacement sqlite3-doc ...&lt;br /&gt;Setting up sqlite3-doc (3.6.22-1) ...&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;Now to debug the segmentation fault. I'm currently looking into why Firefox is segfaulting on me every one and half minutes or so, and I've worked out that because I have a corrupted places.sqlite (index has gone bad) that it's actually sqlite3 that is having the problem.&lt;br /&gt;&lt;br /&gt;I've actually applied this same procedure to Firefox, and I determined that sqlite wasn't happy with the following query:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;select h.url, v.visit_date, h.hidden, 0 AS whole_entry FROM moz_places h JOIN moz_historyvisits v ON h.id = v.place_id where v.visit_date &lt; '2000-01-01';&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;From here, it's pretty easy to hook up gdb to get the full backtrace, or even step through the code.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Update:&lt;/b&gt; My efforts have resulted in a bugfix from the sqlite team - yay! Basically, the issue was that Firefox was &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=581946"&gt;segfaulting every minute and a half or so&lt;/a&gt;. It turns out that my places.sqlite datafile was corrupted, the sqlite guys have now &lt;a href="http://www.sqlite.org/src/ci/83395a3d24"&gt;developed a fix&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If anyone else has a similar issue to this one, incidentally, then they can't go wrong with the following:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;chris@ubuntu:~/.mozilla/firefox/1u64q3v3.default$ for i in *.sqlite; do echo "Reindexing $i"; echo "reindex;" | sqlite3 $i; done&lt;br /&gt;Reindexing content-prefs.sqlite&lt;br /&gt;Reindexing cookies.sqlite&lt;br /&gt;Reindexing downloads.sqlite&lt;br /&gt;Reindexing formhistory.sqlite&lt;br /&gt;Reindexing permissions.sqlite&lt;br /&gt;Reindexing places.sqlite&lt;br /&gt;Reindexing search.sqlite&lt;br /&gt;Reindexing signons.sqlite&lt;br /&gt;Reindexing urlclassifier3.sqlite&lt;br /&gt;chris@ubuntu:~/.mozilla/firefox/1u64q3v3.default$&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-7993044289484112325?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/7993044289484112325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/07/how-to-debug-segfaults-in-ubuntu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7993044289484112325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7993044289484112325'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/07/how-to-debug-segfaults-in-ubuntu.html' title='How to debug segfaults in Ubuntu'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-5080053255543260448</id><published>2010-07-23T17:40:00.001-07:00</published><updated>2010-07-23T17:40:40.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dora'/><title type='text'>Dora!</title><content type='html'>http://www.nickjr.com/kids-games/doras-great-big-world-game.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-5080053255543260448?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/5080053255543260448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/07/dora.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5080053255543260448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5080053255543260448'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/07/dora.html' title='Dora!'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6192466585415593343</id><published>2010-07-02T20:18:00.000-07:00</published><updated>2010-07-02T20:19:56.981-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='freebooks'/><title type='text'>True geek heaven!</title><content type='html'>So I just found a place with a lot of free and legal textbooks.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.freebookcentre.net"&gt;http://www.freebookcentre.net&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's quite unbelievable!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6192466585415593343?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6192466585415593343/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/07/true-geek-heaven.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6192466585415593343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6192466585415593343'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/07/true-geek-heaven.html' title='True geek heaven!'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6767580859897385039</id><published>2010-06-28T05:04:00.000-07:00</published><updated>2010-06-28T05:14:57.798-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='℘'/><category scheme='http://www.blogger.com/atom/ns#' term='powerset'/><category scheme='http://www.blogger.com/atom/ns#' term='sets'/><title type='text'>Yay powersets!</title><content type='html'>&lt;span style="font-family: arial;font-size:500%;" &gt;℘&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Boo! Arial &lt;i&gt;can&lt;/i&gt; display this correctly, why is blogger doing this? Boo!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6767580859897385039?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6767580859897385039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/06/yay-powersets.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6767580859897385039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6767580859897385039'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/06/yay-powersets.html' title='Yay powersets!'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-2378013848497283742</id><published>2010-06-25T07:23:00.000-07:00</published><updated>2010-06-25T07:35:10.278-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='classpath'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><title type='text'>Java classpath issues</title><content type='html'>So I had a strange issue today. I was getting classpath exceptions. Turns out turning off the JQS on Windows XP fixed it.&lt;br /&gt;&lt;br /&gt;But it got me wondering how this works. Here are some links for my own reference:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dustin's Java development tools &lt;a href="http://marxsoftware.blogspot.com/2009/02/day-to-day-java-development-tools-and.html"&gt;blog post&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The &lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jps.html"&gt;jps&lt;/a&gt; tool. &lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/technotes/tools/share/jconsole.html"&gt;Jconsole&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Actually &lt;a href="http://java.sun.com/javase/6/docs/technotes/guides/management/jconsole.html"&gt;using Jconsole&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/ClassNotFoundException.html"&gt;ClassNotFoundException&lt;/a&gt; vs. &lt;a href="http://java.sun.com/javase/6/docs/api/java/lang/NoClassDefFoundError.html"&gt;NoClassDefFoundError&lt;/a&gt;&lt;/li&gt;&lt;li&gt;IBM DeveloperWorks articles on Classpath:&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-dclp1/index.html"&gt;Demystifying class loading problems, Part 1: An introduction to class loading and debugging tools&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-dclp2.html"&gt;Demystifying class loading problems, Part 2: Basic class loading exceptions&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-dclp3/index.html"&gt;Demystifying class loading problems, Part 3: Tackling more unusual class loading problems&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ibm.com/developerworks/java/library/j-dclp4/index.html"&gt;Demystifying class loading problems, Part 4: Deadlocks and constraints&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-2378013848497283742?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/2378013848497283742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/06/java-classpath-issues.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/2378013848497283742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/2378013848497283742'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/06/java-classpath-issues.html' title='Java classpath issues'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-5901271594989888740</id><published>2010-05-18T08:18:00.000-07:00</published><updated>2010-05-18T08:27:41.389-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>Youtube clips I have posted to my Facebook profile</title><content type='html'>My, there are quite a few!&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/XCUc8EzvEu8&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube-nocookie.com/v/XCUc8EzvEu8&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object height="385" width="480"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/4UMWhJsd0JE&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube-nocookie.com/v/4UMWhJsd0JE&amp;amp;hl=en_US&amp;amp;fs=1&amp;amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="385" width="480"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/GA8z7f7a2Pk&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/GA8z7f7a2Pk&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lYoAwfh4QOU&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/lYoAwfh4QOU&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/PfK-UzQ48JE&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/PfK-UzQ48JE&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/4qsWFFuYZYI&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/4qsWFFuYZYI&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/hVNV-FFUOnc&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/hVNV-FFUOnc&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/rmgf60CI_ks&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/rmgf60CI_ks&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/ULiNR-k4m70&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/ULiNR-k4m70&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/twL3ms4bjZk&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/twL3ms4bjZk&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="1280" height="745"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/-1pCOR9Rv9M&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/-1pCOR9Rv9M&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/f8zKtcKCaG8&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/f8zKtcKCaG8&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/Y_4515PnZmc&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/Y_4515PnZmc&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/zSgiXGELjbc&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/zSgiXGELjbc&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/2zaJdq0VUtk&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/2zaJdq0VUtk&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/b4xHc2Ow9CY&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/b4xHc2Ow9CY&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/-mVCuUE6hhs&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/-mVCuUE6hhs&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/Pa1pIO4_lUY&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/Pa1pIO4_lUY&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/QAzESJ62irI&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/QAzESJ62irI&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/zKhEw7nD9C4&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/zKhEw7nD9C4&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="1280" height="745"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/nCgQDjiotG0&amp;hl=en_US&amp;fs=1&amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/nCgQDjiotG0&amp;hl=en_US&amp;fs=1&amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/kVRT0Yrm3nk&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/kVRT0Yrm3nk&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/eqh5O9LbjhY&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/eqh5O9LbjhY&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/_M6px6Ynm90&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/_M6px6Ynm90&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube-nocookie.com/v/FcOXf-U1ZRA&amp;hl=en_US&amp;fs=1&amp;"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube-nocookie.com/v/FcOXf-U1ZRA&amp;hl=en_US&amp;fs=1&amp;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-5901271594989888740?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/5901271594989888740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/05/youtube-clips-i-have-posted-to-my.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5901271594989888740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5901271594989888740'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/05/youtube-clips-i-have-posted-to-my.html' title='Youtube clips I have posted to my Facebook profile'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-5162477213145433459</id><published>2010-05-17T06:14:00.000-07:00</published><updated>2010-05-17T06:34:41.933-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webbrowers'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Cross browser code</title><content type='html'>Interesting post from Microsoft:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/ie/archive/2010/04/14/same-markup-writing-cross-browser-code.aspx"&gt;Same Markup: Writing Cross-Browser Code&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; and damn... look what they've done. &lt;a href="http://www.alistapart.com/articles/beyonddoctype/"&gt;meta tags and http headers&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-5162477213145433459?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/5162477213145433459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/05/cross-browser-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5162477213145433459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5162477213145433459'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/05/cross-browser-code.html' title='Cross browser code'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-5265143465408614485</id><published>2010-05-14T11:08:00.001-07:00</published><updated>2010-05-14T11:10:22.587-07:00</updated><title type='text'>Giano quote file</title><content type='html'>&lt;center&gt;o0o&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;i&gt;Have you read this &lt;a href="http://en.wikipedia.org/w/index.php?title=Wikipedia:Vulgarity&amp;amp;oldid=361757210" class="external autonumber" rel="nofollow"&gt;[4]&lt;/a&gt; are you seriously endorsing it? you thik that is the standards of writing and lower middle class behaviour we should all aspir to? we would be a laughing stock over all of Europe.&lt;/i&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=User_talk:Jimbo_Wales&amp;amp;diff=prev&amp;amp;oldid=361929704" class="external text" rel="nofollow"&gt;Giano on vulgarity&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;center&gt;o0o&lt;/center&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;i&gt;You have deliberatly and very poorly attempted to misconstrue and portray me in a bad light - but don't wory I expect no less from you - and I think you are the loser for it. However, there is one thing that I do admire about you Mr Wales, your spelling.&lt;/i&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=User_talk:Jimbo_Wales&amp;amp;diff=361958643&amp;amp;oldid=361957797" class="external text" rel="nofollow"&gt;Giano on spelling&lt;/a&gt;.&lt;/dd&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;center&gt;o0o&lt;/center&gt;&lt;br /&gt;&lt;dl&gt;&lt;dd&gt;&lt;i&gt;Thanks, I always handle all things to my complete satisfaction, there is only one thing to do with a peanut and I do it. People love to hate me, probably because I have ths iritating habbit of generally being proved right. Sometimes, it takes a while, but sooner or later the editor concerned bites the dust. I put it down to frequent bridge playing and yacht racing, one learns to evaluate one's assets and take few risks.&lt;/i&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=User_talk:GiacomoReturned&amp;amp;diff=361956624&amp;amp;oldid=361947705" class="external text" rel="nofollow"&gt;Giano on his importance and ability&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;center&gt;o0o&lt;/center&gt;&lt;br /&gt;&lt;dl&gt;&lt;dd&gt;&lt;i&gt;Not at all, but a reference is a reference and a fact is a fact and a FA is a FA.&lt;/i&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=Wikipedia:Administrators%27_noticeboard/Edit_warring&amp;amp;diff=prev&amp;amp;oldid=345971301#Hannah_Primrose" class="external text" rel="nofollow"&gt;Giano explaining references, facts and featured articles&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;center&gt;o0o&lt;br /&gt;&lt;br /&gt;&lt;/center&gt;&lt;dl&gt;&lt;dd&gt;&lt;i&gt;I suspect this user has an agenda, and I cannot be bothered to discover it.&lt;/i&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=Wikipedia:Administrators%27_noticeboard/Edit_warring&amp;amp;diff=prev&amp;amp;oldid=345970190" class="external text" rel="nofollow"&gt;Giano on suspicious editors&lt;/a&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;center&gt;o0o&lt;/center&gt;&lt;br /&gt;&lt;dl&gt;&lt;dd&gt;&lt;i&gt;The civility police behave like a lot of ancient old ladies, sitting knitting mishapen garments, waiting dribbling for someone to use the word "fuck" so they can leap out of their chairs in exitement.&lt;/i&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=Wikipedia_talk:Incivility_blocks&amp;amp;diff=prev&amp;amp;oldid=348699368" class="external text" rel="nofollow"&gt;Giano on old ladies&lt;/a&gt;, some time before &lt;a href="http://en.wikipedia.org/w/index.php?title=User_talk:GiacomoReturned&amp;amp;diff=362096777&amp;amp;oldid=362095565" class="external text" rel="nofollow"&gt;this request&lt;/a&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;center&gt;o0o&lt;/center&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;i&gt;Jimbo, sweetheart, this thread has nothing to do with me, please go to the top and start again...&lt;/i&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=User_talk:Jimbo_Wales&amp;amp;diff=prev&amp;amp;oldid=361969766" class="external text" rel="nofollow"&gt;Giano expresses his affection for Jimbo&lt;/a&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;center&gt;o0o&lt;/center&gt;&lt;br /&gt;&lt;dl&gt;&lt;dd&gt;&lt;i&gt;Sorry, I find that I have sufficient elderly aunts of my own to protect and keep out of trouble. Anyway, do you think the goat ridden mountains of Sicily a suitable environment for an elderly aunt?"&lt;/i&gt;&lt;br /&gt;&lt;dl&gt;&lt;br /&gt;&lt;dd&gt;&lt;a href="http://en.wikipedia.org/w/index.php?title=User_talk:GiacomoReturned&amp;amp;diff=362128007&amp;amp;oldid=362127643" class="external text" rel="nofollow"&gt;Giano on aunties&lt;/a&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;br /&gt;&lt;center&gt;o0o&lt;/center&gt;&lt;br /&gt;&lt;/center&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-5265143465408614485?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/5265143465408614485/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/05/giano-quote-file.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5265143465408614485'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5265143465408614485'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/05/giano-quote-file.html' title='Giano quote file'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-5918006210496576376</id><published>2010-04-27T20:06:00.001-07:00</published><updated>2010-04-27T21:14:38.459-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2005'/><title type='text'>Running total in SQL Server...</title><content type='html'>Not really sure how good this is... but seems to do the job!&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family:courier new;"&gt;;with theData (rowNum, GroupA, GroupRowNum, theValue) as&lt;br /&gt;(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;select row_number() over (order by MajorGroup, GroupOrder),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataValue,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;row_number() over (partition by MajorGroup &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;order by MajorGroup, GroupOrder),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;GroupOrder&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;from DataTable&lt;br /&gt;)&lt;br /&gt;select X.GroupA, X.GroupRowNum, X.theValue +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;coalesce(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(select sum(theValue)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;from theData Y&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;where Y.GroupA=X.GroupA and Y.GroupRowNum &amp;gt; X.GroupRowNum), 0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;)&lt;br /&gt;from theData X&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;For some reason I can't get an execution plan as I get an error - I've filed a &lt;a href="https://connect.microsoft.com/SQLServer/feedback/details/554792/the-type-initializer-for-microsoft-sqlserver-management-sqlmgmt-showplan-xmlplannodebuilder-threw-an-exception#details"&gt;Connect bug&lt;/a&gt; with Microsoft.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-5918006210496576376?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/5918006210496576376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/04/running-total-in-sql-server.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5918006210496576376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5918006210496576376'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/04/running-total-in-sql-server.html' title='Running total in SQL Server...'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-4357869043267516446</id><published>2010-03-17T06:49:00.001-07:00</published><updated>2010-03-17T06:57:19.140-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='australia'/><title type='text'>How many members should be in the Australian House of Parliament?</title><content type='html'>You find this by the following formula:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Quota&lt;/span&gt; = &lt;span style="font-style: italic;"&gt;Number of people in Australia&lt;/span&gt; / (&lt;span style="font-style: italic;"&gt;Number of senators in the Senate&lt;/span&gt; * 2)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Members of the House of Parliament for each state&lt;/span&gt; = &lt;span style="font-style: italic;"&gt;Number of people in the state&lt;/span&gt; / &lt;span style="font-style: italic;"&gt;Quota&lt;/span&gt; + (&lt;span style="font-style: italic;"&gt;Optional&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Optional&lt;/span&gt; is worked out as follows:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If mod(&lt;span style="font-style: italic;"&gt;Number of people in the state&lt;/span&gt; / &lt;span style="font-style: italic;"&gt;Quota&lt;/span&gt;) &gt; (&lt;span style="font-style: italic;"&gt;Quota&lt;/span&gt; / 2) then &lt;span style="font-style: italic;"&gt;Optional&lt;/span&gt; = 1&lt;/li&gt;&lt;li&gt;Else &lt;span style="font-style: italic;"&gt;Optional&lt;/span&gt; = 0&lt;/li&gt;&lt;/ul&gt;However, &lt;span style="font-style: italic;"&gt;Members of the House of Parliament for each state&lt;/span&gt; must be equal to or greater than 5.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-4357869043267516446?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/4357869043267516446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/03/how-many-members-should-be-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/4357869043267516446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/4357869043267516446'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2010/03/how-many-members-should-be-in.html' title='How many members should be in the Australian House of Parliament?'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-751555080930815613</id><published>2009-11-04T02:58:00.001-08:00</published><updated>2009-11-04T03:25:40.139-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='ado'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Nasty Oracle ADO bug</title><content type='html'>Oracle has a nasty ADO bug that affects 10.2.0.x Windows clients, and I believe 11g R1 clients as well.&lt;br /&gt;&lt;br /&gt;When you run a query like &lt;span style="font-weight: bold;font-family:courier new;" &gt;select N'X' from dual&lt;/span&gt; in an ADO recordset and you are using AL16UTF16 as the national characterset, then if you look at the value of DefinedSize and ActualSize in ADO, you will get a DefinedSize of 1 and an ActualSize of 2.&lt;br /&gt;&lt;br /&gt;That's obviously wrong, because DefinedSize is the &lt;a href="http://msdn.microsoft.com/en-us/library/ms675824%28VS.85,loband%29.aspx"&gt;maximum capacity of the field,&lt;/a&gt; and in this case it will be returned as a adVarWChar type. Therefore, it should be being returned as 2, as the letter 'X' in AL16UTF16 is represented as 2 bytes and as it's an adVarWChar type that's all it needs to store the value.&lt;br /&gt;&lt;br /&gt;Now if it was the supplementary Han character &amp;#160359;, which is &lt;a href="http://www.unicode.org/cgi-bin/GetUnihanData.pl?codepoint=27267"&gt;U+27267&lt;/a&gt;, the ActualSize will be 4 and DefinedSize will be 4 also. That's because in UTF-16, the actual encoding is 0xD85C-DE67, which is 4 bytes long.&lt;br /&gt;&lt;br /&gt;This particular issue has caused my company a great deal of grief, and it took Oracle a long time to acknowledge there was a problem. However, we have been told that this will be fixed in Windows patch bundle 26 for the Oracle 10g client (bug number is 8301952), and even better I believe that it was fixed in Oracle 11g R2.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-751555080930815613?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/751555080930815613/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/11/nasty-oracle-ado-bug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/751555080930815613'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/751555080930815613'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/11/nasty-oracle-ado-bug.html' title='Nasty Oracle ADO bug'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-268237098935708048</id><published>2009-10-19T03:00:00.000-07:00</published><updated>2009-10-19T03:02:25.177-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Great story</title><content type='html'>Great story.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Norbert Wiener&lt;a name="168"&gt; &lt;/a&gt; was perhaps the greatest U.S. mathematician in the first half of the twentieth century, revered among his colleagues for his brilliance. He was also famous for his absent-mindedness.  &lt;p&gt; After a few years at MIT, Norbert Wiener moved to a larger house.  His wife, knowing his nature, figured that he would forget his new address and be unable to find his way home after work.  So she wrote the address of the new home on a piece of paper which she made him put in his shirt pocket.  At lunchtime that day, the professor had a inspiring idea.  He pulled the paper out of his pocket and used it to scribble down some calculations.  Finding a flaw, he threw the paper away in disgust.  At the end of the day he realized he had thrown away his address.  He now had no idea where he lived.  &lt;/p&gt;&lt;p&gt; Putting his mind to work, he came up with a plan.  He would go to his old house and await rescue.  His wife would surely realize that he was lost and go to his old house to pick him up.  Unfortunately, when he arrived at his old house there was no sign of his wife, only a small girl standing in front of the house. "Excuse me little girl," he said, "but do you happen to know where the people who used to live here moved to?" "It's okay daddy," said the little girl. "Mommy sent me to get you."&lt;br /&gt;&lt;/p&gt;&lt;p&gt;P.S.  Norbert Wiener's daughter was recently tracked down by a mathematics newsletter.  She denies he forgot who she was, but admits he lost the house.  &lt;/p&gt;&lt;p&gt;(&lt;a href="http://www.math.ucdavis.edu/%7Ehass//Calculus/HTAC/excerpts/node2.html"&gt;source&lt;/a&gt;)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-268237098935708048?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/268237098935708048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/10/great-story.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/268237098935708048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/268237098935708048'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/10/great-story.html' title='Great story'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-8269861813678927782</id><published>2009-10-12T20:10:00.000-07:00</published><updated>2009-10-12T20:21:10.111-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>Planet Gnome</title><content type='html'>You know, I really thought that &lt;a href="http://planet.gnome.org/"&gt;Planet Gnome&lt;/a&gt; was all about developing... Gnome applications, frameworks and infrastructure. Silly me. Instead, it's been taken over by a whole lot of PC crap - the latest of which is that Mark Shuttleworth said that he wants to make Ubuntu such that it's "easier to explain to girls". This really put the cat amongst the pigeons, and they are still commenting about it now.&lt;br /&gt;&lt;br /&gt;Honestly, I can understand the controversy over RMS's &lt;a href="http://opensourcetogo.blogspot.com/2009/07/emailing-richard-stallman.html"&gt;presentation at the Gran Canaria Desktop Summit&lt;/a&gt;, which really was sexist, but it appears that it has sparked a wave of self-righteous indignation amongst Gnome people. Seems quite ridiculous.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-8269861813678927782?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/8269861813678927782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/10/planet-gnome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8269861813678927782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8269861813678927782'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/10/planet-gnome.html' title='Planet Gnome'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-3602363501720073933</id><published>2009-10-10T04:02:00.000-07:00</published><updated>2009-10-10T04:05:17.641-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coolhack'/><category scheme='http://www.blogger.com/atom/ns#' term='irc'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><title type='text'>Evil... but totally cool. Debugging apps remotely via IRC</title><content type='html'>The following is so completely evil but completely cool that I just have to tell people about it.&lt;br /&gt;&lt;br /&gt;Basically, you get the GNU Debugger (gdb) and &lt;a href="http://blogs.gnome.org/alexl/2009/10/09/gdb-over-irc/"&gt;hook it up to IRC&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Of course, you'd want to know who you are talking to. Very Insecure.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-3602363501720073933?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/3602363501720073933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/10/evil-but-totally-cool-debugging-apps.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3602363501720073933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3602363501720073933'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/10/evil-but-totally-cool-debugging-apps.html' title='Evil... but totally cool. Debugging apps remotely via IRC'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-9011581967729030677</id><published>2009-08-21T03:21:00.001-07:00</published><updated>2009-08-21T03:21:51.785-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2005'/><title type='text'>List of query processing errors in SQL Server 2005</title><content type='html'>For my own reference: &lt;a href="http://msdn.microsoft.com/en-us/library/ms172350.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms172350.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-9011581967729030677?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/9011581967729030677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/08/list-of-query-processing-errors-in-sql.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/9011581967729030677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/9011581967729030677'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/08/list-of-query-processing-errors-in-sql.html' title='List of query processing errors in SQL Server 2005'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-7502910073233725934</id><published>2009-08-05T05:49:00.000-07:00</published><updated>2009-08-05T19:29:05.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reminder'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='perfmon'/><title type='text'>Note to myself</title><content type='html'>Check the following post for responses:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/perfmon/thread/fc20f93d-8443-4f62-8d22-556eac66ba71"&gt;http://social.msdn.microsoft.com/Forums/en-US/perfmon/thread/fc20f93d-8443-4f62-8d22-556eac66ba71&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; While somewhat helpful, the MSFT didn't bother looking at my followup question and marked their own answer as the solution. Nice going.&lt;br /&gt;&lt;br /&gt;New post to follow up on:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://social.msdn.microsoft.com/Forums/en-US/perfmon/thread/db3d4e32-1f40-4c95-92a2-02a87649eb56"&gt;http://social.msdn.microsoft.com/Forums/en-US/perfmon/thread/db3d4e32-1f40-4c95-92a2-02a87649eb56&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-7502910073233725934?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/7502910073233725934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/08/note-to-myself.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7502910073233725934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7502910073233725934'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/08/note-to-myself.html' title='Note to myself'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-8383755121170056693</id><published>2009-08-05T04:55:00.000-07:00</published><updated>2009-08-05T04:58:30.859-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sound'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Well here's something new...</title><content type='html'>... a professional sound engineer switched using his Mac to another platform. "Why would anyone use Windows for sound?" I hear you say. Well, they don't. In fact he's switch to... Ubuntu Linux.&lt;br /&gt;&lt;br /&gt;Check it out here:&lt;br /&gt;&lt;a href="http://createdigitalmusic.com/2009/08/04/linux-music-workflow-switching-from-mac-os-x-to-ubuntu-with-kim-cascone/"&gt;&lt;br /&gt;http://createdigitalmusic.com/2009/08/04/linux-music-workflow-switching-from-mac-os-x-to-ubuntu-with-kim-cascone/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Speaking of sound on Linux, I found a good Intro to this topic here:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.osnews.com/story/6720/Introduction_to_Linux_Audio"&gt;http://www.osnews.com/story/6720/Introduction_to_Linux_Audio&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-8383755121170056693?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/8383755121170056693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/08/well-hears-something-new.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8383755121170056693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8383755121170056693'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/08/well-hears-something-new.html' title='Well here&apos;s something new...'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-2739215017861872783</id><published>2009-08-03T20:53:00.000-07:00</published><updated>2009-08-05T05:23:15.936-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='notestomyself'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2005'/><title type='text'>Guaranteeing order in views</title><content type='html'>In SQL Server 2005, using the TOP 100 PERCENT clause with an ORDER BY xxx doesn't gurantee that the results will be ordered by xxx. See &lt;a href="http://sqlserverconsulting.blogspot.com/2009/01/top-and-order-by-operators-in-sql-20058.html"&gt;this article&lt;/a&gt; for more info.&lt;br /&gt;&lt;br /&gt;So what to do?&lt;br /&gt;&lt;br /&gt;I believe that you can use the following syntax:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;create view guaranteedOrderView&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select xxx, row_number() over (order by xxx) as OrderNo&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;from exampleTable&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NOTE:&lt;/span&gt; I've not tested this assumption. One of the extremely smart developers at my work told me that the optimizer might well... optimize... out this order.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-2739215017861872783?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/2739215017861872783/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/08/guaranteeing-order-in-views.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/2739215017861872783'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/2739215017861872783'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/08/guaranteeing-order-in-views.html' title='Guaranteeing order in views'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-81259380016556345</id><published>2009-07-22T07:03:00.001-07:00</published><updated>2009-07-22T07:10:18.389-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='services'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Interesting!</title><content type='html'>Discovered a new feature of Windows today.&lt;br /&gt;&lt;br /&gt;If you have a service that seems to be playing up, then note down the process ID in the task manager and run the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;tasklist /svc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately, you can have multiple services sharing the one svchost.exe process. If that's the case, then you need to split them off to their own process by doing the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sc config &amp;lt;servicename&amp;gt; type=own&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can later make them share the same svchost.exe process by running:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;sc config &amp;lt;servicename&amp;gt; type=share&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-81259380016556345?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/81259380016556345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/07/interesting.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/81259380016556345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/81259380016556345'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/07/interesting.html' title='Interesting!'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-1302420794123388751</id><published>2009-07-06T07:11:00.000-07:00</published><updated>2009-07-06T07:23:02.023-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pointless'/><category scheme='http://www.blogger.com/atom/ns#' term='bah'/><category scheme='http://www.blogger.com/atom/ns#' term='twitter'/><title type='text'>Bah, humbug</title><content type='html'>Is there anything more pointless than Twitter? Honestly, it's a technology looking for a solution to a problem that nobody experiences. I don't give a damn whether you just flushed the toilet! And I sure as heck don't care if you just connected your bing bong to your flirp flop through a dongle widget over a Facebook status update by using a new RSS twinkle you just wrote. I say summon the &lt;a href="http://www.youtube.com/watch?v=PN2HAroA12w"&gt;fail whale&lt;/a&gt; forever and do an end to this in&lt;strike&gt;&amp;nbsp;s&amp;nbsp;&lt;/strike&gt;anity!&lt;br /&gt;&lt;br /&gt;You kids. Get off my lawn!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-1302420794123388751?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/1302420794123388751/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/07/bah-humbug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1302420794123388751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1302420794123388751'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/07/bah-humbug.html' title='Bah, humbug'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-3573834388349708717</id><published>2009-06-16T05:19:00.000-07:00</published><updated>2009-06-16T05:24:00.889-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='knuth'/><category scheme='http://www.blogger.com/atom/ns#' term='stevejobs'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Bwhahahaha!!!!</title><content type='html'>Can't resist posting another blog post. The following folklore is titled "&lt;a href="http://folklore.org/StoryView.py?project=Macintosh&amp;amp;story=Close_Encounters_of_the_Steve_Kind.txt"&gt;Close encounters of the Steve kind&lt;/a&gt;."&lt;br /&gt;&lt;blockquote&gt;Steve had managed to get Don Knuth, the legendary Stanford professor of computer science, to give a lunchtime lecture to the Mac team. Knuth is the author of at least a dozen books, including the massive and somewhat impenetrable trilogy "The Art of Computer Programming." (For an amusing look at Knuth's heady self image, and his $2.56 reward program, see &lt;a href="http://www-cs-faculty.stanford.edu/%7Eknuth/books.html"&gt;http://www-cs-faculty.stanford.edu/~knuth/books.html&lt;/a&gt; )&lt;br /&gt;&lt;br /&gt;I was sitting in Steve's office when Lynn Takahashi, Steve's assistant, announced Knuth's arrival. Steve bounced out of his chair, bounded over to the door and extended a welcoming hand.&lt;br /&gt;&lt;br /&gt;"It's a pleasure to meet you, Professor Knuth," Steve said.  "I've read all of your books."&lt;br /&gt;&lt;br /&gt;"You're full of shit," Knuth responded.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-3573834388349708717?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/3573834388349708717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/06/bwhahahaha.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3573834388349708717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3573834388349708717'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/06/bwhahahaha.html' title='Bwhahahaha!!!!'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-2216556101344846805</id><published>2009-06-16T04:59:00.001-07:00</published><updated>2009-08-05T05:27:06.091-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='japanese'/><category scheme='http://www.blogger.com/atom/ns#' term='crazypeople'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Apple story</title><content type='html'>One of the &lt;a href="http://folklore.org/StoryView.py?project=Macintosh&amp;amp;story=Hide_Under_This_Desk.txt"&gt;best stories&lt;/a&gt; about American-Japanese relations I've heard. Better even than the &lt;a href="http://www.youtube.com/watch?v=EQa4HHkhwVg&amp;amp;feature=related"&gt;Crazy People ad&lt;/a&gt;, interestingly enough also involving Sony. Note that it's talking about how Apply initially needed to get a floppy drive working, and the Apple engineers had to work around the complete looniness of Steve Jobs:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;They hatched an alternative plan to continue to work with Sony surreptitiously, against Steve's wishes. Larry Kenyon was given a Sony drive to interface to the Mac, but he was told to keep it hidden, especially from Steve. Bob and George also arranged meetings with Sony, to discuss the customizations that Apple desired and to hammer out the beginnings of a business deal.&lt;br /&gt;&lt;br /&gt;This dual strategy entailed frequent meetings with both Alps and Sony, with the added burden of keeping the Sony meetings secret from Steve. It wasn't that hard to do in Japan, since Steve didn't come along, but it got a little awkward when Sony employees had to visit Cupertino. Sony sent a young engineer named Hide Kamoto to work with Larry Kenyon to spec out the modifications that we required. He was sitting in Larry's cubicle with George Crow when we suddenly heard Steve Jobs's voice as he unexpectedly strode into the software area.&lt;br /&gt;&lt;br /&gt;George knew that Steve would wonder who Kamoto-san was if he saw him. Thinking quickly, he immediately tapped Kamoto-san on his shoulder, and spoke hurriedly, pointing at the nearby janitorial closet. "Dozo, quick, hide in this closet. Please! Now!"&lt;br /&gt;&lt;br /&gt;Kamoto-san looked confused but he got up from his seat and hurried into the dark janitorial closet. He had to stay there for five minutes or so until Steve departed and the coast was clear.&lt;br /&gt;&lt;br /&gt;George and Larry apologized to Kamoto-san for their unusual request. "No problem.", he replied, "But American business practices, they are very strange. Very strange."&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Ah Apple. When you released the puck mouse, I guess you hadn't learned anything.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-2216556101344846805?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/2216556101344846805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/06/one-of-best-stories-about-american.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/2216556101344846805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/2216556101344846805'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/06/one-of-best-stories-about-american.html' title='Apple story'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-3170284925195712884</id><published>2009-06-11T06:25:00.000-07:00</published><updated>2009-06-11T06:30:08.690-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='damn'/><category scheme='http://www.blogger.com/atom/ns#' term='linuxandmicrosoft'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='hellfreezesover'/><title type='text'>Hell just froze over</title><content type='html'>Microsoft and the Linux Foundation just presented a &lt;a href="http://microsoftontheissues.com/cs/files/folders/5090/download.aspx"&gt;joint letter&lt;/a&gt; to the American Law Institute. I think you know you've screwed up when such diametrically opposed viewpoints team up together.&lt;br /&gt;&lt;br /&gt;Thought I think that &lt;a href="http://news.cnet.com/8301-13860_3-10243289-56.html"&gt;CNet&lt;/a&gt; said it best - "Finally, Microsoft and the Linux Foundation agree on something. Neither wants to stand behind their products."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-3170284925195712884?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/3170284925195712884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/06/hell-just-froze-over.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3170284925195712884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3170284925195712884'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/06/hell-just-froze-over.html' title='Hell just froze over'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-9195262583110165844</id><published>2009-06-02T04:17:00.000-07:00</published><updated>2009-08-05T05:27:52.515-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>Last.fm</title><content type='html'>I think that the fact that my favourite track on Last.fm is &lt;a href="http://www.last.fm/music/CD%20Laser%20Lens%20Cleaner/_/CD%20Laser%20Lens%20Cleaner"&gt;CD laser lens cleaner&lt;/a&gt; speaks volumes for the general quality of today's popular music.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-9195262583110165844?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/9195262583110165844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/06/lastfm.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/9195262583110165844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/9195262583110165844'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/06/lastfm.html' title='Last.fm'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-1993874698980104250</id><published>2009-05-31T01:10:00.000-07:00</published><updated>2009-05-31T01:18:05.396-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windowsvista'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='uac'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>"UAC elevations are not 'security'"</title><content type='html'>UAC elevations in Windows Vista are not security.&lt;br /&gt;&lt;br /&gt;What are you on about, I hear you say? Of course they are!&lt;br /&gt;&lt;br /&gt;Actually, according to Mark Russinovich - of &lt;a href="http://technet.microsoft.com/en-us/sysinternals/default.aspx"&gt;sysinternals&lt;/a&gt; fame - &lt;a href="http://blogs.technet.com/markrussinovich/archive/2009/05/26/3244913.aspx#3246014"&gt;UAC elevations are not security&lt;/a&gt;.&lt;br /&gt;&lt;blockquote&gt;Signature checks serve as proof-of-origin for trust decisions (e.g. installing an activeX control) and integrity check, not as any indication that the software is non-malicious, free from exploitable defects, or carrying a malicous data payload.  &lt;p&gt;The only code in general checked for signature validity during loading are ActiveX controls, .NET assemblies and device drivers. OS components are not verified except on demand.  UAC elevations are not 'security' and the signature verification performed by the consent prompt is intended primarily to encourage ISVs to sign their code. &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-1993874698980104250?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/1993874698980104250/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/uac-elevations-are-not-security.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1993874698980104250'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1993874698980104250'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/uac-elevations-are-not-security.html' title='&quot;UAC elevations are not &apos;security&apos;&quot;'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-1528011816752192585</id><published>2009-05-28T05:37:00.001-07:00</published><updated>2009-05-28T05:38:07.540-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssds'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><title type='text'>Excellent post of SSDs</title><content type='html'>I seem to be dealing with storage more and more these days. Who would have guessed? Oh well.&lt;br /&gt;&lt;br /&gt;Anyway, I found the following &lt;a href="http://www.anandtech.com/cpuchipsets/intel/showdoc.aspx?i=3403&amp;amp;p=1"&gt;excellent article&lt;/a&gt; on SSDs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-1528011816752192585?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/1528011816752192585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/excellent-post-of-ssds.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1528011816752192585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1528011816752192585'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/excellent-post-of-ssds.html' title='Excellent post of SSDs'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6174718599417019705</id><published>2009-05-26T20:55:00.000-07:00</published><updated>2009-05-26T20:58:38.840-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='supportgonemad'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Method 2's a bit of winner.</title><content type='html'>We got an email today from our IT head, subject was "Method 2's a bit of winner."&lt;br /&gt;&lt;br /&gt;In the email, it had a link to &lt;a href="http://support.microsoft.com/kb/168702"&gt;http://support.microsoft.com/kb/168702&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Firstly, the symptom:&lt;br /&gt;&lt;br /&gt;When you try to return data from Microsoft Query 97 to a Microsoft Excel 97  worksheet, the spinning globe icon (which signifies that a query is processing)  may appear for a long time, and then the query returns no data to your  worksheet.&lt;br /&gt;&lt;br /&gt;And now, possible solution 2:&lt;br /&gt;&lt;h4 id="tocHeadRef"&gt;Method 2: Move Your Mouse Pointer&lt;/h4&gt; &lt;script type="text/javascript"&gt;             loadTOCNode(3, 'workaround');         &lt;/script&gt; If you move your mouse pointer continuously while the data is being returned to  Microsoft Excel, the query may not fail. Do not stop moving the mouse until all  the data has been returned to Microsoft Excel.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;NOTE&lt;/b&gt;: Depending on  your query, it may take several minutes to return the results of your query to  the worksheet.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6174718599417019705?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6174718599417019705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/method-2s-bit-of-winner.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6174718599417019705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6174718599417019705'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/method-2s-bit-of-winner.html' title='Method 2&apos;s a bit of winner.'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6898821365863532327</id><published>2009-05-21T05:56:00.000-07:00</published><updated>2009-05-21T06:11:29.659-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emc'/><category scheme='http://www.blogger.com/atom/ns#' term='storage'/><category scheme='http://www.blogger.com/atom/ns#' term='book'/><title type='text'>New storage book</title><content type='html'>I bought a new book entitled "Information Storage and Management", which is written by EMC&lt;sup&gt;2&lt;/sup&gt; experts. I'm up to the second chapter, and it's all very dry so far. However... I think it's going to start getting interesting because it goes from the basics of how hard disk drives work and how their components fit together to... &lt;span style="font-style:italic;"&gt;2.4 Fundamental Laws Governing Disk Performance&lt;/span&gt;. Which tells me the following about &lt;span style="font-style:italic;"&gt;average queue size&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;N&lt;sub&gt;Q&lt;/sub&gt; = N - U&lt;br /&gt;= a × R - U  (from eq. 1)&lt;br /&gt;= a × (R&lt;sub&gt;S&lt;/sub&gt; / (1 - U)) - U (from eq. 5)&lt;br /&gt;= (R&lt;sub&gt;S&lt;/sub&gt; / R&lt;sub&gt;a&lt;/sub&gt;) / (1 - U) - U (from eq. 3)&lt;br /&gt;= U / (1 - U) - U (from eq. 4)&lt;br /&gt;= U (1 / (1 - U) - 1)&lt;br /&gt;&lt;b&gt;= U&lt;sup&gt;2&lt;/sup&gt; / (1-U)&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(6)&lt;br /&gt;&lt;br /&gt;Whew! Glad I knew that :-)&lt;br /&gt;&lt;br /&gt;Sounds like some interesting reading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6898821365863532327?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6898821365863532327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/new-storage-book.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6898821365863532327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6898821365863532327'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/new-storage-book.html' title='New storage book'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-759761017155872021</id><published>2009-05-13T04:10:00.000-07:00</published><updated>2009-05-13T04:16:24.842-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Oracle Dump() statement</title><content type='html'>Discovered an interesting Oracle statement today. The statement is dump. The syntax is &lt;a href="http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/functions041.htm"&gt;Dump(value)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This returns the raw value of a row's column.&lt;br /&gt;&lt;br /&gt;Here are the possible values:&lt;br /&gt;&lt;ul&gt;&lt;li type="disc"&gt; &lt;p&gt;8 returns result in octal notation.&lt;/p&gt;&lt;/li&gt;&lt;li type="disc"&gt; &lt;p&gt;10 returns result in decimal notation.&lt;/p&gt;&lt;/li&gt;&lt;li type="disc"&gt; &lt;p&gt;16 returns result in hexadecimal notation.&lt;/p&gt;&lt;/li&gt;&lt;li type="disc"&gt; &lt;p&gt;17 returns result as single characters.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;If you add 1000 to it, it returns the characterset.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.techonthenet.com/oracle/functions/dump.php"&gt;following website&lt;/a&gt; gives some good examples:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: arial;"&gt;dump('Tech')      would return 'Typ=96 Len=4: 84,101,99,104'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;dump('Tech', 10)     would return 'Typ=96 Len=4: 84,101,99,104'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;dump('Tech', 16)     would return 'Typ=96 Len=4: 54,65,63,68'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;dump('Tech', 1016)     would return 'Typ=96 Len=4 CharacterSet=US7ASCII: 54,65,63,68'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;dump('Tech', 1017)     would return 'Typ=96 Len=4 &lt;/span&gt;CharacterSet=US7ASCII: T,e,c,h'&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-759761017155872021?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/759761017155872021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/oracle-dump-statement.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/759761017155872021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/759761017155872021'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/oracle-dump-statement.html' title='Oracle Dump() statement'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-391928558282976692</id><published>2009-05-12T03:40:00.000-07:00</published><updated>2010-04-24T03:55:47.008-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='charactersets'/><category scheme='http://www.blogger.com/atom/ns#' term='ecma'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><category scheme='http://www.blogger.com/atom/ns#' term='nerds'/><category scheme='http://www.blogger.com/atom/ns#' term='dbcs'/><category scheme='http://www.blogger.com/atom/ns#' term='ascii'/><category scheme='http://www.blogger.com/atom/ns#' term='iso'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>Unicode and Oracle</title><content type='html'>In my work for a software company, I get a &lt;span style="font-style: italic;"&gt;lot&lt;/span&gt; of questions and problems relating to Oracle and Unicode. The following series of posts will be a summary of how these two not-particularly-easy-to-use-or-understand components fit together.&lt;br /&gt;&lt;br /&gt;Before I get into how Oracle and Unicode fits together, I really feel that it's instructive to understand both &lt;span style="font-style: italic;"&gt;what&lt;/span&gt; Unicode is, and how it came to be. Therefore I'm starting with...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-size:180%;" &gt;A potted history of the precursors to Unicode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Even before ASCII... or even proper computers&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To really understand Unicode, you first need to understand a little about the background to what came before Unicode. The most detailed history I know actually gives the &lt;a href="http://www.pobox.com/%7Eenf/ascii/ascii.pdf"&gt;history of ASCII&lt;/a&gt;, and doesn't even touch on Unicode, but if you're into that sort of thing (I am!) then it should be interesting.&lt;br /&gt;&lt;br /&gt;Basically, the first non-time based encoding scheme (i.e. not Morse Code) that was invented was used in Telegraphs and was called the Baudot Code. This was created by Emile Baudot in 1876 and it was itself inspired by the Gauss-Weber Telegraph Alphabet. The code was initially represented by 6-bits, but it was later reduced to a 5-bit encoding scheme (32 characters). This patented encoding was the basis of a later code that was called the Murray Code, which was invented by Donald Murray who used it to automatically print telegraphs to a punch-tape based printer he had also invented. The code was also a 5-bit encoding but introduced control characters we still see today - characters such as the Carriage Return (CR), Line Feed (LF), NULL, BLANK and DEL.&lt;br /&gt;&lt;br /&gt;Murray's patent was later sold to the Western Union Telegraph Company in 1912. While it was patented, a number of incompatible variations of his code were being used in other Telegraph systems by this time - an issue that not even Murray was too worried about in the beginning. However as reliable communications became more and more important, governments and businesses started to realise that they needed to standardize this code so that they could communicate more easily with each other.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The French actually work &lt;span style="font-style: italic;"&gt;with&lt;/span&gt; (most of) the rest of the world&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Thus in 1925 the French setup the Comité Consultatif International Télégraphique (CCIT, or in English the "International Telegraph Consultative Committee") for the purposes of creating an internationally recognized standardized encoding. This proved to be no mean feat - especially given that they only had 32 letters to work with! As it turns out, standardizing this coding scheme was particularly difficult because the Russians objected to what everyone else initially agreed on. Rather than bore you with what went on, just understand that eventually two encoding schemes were formed - the International Telegraph Alphabet 1 (ITA-1) which the Russians were particularly fond of, and the International Telegraph Alphabet 2 (ITA-2) which everyone else quite liked.&lt;br /&gt;&lt;br /&gt;As you can imagine, with almost everyone but the Russians using ITA-2, use of ITA-1 soon fell by the wayside and in 1948 it was adopted (with reservations) by the United States as their standard for Telegraphy. Of course when that happened it was pretty much all over for ITA-1. What I find interesting is that evidently in those days they were more cautious about adopting standards, as it took 19 years to adopt the ITA-2 encoding - enough time for World War I and World War II to have been and gone for some time!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Americans take over&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now while it was grand that the world had agreed that ITA-2 was the one everyone should use, 5-bits is really quite limiting and so it was inevitable that someone would decide that the encoding set should be expanded. Thus in the 1960s Captain William F. Luebbert of the U.S. Army Signal Research and Development Lab invented FIELDDATA, which was a 6-bit encoding that was used extensively by the U.S. Army in their communications. I only really mention FIELDDATA as it is historically important because it inspired the committee that invented ASCII. More on ASCII later though.&lt;br /&gt;&lt;br /&gt;In the meantime, another 100-pound gorilla was also inventing their own encoding scheme. That gorilla was IBM, who in 1962 created the 6-bit Binary Coded Decimal Interchange Code (BCDIC) for use in their punched card machines. When punched cards were replaced with IBM's System/360 mainframes, Charles E. McKenzie of IBM extended the code, which became known as Extended Binary Coded Decimal Interchange Code (EBCDIC). Of course, IBM didn't standardize this on their own machines until a few years went by... but it is still in wide use to this day. In fact, EBCDIC was long the rival of ASCII, but the X3.2 subcommittee rejected it. Don't worry, we'll get to this very shortly!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The birth of ASCII&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Given the number of different encodings that had started to proliferate, the American Standards Association (ASA; they are now known as ANSI) decided that it was time to form a new international standard to represent characters. Thus on June 17, 1963 the ASA's X3 Committee for Computer and Processing Standards formed the X3.2 Subcommittee for Coded Character Standards and Data Formats. Within this subcommittee was formed a core group of nerds known as the  X3.2.4 taskgroup. To cut a long story short, our small band of heroes spent so long arguing over such things as how many characters they should represent, whether to use control characters and in what position they should put the characters in the code chart that they never met any girls and thus never produced any offspring. Whether that was because they were off the nerd Richter scale, or whether it was because ASCII ruined them is a point hotly debated. Whatever it was, we shall never have a generation of men like them again. The important thing here is that with all that incredibly dull discussion, you would have thought that the resulting standard included such innovations as lowercase letters, umlauts and character grave-marks. Strangely, this was not to be and the world was initially stuck with a bunch of upper case characters, numbers, punctuation symbols and a lot of obscure control characters.&lt;br /&gt;&lt;br /&gt;Incredibly, it took another four years for the X3.2.5 working group to decide on a final 7-bit encoding scheme. This time, however, someone must have told them that nobody wants to COMMUNICATE BY SHOUTING. It was only at this point that the members got a clue and decided that the world should actually be allowed to write electronically with proper punctuation and lower-case letters. Incidentally, it appears that they didn't keep their controversies inhouse, and managed to anger another set of (albeit cooler) nerds. What happened was that they were just about to release the final standard that just about every standards body in the world had approved - including the ECMA and ISO - when who should come along but the president of the IBM User Group, otherwise known as SHARE. For their troubles, the X3.2.4 subcommittee working group was broadsided by a vitriolic letter in which the SHARE president threatened that the ASA could go to hell unless changes were made to the draft standard. If they were not, he warned that the programmers of the world would create their own competing standard and ASCII as we know it would be in peril due to a lack of adoption. Faced with this unpalatable situation the X3.2.4 working group decided to pull the wool over the SHARE president's eyes by moving a few characters into different positions as well as changing the form of a few characters - for instance they adding a break in the middle of the "|" character (have a look at your current keyboard to see what I'm talking about).&lt;br /&gt;&lt;br /&gt;Thus in 1967, with SHARE suitably triumphant and mollified - not to mention feeling very smug about forcing changes to a standard that every country in the world had agreed to - the ASA officially released the American Standard Code for Information Interchange (ASCII), or more formally X3.4-1967. This was actually a joint release done with the European Computer Manufacturers Association (ECMA) and the International Standards Organization (ISO). The ECMA released ASCII as ECMA-6 and ISO released a slightly modified version of ASCII as ISO-646. The ISO standard differs from ASCII because it replaced the dollars sign with the International symbol for currency, which is &lt;span style="font-size:130%;"&gt;&lt;a href="http://en.wikipedia.org/wiki/%C2%A4"&gt;&lt;b&gt;¤&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;. Personally, I think that while this certainly &lt;span style="font-style: italic;"&gt;seems&lt;/span&gt; a good idea in theory, when you realise that currencies fluctuate against each other then you start to understand that unless you show the &lt;span style="font-style: italic;"&gt;actual&lt;/span&gt; symbol of the currency being used you could either make quite a bit of money, or lose quite a bit of money. Possibly this is why nobody has ever heard of the universal symbol of currency, which ironically is not used universally. What &lt;span style="font-style: italic;"&gt;was&lt;/span&gt; the ISO thinking?&lt;br /&gt;&lt;br /&gt;As an aside, you'd think that after all that careful consideration and endless argument amongst nations (and even within nations - IBM's EBCDIC was categorically rejected by the X3.2.4 committee) that people wouldn't want to fiddle with the standardized characterset. But no, what we got was &lt;a href="http://en.wikipedia.org/wiki/ATASCII"&gt;ATASCII&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/PETSCII"&gt;PETSKII&lt;/a&gt;, the &lt;a href="http://en.wikipedia.org/wiki/ZX_Spectrum_character_set"&gt;ZX Spectrum characterset&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Galaksija#Character_ROM"&gt;Galaksija&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/YUSCII"&gt;YUSCII&lt;/a&gt;. Some people are never happier than when they are buggering up a perfectly good standard.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;8-bits of confusion - Extended ASCII&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;It soon became apparent to almost everyone that while 7-bits certainly gave everyone a lot more characters to play with, it wasn't really enough to represent even a fraction of the world's characters. Computers by this stage all used the byte as the smallest unit of measurement anyway, so really there was no need to only represent characters with 7 bits. Also, by this time the IBM PC had been unleashed on an unsuspecting public, and with it came an 8-bit extended ASCII variant called PC-US (sometimes also known as OEM-US or DOS-US). This extended ASCII characterset was burnt into the ROM of every IBM and IBM compatible PC that was sold, which obviously made it very popular, especially as it included characters that let you do things like this:&lt;br /&gt;&lt;span style="font-family:courier;"&gt;&lt;br /&gt;╔═══════════════════════════╗&lt;br /&gt;║ SWEET BOX WITH TEXT IN IT ║&lt;br /&gt;╚═══════════════════════════╝&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;(The box would be even sweeter if Blogger honoured non-breaking spaces).&lt;br /&gt;&lt;br /&gt;That one extra bit allowed for a whopping 255 characters, 127 more than were available than before. The rest of the world soon cottoned on, and a large number of ASCII variants appeared; these included two version of the Greek alphabet, many variants of the Cyrillic languages, Arabic, Chinese, etc, etc, etc. Of course they all used the same code points to represent their various languages, so eventually IBM organized these into what are now known as &lt;a href="http://www-03.ibm.com/systems/i/software/globalization/codepages.html"&gt;code pages&lt;/a&gt; - the original being code page 437.  Soon thereafter, Microsoft made it big with Windows, and decided to add to the confusion with their &lt;a href="http://msdn.microsoft.com/en-us/goglobal/bb964654.aspx"&gt;own set of code pages&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For a while, confusion reigned. In particular, BASIC programmers were annoyed because when they switched their graphics card to another mode that used a non-437 code page their sweet graphics would turn into a big mess of characters. And you never want to make a BASIC programmer angry...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;ISO to the rescue!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Evidently realising that angry BASIC programmers aren't a good thing, ISO (now known as ISO/IEC) decided to remedy the situation. Unfortunately for the BASIC programmers this is the same organization that nearly caused financial chaos by replacing the dollar symbol with the  universal currency symbol, so unfortunately for them they didn't get any ANSI graphic symbols. And hence BASIC died, to give birth to the hell-spawn known as Visual BASIC... sorry, I digress.&lt;br /&gt;&lt;br /&gt;Basically, ISO/IEC sat down and decided to use the 8th bit of extended-ASCII to form a proper universal standard. Thus was born the ISO 8859 charactersets, of which there were eventually 15 different versions.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ISO 8859-1; this is the most well known. It's also called Latin-1, and you'll often see reference to it in databases and in formats such as MIME encoded emails. It covers characters from most Western European languages.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ISO 8859-2; (Latin-2) covers characters from Central and Eastern Europe&lt;/li&gt;&lt;li&gt;ISO 8859-3; (Latin-3) covers Esperanto and Maltic languages&lt;/li&gt;&lt;li&gt;ISO 8859-4; (Latin-4) covers Baltic languages&lt;/li&gt;&lt;li&gt;ISO 8859-5; (Cyrillic) covers Bulgarian, Byelorussian, Macedonian, Russian, and Serbian languages&lt;/li&gt;&lt;li&gt;ISO 8859-6; (Arabic) does &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; cover all of the Persian or Pakistani Urdu languages&lt;/li&gt;&lt;li&gt;ISO 8859-7; (Greek)&lt;/li&gt;&lt;li&gt;ISO 8859-8; (Hebrew)&lt;/li&gt;&lt;li&gt;ISO 8859-9; (Latin-5) has Turkish characters&lt;/li&gt;&lt;li&gt;ISO 8859-10; (Latin-6) covers Nordic languages&lt;/li&gt;&lt;li&gt;ISO 8859-11; (Thai)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ISO 8859-12; sorry, those who use Devanagari missed out - this never eventuated.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ISO 8859-13; (Latin-7) covers languages written in the Baltic Rim&lt;/li&gt;&lt;li&gt;ISO 8859-14; (Latin-8) covers Celtic languages&lt;/li&gt;&lt;li&gt;ISO 8859-15; (Latin-9) Latin-1 on steroids; includes the Euro symbol and a few other obscure characters&lt;/li&gt;&lt;/ul&gt;Now there are only really two places I know of where you can get a list of ISO 8859 character maps. The first is the following &lt;a href="http://czyborra.com/charsets/iso8859.html"&gt;Debian&lt;/a&gt; page, and of course the second is &lt;a href="http://en.wikipedia.org/wiki/ISO_8859"&gt;Wikipedia&lt;/a&gt; which not only lets you copy and paste the characters but gives you an excruciating amount of info on the charactersets. Sort of like this blog post, only without the sarcasm.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Yet more charactersets&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Of course, this now meant that there were more charactersets than you could poke a stick at. In actual fact, there are even more charactersets than this because &lt;a href="http://en.wikipedia.org/wiki/Iso-646"&gt;ISO-646&lt;/a&gt; had dozens of variations. Not only this, but there appeared another class of characterset encodings called the &lt;span style="font-style: italic;"&gt;Double-Byte Character Set&lt;/span&gt; (also known as DBCS). DBCSes were actually the real precursor to Unicode in my mind, because they were the first to attempt to use more than a byte to represent characters. You can read more about &lt;a href="http://en.wikipedia.org/wiki/DBCS"&gt;DBCSes&lt;/a&gt; on Wikipedia. While you are there, if you are interested it's worthwhile reading about another ISO/IEC standard - &lt;a href="http://en.wikipedia.org/wiki/ISO_2022"&gt;ISO/IEC 2022&lt;/a&gt; - which uses variable-sized encoding to represent characters and is mainly used to represent characters of East-Asian languages.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;More to come later&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Well, I'll write more later, as it's quite late here and writing about the precursors to Unicode is actually quite tiring.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-391928558282976692?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/391928558282976692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/unicode-and-oracle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/391928558282976692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/391928558282976692'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/unicode-and-oracle.html' title='Unicode and Oracle'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-2585697831465544756</id><published>2009-05-08T06:15:00.000-07:00</published><updated>2009-05-11T15:08:42.572-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pua'/><category scheme='http://www.blogger.com/atom/ns#' term='fonts'/><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><title type='text'>Finding what font renders Unicode characters in the PUA</title><content type='html'>Unicode 5 allows for 137,468 privately used codepoints. This means that there are codepoints that are reserved for private organizations to do with what they will - which means that no characters have been officially assigned to them.&lt;br /&gt;&lt;br /&gt;In practice, this means that you need to have some way of knowing where the document with the embedded Unicode character came from. This is normally left up to a high-level protocol to negotiate how to render the character.&lt;br /&gt;&lt;br /&gt;A great example is the character U+F8FF, which is used by a number of fonts. According to &lt;a href="http://en.wikipedia.org/wiki/U%2BF8FF"&gt;Wikipedia&lt;/a&gt;, this font is the Apple Computer logo with Apple fonts installed, the Microsoft logo when using Wingdings, and the Luxi font (designed for the X Window System) shows a euro symbol. There are a heck of a lot of &lt;a href="http://www.fileformat.info/info/unicode/char/f8ff/fontsupport.htm"&gt;other fonts&lt;/a&gt; that also use this codepoint.&lt;br /&gt;&lt;br /&gt;And this was my challenge the other day. I'm currently in the process of troubleshooting a particularly tricky Unicode issue, but I wanted to see what used U+100084, but finding what uses this codepoint was a bit tricky. Then I discovered that &lt;a href="http://www.fileformat.info/"&gt;fileformat.info&lt;/a&gt; has a &lt;a href="http://www.fileformat.info/info/unicode/font/fontlist.htm"&gt;Unicode font list&lt;/a&gt; and a &lt;a href="http://www.fileformat.info/info/unicode/char/search.htm"&gt;Unicode font search tool&lt;/a&gt;. I had to use the &lt;a href="http://www.fileformat.info/info/unicode/font/fontlist.htm?text=%F4%80%82%83+-+U%2B100083"&gt;local file list&lt;/a&gt;, and for some reason I found that my PC had Palatino Linotype installed on it - a very expensive font. However, it was the only font that rendered the character. Therefore, I came to the conclusion that this came from a PDF document, which had the font embedded.&lt;br /&gt;&lt;br /&gt;Very useful!&lt;br /&gt;&lt;br /&gt;P.S. Please, please, if you are thinking of using a font that requires a private use codepoint, do everyone a favour. &lt;span style="font-style: italic;"&gt;Don't&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-2585697831465544756?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/2585697831465544756/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/finding-what-font-renders-unicode.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/2585697831465544756'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/2585697831465544756'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/05/finding-what-font-renders-unicode.html' title='Finding what font renders Unicode characters in the PUA'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-5100384643519195038</id><published>2009-03-06T03:45:00.000-08:00</published><updated>2009-03-06T03:54:13.782-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technicalwriting'/><category scheme='http://www.blogger.com/atom/ns#' term='grammar'/><category scheme='http://www.blogger.com/atom/ns#' term='pronounspronounspronouns'/><title type='text'>Pronouns - oh my!</title><content type='html'>Recently I've been editing a lot of technical articles. Poor grammar and the use of passive voice has apparently been a bit of an issue for me!&lt;br /&gt;&lt;br /&gt;In the course of understanding the difference between &lt;span style="font-style: italic;"&gt;active&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;passive&lt;/span&gt; voice, I stumbled over &lt;a href="http://www.uottawa.ca/academic/arts/writcent/hypergrammar/"&gt;HyperGrammar&lt;/a&gt;, which is an electronic grammar course at the University of Ottawa's &lt;a href="http://www.arts.uottawa.ca/writcent/"&gt;Writing Centre&lt;/a&gt;. It's an excellent website, one which I'm interested in reading - especially as the Australian school system never taught me grammar as it fell out of fashion with the teaching profession. A terrible mistake we are now all paying for - I understand that grammar is now back in fashion, so I suppose that there is still hope.&lt;br /&gt;&lt;br /&gt;I just started reading about what a pronoun is, but as it's almost 11PM, I decided to stop when I discovered you can use subjective personal pronouns, objective personal pronouns, possessive person pronouns, demonstrative pronouns, interrogative pronouns, relative pronouns, indefinite pronouns, relative pronouns and, finally, intensive pronouns!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-5100384643519195038?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/5100384643519195038/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/03/pronouns-oh-my.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5100384643519195038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/5100384643519195038'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/03/pronouns-oh-my.html' title='Pronouns - oh my!'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-902462745979972638</id><published>2009-02-26T05:38:00.000-08:00</published><updated>2009-02-26T05:51:42.544-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='richardsimmons'/><category scheme='http://www.blogger.com/atom/ns#' term='steamers'/><category scheme='http://www.blogger.com/atom/ns#' term='letterman'/><title type='text'>Richard Simmons</title><content type='html'>I have a confession. I'm a bit of a fan of, all people, &lt;a href="http://www.youtube.com/watch?v=3SCJLlSf21Y"&gt;Richard Simmons&lt;/a&gt;. Why? Well, he's a pretty positive guy, he doesn't hold grudges (go watch any of the thousands of clips of him appearing on Letterman), he's happy about himself and he's confident enough that he doesn't mind being totally camp or make himself look a bit foolish in front of millions of people. Most of all, he seems like a fairly kind individual, and that is one of the most important aspects to anyone really.&lt;br /&gt;&lt;br /&gt;You see, I think that when most people watch Richard Simmons they don't see a guy who has a very strong will, but I &lt;span style="font-style: italic;"&gt;do&lt;/span&gt; think this. Richard Simmons is happy in his own skin (literally - *shudder*) that it really doesn't &lt;span style="font-style: italic;"&gt;matter&lt;/span&gt; what mockers like Letterman think. Simmons goes out and does what he wants to do, and to hell with what others think of him. And in the process, he's actually helped out a reasonable amount of people who &lt;span style="font-style: italic;"&gt;do&lt;/span&gt; feel bad about themselves.&lt;br /&gt;&lt;br /&gt;Therefore, Richard Simmons, I salute you. You may have shocking dress sense, you may act the fool, you might show your 60+ year old legs on Letterman &lt;span style="font-style: italic;"&gt;far&lt;/span&gt; too often, and you may market &lt;a href="http://www.infomercial-hell.com/blog/2008/02/18/david-letterman-steamer-product-prank-costs-richard-simmons-dearly/"&gt;ridiculous steamers&lt;/a&gt;, but you are still an unlikely role model for our generation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-902462745979972638?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/902462745979972638/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/richard-simmons.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/902462745979972638'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/902462745979972638'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/richard-simmons.html' title='Richard Simmons'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-3892501333340492602</id><published>2009-02-19T05:39:00.001-08:00</published><updated>2009-02-20T02:54:55.709-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oxymoron'/><category scheme='http://www.blogger.com/atom/ns#' term='kfc'/><title type='text'>KFC nutrition</title><content type='html'>&lt;a href="http://www.kfc.com/nutrition%20/"&gt;Figures.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-3892501333340492602?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/3892501333340492602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/kfc-nutrition.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3892501333340492602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3892501333340492602'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/kfc-nutrition.html' title='KFC nutrition'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-3566964017973609364</id><published>2009-02-19T05:07:00.000-08:00</published><updated>2009-02-19T05:16:02.262-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='baby'/><category scheme='http://www.blogger.com/atom/ns#' term='cutie'/><title type='text'>World, meet Emily</title><content type='html'>Warning: exceedingly cute baby pictures ahead.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RyR_zJsOOl0/SZ1bKACYojI/AAAAAAAAH6I/tCp84XC03g4/s1600-h/p9290512.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 225px;" src="http://4.bp.blogspot.com/_RyR_zJsOOl0/SZ1bKACYojI/AAAAAAAAH6I/tCp84XC03g4/s400/p9290512.jpg" alt="" id="BLOGGER_PHOTO_ID_5304496163479134770" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_RyR_zJsOOl0/SZ1bFy6FCmI/AAAAAAAAH6A/huOaCWKenA0/s1600-h/p9290511.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 225px;" src="http://4.bp.blogspot.com/_RyR_zJsOOl0/SZ1bFy6FCmI/AAAAAAAAH6A/huOaCWKenA0/s400/p9290511.jpg" alt="" id="BLOGGER_PHOTO_ID_5304496091235158626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RyR_zJsOOl0/SZ1a-h3BvRI/AAAAAAAAH54/0R-p--_vonU/s1600-h/p9290510.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 225px;" src="http://3.bp.blogspot.com/_RyR_zJsOOl0/SZ1a-h3BvRI/AAAAAAAAH54/0R-p--_vonU/s400/p9290510.jpg" alt="" id="BLOGGER_PHOTO_ID_5304495966399872274" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RyR_zJsOOl0/SZ1a4s1xkuI/AAAAAAAAH5w/M68J6HVAROI/s1600-h/p9290508.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 225px;" src="http://3.bp.blogspot.com/_RyR_zJsOOl0/SZ1a4s1xkuI/AAAAAAAAH5w/M68J6HVAROI/s400/p9290508.jpg" alt="" id="BLOGGER_PHOTO_ID_5304495866268193506" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_RyR_zJsOOl0/SZ1az6HsIKI/AAAAAAAAH5o/MTEZHASGBVQ/s1600-h/p9290507.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 225px;" src="http://3.bp.blogspot.com/_RyR_zJsOOl0/SZ1az6HsIKI/AAAAAAAAH5o/MTEZHASGBVQ/s400/p9290507.jpg" alt="" id="BLOGGER_PHOTO_ID_5304495783933649058" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RyR_zJsOOl0/SZ1athFwZfI/AAAAAAAAH5g/btXDArga5HM/s1600-h/p9290506.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 225px;" src="http://2.bp.blogspot.com/_RyR_zJsOOl0/SZ1athFwZfI/AAAAAAAAH5g/btXDArga5HM/s400/p9290506.jpg" alt="" id="BLOGGER_PHOTO_ID_5304495674135438834" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_RyR_zJsOOl0/SZ1an1M3M7I/AAAAAAAAH5Y/Q766F3cUg8E/s1600-h/p9290505.jpg"&gt;&lt;img style="cursor: pointer; width: 300px; height: 225px;" src="http://2.bp.blogspot.com/_RyR_zJsOOl0/SZ1an1M3M7I/AAAAAAAAH5Y/Q766F3cUg8E/s400/p9290505.jpg" alt="" id="BLOGGER_PHOTO_ID_5304495576454738866" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-3566964017973609364?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/3566964017973609364/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/world-meet-emily.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3566964017973609364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3566964017973609364'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/world-meet-emily.html' title='World, meet Emily'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_RyR_zJsOOl0/SZ1bKACYojI/AAAAAAAAH6I/tCp84XC03g4/s72-c/p9290512.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-1164919483211532964</id><published>2009-02-19T03:15:00.000-08:00</published><updated>2009-02-19T04:46:10.768-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><title type='text'>How To Kill Redundancy With a Redundancy</title><content type='html'>Terry Childs was a network administrator of the San Francisco FibreWAN. When I say &lt;span style="font-style: italic;"&gt;a&lt;/span&gt; network admin, I really mean  &lt;span style="font-style: italic;"&gt;the&lt;/span&gt; network admin - given that he was the only one who looked after it. So while I'm impressed he is one of the world's few CCIEs, I do think that this is really a bit too much for anyone to take on by themselves.&lt;br /&gt;&lt;br /&gt;So when he &lt;a href="http://www.cio.com.au/article/255165/sorting_facts_terry_childs_case"&gt;went rogue&lt;/a&gt; and wouldn't disclose the passwords to the Cisco routers and passwords he administered, I was somewhat gobsmacked. Not at Terry Childs, mind you, but at the dumb-arse morons who left a sole employee the administrator and contact for their entire critical networking infrastructure. Seriously, what would have happened if the man had expired? If he'd dropped off the mortal coil then they would not have been able to recover the passwords &lt;span style="font-style: italic;"&gt;at all&lt;/span&gt;. Luckily Childs turned them over to Mayor &lt;a href="http://www.cio.com.au/article/254280/san_francisco_mayor_gets_back_keys_network"&gt;Gavin Newsom&lt;/a&gt;, so a big problem was averted.&lt;br /&gt;&lt;br /&gt;I'm sure that the San Fran network infrastructure had built-in redundancy. But it looks like they forgot the most important redundancy of all - the people to administer it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-1164919483211532964?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/1164919483211532964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/terry-childs-case.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1164919483211532964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1164919483211532964'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/terry-childs-case.html' title='How To Kill Redundancy With a Redundancy'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-8677075845129381882</id><published>2009-02-15T04:09:00.000-08:00</published><updated>2009-02-15T04:10:51.311-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='montypython'/><category scheme='http://www.blogger.com/atom/ns#' term='youtube'/><title type='text'>Python takes Youtube</title><content type='html'>I notice that there is a "report background image" link down the bottom of the &lt;a href="http://www.youtube.com/montypython"&gt;Monty Python YouTube channel&lt;/a&gt;. All hail Monty Python!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-8677075845129381882?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/8677075845129381882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/python-takes-youtube.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8677075845129381882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/8677075845129381882'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/python-takes-youtube.html' title='Python takes Youtube'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-645238648335958300</id><published>2009-02-03T00:35:00.000-08:00</published><updated>2009-02-03T00:39:55.381-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coffee'/><category scheme='http://www.blogger.com/atom/ns#' term='slashdot'/><category scheme='http://www.blogger.com/atom/ns#' term='printer'/><category scheme='http://www.blogger.com/atom/ns#' term='green'/><title type='text'>Coffee printer</title><content type='html'>On slashdot I found &lt;a href="http://www.inhabitat.com/2009/02/02/riti-coffee-printer-greener-gadgets/"&gt;this awesome printer&lt;/a&gt;, that prints with coffee. Hmmmm... if I bought this I think my caffeine addiction would only get worse :-)&lt;br /&gt;&lt;br /&gt;This made me look at the website where it was submitted. It was part of the &lt;a href="http://www.greenergadgets.com/index.php/design-competition/"&gt;Greener Gadgets design competition&lt;/a&gt;, which in its own right is pretty interesting. Go check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-645238648335958300?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/645238648335958300/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/coffee-printer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/645238648335958300'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/645238648335958300'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/coffee-printer.html' title='Coffee printer'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-1299013479204806575</id><published>2009-02-01T03:40:00.000-08:00</published><updated>2009-02-03T00:41:45.843-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='failagain'/><category scheme='http://www.blogger.com/atom/ns#' term='dvorak'/><category scheme='http://www.blogger.com/atom/ns#' term='css'/><title type='text'>On Not Getting It Redux</title><content type='html'>I thought &lt;a href="http://randomtechnicalstuff.blogspot.com/2009/01/on-not-getting-it.html"&gt;John C. Dvorak&lt;/a&gt; could not have looked more ridiculous with his "my Windows XP idle process is killing my computer!" line, but I stumbled across the &lt;a href="http://www.pcmag.com/article2/0,1895,1987181,00.asp"&gt;following article&lt;/a&gt; today. In it, he rails against CSS.&lt;br /&gt;&lt;br /&gt;&lt;span id="intellitxt"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span id="intellitxt"&gt;If your Internet connection happens to lose a bit of CSS data, you get a mess on your screen. &lt;/span&gt;&lt;/blockquote&gt;How on &lt;span style="font-style: italic;"&gt;earth&lt;/span&gt; did this guy get to be a widely known and respected pundit on all things technology?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-1299013479204806575?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/1299013479204806575/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/on-not-getting-it-redux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1299013479204806575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1299013479204806575'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/02/on-not-getting-it-redux.html' title='On Not Getting It Redux'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-1452515309841174795</id><published>2009-01-20T03:41:00.000-08:00</published><updated>2009-05-14T04:17:44.976-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xssflaw'/><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><title type='text'>I pity the fool!</title><content type='html'>I pity the fool... who &lt;a href="http://www.yourtv.com.au/guide/index.cfm?action=%20Man%3Cbr%3E%3Cimg%20src=%22http%3a%2f%2fwww.jimbo.info%2fweblog%2f2008%2f06%2f02%2fMrT15.jpg%22%3E%3Cbr%3E%3Cbig%3EI%20pity%20the%20fool%21%3C/big%3E%3Cbr%3EYou%20are"&gt;allows users to control text output via a URL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Nice going TV Guide!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-1452515309841174795?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/1452515309841174795/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/i-pity-fool.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1452515309841174795'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/1452515309841174795'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/i-pity-fool.html' title='I pity the fool!'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-3860375050420963843</id><published>2009-01-20T00:56:00.001-08:00</published><updated>2009-05-14T04:19:48.874-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='slashdot'/><category scheme='http://www.blogger.com/atom/ns#' term='dvorak'/><title type='text'>On Not Getting It</title><content type='html'>On Slashdot today I read a post entitled &lt;a href="http://ask.slashdot.org/article.pl?sid=09/01/19/1856206"&gt;"Do Nice Engineers Finish Last?"&lt;/a&gt; which had the best first post ever. Which then got better.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://ask.slashdot.org/article.pl?sid=09/01/19/1856206#"&gt;First post&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;Do Nice Engineers Finish Last In Tough Times?&lt;/blockquote&gt;Why, just the other day, a coworker was in contention for a promotion that was going to a younger engineer. My coworker found the specs to the younger engineer's car online and determined the precise rate it would have to leak coolant to completely drain the reserve tank precisely when he was leaving home to make an important customer meeting the next morning. I saw him on a crawl board attaching the regulator and a valve system in the parking lot and sure enough it overheated at precisely the right time so our customer just sat their waiting.&lt;br /&gt;&lt;br /&gt;It's a calculate-or-be-calculated world out there!&lt;br /&gt;&lt;/blockquote&gt;&lt;a href="http://ask.slashdot.org/comments.pl?sid=1097203&amp;amp;cid=26520961"&gt;Response:&lt;/a&gt;&lt;br /&gt;&lt;blockquote&gt;Aside from the fact that your post is a load of horseshit, I suppose that you didn't step up to the plate by telling management what you witnessed.&lt;br /&gt;&lt;br /&gt;And, incidentally, once the youngster took his car to the shop to be repaired, the tampering would have been discovered, and your fictional coworker would have been thrown in jail (hmm just where did this after market valve and regulator come from anyway?). In most states tampering with an automobile is a felony.&lt;/blockquote&gt;I think this might have spiked the parent poster's conscience, because &lt;a href="http://ask.slashdot.org/comments.pl?sid=1097203&amp;amp;cid=26521177"&gt;he replied&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;Alright alright, I need to come clean ... I embellished on this story a little bit. Here's the truth:&lt;br /&gt;&lt;br /&gt;I was going to tell my boss but when I walked in, the coworker I was ratting out was on his knees with a mouthful of my boss and I think he said, "Oh hai!" I didn't stick around to clarify, I just left.&lt;br /&gt;&lt;br /&gt;And it wasn't a car, it was a hovercraft. And it wasn't a regulator &amp;amp; valve, it was a detonator &amp;amp; C4. And he wasn't late for a meeting, he died. And don't worry about the law, Virginia isn't a state it's a commonwealth.&lt;br /&gt;&lt;br /&gt;I feel almost relieved to get that off my chest and to come clean with you. I think I answered all your questions truthfully and fairly. Hopefully, together you and I can keep the internet a sound unbiased source of nothing but the unadulterated truth and historic account of everything.&lt;br /&gt;&lt;br /&gt;You've helped me help myself. I love you.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-3860375050420963843?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/3860375050420963843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/on-not-getting-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3860375050420963843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3860375050420963843'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/on-not-getting-it.html' title='On Not Getting It'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-3169270040371810493</id><published>2009-01-19T04:40:00.001-08:00</published><updated>2009-01-20T01:32:35.418-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='forkbomb'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='stupidnettricks'/><category scheme='http://www.blogger.com/atom/ns#' term='denialofservice'/><category scheme='http://www.blogger.com/atom/ns#' term='dontdothisathome'/><title type='text'>Stupid bash tricks</title><content type='html'>The following is a very stupid bash command to run.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;:(){:|:};:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is a fork bomb, so don't run it without having set process limits.&lt;br /&gt;&lt;br /&gt;I was trying to understand how this worked, and I found the &lt;a href="http://www.cyberciti.biz/faq/understanding-bash-fork-bomb/"&gt;following blog&lt;/a&gt; that set me straight. What was tricking me was the colon... it didn't look like it should be valid but it is. Who knew? Well, certainly not me.&lt;br /&gt;&lt;br /&gt;The site I note above helpfully suggests changing the colon to "bomb", which gives us:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bomb() {&lt;br /&gt;    bomb | bomb&lt;br /&gt;}; bomb&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-3169270040371810493?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/3169270040371810493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/stupid-bash-trick.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3169270040371810493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3169270040371810493'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/stupid-bash-trick.html' title='Stupid bash tricks'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6960962859715201650</id><published>2009-01-19T04:24:00.000-08:00</published><updated>2009-01-19T04:27:22.483-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='stupidnettricks'/><category scheme='http://www.blogger.com/atom/ns#' term='slashdot'/><category scheme='http://www.blogger.com/atom/ns#' term='futurama'/><title type='text'>Stupid slashdot tricks</title><content type='html'>Well, only one. It looks like the Slashdot crew are bigger fans of Futurama than I realised!&lt;br /&gt;&lt;br /&gt;I got this from a &lt;a href="http://tech.slashdot.org/comments.pl?sid=1096387&amp;cid=26514489"&gt;slashdot sig&lt;/a&gt;.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;chris@ubuntu:~$ echo -e "HEAD / HTTP/1.1\nHost: slashdot.org\n\n" | netcat slashdot.org 80&lt;br /&gt;HTTP/1.1 200 OK&lt;br /&gt;Date: Mon, 19 Jan 2009 12:23:53 GMT&lt;br /&gt;Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4&lt;br /&gt;SLASH_LOG_DATA: shtml&lt;br /&gt;X-Powered-By: Slash 2.005001237&lt;br /&gt;X-Bender: Farewell, big blue ball of idiots!&lt;br /&gt;Cache-Control: private&lt;br /&gt;Pragma: private&lt;br /&gt;Connection: close&lt;br /&gt;Content-Type: text/html; charset=iso-8859-1&lt;br /&gt;&lt;br /&gt;chris@ubuntu:~$ echo -e "HEAD / HTTP/1.1\nHost: slashdot.org\n\n" | netcat slashdot.org 80&lt;br /&gt;HTTP/1.1 200 OK&lt;br /&gt;Date: Mon, 19 Jan 2009 12:24:02 GMT&lt;br /&gt;Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4&lt;br /&gt;SLASH_LOG_DATA: shtml&lt;br /&gt;X-Powered-By: Slash 2.005001237&lt;br /&gt;X-Fry: People said I was dumb but I proved them!&lt;br /&gt;Cache-Control: private&lt;br /&gt;Pragma: private&lt;br /&gt;Connection: close&lt;br /&gt;Content-Type: text/html; charset=iso-8859-1&lt;br /&gt;&lt;br /&gt;chris@ubuntu:~$ echo -e "HEAD / HTTP/1.1\nHost: slashdot.org\n\n" | netcat slashdot.org 80&lt;br /&gt;HTTP/1.1 200 OK&lt;br /&gt;Date: Mon, 19 Jan 2009 12:24:07 GMT&lt;br /&gt;Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4&lt;br /&gt;SLASH_LOG_DATA: shtml&lt;br /&gt;X-Powered-By: Slash 2.005001237&lt;br /&gt;X-Leela: There's a political debate on. Quick, change the channel!&lt;br /&gt;Cache-Control: private&lt;br /&gt;Pragma: private&lt;br /&gt;Connection: close&lt;br /&gt;Content-Type: text/html; charset=iso-8859-1&lt;br /&gt;&lt;br /&gt;chris@ubuntu:~$ echo -e "HEAD / HTTP/1.1\nHost: slashdot.org\n\n" | netcat slashdot.org 80&lt;br /&gt;HTTP/1.1 200 OK&lt;br /&gt;Date: Mon, 19 Jan 2009 12:24:11 GMT&lt;br /&gt;Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4&lt;br /&gt;SLASH_LOG_DATA: shtml&lt;br /&gt;X-Powered-By: Slash 2.005001237&lt;br /&gt;X-Fry: Stop abducting me!&lt;br /&gt;Cache-Control: private&lt;br /&gt;Pragma: private&lt;br /&gt;Connection: close&lt;br /&gt;Content-Type: text/html; charset=iso-8859-1&lt;br /&gt;&lt;br /&gt;chris@ubuntu:~$&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6960962859715201650?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6960962859715201650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/stupid-slashdot-tricks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6960962859715201650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6960962859715201650'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/stupid-slashdot-tricks.html' title='Stupid slashdot tricks'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6823619047786418066</id><published>2009-01-13T00:45:00.000-08:00</published><updated>2009-01-13T00:56:01.847-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windowsxp'/><category scheme='http://www.blogger.com/atom/ns#' term='asshat'/><category scheme='http://www.blogger.com/atom/ns#' term='johncdvorak'/><category scheme='http://www.blogger.com/atom/ns#' term='applehater'/><category scheme='http://www.blogger.com/atom/ns#' term='mousedenier'/><category scheme='http://www.blogger.com/atom/ns#' term='windowsxphater'/><category scheme='http://www.blogger.com/atom/ns#' term='idleprocess'/><title type='text'>Dvorak and the nefarious "idle process"</title><content type='html'>While most people know that John Charles Dvorak once famously said that "the Macintosh uses an experimental pointing device called a ‘mouse’. There is no evidence that people want to use these things. I don't want one of these new fangled devices", they might not also know that he said the following in PC World about the Windows XP &lt;a href="http://www.pcmag.com/article2/0,1759,1304348,00.asp"&gt;idle process&lt;/a&gt;:&lt;br /&gt;&lt;span id="intellitxt"&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span id="intellitxt"&gt;&lt;p&gt;This week's column is about exploring the commonly observed problems that crop up with each new release [of Windows]. Maybe Microsoft should patch the patches once in a while.&lt;/p&gt; &lt;p&gt;Here are a few of my gripes – most of them a result of excessive patching&lt;/p&gt;&lt;/span&gt;&lt;br /&gt;&lt;span id="intellitxt"&gt;&lt;b&gt;IDLE-TIME PROCESS.&lt;/b&gt; Once in a while the system will go into an idle mode, requiring from five minutes to half an hour to unwind. It's weird, and I almost always have to reboot. When I hit Ctrl-Alt-Delete, I see that the System Idle Process is hogging all the resources and chewing up 95 percent of the processor's cycles. Doing what? Doing nothing? Once in a while, after you've clicked all over the screen trying to get the system to do something other than idle, all your clicks suddenly ignite and the screen goes crazy with activity. This is not right.&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6823619047786418066?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6823619047786418066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/dvorak-and-nefarious-idle-process.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6823619047786418066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6823619047786418066'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/dvorak-and-nefarious-idle-process.html' title='Dvorak and the nefarious &quot;idle process&quot;'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-7266372713733057620</id><published>2009-01-10T20:21:00.000-08:00</published><updated>2009-01-10T20:32:32.680-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='spam'/><category scheme='http://www.blogger.com/atom/ns#' term='oops'/><category scheme='http://www.blogger.com/atom/ns#' term='reply-all'/><title type='text'>Reply-all storms</title><content type='html'>Ah yes, the old reply-all storm. Never good, but even worse when it takes out U.S. diplomatic mail servers!&lt;br /&gt;&lt;br /&gt;According to this report on &lt;a href="http://hosted.ap.org/dynamic/stories/S/STATE_DEPARTMENT_E_MAIL?SITE=AP&amp;amp;SECTION=HOME&amp;amp;TEMPLATE=DEFAULT"&gt;Associated Press&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;p class="ap-story-p"&gt;Officials said the storm started when some diplomats used the 'reply all' function to respond to a blank e-mail sent recently to many people on the department's global address list.&lt;/p&gt; &lt;p class="ap-story-p"&gt;Most demanded to be removed from the list while others used 'reply all' to tell their co-workers, in often less than diplomatic language, to stop responding to the entire group, the officials said.&lt;/p&gt; &lt;p class="ap-story-p"&gt;Some then compounded the problem by trying to recall their initial replies, which generated another round of messages to the group, they said.&lt;/p&gt;&lt;/blockquote&gt;&lt;p class="ap-story-p"&gt;&lt;/p&gt;The best email storm I've heard of though, is the one &lt;a href="http://it.slashdot.org/article.pl?sid=05/07/24/2016202"&gt;involving journalists&lt;/a&gt; who were accidentally sent a mass email from the Casey Journalism Center at the University of Maryland inviting them to their "Casey Medals" Awards.&lt;br /&gt;&lt;br /&gt;According to &lt;span style="font-style: italic;"&gt;&lt;a href="http://www.allbusiness.com/services/business-services-miscellaneous-business/4679834-1.html"&gt;Editor and Publisher&lt;/a&gt; &lt;/span&gt;the email snafu caused some interesting effects:&lt;br /&gt;&lt;blockquote&gt;The back-and-forth sparked a circle of never-ending responses that, in some cases, kept hundreds of e-mails filling electronic mailboxes over several hours on Tuesday and Wednesday morning. But, in an unexpected surprise, it also brought many journalists in touch with old colleagues, while forging a number of new industry connections through something of an online cocktail party.&lt;br /&gt;&lt;br /&gt;"People started chit-chatting back and forth and inviting themselves to the awards," said Kim Platicha, editor and publisher of Parentwise Austin magazine in Austin, Texas. "It really evolved from there, it was hysterical. I have already started an e-mail conversation with a couple of folks."&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-7266372713733057620?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/7266372713733057620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/reply-all-storms.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7266372713733057620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7266372713733057620'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/reply-all-storms.html' title='Reply-all storms'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-7747997654219664607</id><published>2009-01-03T17:14:00.000-08:00</published><updated>2009-02-03T00:42:26.150-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zune'/><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='boundaryconditionfailure'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><category scheme='http://www.blogger.com/atom/ns#' term='freescale'/><title type='text'>What killed the Zune30?</title><content type='html'>So we've been hearing a lot about &lt;a href="http://it.slashdot.org/article.pl?sid=08/12/31/1428254"&gt;Microsoft&lt;/a&gt; &lt;a href="http://slashdot.org/article.pl?sid=09/01/03/1754244"&gt;Zune 30s&lt;/a&gt; &lt;a href="http://www.p2pnet.net/story/18030"&gt;crashing&lt;/a&gt;. Microsoft have now said that it was a &lt;a href="http://www.zune.net/en-us/support/zune30.htm"&gt;leap year bug&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;And indeed it is! From &lt;a href="http://pastie.org/349916"&gt;Pastie&lt;/a&gt; (start at line 249):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;//------------------------------------------------------------------&lt;br /&gt;//&lt;br /&gt;// Function: ConvertDays&lt;br /&gt;//&lt;br /&gt;// Local helper function that split total days since Jan 1, ORIGINYEAR into&lt;br /&gt;// year, month and day&lt;br /&gt;//&lt;br /&gt;// Parameters:&lt;br /&gt;//&lt;br /&gt;// Returns:&lt;br /&gt;//      Returns TRUE if successful, otherwise returns FALSE.&lt;br /&gt;//&lt;br /&gt;//------------------------------------------------------------------&lt;br /&gt;BOOL ConvertDays(UINT32 days, SYSTEMTIME* lpTime)&lt;br /&gt;{&lt;br /&gt;int dayofweek, month, year;&lt;br /&gt;UINT8 *month_tab;&lt;br /&gt;&lt;br /&gt;//Calculate current day of the week&lt;br /&gt;dayofweek = GetDayOfWeek(days);&lt;br /&gt;&lt;br /&gt;year = ORIGINYEAR;&lt;br /&gt;&lt;br /&gt;while (days &gt; 365)&lt;br /&gt;{&lt;br /&gt; if (IsLeapYear(year))&lt;br /&gt; {&lt;br /&gt;     if (days &gt; 366)&lt;br /&gt;     {&lt;br /&gt;         days -= 366;&lt;br /&gt;         year += 1;&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;     days -= 365;&lt;br /&gt;     year += 1;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// Determine whether it is a leap year&lt;br /&gt;month_tab = (UINT8 *)((IsLeapYear(year))? monthtable_leap : monthtable);&lt;br /&gt;&lt;br /&gt;for (month=0; month&lt;12;&gt;wDay = days;&lt;br /&gt;lpTime-&gt;wDayOfWeek = dayofweek;&lt;br /&gt;lpTime-&gt;wMonth = month;&lt;br /&gt;lpTime-&gt;wYear = year;&lt;br /&gt;&lt;br /&gt;return TRUE;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Why is this bad? Well, 2008 was a leap year that has &lt;span style="font-style: italic;"&gt;366 &lt;/span&gt;days. Let's step through the lines of code that caused the problem.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;//Calculate current day of the week&lt;br /&gt;dayofweek = GetDayOfWeek(&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;366&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;year = &lt;span style="color: rgb(0, 153, 0); font-weight: bold;"&gt;2008&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;while (&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;366&lt;/span&gt; &gt; 365)&lt;br /&gt;{&lt;br /&gt;if (IsLeapYear(&lt;span style="color: rgb(0, 153, 0); font-weight: bold;"&gt;2008&lt;/span&gt;))&lt;br /&gt;{&lt;br /&gt;if (&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;366&lt;/span&gt; &gt; 366)&lt;br /&gt;{&lt;br /&gt;   days -= 366;&lt;br /&gt;   year += 1;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;days -= 365;&lt;br /&gt;year += 1;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;As you can see, the while loop condition becomes true - yes, the day is day 366 and that's greater than 365. And yes, 2008 is a leap year. But as you can see, 366 will &lt;span style="font-style: italic;"&gt;never&lt;/span&gt; be greater than... 366.&lt;br /&gt;&lt;br /&gt;Therefore, the loop condition never evaluates to false, hence an infinite loop. Thus your Zune will crash.&lt;br /&gt;&lt;br /&gt;Guess  &lt;a href="http://www.freescale.com/"&gt;Freescale&lt;/a&gt;, the makers of the Zune's processor (the &lt;a href="http://www.freescale.com/webapp/sps/site/prod_summary.jsp?code=MC13783&amp;amp;nodeId=0174404881"&gt;MC13783&lt;/a&gt;), had a programmer who didn't understand about boundary conditions.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update: &lt;/span&gt;Another blogger has now gone and suggested a few &lt;a href="http://www.aeroxp.org/2009/01/lesson-on-infinite-loops/"&gt;bug fixes&lt;/a&gt; for the Zune issue. Nice going :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-7747997654219664607?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/7747997654219664607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/what-killed-zune360.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7747997654219664607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7747997654219664607'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2009/01/what-killed-zune360.html' title='What killed the Zune30?'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-7297624244364914608</id><published>2008-12-27T14:44:00.001-08:00</published><updated>2008-12-28T01:46:19.420-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='queries'/><category scheme='http://www.blogger.com/atom/ns#' term='joins'/><title type='text'>SQL joins</title><content type='html'>A relational database is so named because the data it stores relates to each other. In SQL, the relationships between data is expressed in a query by what is known as a &lt;span style="font-style: italic;"&gt;join&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;There are a number of different types of joins. Most joins can be either defined as an &lt;span style="font-style: italic;"&gt;implicit&lt;/span&gt; join or an &lt;span style="font-style: italic;"&gt;explicit&lt;/span&gt; join. An implicit join is one where there is no explicit JOIN statement yet there is a join implicit in the WHERE clause of the query. An explicit join is one where there is actually a JOIN statement in the FROM clause of the query.&lt;br /&gt;&lt;br /&gt;An explicit join is also known as a qualified join, and uses the syntax&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT &amp;lt;columns&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM &amp;lt;table&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;join type&amp;gt; JOIN &amp;lt;table&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ON &amp;lt;join condition&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Cross joins&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Given two tables, each row in the inner table joins each row of the outer table. I can think of almost no examples where you'd want to use this, but the implicit join syntax is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT * FROM&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;OrgUnit, Person&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The explicit join syntax is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT * FROM OrgUnit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;CROSS JOIN Person&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A cross join is also known as a Cartesian product or a Cartesian join. I have never needed to use it! Note that this is the &lt;span style="font-style: italic;"&gt;only&lt;/span&gt; join that does not use the ON syntax, as it's not needed and if you needed to restrict the data set then you'd need to filter in the WHERE clause of the query. Of course, if your filter does a comparison against two related columns of the datasets, then you have an INNER join, described below.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Inner joins&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;An "inner" join is named because given two tables, the query will return each row in the inner table that has a match in the outer table.&lt;br /&gt;&lt;br /&gt;To show an example of this, I'll have another look at my two tables I introduced in the cross join section. They are OrgUnit and Person.&lt;br /&gt;&lt;br /&gt;&lt;div class="nobrtable"&gt;&lt;br /&gt;&lt;table width="100%"&gt;&lt;br /&gt;&lt;caption  style="margin-bottom: 8px;font-family:courier new;"&gt;&lt;span style="font-size:180%;"&gt;OrgUnit&lt;/span&gt;&lt;/caption&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;OrgUnitID&lt;/th&gt; &lt;th&gt;OrgUnitName&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Manufacturing&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Accounting&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Human Resources&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;Tiger team&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;IT&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;Consultancy&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="nobrtable"&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;caption  style="margin-bottom: 8px;font-family:arial;"&gt;&lt;span style="font-size:180%;"&gt;Person&lt;/span&gt;&lt;/caption&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;PersonID&lt;/th&gt; &lt;th&gt;FirstName&lt;/th&gt; &lt;th&gt;LastName&lt;/th&gt; &lt;th&gt;PhoneNumber&lt;/th&gt; &lt;th&gt;Address&lt;/th&gt; &lt;th&gt;OrgUnitID&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;1&lt;/td&gt; &lt;td&gt;Chris&lt;/td&gt; &lt;td&gt;Sasquatch&lt;/td&gt; &lt;td&gt;03 9998 7656&lt;/td&gt; &lt;td&gt;5 Curumbah St, Gladstone, VIC, 3145&lt;/td&gt; &lt;td&gt;5&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;2&lt;/td&gt; &lt;td&gt;Jill&lt;/td&gt; &lt;td&gt;Anderson&lt;/td&gt; &lt;td&gt;03 9765 3975&lt;/td&gt; &lt;td&gt;23 Sesqatonia Rd, Smallville, VIC, 3087&lt;/td&gt; &lt;td&gt;6&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;3&lt;/td&gt; &lt;td&gt;Robert&lt;/td&gt; &lt;td&gt;Manaheim&lt;/td&gt; &lt;td&gt;03 7659 8765&lt;/td&gt; &lt;td&gt;18a Xyz St, Whoknowswhere, VIC, 3009&lt;/td&gt; &lt;td&gt;2&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;4&lt;/td&gt; &lt;td&gt;Mysterious&lt;/td&gt; &lt;td&gt;Guy&lt;/td&gt; &lt;td&gt;02 8765 4321&lt;/td&gt; &lt;td&gt;78 Unknown St, NSW, 2000&lt;/td&gt; &lt;td&gt;1&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;5&lt;/td&gt; &lt;td&gt;Captain&lt;/td&gt; &lt;td&gt;Obvious&lt;/td&gt; &lt;td&gt;02 1111 1111&lt;/td&gt; &lt;td&gt;54 Duh Lane, NSW, 2119&lt;/td&gt; &lt;td&gt;4&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;6&lt;/td&gt; &lt;td&gt;Mickey&lt;/td&gt; &lt;td&gt;Mouse&lt;/td&gt; &lt;td&gt;07 7654 6665&lt;/td&gt; &lt;td&gt;1 Disney Rd, QLD, 7654&lt;/td&gt; &lt;td&gt;7&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;7&lt;/td&gt; &lt;td&gt;Donald&lt;/td&gt; &lt;td&gt;Duck&lt;/td&gt; &lt;td&gt;07 7654 6665&lt;/td&gt; &lt;td&gt;5 Drewery Lane, WA, 8097&lt;/td&gt; &lt;td&gt;NULL&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;8&lt;/td&gt; &lt;td&gt;Daffy&lt;/td&gt; &lt;td&gt;Duck&lt;/td&gt; &lt;td&gt;08 7654 3214&lt;/td&gt; &lt;td&gt;8 St Kilda Street, WA, 8008&lt;/td&gt; &lt;td&gt;7&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;9&lt;/td&gt; &lt;td&gt;Bugs&lt;/td&gt; &lt;td&gt;Bunny&lt;/td&gt; &lt;td&gt;08 7654 3214&lt;/td&gt; &lt;td&gt;1004 Killawee Rd, NT, 6543&lt;/td&gt; &lt;td&gt;7&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If I wanted to find out all the Organization Units that each invididual resides in, I would run the following explicit query:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT&lt;br /&gt;p.FirstName,&lt;br /&gt;p.LastName,&lt;br /&gt;p.Address,&lt;br /&gt;p.PhoneNumber,&lt;br /&gt;o.OrgUnitName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM Person p&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INNER JOIN OrgUnit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ON p.OrgUnitID=o.OrgUnitID&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The implicit query is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT&lt;br /&gt;p.FirstName,&lt;br /&gt;p.LastName,&lt;br /&gt;p.Address,&lt;br /&gt;p.PhoneNumber,&lt;br /&gt;o.OrgUnitName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM Person p, OrgUnit o&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WHERE p.OrgUnitID=o.OrgUnitID&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This gives the following results:&lt;br /&gt;&lt;br /&gt;&lt;div class="nobrtable"&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;FirstName&lt;/th&gt; &lt;th&gt;LastName&lt;/th&gt; &lt;th&gt;PhoneNumber&lt;/th&gt; &lt;th&gt;Address&lt;/th&gt; &lt;th&gt;OrgUnitName&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Chris&lt;/td&gt; &lt;td&gt;Sasquatch&lt;/td&gt; &lt;td&gt;03 9998 7656&lt;/td&gt; &lt;td&gt;5 Curumbah St, Gladstone, VIC, 3145&lt;/td&gt; &lt;td&gt;IT&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Jill&lt;/td&gt; &lt;td&gt;Anderson&lt;/td&gt; &lt;td&gt;03 9765 3975&lt;/td&gt; &lt;td&gt;23 Sesqatonia Rd, Smallville, VIC, 3087&lt;/td&gt; &lt;td&gt;Consultancy&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Robert&lt;/td&gt; &lt;td&gt;Manaheim&lt;/td&gt; &lt;td&gt;03 7659 8765&lt;/td&gt; &lt;td&gt;18a Xyz St, Whoknowswhere, VIC, 3009&lt;/td&gt; &lt;td&gt;Accounting&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Mysterious&lt;/td&gt; &lt;td&gt;Guy&lt;/td&gt; &lt;td&gt;02 8765 4321&lt;/td&gt; &lt;td&gt;78 Unknown St, NSW, 2000&lt;/td&gt; &lt;td&gt;Manufacturing&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Captain&lt;/td&gt; &lt;td&gt;Obvious&lt;/td&gt; &lt;td&gt;02 1111 1111&lt;/td&gt; &lt;td&gt;54 Duh Lane, NSW, 2119&lt;/td&gt; &lt;td&gt;Tiger team&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Mickey&lt;/td&gt; &lt;td&gt;Mouse&lt;/td&gt; &lt;td&gt;07 7654 6665&lt;/td&gt; &lt;td&gt;1 Disney Rd, QLD, 7654&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Daffy&lt;/td&gt; &lt;td&gt;Duck&lt;/td&gt; &lt;td&gt;08 7654 3214&lt;/td&gt; &lt;td&gt;8 St Kilda Street, WA, 8008&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Bugs&lt;/td&gt; &lt;td&gt;Bunny&lt;/td&gt; &lt;td&gt;08 7654 3214&lt;/td&gt; &lt;td&gt;1004 Killawee Rd, NT, 6543&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Outer joins&lt;br /&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;An "outer" join is so named because given two tables, each row in the outer table is returned even if it does not meet the ON condition. There is no implicit join syntax for this sort of join - you must use the ANSI syntax.&lt;br /&gt;&lt;br /&gt;There are a number of forms of outer joins: left outer join, right outer join and full outer join. Let's explore each of these.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span style="font-size:130%;"&gt;Left outer joins&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A left outer join returns the "left" rows of an outer join regardless of whether they met the ON condition or not. If the right hand table does not meet the join condition, then a NULL is displayed.&lt;br /&gt;&lt;br /&gt;Let's say that I wanted to find all the people in my database and if they are part of an organization unit. I would do this with the following query:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT&lt;br /&gt;p.FirstName,&lt;br /&gt;p.LastName,&lt;br /&gt;p.Address,&lt;br /&gt;p.PhoneNumber,&lt;br /&gt;o.OrgUnitName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM Person p&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;LEFT OUTER JOIN OrgUnit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ON p.OrgUnitID=o.OrgUnitID&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This would return the following results:&lt;br /&gt;&lt;br /&gt;&lt;div class="nobrtable"&gt;&lt;br /&gt;&lt;table width="100%"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;FirstName&lt;/th&gt; &lt;th&gt;LastName&lt;/th&gt; &lt;th&gt;PhoneNumber&lt;/th&gt; &lt;th&gt;Address&lt;/th&gt; &lt;th&gt;OrgUnitName&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Chris&lt;/td&gt; &lt;td&gt;Sasquatch&lt;/td&gt; &lt;td&gt;03 9998 7656&lt;/td&gt; &lt;td&gt;5 Curumbah St, Gladstone, VIC, 3145&lt;/td&gt; &lt;td&gt;IT&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Jill&lt;/td&gt; &lt;td&gt;Anderson&lt;/td&gt; &lt;td&gt;03 9765 3975&lt;/td&gt; &lt;td&gt;23 Sesqatonia Rd, Smallville, VIC, 3087&lt;/td&gt; &lt;td&gt;Consultancy&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Robert&lt;/td&gt; &lt;td&gt;Manaheim&lt;/td&gt; &lt;td&gt;03 7659 8765&lt;/td&gt; &lt;td&gt;18a Xyz St, Whoknowswhere, VIC, 3009&lt;/td&gt; &lt;td&gt;Accounting&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Mysterious&lt;/td&gt; &lt;td&gt;Guy&lt;/td&gt; &lt;td&gt;02 8765 4321&lt;/td&gt; &lt;td&gt;78 Unknown St, NSW, 2000&lt;/td&gt; &lt;td&gt;Manufacturing&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Captain&lt;/td&gt; &lt;td&gt;Obvious&lt;/td&gt; &lt;td&gt;02 1111 1111&lt;/td&gt; &lt;td&gt;54 Duh Lane, NSW, 2119&lt;/td&gt; &lt;td&gt;Tiger team&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Mickey&lt;/td&gt; &lt;td&gt;Mouse&lt;/td&gt; &lt;td&gt;07 7654 6665&lt;/td&gt; &lt;td&gt;1 Disney Rd, QLD, 7654&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Daffy&lt;/td&gt; &lt;td&gt;Duck&lt;/td&gt; &lt;td&gt;08 7654 3214&lt;/td&gt; &lt;td&gt;8 St Kilda Street, WA, 8008&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Bugs&lt;/td&gt; &lt;td&gt;Bunny&lt;/td&gt; &lt;td&gt;08 7654 3214&lt;/td&gt; &lt;td&gt;1004 Killawee Rd, NT, 6543&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Donald&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Duck&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;07 7654 6665&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;5 Drewery Lane, WA, 8097&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;NULL&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;br /&gt;I have highlighted in bold red the row that is returned in the left outer join that was &lt;span style="font-style: italic;"&gt;not &lt;/span&gt;returned in the inner join. As you can see, Donald Duck exists in the left hand table, but is not part of a organization unit. With the left outer join he is still returned in the output, however as he is not part of any org unit it displays a NULL value.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span style="font-size:130%;"&gt;Right outer joins&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;A right outer join is the counterpart of the left outer join. It returns the "right" rows of an outer join regardless of whether they met the ON condition or not. If the left hand table does not meet the join condition, then a NULL is displayed.&lt;br /&gt;&lt;br /&gt;Let's say that I wanted to find all org units and if they have any members show who they are. I would run the following query:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;p.FirstName, p.LastName, o.OrgUnitName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM Person p&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;RIGHT OUTER JOIN OrgUnit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ON p.OrgUnitID=o.OrgUnitID&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This returns the following results:&lt;br /&gt;&lt;br /&gt;&lt;div class="nobrtable"&gt;&lt;br /&gt;&lt;table width="100%"&gt;&lt;br /&gt;&lt;tbody&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;FirstName&lt;/th&gt; &lt;th&gt;LastName&lt;/th&gt; &lt;th&gt;OrgUnitName&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Mysterious&lt;/td&gt; &lt;td&gt;Guy&lt;/td&gt; &lt;td&gt;Manufacturing&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Robert&lt;/td&gt; &lt;td&gt;Manaheim&lt;/td&gt; &lt;td&gt;Accounting&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;NULL&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;NULL&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Human Resources&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Captain&lt;/td&gt; &lt;td&gt;Obvious&lt;/td&gt; &lt;td&gt;Tiger team&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Chris&lt;/td&gt; &lt;td&gt;Sasquatch&lt;/td&gt; &lt;td&gt;IT&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Jill&lt;/td&gt; &lt;td&gt;Anderson&lt;/td&gt; &lt;td&gt;Consultancy&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Mickey&lt;/td&gt; &lt;td&gt;Mouse&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Daffy&lt;/td&gt; &lt;td&gt;Duck&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Bugs&lt;/td&gt; &lt;td&gt;Bunny&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;br /&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Again I have highlighted in bold red the important row that is returned by the right outer join. The human resources org unit of this company has nobody in it (silly rabbits!) but we still want to know all the org units of the company. Thus as the table OrgUnits is on the &lt;span style="font-style: italic;"&gt;right hand side&lt;/span&gt; of the join we return the organization but NULLs for the left hand side table rows.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;span style="font-size:130%;"&gt;Full outer joins&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;A full outer join allows us to display each row in &lt;span style="font-style: italic;"&gt;both&lt;/span&gt; left and right tables. If there is a row in the right hand table that does not match the ON join condition, then it displays the right hand table row and NULL values for the left hand table. If there is a row in the left hand table that does not match the ON join condition, then it displays the left hand table row and NULL values for the right hand table.&lt;br /&gt;&lt;br /&gt;This may seem a bit like a cross join, but it is not. A cross join matches every row for the left and right hand tables regardless of the relationship between the tables. The full outer join maintains the relationships between the tables, it's just if either side does not have a matching row then it displays the row on the right/left hand side regardless.&lt;br /&gt;&lt;br /&gt;If I wanted to see all the OrgUnits and each member of the OrgUnit, but I also wanted to see all  the people in the database regardless of whether they belong to an OrgUnit, I would run the following query:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;o.OrgUnitName&lt;/span&gt;,&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;p.FirstName,&lt;br /&gt;p.LastName,&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;p.PhoneNumber,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;p.Address,&lt;br /&gt;o.OrgUnitName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM Person p&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FULL OUTER JOIN OrgUnit&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;ON p.OrgUnitID=o.OrgUnitID&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="nobrtable"&gt;&lt;br /&gt;&lt;table&gt;&lt;br /&gt;&lt;tbody&gt;&lt;tr&gt;&lt;br /&gt;&lt;th&gt;FirstName&lt;/th&gt; &lt;th&gt;LastName&lt;/th&gt; &lt;th&gt;PhoneNumber&lt;/th&gt; &lt;th&gt;Address&lt;/th&gt; &lt;th&gt;OrgUnitName&lt;/th&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Chris&lt;/td&gt; &lt;td&gt;Sasquatch&lt;/td&gt; &lt;td&gt;03 9998 7656&lt;/td&gt; &lt;td&gt;5 Curumbah St, Gladstone, VIC, 3145&lt;/td&gt; &lt;td&gt;IT&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Jill&lt;/td&gt; &lt;td&gt;Anderson&lt;/td&gt; &lt;td&gt;03 9765 3975&lt;/td&gt; &lt;td&gt;23 Sesqatonia Rd, Smallville, VIC, 3087&lt;/td&gt; &lt;td&gt;Consultancy&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;NULL&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;NULL&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;NULL&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;NULL&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Human Resources&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Robert&lt;/td&gt; &lt;td&gt;Manaheim&lt;/td&gt; &lt;td&gt;03 7659 8765&lt;/td&gt; &lt;td&gt;18a Xyz St, Whoknowswhere, VIC, 3009&lt;/td&gt; &lt;td&gt;Accounting&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Mysterious&lt;/td&gt; &lt;td&gt;Guy&lt;/td&gt; &lt;td&gt;02 8765 4321&lt;/td&gt; &lt;td&gt;78 Unknown St, NSW, 2000&lt;/td&gt; &lt;td&gt;Manufacturing&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Captain&lt;/td&gt; &lt;td&gt;Obvious&lt;/td&gt; &lt;td&gt;02 1111 1111&lt;/td&gt; &lt;td&gt;54 Duh Lane, NSW, 2119&lt;/td&gt; &lt;td&gt;Tiger team&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Mickey&lt;/td&gt; &lt;td&gt;Mouse&lt;/td&gt; &lt;td&gt;07 7654 6665&lt;/td&gt; &lt;td&gt;1 Disney Rd, QLD, 7654&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Daffy&lt;/td&gt; &lt;td&gt;Duck&lt;/td&gt; &lt;td&gt;08 7654 3214&lt;/td&gt; &lt;td&gt;8 St Kilda Street, WA, 8008&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td&gt;Bugs&lt;/td&gt; &lt;td&gt;Bunny&lt;/td&gt; &lt;td&gt;08 7654 3214&lt;/td&gt; &lt;td&gt;1004 Killawee Rd, NT, 6543&lt;/td&gt; &lt;td&gt;Special projects&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;br /&gt;&lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Donald&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Duck&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;07 7654 6665&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;5 Drewery Lane, WA, 8097&lt;/td&gt; &lt;td style="color: rgb(255, 0, 0); font-weight: bold;"&gt;NULL&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Semi and anti-semi joins&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The last sort of joins I want to talk about are semi-joins and anti-semi joins.&lt;br /&gt;&lt;br /&gt;A semi-join will return rows from a table when there is one or more corresponding rows in the joining table. Interestingly, there isn't actually any explicit syntax for semi-joins, instead you must use the EXISTS statement.&lt;br /&gt;&lt;br /&gt;For instance, let's say that I want to find all OrgUnits that have at least one Person. We could do the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;o.OrgUnitName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;OrgUnit&lt;/span&gt; o&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;INNER JOIN &lt;/span&gt;&lt;span style="font-family:courier new;"&gt;Person p&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;However, this will return more than one record for the OrgUnit "Special projects".&lt;br /&gt;&lt;br /&gt;Instead, a semi-join will do this for you. The syntax is:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT o.OrgUnitID&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM OrgUnit AS o&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WHERE EXISTS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   (&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;SELECT p.OrgUnitID FROM Person AS p&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;WHERE p.OrgUnitID = o.OrgUnitID  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You can also do this by using an IN statement:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT o.OrgUnitName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM OrgUnit AS o&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WHERE o.OrgUnitID IN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    SELECT p.OrgUnitID FROM Person AS p&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    WHERE p.OrgUnitID = o.OrgUnitID  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;An &lt;span style="font-style: italic;"&gt;anti-semi join&lt;/span&gt; however, does the exact opposite. It will find any rows that do &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; have at least one matching row in the second table. To do this, use the NOT EXISTS statement.&lt;br /&gt;&lt;br /&gt;Going back to our previous example, if we wanted to find all the departments that do not have any members, we would do the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT o.OrgUnitID&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM OrgUnit AS o&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WHERE NOT EXISTS&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;   (&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;SELECT p.OrgUnitID FROM Person AS p&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;WHERE p.OrgUnitID = o.OrgUnitID  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;With the NOT IN statement it would be:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT o.OrgUnitName&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;FROM OrgUnit AS o&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;WHERE o.OrgUnitID NOT IN&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  (&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    SELECT p.OrgUnitID FROM Person AS p&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    WHERE p.OrgUnitID = o.OrgUnitID  &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  )&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Note 1: I picked this IN trick up at the &lt;a href="http://geeks.netindonesia.net/blogs/kasim.wirama/archive/2008/05/18/types-of-join.aspx"&gt;following blog&lt;/a&gt;.&lt;br /&gt;Note 2: I asked over at &lt;a href="http://www.sqlservercentral.com/Forums/Topic626235-338-1.aspx"&gt;SQL Server Central&lt;/a&gt; whether they thought it would be a good idea to add a TOP 1 clause to the query. i.e. the correlated subquery becomes:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;SELECT TOP 1 p.OrgUnitID FROM Person AS p&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    WHERE p.OrgUnitID = o.OrgUnitID  &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;However, it was politely suggested I test myself. Fair enough I suppose :-)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Another way of doing a FULL OUTER join&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Interestingly, we can get a FULL OUTER join by doing a left outer join of Table1 to Table2, then do a UNION ALL of a left anti-semi join of Table2 to Table1. Or in other words:&lt;br /&gt;&lt;br /&gt;Table1 LEFT OUTER JOIN Table2&lt;br /&gt;UNION ALL&lt;br /&gt;Table2 LEFT ANTI-SEMI JOIN Table1&lt;br /&gt;&lt;br /&gt;I picked this up from the book Inside Microsoft SQL Server 2005: Query Tuning and Optimization. It's useful because a nested loop can't do a FULL OUTER join, except that you can transform the FULL OUTER join into joins that the nested loop &lt;span style="font-style: italic;"&gt;can&lt;/span&gt; handle. Which I thought was quite neat, in a totally geeky way of course :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-7297624244364914608?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/7297624244364914608/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/mysterious-world-of-joins.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7297624244364914608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/7297624244364914608'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/mysterious-world-of-joins.html' title='SQL joins'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-256177827782527763</id><published>2008-12-26T19:26:00.001-08:00</published><updated>2008-12-27T20:46:12.572-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humour'/><category scheme='http://www.blogger.com/atom/ns#' term='conspicuousconsumption'/><category scheme='http://www.blogger.com/atom/ns#' term='slate'/><category scheme='http://www.blogger.com/atom/ns#' term='suv'/><title type='text'>Attention span of a gnat on meth</title><content type='html'>Thank you, &lt;a href="http://www.salon.com/comics/tomo/2008/06/03/tomo/index.html"&gt;Slate&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-256177827782527763?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/256177827782527763/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/attention-span-of-gnat-on-meth.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/256177827782527763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/256177827782527763'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/attention-span-of-gnat-on-meth.html' title='Attention span of a gnat on meth'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-6198721607526665821</id><published>2008-12-25T23:16:00.000-08:00</published><updated>2008-12-25T23:18:25.035-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='compiler'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='warnings'/><category scheme='http://www.blogger.com/atom/ns#' term='gnome'/><title type='text'>C warning flags</title><content type='html'>A short blog post today. Just found an excellent post explaining the &lt;a href="http://blogs.gnome.org/otte/2008/12/22/warning-options/"&gt;different gcc warning flags&lt;/a&gt; and what they do, by GNOME hacker Benjamin Otte.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-6198721607526665821?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/6198721607526665821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/c-warning-flags.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6198721607526665821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/6198721607526665821'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/c-warning-flags.html' title='C warning flags'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-4634319202664447827</id><published>2008-12-23T02:55:00.000-08:00</published><updated>2008-12-24T03:52:15.582-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='tuning'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='rbar'/><title type='text'>Query tuning</title><content type='html'>I think that I've found the best blog post on SQL tuning I've ever read.&lt;br /&gt;&lt;br /&gt;It's by Jeff Moden, and it's entitled &lt;a href="http://www.sqlservercentral.com/articles/Performance+Tuning/62278/"&gt;More RBAR and "Tuning" UPDATEs&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I had a similar issue the other day, where I had a query that was taking almost 7 minutes to retrieve 6,000 records. For some reason it was doing a UNION of two SELECT statements, yet the second SELECT statement was the same as the first - so I thought that this was what was causing the issue.&lt;br /&gt;&lt;br /&gt;And sure, when we took out the second SELECT statement the query reduced to about 3 and a half minutes.&lt;br /&gt;&lt;br /&gt;Yet that was absolutely &lt;span style="font-style: italic;"&gt;still &lt;/span&gt;too long. When I looked at the statement a bit further, I noticed that it was doing a LEFT OUTER join against a view that used a count function, a correlated subquery and a CASE statement, and not only that but when the actual SELECT statement found a NULL yet &lt;span style="font-style: italic;"&gt;another&lt;/span&gt; CASE statement was used to convert the NULL into a value. The query plan was hideous - for 6,000 records in the final query output the LEFT OUTER join to the view was bringing back 1.6 &lt;span style="font-style: italic;"&gt;million&lt;/span&gt; rows.&lt;br /&gt;&lt;br /&gt;Hello &lt;a href="http://www.simple-talk.com/sql/t-sql-programming/rbar--row-by-agonizing-row/"&gt;RBAR&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;So I did exactly what Jeff did - read the view and the query to work out what it was trying to do, then I rewrote the view to be more sensible. All of a sudden I went from about 3.5 minutes to run the query to &lt;span style="font-style: italic;"&gt;7 seconds&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;So lesson learned - RBAR bad, set-based good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-4634319202664447827?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/4634319202664447827/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/query-tuning.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/4634319202664447827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/4634319202664447827'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/query-tuning.html' title='Query tuning'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-3912555948007923729</id><published>2008-12-12T02:54:00.000-08:00</published><updated>2008-12-27T21:19:14.304-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='memory'/><title type='text'>Memory in Windows</title><content type='html'>During memory performance troubleshooting on Windows servers, I've often had to go to the task manager - and at times I've needed to use the Performance Monitor. The biggest problem I had when I first used these tools was understanding the different types of memory counters/columns in these tools. It has taken me a reasonable amount of research to understand the difference between such counters as virtual bytes, private bytes and working set.&lt;br /&gt;&lt;br /&gt;In case anyone else has wondered what the different memory counters are in the Performance Monitor, or have been confused by the column labels in the task manager, the &lt;span style="font-size:100%;"&gt;following is a brief summary.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Virtual memory&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before I explain, a quick explanation is probably due as to the meaning of the term "Virtual Memory". Probably the best explanation I have ever read is a 1992 Microsoft technical article entitled &lt;a href="http://msdn.microsoft.com/en-us/library/ms810616.aspx"&gt;The Virtual-Memory Manager in Windows NT&lt;/a&gt;. However, in a nutshell, Windows uses a 32-bit contiguous virtual address space which can address up to 4 GB of memory. Don't get too excited about this, because by default 2GB of virtual address space is reserved for the operating system, though this can be changed to just 1GB with the &lt;a href="http://blogs.msdn.com/oldnewthing/archive/2004/08/22/218527.aspx"&gt;/3GB bootup switch&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Each virtual address is actually just a placeholder to a physical location of memory in the machine, and when accessing memory Windows must jump through a few hoops to translate the virtual address to the physical address. In essence it must look up a 3 level btree to get to the address, first looking up a page directory, which refers to an entry in a page table, which in turn refers to a page frame. Note that for faster memory access Windows (and in fact all modern operating systems) relies on the processor's translatable lookaside buffer (TLB) to gain direct access to the memory.&lt;br /&gt;&lt;br /&gt;The interesting thing about virtual memory is that each page table entry may either refer to an area of physical memory or to a pagefile on disk. This allows Windows to address more memory than is physically available via the system's RAM. When a program looks up an area of memory that is backed by a pagefile, the process is suspended by the operating system and the data is retrieved from the disk and placed into physical memory. This is known as a &lt;span style="font-style: italic;"&gt;page fault&lt;/span&gt;. When the page has been retrieved from the disk and into memory, the operating system unsuspends and returns control back to the process.&lt;br /&gt;&lt;br /&gt;This is often a point of confusion for people, the best example of which was recently on Slashdot under an "Ask Slashdot" question "&lt;a href="http://ask.slashdot.org/article.pl?sid=08/12/04/217233"&gt;Why Use Virtual Memory in Modern Systems?&lt;/a&gt;":&lt;br /&gt;&lt;i&gt;&lt;/i&gt;&lt;blockquote&gt;&lt;i&gt;"I have a system with Windows Vista Ultimate (64-bit) installed on it, and it has 4GB of RAM. However when I've been watching system performance, my system seems to divide the work between the physical RAM and the virtual memory, so I have 2GB of data in the virtual memory and another 2GB in the physical memory. Is there a reason why my system should even be using the virtual memory anymore? I would think the computer would run better if it based everything off of RAM instead of virtual memory. Any thoughts on this matter or could you explain why the system is acting this way?"&lt;br /&gt;&lt;/i&gt;&lt;/blockquote&gt;The confusion here is that the poster is asking quite a different question, which is "why use a pagefile in modern systems?", which I think for workstations is actually a fairly reasonable question!&lt;br /&gt;&lt;br /&gt;I also find it interesting that in Windows Vista Microsoft have tried to address this in their description of the virtual bytes counter of Performance Monitor, as they now state in the counter's description that "Use of virtual address space does not necessarily imply corresponding use of either disk or main memory pages." Obviously Microsoft tech support got heartily sick of having to explain this concept to the many people who misunderstand it and call them about it!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;Performance monitor&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The performance monitor (perfmon.exe, I'll call it perfmon from now on) is a tool in all versions of Windows since Windows 2000 that can access the various counters that are built into Windows, as well as other third party counters for products such as SQL Server.&lt;br /&gt;&lt;br /&gt;If you had a process that you believed was leaking memory, then you can run perfmon to find out if this is the case. You would simply create a new log, then you'd add a number of process counters for the process you feel is causing the problem. Alternatively, if you didn't know what process was causing issues you could just add the process object to capture all counters for every process, of course you would then need to remove hundreds of counters when you loaded the file... but sometimes you've just got to do these sort of things when it's not clear what's going on. Painful, but true. :-)&lt;br /&gt;&lt;br /&gt;The problem, then, becomes a matter of knowing what counters to actually look at. The following are the important ones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Virtual bytes&lt;/span&gt; are the number of bytes of virtual memory that the process is using in total&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Private bytes&lt;/span&gt; are the number of bytes of virtual memory that is being used by the process alone and that it can't share with other processes. We must distinguish between this counter and the virtual bytes counter because the process can actually load &lt;a href="http://msdn.microsoft.com/en-us/library/ms810613.aspx"&gt;memory-mapped files&lt;/a&gt;, EXEs or DLLs into its virtual address space. Private bytes is a counter that does &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; include these things. As such, you will almost always see that virtual bytes is significantly larger than private bytes.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Working set bytes&lt;span style="font-style: italic;"&gt; &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; are the set of virtual addresses used by the application that are actually resident in memory (i.e. are NOT paged to the disk)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Page file bytes &lt;/span&gt;are, fairly obviously, the set of virtual addresses that reference a page in the pagefile. When memory is low, incidently, you can also add in the counter &lt;span style="font-weight: bold;"&gt;Page faults/sec&lt;/span&gt; to see how often the memory is being swapped from disk into memory. The more page faults per second, the slower the process will run because suspending a process while a page is retreived from a disk can be quite an expensive operation!&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Paged pool bytes/Paged non-pool bytes&lt;/span&gt; - I had to look this one up! The best explanation is actually on Microsoft's &lt;a href="http://blogs.technet.com/askperf/default.aspx"&gt;Ask the Performance Team&lt;/a&gt; where they have a whole article on &lt;a href="http://blogs.technet.com/askperf/archive/2007/03/07/memory-management-understanding-pool-resources.aspx"&gt;understanding pool resources&lt;/a&gt;. Rather than reinvent the wheel, I'll just quote them:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;&lt;blockquote&gt;&lt;/blockquote&gt;When a machine boots up, the Memory Manager creates two dynamically sized memory pools that kernel-mode components use to allocate system memory. These two pools are known as the Paged Pool and NonPaged Pool.  Each of these pools start at an initial size that is based upon the amount of physical memory present in the system.  Pool memory is a subset of available memory and is not necessarily contiguous.  If necessary, these pools can grow up to a maximum size that is determined by the system at boot time.&lt;/span&gt;&lt;/blockquote&gt;For more info on this area of memory, the linked article explains it all very well so I won't explain it any further here.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I should note that after you capture these counters, when you view them again you will probably need to set the scale to something more sensible like 0.000001, or else you just won't see a line on the graph!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-size:130%;"&gt;Task Manager&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;When something is going slowly, most people who know enough about Windows look at the processes tab of the Windows Task Manager.&lt;br /&gt;&lt;br /&gt;I have to say before I talk about the task manager that though I've really only just started to use Windows Vista (well, I hardly use it at all, I prefer Ubuntu Linux for home use) despite its shortcomings Microsoft really put some care in the ancillary utilities like the Performance Monitor (now part of the Reliability and Performance Monitor) and the task manager. The task manager under Vista is really quite impressive now!&lt;br /&gt;&lt;br /&gt;However, I'm afraid that I've only just started looking at the Vista task manager, so I won't talk about it much here. I might edit the article later and rewrite this section. :-)&lt;br /&gt;&lt;br /&gt;The main areas to look at in the Task manager are the mem usage column and the VM size column. While it might seem very straight forward to understand what these columns do, given the discussion above, the Task manager programmers must have been on crack as they don't report what you might think.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Mem usage&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; seems very vague for a description - after all, does this refer to the amount of virtual memory being used, the amount of actual unpaged memory, perhaps the total amount of memory exclusively used by the process? Well, it is actually the working set, which if you remember is all the virtual memory addresses that are resident in physical memory.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;VM size &lt;/span&gt;is really a &lt;span style="font-style: italic;"&gt;very&lt;/span&gt; odd name to give a column. After all, VM size is actually 4GB on 32-bit CPUs as virtual memory is all the memory that Windows can possibly address. Not surprisingly, confusion reigns supreme about this column and it is often confused as either the &lt;a href="http://www.codinghorror.com/blog/archives/000393.html"&gt;virtual memory that is paged to disk&lt;/a&gt; or the &lt;a href="http://techsalsa.com/solution-to-virtual-memory-too-low-problem/"&gt;amount of virtual memory being used by a process&lt;/a&gt;. It is neither of these things, instead it is actually the amount of private memory being used by the process (remembering that private memory is memory that is being used &lt;span style="font-style: italic;"&gt;exclusively&lt;/span&gt; by the process and doesn't take into account things like dlls, etc).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Anyway, I do hope that this is somewhat enlightening. Researching this took me some time and while searching google I found it frustrating seeing so much contradictory and confusing information about how to answer a question that at first glance seem to be straight forward but isn't: "how much memory is my program using?"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-3912555948007923729?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/3912555948007923729/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/different-types-of-memory-in-windows.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3912555948007923729'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3912555948007923729'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/different-types-of-memory-in-windows.html' title='Memory in Windows'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9025736111713624877.post-3810694477095881095</id><published>2008-12-10T04:08:00.000-08:00</published><updated>2008-12-24T04:20:25.605-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='databases'/><category scheme='http://www.blogger.com/atom/ns#' term='sqlserver2005'/><category scheme='http://www.blogger.com/atom/ns#' term='varchar(max)'/><title type='text'>varchar(MAX) truncating</title><content type='html'>I was reading Karen Delaney's excellent Inside SQL Server 2005 book about the SQL Server 2005 storage engine, and she explained quite a neat feature: varchar(MAX).&lt;br /&gt;&lt;br /&gt;varchar(MAX) is a funny sort of varchar, only you aren't restricted to only 8000 bytes (or characters - to varchar it's all the same) but in fact the maximum length of the column is the maximum length of any LOB type (2^31). Basically, if a column is set to varchar(MAX) and you have less than 8000 bytes then SQL Server internally stores the column as a varchar column, and if you exceed 8000 bytes then it stores it as LOB data.&lt;br /&gt;&lt;br /&gt;The interesting thing about varchar(max) is that it appears that unlike TEXT columns you can actually apply normal string manipulating SQL on it (i.e. replicate, left, right, etc). Yes, that's right, no more mucking about with TEXTPTR manipulation!&lt;br /&gt;&lt;br /&gt;The trap to watch out for is that if you decide to do something like join a varchar(MAX) value to a varchar value in order to create a new varchar(MAX) value, if the new value becomes greater than 8000 characters then the new value will be truncated to 8000 bytes.&lt;br /&gt;&lt;br /&gt;e.g.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;declare @theText varchar(MAX)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set @theText = replicate('x', 7095) + 'the end bit'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select len(@theText)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(shamelessly stolen from &lt;a href="http://sqlblogcasts.com/blogs/simons/archive/2005/11/18/when-is-varchar-max--not-a-varchar-max-.aspx"&gt;this blog&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;While you might think that the length of the string will show as 8006, the length is actually 8000.&lt;br /&gt;&lt;br /&gt;Why does this occur?&lt;br /&gt;&lt;br /&gt;The answer is actually found in SQL Server books online, under the section &lt;a href="http://msdn.microsoft.com/en-us/library/ms190476.aspx"&gt;Precision, Scale and Length&lt;/a&gt;. This says that:&lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;When two &lt;strong&gt;char&lt;/strong&gt;, &lt;strong&gt;varchar&lt;/strong&gt;, &lt;strong&gt;binary&lt;/strong&gt;, or &lt;strong&gt;varbinary&lt;/strong&gt; expressions are concatenated, the length of the resulting expression is the sum of the lengths of the two source expressions or 8,000 characters, whichever is less.&lt;/p&gt;     When two &lt;strong&gt;nchar&lt;/strong&gt; or &lt;strong&gt;nvarchar&lt;/strong&gt; expressions are concatenated, the length of the resulting expression is the sum of the lengths of the two source expressions or 4,000 characters, whichever is less.&lt;/blockquote&gt;Therefore, be warned! unless you cast the string to a varchar(MAX), then you might not get the results you expect!&lt;br /&gt;&lt;br /&gt;For the above example, incidently, you would do the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;declare @theText varchar(MAX)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;set @theText = replicate(cast 'x' as varchar(MAX)), 7095) + cast('the end bit' as varchar(MAX))&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;select len(@theText)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9025736111713624877-3810694477095881095?l=randomtechnicalstuff.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://randomtechnicalstuff.blogspot.com/feeds/3810694477095881095/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/varcharmax-truncating.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3810694477095881095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9025736111713624877/posts/default/3810694477095881095'/><link rel='alternate' type='text/html' href='http://randomtechnicalstuff.blogspot.com/2008/12/varcharmax-truncating.html' title='varchar(MAX) truncating'/><author><name>Ta bu shi da yu</name><uri>http://www.blogger.com/profile/00750381951662588677</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
