<?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-6691579676571716537</id><updated>2012-01-24T09:35:50.415Z</updated><category term='.Net 2.0'/><category term='Vista'/><category term='XBox 360'/><category term='SQL'/><category term='XP'/><category term='JFGI'/><category term='Esendex'/><category term='BlogIt'/><category term='Slashdot'/><category term='Date'/><category term='Review'/><category term='Bug'/><category term='SIP'/><category term='Opinions'/><category term='Divx'/><category term='XNA'/><category term='Ajax'/><category term='Testing'/><category term='.Net 2'/><category term='C++'/><category term='Tech Ed'/><category term='Clone'/><category term='Blender'/><category term='GData API'/><category term='COM+'/><category term='Code Samples'/><category term='ildasm'/><category term='Inheritance'/><category term='Graduates'/><category term='Threading'/><category term='LINQ'/><category term='SMS'/><category term='Gaming'/><category term='Visual C# Express'/><category term='UltraMon'/><category term='REST'/><category term='TransactionScope'/><category term='Web Services'/><category term='Performance Counters'/><category term='.Net 2 Migration'/><category term='MSMQ'/><category term='Logging'/><category term='Gadgets'/><category term='XML'/><category term='Windows Services'/><category term='Design'/><category term='SAPI'/><category term='AutoFormatter'/><category term='Dependency Walker'/><category term='Blogging'/><category term='VS Plugins'/><category term='C#'/><category term='Interop'/><category term='Error codes'/><category term='RTC'/><category term='Driving'/><category term='WSE3'/><category term='VB.Net'/><category term='ASP.Net'/><category term='Batch File'/><title type='text'>Project 20</title><subtitle type='html'>A reference blog containing posts added during my time at Esendex.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default?start-index=101&amp;max-results=100'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>158</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6691579676571716537.post-1530867733183479054</id><published>2008-03-06T21:20:00.000Z</published><updated>2008-03-06T21:22:39.597Z</updated><title type='text'>That's All Folks</title><content type='html'>Today marks the end of an era for me.  After more than 4 years at Esendex I feel that now is a good time to move on to pastures new.  It's my last day today, and this will be the last post of this blog as well.&lt;br /&gt;&lt;br /&gt;I first set this up to chart the experiences and knowledge gained during my work at Esendex, and now that work has come to an end I feel it is also fitting that this blog should as well.&lt;br /&gt;&lt;br /&gt;I shall keep blogging though.  I recently remembered that way back in 2004 I reserved &lt;a href="http://iandykes.blogspot.com/"&gt;iandykes.blogspot.com&lt;/a&gt; so I've resurrected that one and intend to keep it updated from now on.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-1530867733183479054?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/1530867733183479054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=1530867733183479054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1530867733183479054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1530867733183479054'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/03/thats-all-folks.html' title='That&apos;s All Folks'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3979556209514449460</id><published>2008-02-25T20:28:00.002Z</published><updated>2008-02-26T12:34:35.369Z</updated><title type='text'>Cool CG Animated Short Film</title><content type='html'>A &lt;a href="http://www.youtube.com/watch?v=FFuitd30vH4"&gt;CG 3D animated short film&lt;/a&gt;, apparently created by just one person.  Amazing level of detail, and raised a few smiles as well.  Looks very polished and professional.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3979556209514449460?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3979556209514449460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3979556209514449460' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3979556209514449460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3979556209514449460'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/02/cool-cg-animated-short-film.html' title='Cool CG Animated Short Film'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-6690672509231623945</id><published>2008-02-22T14:03:00.003Z</published><updated>2008-02-22T14:08:43.097Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><title type='text'>A Brief Introduction to REST</title><content type='html'>If you're looking for information on &lt;a href="http://en.wikipedia.org/wiki/Representational_State_Transfer"&gt;REpresentational State Transfer&lt;/a&gt;, then check out &lt;a href="http://www.infoq.com/articles/rest-introduction"&gt;A Brief Introduction to REST&lt;/a&gt; at &lt;a href="http://www.infoq.com/rest/"&gt;InfoQ&lt;/a&gt;.  I particularly like:&lt;br /&gt;&lt;blockquote&gt;The next principle we’re going to look at has a formal description that is a little intimidating: “Hypermedia as the engine of application state”, sometimes abbreviated as HATEOAS. (Seriously — I’m not making this up.)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6690672509231623945?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6690672509231623945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6690672509231623945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6690672509231623945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6690672509231623945'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/02/brief-introduction-to-rest.html' title='A Brief Introduction to REST'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8143188872598040372</id><published>2008-02-21T09:07:00.006Z</published><updated>2008-02-21T09:30:58.366Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JFGI'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><title type='text'>Assigning Basic Authorization HTTP Header to HttpWebRequest</title><content type='html'>&lt;div style="margin: 0px; padding: 5px; float: right;"&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;digg_url ='http://devproj20.blogspot.com/2008/02/assigning-basic-authorization-http.html';&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you're making a call to a HTTP resource that requires a &lt;a href="http://en.wikipedia.org/wiki/Basic_authentication_scheme"&gt;Basic Authorization HTTP header&lt;/a&gt;, you can use the following code:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;HttpWebRequest request = (HttpWebRequest)WebRequest.Create("url-here");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;request.Credentials = new NetworkCredential("username", "password");&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then post the request in the usual way.&lt;br /&gt;&lt;br /&gt;The confusion comes because &lt;span style="font-weight: bold;"&gt;on the first call the HTTP header will not be present&lt;/span&gt; on the request.  The framework is relying on the first call receiving a &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"&gt;401 response&lt;/a&gt;, with a &lt;a href="http://freesoft.org/CIE/RFC/1945/65.htm"&gt;&lt;span style="font-style: italic;"&gt;WWW-Authenticate&lt;/span&gt;&lt;/a&gt; header present, giving a &lt;span style="font-style: italic;"&gt;Basic realm=&amp;lt;realm-name&amp;gt; &lt;/span&gt; value.  A second call will then be made with the correct headers in place.&lt;br /&gt;&lt;br /&gt;If you are just consuming the resource, chances are the server will respond in a way that allows this behaviour.  However, if it doesn't respond with a 401, or that 401 response doesn't contain the &lt;span style="font-style: italic;"&gt;WWW-Authenticate&lt;/span&gt; header (or you just don't want to make 2 calls), then you have to manually add the &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html"&gt;Authorization header&lt;/a&gt; to the request:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;byte[] authBytes = Encoding.UTF8.GetBytes("user:password".ToCharArray());            &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes);&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8143188872598040372?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8143188872598040372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8143188872598040372' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8143188872598040372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8143188872598040372'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/02/assigning-basic-authorization-http.html' title='Assigning Basic Authorization HTTP Header to HttpWebRequest'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6691579676571716537.post-4647916847913709808</id><published>2008-02-20T16:13:00.005Z</published><updated>2008-02-20T16:57:54.133Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='JFGI'/><category scheme='http://www.blogger.com/atom/ns#' term='XML'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Writing XML with UTF-8 Encoding using XmlTextWriter and StringWriter</title><content type='html'>&lt;div style="margin: 0px; padding: 5px; float: right;"&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;digg_url ='http://devproj20.blogspot.com/2008/02/writing-xml-with-utf-8-encoding-using.html';&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you want to use XmlTextWriter to write XML into a StringBuilder you can create the XmlTextWriter like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;StringBuilder builder = new StringBuilder();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;XmlWriter writer = new XmlTextWriter(new StringWriter(builder));&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;But this generates a declaration on the resulting XML with the encoding of UTF-16 (the encoding of a .Net String).  There doesn't seem to be a straightforward way of making this declaration UTF-8 in this set up.&lt;br /&gt;&lt;br /&gt;You can, of course, use a MemoryStream instead of a StringWriter, and then use Encoding.UTF8.GetString(...) to convert the bytes to a string, but doing this made the resulting string have non-printable characters in it, which we don't want.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.thescripts.com/forum/thread307901.html"&gt;The solution is to subclass StringWriter and override the Encoding property&lt;/a&gt;.  Sounds a bit overkill for a solution, but it works very well.  Just create the following class (based on Jon Skeet's class):&lt;span style=";font-family:courier new;font-size:85%;"  &gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public class StringWriterWithEncoding : StringWriter&lt;br /&gt;{&lt;br /&gt;Encoding encoding;&lt;br /&gt;&lt;br /&gt;public StringWriterWithEncoding (StringBuilder builder, Encoding encoding)&lt;br /&gt;:base(builder)&lt;br /&gt;{&lt;br /&gt;this.encoding = encoding;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public override Encoding Encoding&lt;br /&gt;{&lt;br /&gt;get { return encoding; }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;Then use StringWriterWithEncoding instead of StringWriter in your XmlTextWriter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-4647916847913709808?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/4647916847913709808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=4647916847913709808' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4647916847913709808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4647916847913709808'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/02/writing-xml-with-utf-8-encoding-using.html' title='Writing XML with UTF-8 Encoding using XmlTextWriter and StringWriter'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6691579676571716537.post-767396716346355486</id><published>2008-02-20T11:28:00.006Z</published><updated>2008-02-20T11:49:55.773Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Bug'/><category scheme='http://www.blogger.com/atom/ns#' term='JFGI'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><title type='text'>This operation requires IIS integrated pipeline mode</title><content type='html'>&lt;div style="margin: 0px; padding: 5px; float: right;"&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;digg_url ='http://devproj20.blogspot.com/2008/02/this-operation-requires-iis-integrated.html';&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;If you're getting an error message&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);font-family:courier new;" &gt;This operation requires IIS integrated pipeline mode&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;when trying to add headers to a HttpResponse object in an ASP.Net web application, chances are you're trying something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;response.Headers["myHeader"] = "someValue";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;or&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;response.Headers.Add("myHeader", "someValue");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A quick Google reveals mentions of bugs in the 3.5 framework, but I'm using .Net 2.  Nevertheless you can work around this problem by adding your header this way instead:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:courier new;" &gt;response.AddHeader("myHeader", "someValue");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And your code should now add the header successfully.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-767396716346355486?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/767396716346355486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=767396716346355486' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/767396716346355486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/767396716346355486'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/02/this-operation-requires-iis-integrated.html' title='This operation requires IIS integrated pipeline mode'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6691579676571716537.post-5203974694272339633</id><published>2008-02-11T16:00:00.000Z</published><updated>2008-02-11T16:05:24.893Z</updated><title type='text'>50 Open Source Alternatives to Proprietary Programs</title><content type='html'>&lt;a href="http://whdb.com/2008/the-top-50-proprietary-programs-that-drive-you-crazy-and-their-open-source-alternatives/"&gt;The Top 50 Proprietary Programs that Drive You Crazy — and Their Open Source Alternatives&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Decent list of open source software for pretty much anything you want to do on your computer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-5203974694272339633?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/5203974694272339633/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=5203974694272339633' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5203974694272339633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5203974694272339633'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/02/50-open-source-alternatives-to.html' title='50 Open Source Alternatives to Proprietary Programs'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2415732950040782145</id><published>2008-02-05T15:08:00.001Z</published><updated>2008-02-20T11:49:43.537Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Threading'/><category scheme='http://www.blogger.com/atom/ns#' term='JFGI'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Custom ThreadPool</title><content type='html'>Last year in a post from the last day at Tech Ed I mentioned a talk about building &lt;a href="http://devproj20.blogspot.com/2007/06/tech-ed-day-5-scalable-aspnet-web.html"&gt;Scalable ASP.NET Web Applications&lt;/a&gt;, in which a warning was given about using the normal .Net ThreadPool in web apps.  A suggestion was made to instead use a custom thread pool so that ASP.NET's worker threads weren't all used up.&lt;br /&gt;&lt;br /&gt;In that talk it was said there was code for such a class on the &lt;a href="http://www.wintellect.com/webdemos.aspx"&gt;Wintellect website&lt;/a&gt;, but I remember looking at the time and couldn't find anything.&lt;br /&gt;&lt;br /&gt;I've since found &lt;a href="http://www.bearcanyon.com/dotnet/"&gt;Mike Woodring's .NET Sample Page&lt;/a&gt;, on which there is a &lt;a href="http://www.bearcanyon.com/dotnet/#threadpool"&gt;custom thread pool&lt;/a&gt; inplementation available for download.&lt;br /&gt;&lt;br /&gt;I've not needed to use it yet, so can't comment on its usage, but I'll give it a go when I need control over the ThreadPool.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2415732950040782145?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2415732950040782145/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2415732950040782145' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2415732950040782145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2415732950040782145'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/02/custom-threadpool.html' title='Custom ThreadPool'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7486177165347528040</id><published>2008-01-30T11:39:00.000Z</published><updated>2008-01-30T11:40:16.055Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Batch File'/><category scheme='http://www.blogger.com/atom/ns#' term='Date'/><title type='text'>Get the current date as a string from a batch file</title><content type='html'>Ever needed to include the current date in something like a filename from a batch file?  &lt;a href="http://support.microsoft.com/kb/555314"&gt;Check out this MS KB article&lt;/a&gt; on how to do it.&lt;br /&gt;&lt;br /&gt;I've changed the format slightly to include a dash between each part.  This is what I used:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;SET current.date=%date:~-4,4%-%date:~-7,2%-%date:~0,2%&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7486177165347528040?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7486177165347528040/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7486177165347528040' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7486177165347528040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7486177165347528040'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/01/get-current-date-as-string-from-batch.html' title='Get the current date as a string from a batch file'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-1625288701618718126</id><published>2008-01-25T16:20:00.001Z</published><updated>2008-01-25T16:24:58.625Z</updated><title type='text'>Mario, Lego, Plasticine, and Friday afternoon equals...</title><content type='html'>Nice to see &lt;a href="http://www.mindthe.net/devices/"&gt;Jonathan&lt;/a&gt; and &lt;a href="http://esendexdeveloper.blogspot.com/"&gt;Kevin&lt;/a&gt; have been hard at work this Friday afternoon... ;)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm3.static.flickr.com/2297/2218252535_05b1c20a5b.jpg?v=0"&gt;&lt;img style="cursor: pointer; width: 320px;" src="http://farm3.static.flickr.com/2297/2218252535_05b1c20a5b.jpg?v=0" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jbjon/2218252535/"&gt;read more&lt;/a&gt; | &lt;a href="http://digg.com/nintendo/Mario_Lego_Plasticine_and_Friday_afternoon_equals"&gt;digg story&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-1625288701618718126?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/1625288701618718126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=1625288701618718126' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1625288701618718126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1625288701618718126'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/01/mario-lego-plasticine-and-friday.html' title='Mario, Lego, Plasticine, and Friday afternoon equals...'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7090917539358778874</id><published>2008-01-21T08:58:00.000Z</published><updated>2008-01-21T08:59:06.406Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='XBox 360'/><title type='text'>Truth About Xbox 360 Red Ring of Death</title><content type='html'>Interesting interview with a "Microsoft insider" covering the &lt;a href="http://blog.seattlepi.nwsource.com/digitaljoystick/archives/129866.asp"&gt;Truth About Xbox 360 Red Ring of Death&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Not sure how reliable the source is, but it makes interesting reading.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7090917539358778874?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7090917539358778874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7090917539358778874' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7090917539358778874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7090917539358778874'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/01/truth-about-xbox-360-red-ring-of-death.html' title='Truth About Xbox 360 Red Ring of Death'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3499444663483800446</id><published>2008-01-16T21:17:00.000Z</published><updated>2008-01-18T10:12:03.535Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web Services'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>Force a C# Web Service Proxy to use HTTP 1.0</title><content type='html'>&lt;div style="float:right;padding:5px;margin:0px;"&gt;&lt;br /&gt;&lt;script type="text/javascript"&gt;digg_url ='http://devproj20.blogspot.com/2008/01/force-c-web-service-proxy-to-use-http.html';&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href="#code"&gt;(Code at the bottom)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://www.esendex.com/en/Developers/"&gt;Esendex customers&lt;/a&gt; can submit SMS using &lt;a href="https://www.esendex.com/en/Developers/APIs/SOAP-XML-SMS-API/"&gt;.Net Web Services&lt;/a&gt;.  While the &lt;a href="https://www.esendex.com/en/Developers/SDKs/NET-SMS-SDK/"&gt;simple code samples&lt;/a&gt; we provide will get most people up and running, the samples aren't always enough when volumes start to increase.&lt;br /&gt;&lt;br /&gt;The most common error report we receive from these high usage customers usually contains a complaint that our APIs are down, and aren't responding, but this is rarely the case.  Our server array offers all our customers the responsiveness and the reliability that they will need, but the error report always seems to look like this is the case.&lt;br /&gt;&lt;br /&gt;Normally the problem is at the customers side, and more often than not it's due to them consuming our Web Services using HTTP 1.1.&lt;br /&gt;&lt;br /&gt;A limitation of HTTP 1.1 is that it only support 2 simultaneous connections to another server.  This is usually OK, but if a customer has a multi-threaded application then this can quickly become a problem.  The problem manifests itself with an error that looks like the server is down.&lt;br /&gt;&lt;br /&gt;In reality what you'll have is a bunch of threads all waiting for a chance to connect, and when they don't you tend to get timeout errors that make it look like the server didn't respond.&lt;br /&gt;&lt;br /&gt;To get around this you need to connect using HTTP 1.0, but by default Visual Studio creates a web reference using 1.1.  So you need to do some tweaking.&lt;br /&gt;&lt;br /&gt;Basically we need to override the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.web.services.protocols.soaphttpclientprotocol.getwebrequest.aspx"&gt;GetWebRequest&lt;/a&gt; method on our generated web reference and alter the properties on the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.net.httpwebrequest%28VS.80%29.aspx"&gt;HttpWebRequest&lt;/a&gt; so that we can assign the right version.&lt;br /&gt;&lt;br /&gt;When you add a Web Reference in Visual Studio you effectively add an auto generated class to your project, which (if you look down the directory tree in Windows Explorer) is saved in a Reference.cs file.  This file changes every time you tell Visual Studio to update the web reference.&lt;br /&gt;&lt;br /&gt;Because of this it isn't always possible to override that particular class.  If you working with an API that can change and you want to be able to update it easily, then you'll have to use &lt;a href="http://msdn2.microsoft.com/en-us/library/wa80x488%28VS.80%29.aspx"&gt;partial classes&lt;/a&gt; in order to override the method.  Or you could sub class the proxy and override it in there.&lt;br /&gt;&lt;br /&gt;Personally I like to move the Reference.cs file into the project as a normal file (renamed of course), and then edit the generated code.  I can do this as I know that the API isn't going to change (if we do need to offer new functionality we release new Web Services rather than change existing ones).&lt;br /&gt;&lt;br /&gt;This allows you to override the method in the normal way, and also allows you to change how the proxy gets the URL to connect to.&lt;br /&gt;&lt;br /&gt;Whichever way you do it, here's the code you need to add in:&lt;br /&gt;&lt;a name="code"&gt;&lt;/a&gt;&lt;pre&gt;protected override WebRequest GetWebRequest(Uri uri)&lt;br /&gt;{&lt;br /&gt;HttpWebRequest request =&lt;br /&gt;  (HttpWebRequest)base.GetWebRequest(uri);&lt;br /&gt;request.ProtocolVersion = System.Net.HttpVersion.Version10;&lt;br /&gt;&lt;br /&gt;return request;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;And, as you've now got access to the HttpWebRequest you can also disable Keep Alives if they're causing you problems as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3499444663483800446?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3499444663483800446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3499444663483800446' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3499444663483800446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3499444663483800446'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/01/force-c-web-service-proxy-to-use-http.html' title='Force a C# Web Service Proxy to use HTTP 1.0'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6691579676571716537.post-8800218102305329702</id><published>2008-01-13T16:31:00.000Z</published><updated>2008-01-13T17:16:12.970Z</updated><title type='text'>confused.com? You will be...</title><content type='html'>My car insurance is due this month, leaving me with that magical four years no claims that most insurance companies seem to love. So I went to confused.com to give it a go.&lt;br /&gt;&lt;br /&gt;I used my iPod Touch as I didn't want to boot the laptop, and maybe this contributed to the frustrating experience, but if a website can't support Safari then that's hardly my problem really.&lt;br /&gt;&lt;br /&gt;It didn't start well as the Get Quotes button was floating at the bottom of the page rather than in line with everything else, but it was about to get worse.  The site didn't recognise my registration number so I had to manually enter my car details.  This is the first site that has failed to find my car from the number plate, and I've used a number of them for looking for insurance and tyres before.&lt;br /&gt;&lt;br /&gt;Then I was asked for my occupation, and although it didn't recognise Software Developer it did seem to pick up Programmer.  Well, it was listed as Computer Programmer in the list so I selected that and tried to continue.  That was no good for it though, I had to type in my occupation so that it matched what I selected in the drop down list. Further frustrations...&lt;br /&gt;&lt;br /&gt;Eventually I get to the last screen on which I'm asked to enter a password so I can retrieve my details later.  So I enter a password only to be told it isn't good enough.  Passwords have to be between 6 and 8 characters apparently...&lt;br /&gt;&lt;br /&gt;So I entered in a password that matched this criteria only to be told it still wasn't good enough.  I gave up at that point, as a user of web applications I expect better.&lt;br /&gt;&lt;br /&gt;As a developer of web applications I know the whole experience can be much better.  &lt;br /&gt;&lt;br /&gt;What's the point of heavily advertising your service if you confuse your would be customers before you've convinced them to part with any money?&lt;br /&gt;&lt;br /&gt;So, after being thoroughly disappointed with that experience I'm just going to stay with my current insurer.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8800218102305329702?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8800218102305329702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8800218102305329702' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8800218102305329702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8800218102305329702'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/01/confusedcom-you-will-be.html' title='confused.com? You will be...'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-969030776951004976</id><published>2008-01-11T12:49:00.000Z</published><updated>2008-01-11T13:23:43.968Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Slashdot'/><category scheme='http://www.blogger.com/atom/ns#' term='Graduates'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>What skills should a graduate have?</title><content type='html'>There's a question &lt;a href="http://ask.slashdot.org/article.pl?sid=08/01/09/1858220"&gt;What Skills Should Undergrads Have&lt;/a&gt; running on &lt;a href="http://slashdot.org/"&gt;slashdot&lt;/a&gt; from the aftermath of the whole "&lt;a href="http://developers.slashdot.org/article.pl?sid=08/01/08/0348239&amp;amp;tid=146"&gt;Java is damaging students&lt;/a&gt;" article.  There's a lot of answers already but I think one of the important ones is being able to visualise how software connects to each other.&lt;br /&gt;&lt;br /&gt;As a graduate programmer it's highly unlikely that you will be given a &lt;a href="http://www.site.uottawa.ca:4321/oose/index.html#greenfielddevelopment"&gt;green field development&lt;/a&gt; project.  It's more likely that you'll be maintaining or enhancing an existing system, so it's important to be able to see in your mind how and where the different components connect.&lt;br /&gt;&lt;br /&gt;I've tried to answer questions like this before, but it's so difficult as a professional developer needs to have so many skills it's impossible to narrow down even a few as being the most important.  But I guess when you're starting out in the business you need to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Realise that you don't know anything&lt;/li&gt;&lt;li&gt;Be willing to learn&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Not be afraid to ask questions&lt;/li&gt;&lt;li&gt;Be able to analyse problems and visualise solutions&lt;/li&gt;&lt;/ul&gt;Technical ability is of course important, but you need to interview well and show some potential to get a decent job out of it.&lt;br /&gt;&lt;br /&gt;A friend of a friend I met in sixth form college once claimed that he didn't need any computing qualifications to get a job, as his proven ability at writing his own programs would set him apart from everyone else.  And admittedly he had written a lot of programs.&lt;br /&gt;&lt;br /&gt;Yet from an employer's point of view all that work he's done hasn't been in a commercial environment where change requests are common, priorities change, your projects are moved to other developers, and you're asked to work on projects of which you have no knowledge.&lt;br /&gt;&lt;br /&gt;The experience he had of writing programs didn't cover any of that, and being flexible enough to handle those situations is a very desirable attribute to employers.&lt;br /&gt;&lt;br /&gt;I don't know what he's doing now.  Maybe he's carrying on doing what he wants and making a living out of it.  But even if that worked for him it's certainly not a path I would recommend for people wishing to get a foothold in the industry.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-969030776951004976?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/969030776951004976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=969030776951004976' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/969030776951004976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/969030776951004976'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/01/what-skills-should-graduate-have.html' title='What skills should a graduate have?'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2828047865655908441</id><published>2008-01-10T16:44:00.000Z</published><updated>2008-01-10T17:08:50.467Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Threading'/><category scheme='http://www.blogger.com/atom/ns#' term='Testing'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>Needle in a haystack</title><content type='html'>Been a bit quiet on the blogging front recently.  That's mainly because I'm currently running through some tests for the first iteration of an update that will drastically change the architecture of the Esendex Messaging System.  I can't go into detail about the change, but my current tests run into a &lt;span style="font-style: italic;"&gt;very&lt;/span&gt; intermittent failure.&lt;br /&gt;&lt;br /&gt;At irregular intervals one of the services hangs: just totally stops responding, and because it's multithreaded the log files aren't much help.  Actually, its worse than looking for a needle in a haystack, as at least in that case you know what you're looking for.&lt;br /&gt;&lt;br /&gt;It first presented itself after sending only 100 messages, then after 2,000.  An initial investigation didn't shine any light on anything so I sent some more messages.  It hasn't failed again yet, and I've currently sent 15,000 through.  No code change either, so the error is still in there waiting to be found.&lt;br /&gt;&lt;br /&gt;Frustrating is not the word.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2828047865655908441?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2828047865655908441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2828047865655908441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2828047865655908441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2828047865655908441'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/01/needle-in-haystack.html' title='Needle in a haystack'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7391121494806545275</id><published>2008-01-03T16:33:00.000Z</published><updated>2008-01-03T17:04:01.719Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SMS'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>Esendex Webservice SMS using C++</title><content type='html'>C++ is not my main language, but all &lt;a href="http://www.esendex.com/en/Developers/"&gt;Esendex developers&lt;/a&gt; are expected to help our customers integrate their systems with ours on top of our usual development work.&lt;br /&gt;&lt;br /&gt;Admittedly we don't have many people asking for help with C++, but when they do we usually direct them to the &lt;a href="http://www.esendex.com/en/Developers/SDKs/C-SMS-SDK/"&gt;C++ SMS SDK&lt;/a&gt;.  This includes a COM component which developers must install, and this fact does pose some problems for some developers.&lt;br /&gt;&lt;br /&gt;So, while waiting for a build I found &lt;a href="http://weblogs.asp.net/israelio/archive/2006/06/11/How-to-Consume-WebService-via-unmanaged-C_2B002B00_.aspx"&gt;How to Consume [a] WebService via unmanaged C++&lt;/a&gt;, which describes how you can get Visual Studio 2005 (and apparently 2003 as well, but I've not checked that), to generate a proxy for you.&lt;br /&gt;&lt;br /&gt;In Visual Studio 2005:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Generate the proxy:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Right click on the project in the Solution Explorer and click Add Web Reference.&lt;/li&gt;&lt;li&gt;In the dialog, enter http://www.esendex.com/secure/messenger/soap/SendServiceNoHeader.asmx as the URL, and give it a name&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Click Add Web Reference&lt;/li&gt;&lt;li&gt;This will generate a file in your project (with the name you gave it)&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;2.  Write code to call the proxy:&lt;/span&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;   SendServiceNoHeader::CSendServiceNoHeader proxy;  &lt;br /&gt;   BSTR result = NULL;  &lt;br /&gt;   HRESULT hr = proxy.SendMessageFull( CComBSTR("username"),&lt;br /&gt;       CComBSTR("password"),&lt;br /&gt;       CComBSTR("account reference"),&lt;br /&gt;       CComBSTR("originator"),&lt;br /&gt;       CComBSTR("destination"),&lt;br /&gt;       CComBSTR("C++ Hello!"),&lt;br /&gt;       CComBSTR("Text"), 0, &amp;amp;result);&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;3. Notes:&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;result&lt;/span&gt; will contain the ID of the message you've just sent&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;hr&lt;/span&gt; can be used to check if the operation was successful&lt;/li&gt;&lt;li&gt;You may need to include the line &lt;span style="font-family: courier new;"&gt;CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);&lt;/span&gt; before this code if your application doesn't already have it.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7391121494806545275?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7391121494806545275/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7391121494806545275' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7391121494806545275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7391121494806545275'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2008/01/esendex-webservice-sms-using-c.html' title='Esendex Webservice SMS using C++'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-1453116319426849667</id><published>2007-12-10T15:52:00.000Z</published><updated>2007-12-10T16:05:48.646Z</updated><title type='text'>I'm afraid I'm a car snob</title><content type='html'>My car needed its second service today, which coincided with a planned shopping trip which i didn't really want to move. So I've got a courtesy car, and although it's almost brand new, clean, quiet and quite nice looking, there's no power there at all. I'm used to 200 horsepower and a turbo, now I've got an entry level 1.4 litre which is too heavy to ever be called nippy.&lt;br /&gt;&lt;br /&gt;But at least it's only temporary, hopefully I'll get mine back tonight or tomorrow.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-1453116319426849667?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/1453116319426849667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=1453116319426849667' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1453116319426849667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1453116319426849667'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/12/im-afraid-im-car-snob.html' title='I&apos;m afraid I&apos;m a car snob'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3992838166787191526</id><published>2007-12-06T16:59:00.000Z</published><updated>2007-12-06T17:02:25.740Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='UltraMon'/><title type='text'>UltraMon</title><content type='html'>If you're lucky enough to be using multiple monitors on one PC then check out &lt;a href="http://www.realtimesoft.com/ultramon/overview/"&gt;UltraMon&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've been using it for a couple of weeks now, and only just realised I can make Visual Studio span both screens, which means I can dock all the toolbars to one screen, leaving me with a full screen of code :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3992838166787191526?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3992838166787191526/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3992838166787191526' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3992838166787191526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3992838166787191526'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/12/ultramon.html' title='UltraMon'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-4062344015533497844</id><published>2007-12-06T14:59:00.000Z</published><updated>2007-12-06T15:32:24.031Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inheritance'/><category scheme='http://www.blogger.com/atom/ns#' term='Clone'/><category scheme='http://www.blogger.com/atom/ns#' term='VB.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Neat Pattern for Cloning with Inheritance</title><content type='html'>For once I've come across an &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1911789&amp;amp;SiteID=1"&gt;MSDN forum post which exactly solves a problem&lt;/a&gt; I had.  I'm not having the same problem as the person who asked the question, but the solution given was spot on for me.&lt;br /&gt;&lt;br /&gt;Suppose you have two classes, SuperClass and SubClass, where SubClass inherits from SuperClass.  If I want to create a deep copy of SubClass I should really implement a Copy method in SuperClass, and override that in SubClass.&lt;br /&gt;&lt;br /&gt;But if I do that I can't really use the Copy method in SuperClass, because I can't cast a SuperClass to a SubClass.&lt;br /&gt;&lt;br /&gt;The solution (as described in the above post: I can claim zero credit for this neat pattern), is to instead create a CopyFrom method, in which a SuperClass can be populated from another SuperClass.  Then in the SuperClass's Copy method I create a new SuperClass, and call the CopyFrom method on it, passing in "this" (or "Me", if in VB.Net).&lt;br /&gt;&lt;br /&gt;Then SubClass can override CopyFrom and call into the base method, adding any further properties that SubClass has.  SubClass then overrides the Copy method, creates a new SubClass, and calls CopyFrom before returning it.&lt;br /&gt;&lt;br /&gt;This is the code from the post above (credit to "nobugz"):&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Class A&lt;br /&gt;  Private DataA As String = "Data-A"&lt;br /&gt;  Public Sub New()&lt;br /&gt;  End Sub&lt;br /&gt;  Public Overridable Sub CopyFrom(ByVal obj As A)&lt;br /&gt;    Me.DataA = obj.DataA&lt;br /&gt;  End Sub&lt;br /&gt;  Public Overridable Function Clone() As A&lt;br /&gt;    Dim NewA As New A&lt;br /&gt;    NewA.CopyFrom(Me)&lt;br /&gt;    Return NewA&lt;br /&gt;  End Function&lt;br /&gt;End Class&lt;br /&gt;&lt;br /&gt;Class B&lt;br /&gt;  Inherits A&lt;br /&gt;  Private DataB As String = "Data-B"&lt;br /&gt;  Public Sub New()&lt;br /&gt;  End Sub&lt;br /&gt;  Public Overrides Sub CopyFrom(ByVal obj As A)&lt;br /&gt;    obj.CopyFrom(Me)&lt;br /&gt;    Me.DataB = CType(obj, B).DataB&lt;br /&gt;  End Sub&lt;br /&gt;  Public Overrides Function Clone() As A&lt;br /&gt;    Dim obj As B = New B&lt;br /&gt;    obj.CopyFrom(Me)&lt;br /&gt;    Return obj&lt;br /&gt;  End Function&lt;br /&gt;End Class&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/6691579676571716537-4062344015533497844?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/4062344015533497844/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=4062344015533497844' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4062344015533497844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4062344015533497844'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/12/neat-pattern-for-cloning-with.html' title='Neat Pattern for Cloning with Inheritance'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7599593504951557694</id><published>2007-12-05T12:17:00.001Z</published><updated>2007-12-05T12:24:25.233Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='XBox 360'/><category scheme='http://www.blogger.com/atom/ns#' term='Divx'/><title type='text'>Divx XBox 360 Dashboard Update December 2007</title><content type='html'>If you've signed into XBox Live over the past couple of days you'll probably have been prompted to download a console update.  I haven't yet found a complete list of everything that's changed, but I can confirm that &lt;span style="font-weight: bold;"&gt;the rumoured Divx support has been included&lt;/span&gt;.  Yes, you can now stream Divx videos from a PC (running Windows Media Player 11) through your XBox so you can watch them on TV.&lt;br /&gt;&lt;br /&gt;The quality is surprising good from the what I've watched.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7599593504951557694?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7599593504951557694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7599593504951557694' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7599593504951557694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7599593504951557694'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/12/divx-xbox-360-dashboard-update-december.html' title='Divx XBox 360 Dashboard Update December 2007'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-1812689994763807189</id><published>2007-12-04T14:56:00.000Z</published><updated>2007-12-04T15:05:37.897Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='XP'/><category scheme='http://www.blogger.com/atom/ns#' term='Design'/><title type='text'>Bad Smells in Code</title><content type='html'>If you've read anything by &lt;a href="http://en.wikipedia.org/wiki/Kent_Beck"&gt;Kent Beck&lt;/a&gt; or &lt;a href="http://martinfowler.com/"&gt;Martin Fowler&lt;/a&gt; you'll probably have come across the concept of &lt;a href="http://sis36.berkeley.edu/projects/streek/agile/bad-smells-in-code.html"&gt;Bad Smells&lt;/a&gt; in developing computer systems.  Not every developer I know has heard of these though, or if they have they're not entirely sure what it means.&lt;br /&gt;&lt;br /&gt;In general terms it basically means that something just doesn't feel right in the code.  But it can take a few years experience in writing code before you get to the point where you start getting this feeling, so I'm glad that a list of the common bad smells are listed for all to see.&lt;br /&gt;&lt;br /&gt;The list is by no means complete, but please &lt;a href="http://sis36.berkeley.edu/projects/streek/agile/bad-smells-in-code.html"&gt;check out the most common bad smells&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-1812689994763807189?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/1812689994763807189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=1812689994763807189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1812689994763807189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1812689994763807189'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/12/bad-smells-in-code.html' title='Bad Smells in Code'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-4473363108014355181</id><published>2007-11-28T10:41:00.000Z</published><updated>2007-11-30T16:11:46.697Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Dependency Walker'/><category scheme='http://www.blogger.com/atom/ns#' term='ildasm'/><title type='text'>DLL Dependencies</title><content type='html'>Found &lt;a href="http://geekswithblogs.net/mwatson/archive/2004/01/29/1610.aspx"&gt;this blog entry&lt;/a&gt; on &lt;a href="http://geekswithblogs.net/"&gt;geekswithblogs.net&lt;/a&gt; linking to &lt;a href="http://www.dependencywalker.com/"&gt;Dependency Walker&lt;/a&gt;.  This is an application that shows you the dependancies that a DLL has.&lt;br /&gt;&lt;br /&gt;I couldn't get to the site though, so I &lt;a href="http://www.majorgeeks.com/Dependency_Walker_d227.html"&gt;downloaded the app from majorgeeks.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There's a comment on that blog saying it doesn't work with .Net assemblies though, but you can just use &lt;a href="http://msdn2.microsoft.com/en-us/library/f7dy01k1%28VS.80%29.aspx"&gt;ildasm&lt;/a&gt; for that, and look in the manifest.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-4473363108014355181?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/4473363108014355181/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=4473363108014355181' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4473363108014355181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4473363108014355181'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/dll-dependencies.html' title='DLL Dependencies'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-4252362691882486813</id><published>2007-11-26T22:45:00.000Z</published><updated>2007-11-26T22:49:16.135Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Review'/><title type='text'>Blackwater (Jeremy Scahill)</title><content type='html'>I'm currently reading &lt;a href="http://www.amazon.co.uk/dp/184668630X?tag=iandyk-21&amp;amp;camp=1406&amp;amp;creative=6394&amp;amp;linkCode=as1&amp;amp;creativeASIN=184668630X&amp;amp;adid=0T3MMKY2HCHQTGQ87RZS&amp;amp;"&gt;Blackwater: The Rise of the World's Most Powerful Mercenary Army by Jeremy Scahill&lt;/a&gt;.  It recounts the history of &lt;a href="http://www.blackwaterusa.com/"&gt;Blackwater USA&lt;/a&gt; (&lt;a href="http://en.wikipedia.org/wiki/Blackwater_USA"&gt;Wiki entry here&lt;/a&gt;), the company employing a large proportion of the "security contractors" hired to protect assets in hostile places around the globe, such as in Iraq.&lt;br /&gt;&lt;br /&gt;The book begins by documenting the bloody ambush of Blackwater contractors in Fallujah in March 2006, and moves on to tell how the U.S. Government is increasingly using companies such as Blackwater to influence foreign policy where it would be politically unwise to use the U.S. Military.  Scahill tells how Blackwater has set up bases in Tbilisi, Georgia and Azerbaijan which are now tantamount to having unofficial U.S. bases in the area, but without the political uproar.&lt;br /&gt;&lt;br /&gt;The book certainly makes interesting reading.  In fact, what I find most enlightening is not how powerful and influential companies like Blackwater are, but rather the clear political wrangling that goes off behind closed doors, that common folk like me only get a hint about in the press.&lt;br /&gt;&lt;br /&gt;Scahill is obviously very passionate about this cause, and he has produced a seemingly well researched piece of writing that forces us to ask questions not just about our role in Iraq, but also asks us to cast an eye over other conflicts and places of political unrest.  It is clear from the stories told in this book that our governments aren't giving us a true picture of what is happening in these places.  But this is something a cynical, skeptical person such as myself already suspected anyway.&lt;br /&gt;&lt;br /&gt;However, the book could hardly be called impartial, and as such it loses much of the credibility it should be earning.  Scahill's choice of language is constantly laced with emotive terms that will make it easy for any party opposed to his views to dismiss the entire book as left-wing propaganda.&lt;br /&gt;&lt;br /&gt;In choosing to write in this style Scahill has made a rod for his own back.  What should be a chilling, hard hitting exposé on the U.S. Government's recent political choices is in danger of being wholly dismissed when the questions it raises deserve to be answered.&lt;br /&gt;&lt;br /&gt;If you can look past the occasional emotional phrase, and concentrate on the fully referenced source material, you can see a book which raises as many questions as it answers.  Although I doubt answering these questions was ever Scahill's intention, in writing this book he has at least made public what is happening that other media sources aren't giving us a true picture of.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-4252362691882486813?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/4252362691882486813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=4252362691882486813' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4252362691882486813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4252362691882486813'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/blackwater-jeremy-scahill.html' title='Blackwater (Jeremy Scahill)'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2429782671263392264</id><published>2007-11-26T21:40:00.000Z</published><updated>2007-11-26T21:53:51.763Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Error codes'/><title type='text'>What does that error code mean?</title><content type='html'>If you've ever come across an error number in managed code it can be infuriatingly difficult to find out the true root cause of your problem: normally there's a helpful wrapper around the numbers, giving (semi) meaningful names to the errors encountered.&lt;br /&gt;&lt;br /&gt;But, work with stuff long enough and you'll soon find a huge, dirty-looking (mostly negative) integer staring back at you in your log files or debugger window and you'll wonder "What the **** does that mean?"&lt;br /&gt;&lt;br /&gt;If you can't find anything on Google for the exact number you've got, paste the number into calc and convert it to hex.  You'll usually get a number preceded by a bunch of Fs, which you can ignore.  Do another search for this hex number (minus the Fs), and you'll sometimes get something which will point you in the right direction.&lt;br /&gt;&lt;br /&gt;It was on such a search where I stumbled across &lt;a href="http://www.comp.nus.edu.sg/%7Ewuyongzh/my_doc/ntstatus.txt"&gt;this helpful document&lt;/a&gt;.  This text file contains a heap of hex error codes and their meanings.  judging by the &lt;span style="font-style: italic;"&gt;ntstatus.txt&lt;/span&gt; file name they look to date back to Windows NT days, but they're still helpful now in some cases.&lt;br /&gt;&lt;br /&gt;I can't say that everything in there is accurate, or that every error code you'll get is listed there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2429782671263392264?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2429782671263392264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2429782671263392264' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2429782671263392264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2429782671263392264'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/what-does-that-error-code-mean.html' title='What does that error code mean?'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-5657249036504572628</id><published>2007-11-26T16:34:00.000Z</published><updated>2007-11-26T21:38:14.602Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SIP'/><category scheme='http://www.blogger.com/atom/ns#' term='Interop'/><category scheme='http://www.blogger.com/atom/ns#' term='RTC'/><title type='text'>Creating an Interop Assembly for RTC Client API 1.3</title><content type='html'>If you want to use the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms775893.aspx"&gt;RTC Client API 1.3&lt;/a&gt; in managed code (like C# or VB.Net), you need to create an Interop assembly from the &lt;span style="font-style: italic;"&gt;rtccore.idl&lt;/span&gt; file that is found in the &lt;span style="font-style: italic;"&gt;C:\Program Files\RTC Client API v1.3 SDK\SDK\IDL&lt;/span&gt; directory (if you used the default installation path).&lt;br /&gt;&lt;br /&gt;There are some steps detailing how to create the assembly here: &lt;a href="http://blogs.msdn.com/nnaidu/archive/2006/08/25/720795.aspx"&gt;Creating a Interop Assembly for RTC Client API 1.3&lt;/a&gt;.  However, I found that they were a little out of date and I had to do some reading around before I understood them.&lt;br /&gt;&lt;br /&gt;To create the assembly:&lt;br /&gt;&lt;br /&gt;1. Download and install the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=0BAF2B35-C656-4969-ACE8-E4C0C0716ADB&amp;amp;displaylang=en"&gt;Microsoft ® Windows Server® 2003 R2 Platform SDK&lt;/a&gt;.  This SDK works for "the x86, x64 and Itanium-based versions of Windows Server 2003, Windows Server 2003 R2, Windows XP SP2, Windows XP x64 Pro Edition, and Windows 2000".&lt;br /&gt;&lt;br /&gt;2. Go to the &lt;span style="font-weight: bold;"&gt;Visual Studio 2005 Command Prompt&lt;/span&gt; from Start Menu -&gt; All Programs -&gt; Microsoft Visual Studio 2005 -&gt; Visual Studio Tools&lt;br /&gt;&lt;br /&gt;3. In the Command Prompt window, &lt;span style="font-weight: bold;"&gt;change directory to where the rtccore.idl file is&lt;/span&gt; (C:\Program Files\RTC Client API v1.3 SDK by default).&lt;br /&gt;&lt;br /&gt;4. In the Command Prompt type: &lt;span style="font-style: italic; font-weight: bold;"&gt;midl /I "C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Include" rtccore.idl&lt;/span&gt;.  This will create 5 new files in the directory.  One of which is rtccore.tlb.&lt;br /&gt;&lt;br /&gt;5. In the Command Prompt type: &lt;span style="font-style: italic; font-weight: bold;"&gt;tlbimp rtccore.tlb /out:Interop.RTCCore.dll /namespace:RTCCore /sysarray&lt;/span&gt;.  This will create an Interop.RTCCore.dll file in the directory, which you can then reference in your .Net applications.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-5657249036504572628?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/5657249036504572628/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=5657249036504572628' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5657249036504572628'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5657249036504572628'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/creating-interop-assembly-for-rtc.html' title='Creating an Interop Assembly for RTC Client API 1.3'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8774241729296450737</id><published>2007-11-26T12:24:00.000Z</published><updated>2007-11-26T21:54:59.605Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='SAPI'/><title type='text'>Using Microsoft's Speech API (SAPI) in managed code</title><content type='html'>Neat little article here for &lt;a href="http://windowscoding.com/blogs/blake/archive/2006/11/01/How-to-use-Microsofts-Speech-API-in-a-managed-application.aspx"&gt;How to use Microsoft's Speech API (SAPI) in a managed application&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Doesn't go into much detail on how to use it afterwards, but there's enough there to show how simple it is.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8774241729296450737?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8774241729296450737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8774241729296450737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8774241729296450737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8774241729296450737'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/using-microsofts-speech-api-sapi-in.html' title='Using Microsoft&apos;s Speech API (SAPI) in managed code'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3447845702126876805</id><published>2007-11-20T09:58:00.001Z</published><updated>2007-11-26T21:38:30.001Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='BlogIt'/><title type='text'>First mobile blog post!</title><content type='html'>&lt;p&gt;I'm just testing right now, I'm not mobile myself but this post is being written on my mobile phone. It's a new free service we're offering, so if you want to use your mobile to add blog entries give it a go!&lt;br /&gt;&lt;/p&gt;Mobile post from the &lt;a href="http://www.esendex.com/"&gt;Esendex&lt;/a&gt; BlogIt service&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3447845702126876805?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3447845702126876805/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3447845702126876805' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3447845702126876805'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3447845702126876805'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/first-mobile-blog-post.html' title='First mobile blog post!'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8768101879568695139</id><published>2007-11-20T09:41:00.001Z</published><updated>2007-11-26T21:38:45.376Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='BlogIt'/><title type='text'>Esendex BlogIt</title><content type='html'>&lt;p&gt;I've just signed up for this great new service from Esendex where I can blog all day long from my mobile phone for free!&lt;br /&gt;&lt;/p&gt;Mobile post from the &lt;a href="http://www.esendex.com/"&gt;Esendex&lt;/a&gt; BlogIt service&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8768101879568695139?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8768101879568695139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8768101879568695139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8768101879568695139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8768101879568695139'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/blogit.html' title='Esendex BlogIt'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2008504949129452627</id><published>2007-11-14T14:02:00.000Z</published><updated>2007-11-14T14:06:59.414Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>YO! Sushi</title><content type='html'>I've been to the &lt;a href="http://www.yosushi.com/nottingham_restaurant.php"&gt;Nottingham&lt;/a&gt; &lt;a href="http://www.yosushi.com/"&gt;YO! Sushi&lt;/a&gt; a few times now and I have to say I've never had a better fast dining experience.  It's a very short walk from the office and thanks to the conveyer belt of dishes, you can start eating straight away--perfect for a quick bite to eat at lunch.&lt;br /&gt;&lt;br /&gt;Only trouble is I always find myself getting carried away and eating too much :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2008504949129452627?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2008504949129452627/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2008504949129452627' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2008504949129452627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2008504949129452627'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/yo-sushi.html' title='YO! Sushi'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-4250881274388244448</id><published>2007-11-14T09:18:00.000Z</published><updated>2007-11-14T09:50:06.777Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>How fast is your turnaround time?</title><content type='html'>There's currently a question been posted on &lt;a href="http://ask.slashdot.org/"&gt;AskSlashdot&lt;/a&gt; which asks &lt;a href="http://ask.slashdot.org/article.pl?sid=07/11/13/1920209"&gt;How fast is your turnaround time&lt;/a&gt;?:&lt;br /&gt;&lt;blockquote&gt;...Overall, we manage to get a 'bullet-proof' patch in about 4-5 weeks (from coding-&gt;QA-&gt;Build/Packaging-&gt;shipment), which I consider not so bad. But the other day, we got an urgent request from our support team to come up with a decent fix in 48 hours. I think they're a tiny bit unrealistic. So I wanted to get feedback from my peers: are we doing that bad?...&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.esendex.com/en/UK/"&gt;Esendex&lt;/a&gt;'s core product is an online service, which means our customers don't need to install anything.  So realistically I'm not in a position to comment on this particular matter.  We don't need to go through a packaging stage, and we can be pretty confident that we won't have installation issues as we own all the server hardware the system runs on.&lt;br /&gt;&lt;br /&gt;But looking at the timescales involved here puts a few things into perspective.  If one of our releases introduces a critical error (by which I mean that people can't use our service anymore), then the entire business rests on getting that error fixed.  In these cases (thankfully they are few and far between) 48 hours is just too long.  In fact much too long.&lt;br /&gt;&lt;br /&gt;If we're in a position where we have customers not able to send messages then our &lt;a href="http://en.wikipedia.org/wiki/Service_Level_Agreement"&gt;SLA&lt;/a&gt;s make us contractually obliged to fix the problem within 4 hours.  I remember being alerted to one such error a few years ago at 2am on a Sunday morning.  By 5am that day the system was patched and fully operational again.&lt;br /&gt;&lt;br /&gt;A quick turnaround stems from the design methodology you are using.  With &lt;a href="http://en.wikipedia.org/wiki/Extreme_Programming"&gt;XP&lt;/a&gt; we learn to expect change, so we make sure that we don't code ourselves into a corner.  This makes new requirements easy to add, but it has the side effect of making most bugs easier to fix as well.&lt;br /&gt;&lt;br /&gt;Of course, there's always going to be the possibility that your design is so flawed that it's impossible to fix a certain bug.  In these cases backing out of an update is sometimes the only feasible option.&lt;br /&gt;&lt;br /&gt;All non-trivial software contains errors.  If there's one truism about software development, that's it.  The important differentiating factor is the severity of those errors.  A truly business critical severe error needs to be fixed as fast as possible, and if it means late nights then so be it.&lt;br /&gt;&lt;br /&gt;As professional developers we're paid to release working software, and if that software doesn't do its job then we haven't done our job.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-4250881274388244448?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/4250881274388244448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=4250881274388244448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4250881274388244448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4250881274388244448'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/how-fast-is-your-turnaround-time.html' title='How fast is your turnaround time?'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3933718123529231015</id><published>2007-11-06T16:45:00.001Z</published><updated>2007-11-26T21:38:57.780Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gadgets'/><title type='text'>And so I bought an Ipod Touch...</title><content type='html'>Just happened to pass &lt;a href="http://www.currys.co.uk/"&gt;Curry's&lt;/a&gt; at lunch, so I wandered in from the cold and had a look around.  Among the Ipods was &lt;a href="http://www.apple.com/uk/ipodtouch/"&gt;the new Touch&lt;/a&gt;, with the tempting notice of "Back in stock" next to it.  I've been wondering about getting one since seeing it reviewed on &lt;a href="http://www.bbc.co.uk/food/tv_and_radio/sftw_index.shtml"&gt;Something for the Weekend&lt;/a&gt;, and as I asked the shop assistant if they did indeed have some in stock (as I no longer believe everything I read) a strange feeling swept over me.&lt;br /&gt;&lt;br /&gt;And so I bought an Ipod Touch, and I must say I am very impressed.  I haven't put any music on it yet as my music collection is at home, and I am at work, but the internet connectivity is very useful.  The Safari browser is cool, and it has the "pinching" zooming that the &lt;a href="http://www.apple.com/uk/iphone/"&gt;IPhone&lt;/a&gt; has.&lt;br /&gt;&lt;br /&gt;And &lt;a href="http://www.esendex.com/en/UK/"&gt;the Esendex website&lt;/a&gt; works through it too.  I think I must be one of the few people that have sent a text message from an Ipod Touch :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3933718123529231015?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3933718123529231015/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3933718123529231015' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3933718123529231015'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3933718123529231015'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/and-so-i-bought-ipod-touch.html' title='And so I bought an Ipod Touch...'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-6069228084916637322</id><published>2007-11-05T22:12:00.000Z</published><updated>2007-11-05T22:17:23.089Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gaming'/><title type='text'>Zero Punctuation</title><content type='html'>I got emailed a link the other week to &lt;a href="http://www.escapistmagazine.com/articles/view/editorials/zeropunctuation/2582-Zero-Punctuation-MOH-Airborne"&gt;Zero Punctuation's MOH: Airborne review&lt;/a&gt;, and this evening I've just watched a load more.&lt;br /&gt;&lt;br /&gt;Very, very funny.  I can't recommend them enough.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.escapistmagazine.com/articles/view/editorials/zeropunctuation/"&gt;Check here for a list of reviews&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6069228084916637322?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6069228084916637322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6069228084916637322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6069228084916637322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6069228084916637322'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/zero-punctuation.html' title='Zero Punctuation'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-6465251603952194024</id><published>2007-11-05T20:16:00.000Z</published><updated>2007-11-05T20:22:21.061Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Remember, remember</title><content type='html'>As I write this the sound of gunfire clatters in the street outside.  Huge explosions rock the glass in my window.  Orange haze stains the night sky as distant fires rage.&lt;br /&gt;&lt;br /&gt;A smoky mist lingers in the crisp November air.&lt;br /&gt;&lt;br /&gt;No, England hasn't been invaded.  Marauding rioters aren't destroying the town.  And I haven't taken a day trip to Iraq.&lt;br /&gt;&lt;br /&gt;It's just that time of year again where we decide to celebrate the fact that &lt;a href="http://en.wikipedia.org/wiki/Guy_Fawkes_Night"&gt;402 years ago a Catholic tried (and failed) to blow up the Houses of Parliament&lt;/a&gt;.  So now, to show our solidarity in this traditional religious intolerance, we feel the need to purchase illegal industrial fireworks and set them off in our own back yards.&lt;br /&gt;&lt;br /&gt;Now, don't get me wrong, I enjoy Bonfire Night.  In fact on Saturday I wended my merry way down to Tesco and took advantage of their "buy 1 get 1 free" offer on fireworks, and later that evening we set them off (and we were only slightly drunk).&lt;br /&gt;&lt;br /&gt;But these were "garden fireworks".  Actually sold for use in people's gardens.  And, if I have to be honest, some of them weren't that good (in fact, some of them were really quite crap).  But we all had a good time nevertheless.&lt;br /&gt;&lt;br /&gt;These aren't garden fireworks going off outside.&lt;br /&gt;&lt;br /&gt;I'll try and describe what I can see from my window now.  If you've ever been to an organised fireworks display you'll know that those fireworks are considerably louder, faster and bigger than what you can buy over the counter at your local supermarket.  Imagine those types of fireworks being set off from at least one house per street as far as I can see.  I can see maybe twenty streets from here.&lt;br /&gt;&lt;br /&gt;All around rockets are screaming into the sky, erupting into a shower of sparks.  It is really impressive looking actually, and I admit there is a tinge of jealousy that their fireworks are better than the ones I bought on Saturday.&lt;br /&gt;&lt;br /&gt;But imagine this.  You jab a rocket a little too far into the ground and light it.  What happens?  It goes nowhere and makes a big bang.  Imagine doing that with one of the industrial fireworks I'm looking at right now.  The outcome of that would spoil any body's night.&lt;br /&gt;&lt;br /&gt;I can't remember a Bonfire Night being this noisy.  How come people are spending this much money on their own personal fireworks displays?  Is it just petty competitiveness that makes people do it?&lt;br /&gt;&lt;br /&gt;I'll be sticking with my legal garden fireworks, thank you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6465251603952194024?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6465251603952194024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6465251603952194024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6465251603952194024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6465251603952194024'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/remember-remember.html' title='Remember, remember'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-1738816422185637901</id><published>2007-11-01T15:20:00.000Z</published><updated>2007-11-26T21:39:25.658Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Services'/><title type='text'>Manually Remove a Windows Service</title><content type='html'>Just a quick note linking to this article explaining how to &lt;a href="http://jayseae.cxliv.org/2005/02/03/manually_remove_a_windows_service.php"&gt;Manually Remove a Windows Service&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Basically, open the Registry and go to this key: HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services&lt;br /&gt;&lt;br /&gt;If you expand this key you'll see sub-keys for each installed service.  Delete the key for the service you want to remove.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-1738816422185637901?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/1738816422185637901/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=1738816422185637901' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1738816422185637901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1738816422185637901'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/11/manually-remove-windows-service.html' title='Manually Remove a Windows Service'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8111901055458648671</id><published>2007-10-31T13:03:00.000Z</published><updated>2007-10-31T13:16:05.355Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Performance Counters'/><title type='text'>Been a little quiet here lately</title><content type='html'>I've just become very aware that I haven't posted here since &lt;a href="http://devproj20.blogspot.com/2007/10/bp-fined-for-environmental-crimes-and.html"&gt;Friday's cynical link about BP being fined&lt;/a&gt;, but things have been busy here finalising and deploying the update hinted at in my &lt;a href="http://devproj20.blogspot.com/2007/10/monitoring-custom-windows-services.html"&gt;Monitoring Custom Windows Services&lt;/a&gt; post.&lt;br /&gt;&lt;br /&gt;It's not been an easy couple of weeks, but I think we're finally seeing the performance improvements that we were hoping for.&lt;br /&gt;&lt;br /&gt;I know I mentioned posting some code samples about how to create your own performance counters, but I really haven't had time.&lt;br /&gt;&lt;br /&gt;If you want to investigate using performance counters then probably the best thing to do is check out these MSDN articles:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ty9fywea%28vs.80%29.aspx"&gt;Category and Counter Management&lt;/a&gt;,&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/y84hetex%28vs.80%29.aspx"&gt;Create Performance Counter Categories&lt;/a&gt;,&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/5e3s61wf%28vs.80%29.aspx"&gt;How to Create Custom Performance Counters&lt;/a&gt;.&lt;a href="http://msdn2.microsoft.com/en-us/library/y84hetex%28vs.80%29.aspx"&gt;&lt;br /&gt;&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/6691579676571716537-8111901055458648671?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8111901055458648671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8111901055458648671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8111901055458648671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8111901055458648671'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/been-little-quiet-here-lately.html' title='Been a little quiet here lately'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8606278693487401914</id><published>2007-10-26T12:25:00.000+01:00</published><updated>2007-10-26T12:25:43.965+01:00</updated><title type='text'>BP fined for environmental crimes and fraud</title><content type='html'>&lt;a href="http://news.bbc.co.uk/1/hi/business/7062669.stm"&gt;BP has been fined $373m by the US government&lt;/a&gt; for "environmental crimes and committing fraud".&lt;br /&gt;&lt;blockquote&gt;"BP has committed serious environmental crimes in our two largest states, with terrible consequences for people and the environment," the Environment Protection Agency said.&lt;/blockquote&gt;&lt;br /&gt;Anyone else remember their advertising campaign that encouraged people to &lt;a href="http://www.bp.com/extendedsectiongenericarticle.do?categoryId=9015627&amp;amp;contentId=7029058"&gt;calculate their "carbon footprint"&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;Seems BP should get their own house in order before telling the rest of us to.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8606278693487401914?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8606278693487401914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8606278693487401914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8606278693487401914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8606278693487401914'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/bp-fined-for-environmental-crimes-and.html' title='BP fined for environmental crimes and fraud'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2806473428550803320</id><published>2007-10-25T10:15:00.001+01:00</published><updated>2007-10-25T10:49:08.430+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows Services'/><category scheme='http://www.blogger.com/atom/ns#' term='Performance Counters'/><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>Monitoring Custom Windows Services</title><content type='html'>A lot of my work at &lt;a href="http://www.esendex.com/en/Developers/"&gt;Esendex&lt;/a&gt; involves creating and maintaining &lt;a href="http://en.wikipedia.org/wiki/Windows_service"&gt;Windows Services&lt;/a&gt; that form the guts of a much larger product that we collectively call the Esendex Messaging System.  The work that these services do can differ wildly: everything from the relatively mundane to complex critical services that the business depends on.&lt;br /&gt;&lt;br /&gt;Because of this, each service needs to be monitored in different ways.  Sometimes its OK to trawl &lt;a href="http://logging.apache.org/log4net/"&gt;through log files&lt;/a&gt; to discover what the service is doing, but with other more widely used services this quickly becomes tedious.&lt;br /&gt;&lt;br /&gt;We're currently in the process of rolling out an update to one of our critical Windows Services, and this update involves an architecture change that makes examining logs beyond tedious, it's actually unworkable for anything other than tracking historical events.&lt;br /&gt;&lt;br /&gt;This is where we use &lt;a href="http://msdn2.microsoft.com/en-us/library/5e3s61wf.aspx"&gt;custom performance counters&lt;/a&gt;.  If you're a developer and don't know what these are, then read up on it, and quickly.  Performance counters can be used to give you visibility on the near-realtime progress of your systems.&lt;br /&gt;&lt;br /&gt;Here are some examples of what we monitor with performance counters:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Execution time of certain key interface methods,&lt;/li&gt;&lt;li&gt;Total counts of current throughput at various stages of a message's journey through the system,&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Rates of current throughput (how many messages per second, etc),&lt;/li&gt;&lt;li&gt;Statuses of key services.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;From these we can use the standard &lt;a href="http://msdn2.microsoft.com/en-us/library/5e3s61wf.aspx"&gt;Windows Performance Monitor&lt;/a&gt; to watch what a service is doing.  For a more bespoke monitoring solution you can also write your own applications that read your performance counters and display the results in a more friendly way.&lt;br /&gt;&lt;br /&gt;If I get time I'll knock up some sample code demonstrating how to do this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2806473428550803320?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2806473428550803320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2806473428550803320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2806473428550803320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2806473428550803320'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/monitoring-custom-windows-services.html' title='Monitoring Custom Windows Services'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7908482253971285942</id><published>2007-10-19T11:06:00.000+01:00</published><updated>2007-10-19T11:06:42.607+01:00</updated><title type='text'>The Vulcan Flies Again</title><content type='html'>Something I've been waiting to see for a few years after hearing that the &lt;a href="http://www.tvoc.co.uk/"&gt;Vulcan to the Sky Trust&lt;/a&gt; were restoring one: yesterday it completed its first test flight.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.dailymail.co.uk/pages/live/articles/news/news.html?in_article_id=488349&amp;amp;in_page_id=1770"&gt;Check out some of these photos&lt;/a&gt; of the flight.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7908482253971285942?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.tvoc.co.uk/' title='The Vulcan Flies Again'/><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7908482253971285942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7908482253971285942' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7908482253971285942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7908482253971285942'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/vulcan-flies-again.html' title='The Vulcan Flies Again'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2973353763246975637</id><published>2007-10-18T22:11:00.000+01:00</published><updated>2007-10-18T22:21:55.829+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual C# Express'/><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><title type='text'>Couple of things I miss from Visual C# Express</title><content type='html'>I know this &lt;a href="http://msdn2.microsoft.com/en-us/express/aa700756.aspx"&gt;great little application is free&lt;/a&gt; and so can't really complain, when you work with &lt;a href="http://msdn2.microsoft.com/en-gb/vstudio/aa718668.aspx"&gt;Visual Studio 2005 Professional&lt;/a&gt; five days a week the bits that are missing start to get to you:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;No "delete all breakpoints" option.&lt;/li&gt;&lt;li&gt;Can't attach the debugger to another process, or set the project to load a different application&lt;/li&gt;&lt;/ol&gt;Doesn't sound like much, and I didn't think that was much, until you step through an &lt;a href="http://msdn2.microsoft.com/en-us/xna/default.aspx"&gt;XNA&lt;/a&gt; project, and then have to manually remove all your breakpoints.  Or if you want to unit test something and you can't attach to the &lt;a href="http://www.nunit.org/"&gt;NUnit&lt;/a&gt; process, which means you can't step through your tests.&lt;br /&gt;&lt;br /&gt;Glad it's got &lt;a href="http://en.wikipedia.org/wiki/IntelliSense"&gt;Intellisense&lt;/a&gt; though :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2973353763246975637?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2973353763246975637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2973353763246975637' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2973353763246975637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2973353763246975637'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/couple-of-things-i-miss-from-visual-c.html' title='Couple of things I miss from Visual C# Express'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6691579676571716537.post-7291366176989847879</id><published>2007-10-18T20:43:00.000+01:00</published><updated>2007-10-18T20:59:18.192+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><category scheme='http://www.blogger.com/atom/ns#' term='Driving'/><title type='text'>The Stupidity of the Collective</title><content type='html'>I left work a little later than usual today, and so when I finally got onto the motorway the traffic was lighter than I normally have to drive through.  Although I say "lighter" it was still busy, and I had to wait a few minutes before I could get into the outside lane to overtake a pair of lorries seemingly dancing together in the first two lanes.&lt;br /&gt;&lt;br /&gt;The middle lane was clear after I passed, so I moved into that, and a little while later the first lane was clear, so I moved into that.&lt;br /&gt;&lt;br /&gt;It was then that I realised the outside lane was pretty much bumper to bumper.  The middle lane was clear, and the first lane that I was in was flowing smoothly at just under 70mph.  The outside lane on the other hand was stumbling along at probably around 60mph, and the cars were so close that people had to keep braking, which was causing a &lt;a href="http://www.webs1.uidaho.edu/niatt_labmanual/Chapters/trafficflowtheory/theoryandconcepts/ShockWaves.htm"&gt;traffic shockwave&lt;/a&gt; as far back as I could see in my mirror.&lt;br /&gt;&lt;br /&gt;Why were these people in that lane?  I have no idea really, but it must be for a similar reason to why cars try to overtake people when the next lane is going no faster than the one they're leaving.&lt;br /&gt;&lt;br /&gt;Don't these people know that life in the fast lane doesn't always get them to their final destination any quicker?  I mean, just look at &lt;a href="http://en.wikipedia.org/wiki/Keith_Richards"&gt;Keith Richards&lt;/a&gt;..... ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7291366176989847879?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7291366176989847879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7291366176989847879' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7291366176989847879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7291366176989847879'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/stupidity-of-collective.html' title='The Stupidity of the Collective'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8508635091116802595</id><published>2007-10-17T09:16:00.000+01:00</published><updated>2007-10-17T09:27:53.570+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>What if Google Had to Design For Google?</title><content type='html'>To web developers the term &lt;a href="http://en.wikipedia.org/wiki/Search_engine_optimization"&gt;SEO&lt;/a&gt; (search engine optimisation) can send chills down their backs.  Usually it means adding things to the design of a web site in order to get it noticed by search engines--particularly &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Saw this linked from &lt;a href="http://slashdot.org/"&gt;Slashdot&lt;/a&gt;: &lt;a href="http://www.meangene.com/google/design_for_google.html"&gt;What if Google Had to Design For Google&lt;/a&gt; in which it shows what Google would look like if their own developers had to get their site noticed by themselves.&lt;br /&gt;&lt;br /&gt;The outcome looks eerily like a &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; or &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt; clone.  Now you know why those sites can look so cluttered ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8508635091116802595?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8508635091116802595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8508635091116802595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8508635091116802595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8508635091116802595'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/what-if-google-had-to-design-for-google.html' title='What if Google Had to Design For Google?'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7464993958423847112</id><published>2007-10-15T09:34:00.000+01:00</published><updated>2007-10-15T09:34:59.064+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Logging'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Log Visualiser using a particle system</title><content type='html'>I carried on my attempts to &lt;a href="http://devproj20.blogspot.com/2007/10/visualising-logs-progress-report.html"&gt;make logging output look a bit interesting&lt;/a&gt;, and what I think I wanted was a stream of pixels flowing down from a server name to give a waterfall effect.  Each pixel streaming down would represent one log event, and the colour of the pixel would be determined by the log level of that event.&lt;br /&gt;&lt;br /&gt;I set out to implement this, but then thought that someone else must have come up with a particle system for XNA already.  And they have, &lt;a href="http://creators.xna.com/Headlines/developmentaspx/archive/2007/01/01/Particle-Sample.aspx"&gt;check out this particle sample&lt;/a&gt; on the &lt;a href="http://creators.xna.com/"&gt;XNA Creators Club&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This sample shows how you can make explosions and smoke effects in XNA, and the end result is surprisingly realistic.  I took this example and derived my own class from the abstract ParticleSystem class.  It took some experimentation with the parameters I used, but now I've got a stream of pixels flowing in the way that I planned.&lt;br /&gt;&lt;br /&gt;I've also got a mock application that just generates log entries for the XNA application, and I've generated 10,000 logging events in a very quick sequence.  As the XNA application doesn't store the events for very long there doesn't appear to be much slow down, but it would be interesting to load test it against a number of servers generating a high volume of logs.  At the moment I think there would be a slow down but I'm pretty sure I can refactor the event handling so that it will be more scalable.&lt;br /&gt;&lt;br /&gt;There's some cleaning up to do, mainly with the positioning of new server entries and externalising a number of parameters to a config file, but I think I'm mostly there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7464993958423847112?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7464993958423847112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7464993958423847112' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7464993958423847112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7464993958423847112'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/log-visualiser-using-particle-system.html' title='Log Visualiser using a particle system'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-6220670629627037375</id><published>2007-10-11T22:07:00.000+01:00</published><updated>2007-10-11T22:22:33.864+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Logging'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Visualising Logs - Progress Report</title><content type='html'>Just a short one as it's getting late now.  I've continued a little with my &lt;a href="http://devproj20.blogspot.com/2007/10/making-logging-output-interesting.html"&gt;XNA log viewer mentioned previously&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've set up a mock application that generates logs on command, and I've set up log4net in the &lt;a href="http://logging.apache.org/log4net/release/howto/chainsaw.html"&gt;same way you would if you wanted to look at the logs in Chainsaw&lt;/a&gt;.  So this fires off UDP packets containing the entry in XML.  I've then got a class that &lt;a href="http://msdn2.microsoft.com/en-us/library/dxkwh6zw%28vs.80%29.aspx"&gt;listens asynchronously to a socket&lt;/a&gt;.  When it receives data it deserialises it to an object, and then raises an event.&lt;br /&gt;&lt;br /&gt;My XNA "game" has one of these socket listening classes, and provides an event handler to receive the logs.&lt;br /&gt;&lt;br /&gt;On screen right now I'm just scrolling the messages.  To do this I have a &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.xna.framework.gamecomponent.aspx"&gt;GameComponent&lt;/a&gt; that contains a rough implementation of a generic  circular queue.  The contents of this queue are drawn to the screen, and as it's always wrapping around, it gives the effect of scrolling without having to move the position of the string.&lt;br /&gt;&lt;br /&gt;Next I need to figure out how I want the logs to be visualised.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6220670629627037375?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6220670629627037375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6220670629627037375' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6220670629627037375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6220670629627037375'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/visualising-logs-progress-report.html' title='Visualising Logs - Progress Report'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3186836904484212624</id><published>2007-10-11T20:47:00.000+01:00</published><updated>2007-10-11T20:49:46.780+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>How to prosecute a lying politician.</title><content type='html'>Did anyone else watch &lt;a href="http://news.uk.msn.com/Ministry-of-Truth.aspx"&gt;The Ministry of Truth&lt;/a&gt; on BBC2 just now?  I saw a summary of it on last night's Newsnight, and was compelled to watch the full version today.&lt;br /&gt;&lt;br /&gt;If you didn't get to see it, the crux of the documentary was to find out what you can do if an MP (including the Prime Minister) openly lies to the electorate.&lt;br /&gt;&lt;blockquote&gt;The shocking answer, according to the makers of this new documentary, is: you can't.&lt;br /&gt;&lt;br /&gt;If a politician lies to the electorate, there is no formal course of legal redress outside a general election. In a bid to close this gap in the constitution, an MP has drafted The Misrepresentation of the People Act: a bill that would force politicians to tell the truth - or face criminal prosecution.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.adampriceblog.org.uk/"&gt;Plaid Cymru MP Adam Price&lt;/a&gt; is now spearheading a national campaign to change British law so that any politician who deliberately misleads the electorate can be prosecuted.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Now, I don't normally get involved in politics, but watching the MPs in this documentary all agree that honesty was important, and then call the interviewer naive for wanting to put something into an actual law has put my back up quite a bit.&lt;br /&gt;&lt;br /&gt;However, it was refreshing to see that no one backed down, and there were responses for every one of the MPs' objections.  For instance:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The bill is not needed as Parliament regulates itself:&lt;/span&gt;&lt;br /&gt;All of the regulatory bodies within Parliament report to the Prime Minister, who then decides if he wants to act on it.  The programme likened this to being judge and jury at your own trial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;If an MP openly misleads Parliament their career is over:&lt;/span&gt;&lt;br /&gt;Admittedly most MPs found to have lied do resign, but it doesn't prevent them from holding office again.  Look at &lt;a href="http://en.wikipedia.org/wiki/Peter_Mandelson"&gt;Peter Mandelson&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/David_Blunkett"&gt;David Blunkett&lt;/a&gt;.  These MPs resigned only to find themselves elected officials once more.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Any MP in the House can ask "question after question after question" at Prime Minister's Question Time&lt;/span&gt; &lt;span style="font-style: italic;"&gt;(&lt;a href="http://en.wikipedia.org/wiki/Lord_Falconer"&gt;Lord Falconer&lt;/a&gt; gave this little gem)&lt;/span&gt;:&lt;br /&gt;An MP can only ask a maximum of two questions per sitting, and the PM doesn't have to actually answer it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;To say this bill is needed is to suggest that all politicians are dishonest:&lt;/span&gt;&lt;br /&gt;Not at all, claims the documentary.  Just because we have laws against murder, robbery, rape, and theft doesn't mean that we would all do it if it was legal.  (Although, an admittedly unscientific poll on the &lt;a href="http://news.uk.msn.com/Ministry-of-Truth.aspx"&gt;Ministry of Truth website&lt;/a&gt; asking "Do you think politicians lie to us" is currently sat at 96% for "Yes, on a regular basis")&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;You can't have a law against lying&lt;/span&gt; (&lt;span style="font-style: italic;"&gt;particularly liked this one, that seemed to be spouted by most of the MPs&lt;/span&gt;):&lt;br /&gt;Well, we do already.  Trades descriptions laws, advertising laws, company laws... they all prevent individuals from deceiving their customers, or board members.  Why should the government who, as one person on the documentary said, "are the board of directors for Great Britain PLC" be any different?&lt;br /&gt;&lt;br /&gt;An Early Day Motion about the bill is set to be put in front of ministers next week.  The cynical side of me thinks that a lot of smarmy spin doctors will shoot it down before anyone has had the chance to discuss it properly, but I truly hope that doesn't happen.&lt;br /&gt;&lt;br /&gt;I wish Adam Price the best of luck next week, and sincerely hope he takes it all the way to an actual law.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3186836904484212624?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3186836904484212624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3186836904484212624' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3186836904484212624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3186836904484212624'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/how-to-prosecute-lying-politician.html' title='How to prosecute a lying politician.'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-5079521661231436555</id><published>2007-10-10T16:49:00.000+01:00</published><updated>2007-10-10T17:22:34.605+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Code Samples'/><title type='text'>Do you use goto in C#?</title><content type='html'>Looking through the code for the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.net.mail.smtpclient%28vs.80%29.aspx"&gt;SmtpClient&lt;/a&gt;.&lt;a href="http://msdn2.microsoft.com/en-us/library/system.net.mail.smtpclient.send%28VS.80%29.aspx"&gt;Send&lt;/a&gt; method in &lt;a href="http://www.aisto.com/roeder/dotnet/"&gt;Reflector&lt;/a&gt; and found this snippet:&lt;br /&gt;&lt;br /&gt;&lt;div style=""&gt;&lt;div style=""&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;/span&gt;&lt;div  style="margin-left: 20pt;font-family:courier new;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;switch&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.DeliveryMethod)&lt;br /&gt;{&lt;/span&gt;&lt;div style="margin-left: 20pt;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;case&lt;/span&gt;&lt;span style="font-size:85%;"&gt; SmtpDeliveryMethod.SpecifiedPickupDirectory:&lt;/span&gt;&lt;div style="margin-left: 20pt;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.EnableSsl)&lt;br /&gt;{&lt;/span&gt;&lt;div style="margin-left: 20pt;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;throw&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;new&lt;/span&gt; SmtpException(SR.GetString(&lt;br /&gt;&lt;span style="color: rgb(163, 21, 21);font-size:85%;" &gt;"SmtpPickupDirectoryDoesnotSupportSsl"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;br /&gt;break&lt;/span&gt;&lt;span style="font-size:85%;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div  style="margin-left: 40pt;font-family:courier new;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;case&lt;/span&gt;&lt;span style="font-size:85%;"&gt; SmtpDeliveryMethod.PickupDirectoryFromIis:&lt;/span&gt;&lt;div style="margin-left: 20pt;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.EnableSsl)&lt;br /&gt;{&lt;/span&gt;&lt;div style="margin-left: 20pt;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;throw&lt;/span&gt;&lt;span style="font-size:85%;"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;new&lt;/span&gt; SmtpException(SR.GetString(&lt;span style="color: rgb(163, 21, 21);font-size:85%;" &gt;&lt;br /&gt;"SmtpPickupDirectoryDoesnotSupportSsl"&lt;/span&gt;&lt;span style="font-size:85%;"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;br /&gt;goto&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Label_021C;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div  style="margin-left: 40pt;font-family:courier new;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;default&lt;/span&gt;&lt;span style="font-size:85%;"&gt;:&lt;/span&gt;&lt;div style="margin-left: 20pt;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;goto&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Label_022B;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div  style="margin-left: 20pt;font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;}&lt;br /&gt;MailWriter fileMailWriter = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.GetFileMailWriter(&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;            this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.PickupDirectoryLocation);&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;br /&gt;goto&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Label_025D;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Label_021C:&lt;/span&gt;&lt;/span&gt;&lt;div  style="margin-left: 20pt;font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;fileMailWriter = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.GetFileMailWriter(&lt;br /&gt;            IisPickupDirectory.GetPickupDirectory());&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;br /&gt;goto&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Label_025D;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Label_022B:&lt;/span&gt;&lt;/span&gt;&lt;div  style="margin-left: 20pt;font-family:courier new;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.GetConnection();&lt;br /&gt;fileMailWriter = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.transport.SendMail((message.Sender != &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;null&lt;/span&gt;&lt;span style="font-size:85%;"&gt;) ?&lt;br /&gt;              message.Sender : message.From, recipients,&lt;br /&gt;              message.BuildDeliveryStatusNotificationString(),&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;out&lt;/span&gt;&lt;span style="font-size:85%;"&gt; exception);&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;Label_025D:&lt;/span&gt;&lt;/span&gt;&lt;div  style="margin-left: 20pt;font-family:courier new;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.message = message;&lt;br /&gt;message.Send(fileMailWriter, &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.DeliveryMethod != SmtpDeliveryMethod.Network);&lt;br /&gt;fileMailWriter.Close();&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;br /&gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.transport.ReleaseConnection();&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;&lt;br /&gt;if&lt;/span&gt;&lt;span style="font-size:85%;"&gt; ((&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;this&lt;/span&gt;&lt;span style="font-size:85%;"&gt;.DeliveryMethod == SmtpDeliveryMethod.Network) &amp;amp;&amp;amp; (exception != &lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;null&lt;/span&gt;&lt;span style="font-size:85%;"&gt;))&lt;br /&gt;{&lt;/span&gt;&lt;div style="margin-left: 20pt;"&gt;&lt;span style="color: rgb(0, 0, 255);font-size:85%;" &gt;throw&lt;/span&gt;&lt;span style="font-size:85%;"&gt; exception;&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size:85%;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;I've always been taught to avoid goto like the plague, and it's something I've followed for years. I've never even considered it to be an option when writing code.&lt;br /&gt;&lt;br /&gt;Thinking about it though, I did read an article a few years ago (which I can't find now) which said you could credibly use gotos only if you used it to jump &lt;span style="font-style: italic;"&gt;down&lt;/span&gt; code, and not up: a rule that is stuck to here.&lt;br /&gt;&lt;br /&gt;The thing is, I know this code can be written without using goto.  But also, it might not be as readable as it is now.&lt;br /&gt;&lt;br /&gt;I'm conflicted.  But I'm sticking to the "no goto" rule until someone can come up with an example that really &lt;span style="font-style: italic;"&gt;can't&lt;/span&gt; be coded without using a goto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-5079521661231436555?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/5079521661231436555/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=5079521661231436555' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5079521661231436555'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5079521661231436555'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/do-you-use-goto-in-c.html' title='Do you use goto in C#?'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6691579676571716537.post-1315043630481110035</id><published>2007-10-10T14:28:00.001+01:00</published><updated>2007-10-10T14:35:30.011+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>Sending SMS to a specific port using the Esendex API</title><content type='html'>I've written an &lt;a href="http://www.esendex.com/en/Esendex-Blogs/Developer-Blog/"&gt;Esendex Developers Blog&lt;/a&gt; entry describing how to &lt;a href="http://www.esendex.com/en/Esendex-Blogs/Developer-Blog/?xformid=58adb90d-7ab7-452f-8163-b41e53d5b90a"&gt;send SMS to a specific port&lt;/a&gt;.  It's quite technical, but we've had a few support cases raised about it in the last couple of weeks, so thought I'd write about it.&lt;br /&gt;&lt;br /&gt;It's quite long as well, but I don't think I could make it be any shorter and still be meaningful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-1315043630481110035?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/1315043630481110035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=1315043630481110035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1315043630481110035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1315043630481110035'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/sending-sms-to-specific-port-using.html' title='Sending SMS to a specific port using the Esendex API'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-6875882272243355671</id><published>2007-10-09T09:30:00.000+01:00</published><updated>2007-10-09T09:32:15.731+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Logging'/><title type='text'>Making logging output "interesting"</title><content type='html'>This &lt;a href="http://slashdot.org/"&gt;slashdot&lt;/a&gt; article caught my interest last night: &lt;a href="http://developers.slashdot.org/developers/07/10/07/1232245.shtml"&gt;Logfiles Made Interesting with glTail&lt;/a&gt;.  Basically a guy has written a Ruby on Rails program that parses &lt;a href="http://httpd.apache.org/"&gt;Apache&lt;/a&gt; access logs and gives you a visual representation of them using &lt;a href="http://en.wikipedia.org/wiki/OpenGL"&gt;OpenGL graphics&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.fudgie.org/"&gt;outcome of it&lt;/a&gt; looks pretty interesting, and it got me thinking about what else you can do.  I'm wondering how we could visualise some &lt;a href="http://logging.apache.org/log4net/"&gt;log4net&lt;/a&gt; logging, maybe using the &lt;a href="http://msdn2.microsoft.com/en-us/xna/default.aspx"&gt;XNA framework&lt;/a&gt; to output the graphics.&lt;br /&gt;&lt;br /&gt;So last night I coded up a simple UDP &lt;a href="http://msdn2.microsoft.com/en-us/library/system.net.sockets.socket.aspx"&gt;Socket&lt;/a&gt; listener, and made a mock application that logs out an &lt;a href="http://logging.apache.org/log4net/release/howto/chainsaw.html"&gt;XML event to a UDPAppender&lt;/a&gt;.  I found it should be pretty simple to get the log events to an XNA application, and now I'm thinking how the logs that the Esendex system generates can be displayed in an interesting yet useful way.&lt;br /&gt;&lt;br /&gt;I'll keep you posted if I do anything else.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6875882272243355671?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6875882272243355671/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6875882272243355671' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6875882272243355671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6875882272243355671'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/making-logging-output-interesting.html' title='Making logging output &quot;interesting&quot;'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7896557562918161701</id><published>2007-10-05T13:48:00.000+01:00</published><updated>2007-10-05T14:07:08.708+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Walkers Keywords from Google Analytics</title><content type='html'>Waiting through my lunch for an &lt;a href="http://www.esendex.com/en/UK/About-us/Network-Accreditation/"&gt;Orange&lt;/a&gt; conference call to continue I opened &lt;a href="http://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; and checked up on who was getting to this blog.  There's an unusually high proportion of people seemingly searching for Walkers crisps.&lt;br /&gt;&lt;br /&gt;Some of the search keywords are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;the purpose of walkers crisps&lt;/li&gt;&lt;li&gt;internal customers at walkers crisps&lt;/li&gt;&lt;li&gt;what are walkers crisps called in walmart orlando&lt;/li&gt;&lt;li&gt;how do you make a packet of walkers crisps&lt;/li&gt;&lt;li&gt;how much fat is there in a pack of walkers&lt;/li&gt;&lt;li&gt;walkers crisp purpose of the business&lt;/li&gt;&lt;li&gt;walkers crisps labels&lt;/li&gt;&lt;li&gt;what is the main purpose of the packaging of walkers crisps&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Also a couple of visits from what looks like an internal Walkers host name.&lt;br /&gt;&lt;br /&gt;Seems to be a bit of a Walkers hub at the moment ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7896557562918161701?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7896557562918161701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7896557562918161701' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7896557562918161701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7896557562918161701'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/walkers-keywords-from-google-analytics.html' title='Walkers Keywords from Google Analytics'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7851285380806238681</id><published>2007-10-05T13:00:00.000+01:00</published><updated>2007-10-10T10:44:42.671+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>Batching Bulk SMS Submissions using the Esendex API</title><content type='html'>I've written a summary of how to submit batched messages using the Esendex APIs, which will help anyone having problems submitting large amounts of messages at once.&lt;br /&gt;&lt;br /&gt;It's not code specific, but should point you in the right direction if you find that making many single submissions is giving you network errors.&lt;br /&gt;&lt;br /&gt;Read this &lt;a href="https://www.esendex.com/en/Esendex-Blogs/Developer-Blog/"&gt;Esendex Developers Blog&lt;/a&gt; entry: &lt;a href="https://www.esendex.com/en/Esendex-Blogs/Developer-Blog/?xformid=de030213-520a-43bc-a984-2ce16063c86c"&gt;Batching Bulk Submissions using the API&lt;/a&gt; for more information.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7851285380806238681?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7851285380806238681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7851285380806238681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7851285380806238681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7851285380806238681'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/batching-bulk-sms-submissions-using.html' title='Batching Bulk SMS Submissions using the Esendex API'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-6437238366585439424</id><published>2007-10-04T11:25:00.000+01:00</published><updated>2007-10-04T11:28:16.127+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Documenting assumptions with Debug.Assert</title><content type='html'>Another one from &lt;a href="http://gregbeech.com/"&gt;Greg Beech&lt;/a&gt; today: &lt;a href="http://gregbeech.com/blogs/tech/archive/2007/08/26/document-your-assumptions-with-debug-assert-instead-of-comments.aspx"&gt;Document your assumptions with Debug.Assert instead of comments&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I've never used &lt;a href="http://msdn2.microsoft.com/en-us/library/e63efys0.aspx"&gt;Debug.Assert&lt;/a&gt;, but after reading this post I'm trying it out today.  The post makes some excellent points:&lt;br /&gt;&lt;blockquote&gt;When writing methods people frequently make assumptions, such as that the internal state of the class is correct, or that the arguments passed into a private method are valid (because they should have been checked by the non-private method calling it)&lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;[If these assumptions are wrong] the program will carry on regardless until it fails at some point in the future. And because you didn't trap the problem at the point where it became clear that something was already wrong (i.e. at the comment documenting the assumption) then it's much harder to work out where the problem really occurred because the failure itself could occur further down the line in a largely unrelated method.&lt;br /&gt;&lt;br /&gt;[...]&lt;br /&gt;&lt;br /&gt;So every time you find yourself making an assumption "I know this will be there", "this should be in that state", "the argument should not be null as the public method will have validated it", document it by using Debug.Assert rather than a comment. Then, if your assumption is incorrect, your application will come to a grinding halt at the point where the problem became apparent.&lt;/blockquote&gt;&lt;br /&gt;So I'm giving it a go.  It can only help during development, and won't affect anything in production code as the Debug class will only compile in debug builds.&lt;br /&gt;&lt;br /&gt;There are a few warnings in Greg's post about when &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; to use it, so make sure you read those before giving it a go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6437238366585439424?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6437238366585439424/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6437238366585439424' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6437238366585439424'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6437238366585439424'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/documenting-assumptions-with.html' title='Documenting assumptions with Debug.Assert'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3589156957547871223</id><published>2007-10-04T09:21:00.000+01:00</published><updated>2007-10-04T09:41:38.772+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>Esendex Website Updated</title><content type='html'>The &lt;a href="https://www.esendex.com/en/UK/"&gt;new style web site&lt;/a&gt; went live yesterday afternoon, with surprisingly (but reassuringly) few problems.  It's early days yet, and I'm sure we'll get a few calls from people who can't find things in the new format, but it looks like the deployment has been successful.&lt;br /&gt;&lt;br /&gt;I was in two minds about posting about this actually, because I've not done that much work on it.  I've paired with &lt;a href="http://neilkilbride.blogspot.com/"&gt;Neil&lt;/a&gt; and &lt;a href="http://esendexdeveloper.blogspot.com/"&gt;Kevin&lt;/a&gt; on the odd task, but I think of the developers here I've probably done the least on it.&lt;br /&gt;&lt;br /&gt;The new website contains various blogs (like for &lt;a href="http://www.esendex.com/en/Esendex-Blogs/Support-Blog/"&gt;support&lt;/a&gt;, &lt;a href="http://www.esendex.com/en/Esendex-Blogs/Developer-Blog/"&gt;development&lt;/a&gt;, and the &lt;a href="http://www.esendex.com/en/Esendex-Blogs/Esendex-Blog/"&gt;company&lt;/a&gt; as a whole), so please check those out.  I've already &lt;a href="http://www.esendex.com/en/Esendex-Blogs/Developer-Blog/?xformid=09f18863-fff8-48fe-b755-026133a7d491"&gt;posted to the development blog&lt;/a&gt;, summarising the &lt;a href="http://devproj20.blogspot.com/2007/08/esendex-inbound-multipart-messaging.html"&gt;inbound multipart message update&lt;/a&gt; I blogged about here recently.&lt;br /&gt;&lt;br /&gt;Right, onto the next &lt;a href="http://www.extremeprogramming.org/rules/userstories.html"&gt;story&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3589156957547871223?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3589156957547871223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3589156957547871223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3589156957547871223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3589156957547871223'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/esendex-website-updated.html' title='Esendex Website Updated'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7339868184173365134</id><published>2007-10-02T15:11:00.000+01:00</published><updated>2007-10-02T16:45:35.779+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Product Knowledge Vs Coding Ability</title><content type='html'>I stumbled across &lt;a href="http://gregbeech.com/blogs/"&gt;Greg Beech&lt;/a&gt;'s blog a few days ago while browsing the &lt;a href="http://forums.microsoft.com/msdn/default.aspx?siteid=1"&gt;MSDN Forums&lt;/a&gt; and my attention was drawn to this post: &lt;a href="http://gregbeech.com/blogs/tech/archive/2007/09/11/is-product-knowledge-more-important-than-coding-ability.aspx"&gt;Is product knowledge more important than coding ability?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The post didn't turn out to be what I thought it was, but it was interesting reading none the less.  I thought it would be a discussion about whether a developer's knowledge of their product was more important than their individual coding ability, but the "product knowledge" that the title refers to is knowledge of third party software your company uses.&lt;br /&gt;&lt;br /&gt;Greg gives a good example where his team solves a difficult problem quickly through their knowledge of the products they are using, rather than with any dramatic improvement in coding skill.&lt;br /&gt;&lt;br /&gt;But isn't knowledge of these products just one measure of your ability as a developer?  Without knowing how to use a framework (and I mean "framework" in the broadest possible terms) a developer isn't going to be able to do much quickly.&lt;br /&gt;&lt;br /&gt;For example, if I wish to send an email from a program I don't open a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.net.sockets.socket.aspx"&gt;socket&lt;/a&gt; to a mail server and throw SMTP commands across the wire.  I use something like the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.net.mail.aspx"&gt;System.Net.Mail&lt;/a&gt; classes which contains everything I need.&lt;br /&gt;&lt;br /&gt;I know I &lt;span style="font-style: italic;"&gt;could&lt;/span&gt; implement my own &lt;a href="http://msdn2.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx"&gt;SmtpClient&lt;/a&gt;.  I have the coding ability to write the code that will do it, but it would be a waste of my time to do so.&lt;br /&gt;&lt;br /&gt;Coding ability and product knowledge are just two of the many weapons in a developer's arsenal that need to be used at different times to solve different problems. &lt;br /&gt;&lt;br /&gt;I'd say the ability to judge when to use each is the more important skill though.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7339868184173365134?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7339868184173365134/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7339868184173365134' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7339868184173365134'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7339868184173365134'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/product-knowledge-vs-coding-ability.html' title='Product Knowledge Vs Coding Ability'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-5153161445655977147</id><published>2007-10-01T13:55:00.000+01:00</published><updated>2007-10-01T14:16:58.924+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Sumo TV Trailerdrome</title><content type='html'>Flicking around Sky Digital channels a few weeks ago I stumbled across &lt;a href="http://www.sky.com/portal/site/skycom/tvlistings?programId=TP000000000126050424&amp;amp;channelId=5712&amp;amp;eventId=583"&gt;Sumo TV's Trailerdrome on channel 144&lt;/a&gt;.  There's no website for the programme itself, the only thing I've found is the Sky.com TV listings page that tells you when it's on:&lt;br /&gt;&lt;blockquote&gt;Featuring the best of obscure film trailers, public information films and newsreels from the last 70 years, when life was more innocent. Or was it?&lt;/blockquote&gt;&lt;br /&gt;And it is obscure, but I found it disturbingly compulsive viewing.  The only problem is that they seem to show the same trailers on different days.&lt;br /&gt;&lt;br /&gt;Among the trailers and public service films I've seen:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a warning to young girls about "getting yourself in trouble", which contained absolutely no mention of pregnancy or sex, but ended with the girl being put into care for no other reason than being a single teenage mother&lt;/li&gt;&lt;li&gt;an animated educational film about how capitalism works, and why it makes America great&lt;/li&gt;&lt;li&gt;coverage of an "Economy Drive" from the 50s/60s, in which teenage drivers aim to follow a long street course using the least amount of fuel.  I think the winner managed around 50 miles per gallon per ton.&lt;/li&gt;&lt;li&gt;a documentary on how to have dinner with your family.  Apparently no one person should dominate the conversation, and the girls of the family must help their mother prepare the meal.&lt;/li&gt;&lt;li&gt;a short film about divorce, that only mentioned the word once, covered none of the legal side of actual proceedings, and which only really showed the beginning of a couple's relationship in which the woman said she could change the man to suit her own needs.&lt;/li&gt;&lt;li&gt;far too many more to list here.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;One of the great things though is that there seems to be no real adverts for the duration of the programme, which runs for about two hours.  There are actually adverts, but they are old ones from the 50s and 60s that clearly aren't on sale now.  There's a crazy one for Heinz Pickles that features an old lady beating up the waiting staff in a restaurant because the pickle she was served wasn't good enough.&lt;br /&gt;&lt;br /&gt;So if you find yourself channel surfing and you happen across something in black and white that usually has a very condescending voice over on top then you've probably stumbled across Trailerdrome.  Give it a go, it's a laugh.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-5153161445655977147?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/5153161445655977147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=5153161445655977147' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5153161445655977147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5153161445655977147'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/10/sumo-tv-trailerdrome.html' title='Sumo TV Trailerdrome'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8598402439280579390</id><published>2007-09-27T14:08:00.000+01:00</published><updated>2007-09-27T14:13:38.028+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Is ploughing like software development?</title><content type='html'>&lt;a href="http://www.mindthe.net/devices/"&gt;Jonathan&lt;/a&gt;'s blogged about a quote from Joe Berkovitz seemingly comparing software development to agriculture: &lt;a href="http://www.mindthe.net/devices/2007/09/27/is-ploughing-like-software-development/"&gt;Is ploughing like software development?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;While I too wonder at this strange analogy, development is sometimes like running on a ploughed field: requiring lots of energy, getting nowhere fast, and when you look back you've just made one hell of a mess. ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8598402439280579390?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8598402439280579390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8598402439280579390' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8598402439280579390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8598402439280579390'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/is-ploughing-like-software-development.html' title='Is ploughing like software development?'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2061241476275443028</id><published>2007-09-26T21:53:00.000+01:00</published><updated>2007-09-27T09:04:11.518+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS Plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='AutoFormatter'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Visual Studio 2005 Automation Samples</title><content type='html'>Guess I should have looked at creating a Visual Studio plugin first rather than figuring out how to convert RTF to HTML.  I might not need to do that judging by the description of one of the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=79C7E038-8768-4E1E-87AE-5BBBE3886DE8&amp;amp;displaylang=en"&gt;Visual Studio 2005 Automation Samples&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;b&gt;Generate HTML&lt;/b&gt;&lt;br /&gt;This sample demonstrates how to take text from the editor window and build a HTML file using this text, including font and color syntax highlighting information.&lt;/blockquote&gt;&lt;br /&gt;Haven't downloaded this yet, but I will do.  Sounds like the Blogger code upload plugin could be quite easy to implement.&lt;br /&gt;&lt;br /&gt;I found this page linked from the &lt;a href="http://msdn2.microsoft.com/en-us/vstudio/Aa700820.aspx"&gt;Customize and Extend Visual Studio&lt;/a&gt; page on &lt;a href="http://msdn2.microsoft.com/en-us/default.aspx"&gt;MSDN&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;UPDATE:  Ahh, the Generate HTML sample is actually in C++, not C#.  Should still be able to use it as a guide though, just need to figure out what objects to use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2061241476275443028?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2061241476275443028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2061241476275443028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2061241476275443028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2061241476275443028'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/visual-studio-2005-automation-samples.html' title='Visual Studio 2005 Automation Samples'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3643163154570559331</id><published>2007-09-26T08:57:00.001+01:00</published><updated>2007-09-26T09:17:39.942+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Nottingham isn't that far from New York then</title><content type='html'>Driving home yesterday was an experience to say the least.  Where &lt;a href="http://www.multimap.com/maps/?hloc=GB%7Cnottingham#t=l&amp;amp;map=52.97278,-1.18565%7C15%7C4&amp;amp;loc=GB:52.9548:-1.1581:13%7Cnottingham%7CNottingham"&gt;the ring road around Nottingham meets the A610&lt;/a&gt; was the scene of chaos.  So much chaos that I found myself laughing at it so I didn't get annoyed with the stupidity of the people involved.&lt;br /&gt;&lt;br /&gt;The A610 heading out of Nottingham was grid-locked completely.  So much so that when the traffic lights changed to red there was still traffic on the junction, and that traffic had nowhere to go.  It effectively cut off the ring road.&lt;br /&gt;&lt;br /&gt;Normally this isn't a problem, but I think there must have been something in the water yesterday.  Horns were sounded, tyres screeched, cars swerved into oncoming traffic--I particularly liked the van driver who did a racing start when the ring road's lights went green, even though 10 feet in front of him was a line of traffic that could not go anywhere.&lt;br /&gt;&lt;br /&gt;He slammed on the brakes and swerved into another lane, cutting up a car and resulting in more horns being sounded.&lt;br /&gt;&lt;br /&gt;I didn't want to add to all of this mayhem, so I turned around and went home another way.&lt;br /&gt;&lt;br /&gt;I always find it curious when people get angry over things that no one has any real control over, and which aren't particularly important anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3643163154570559331?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3643163154570559331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3643163154570559331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3643163154570559331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3643163154570559331'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/nottingham-isnt-that-far-from-new-york.html' title='Nottingham isn&apos;t that far from New York then'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-6168397773386839345</id><published>2007-09-25T14:26:00.000+01:00</published><updated>2007-09-25T14:40:13.263+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS Plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='Blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='GData API'/><category scheme='http://www.blogger.com/atom/ns#' term='AutoFormatter'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>RTF to HTML and the GData API</title><content type='html'>Finally got around to properly extracting the RTF conversion code from &lt;a href="http://blogs.vbcity.com/hotdog/archive/2005/12/30/5759.aspx"&gt;AutoFormatter&lt;/a&gt; last night. It turned out to be&lt;a href="http://devproj20.blogspot.com/2007/09/trying-to-extracting-features-from.html"&gt; as easy as I thought, after last time's wasted efforts&lt;/a&gt;.  I've had a look on &lt;a href="http://blogs.vbcity.com/hotdog/"&gt;Robert Verpalen&lt;/a&gt;'s blog for some contact details, but I can't find any and the AutoFormatter post doesn't seem to allow comments.&lt;br /&gt;&lt;br /&gt;I might have to leave a comment on another one of his other posts, but the date on the AutoFormatter post is December 2005, so I don't know if he's maintaining it now.  Doesn't seem to be any posts since then about the application anyway.&lt;br /&gt;&lt;br /&gt;I think I'll wait until I have something usable first though.&lt;br /&gt;&lt;br /&gt;Anyway, with that extracted I downloaded the &lt;a href="http://code.google.com/apis/blogger/overview.html"&gt;GData API SDK&lt;/a&gt; and tried to connect to my blog.  The sample code included is very helpful, but it still took a little time to get my head around.  I eventually knocked up some code that would add a new draft to my blog, so I think I have everything I need to make the plugin now.&lt;br /&gt;&lt;br /&gt;Now I just need to learn about &lt;a href="http://devproj20.blogspot.com/2007/09/creating-visual-studio-plugins.html"&gt;how to make a decent plugin&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6168397773386839345?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6168397773386839345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6168397773386839345' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6168397773386839345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6168397773386839345'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/rtf-to-html-and-gdata-api.html' title='RTF to HTML and the GData API'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2616491168854706592</id><published>2007-09-25T14:25:00.000+01:00</published><updated>2007-09-26T22:01:49.201+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Comics Britannia on BBC4</title><content type='html'>I watched &lt;a href="http://www.bbc.co.uk/bbcfour/comicsbritannia/"&gt;Comics Britannia&lt;/a&gt; on &lt;a href="http://www.bbc.co.uk/bbcfour/"&gt;BBC4&lt;/a&gt; last night, an episode that focused on more modern comics, ones which a parent probably wouldn't want a young child to read.&lt;br /&gt;&lt;br /&gt;I'm not what you call a comic geek, but I've read a couple of the more "adult" orientated comics (and graphic novels), so I found last night's programme very interesting.&lt;br /&gt;&lt;br /&gt;A pleasingly large section of the programme was devoted to &lt;a href="http://en.wikipedia.org/wiki/Alan_Moore"&gt;Alan Moore&lt;/a&gt;.  His &lt;a href="http://en.wikipedia.org/wiki/V_for_Vendetta"&gt;V For Vendetta&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Watchmen"&gt;Watchmen&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Lost_Girls"&gt;Lost Girls&lt;/a&gt; (which is not one I'd recommend for the easily offended) are among my favourite books of all time, so it was interesting listening to the man himself talk about his creations.&lt;br /&gt;&lt;br /&gt;I think I got into this series a bit too late, so I'm looking forward for a repeat showing sometime soon.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2616491168854706592?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2616491168854706592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2616491168854706592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2616491168854706592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2616491168854706592'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/comics-britannia-on-bbc4.html' title='Comics Britannia on BBC4'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3824789081728486047</id><published>2007-09-21T09:05:00.001+01:00</published><updated>2007-09-25T14:38:16.692+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AutoFormatter'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Trying to Extract Features from AutoFormatter</title><content type='html'>I took a look at the &lt;a href="http://blogs.vbcity.com/hotdog/archive/2005/12/30/5759.aspx"&gt;AutoFormatter&lt;/a&gt; code last night, and tried to make a start on &lt;a href="http://devproj20.blogspot.com/2007/09/rtf-to-html-autoformatter-20.html"&gt;extracting the code that does the conversion into a class library&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I can't say it was an easy task though, and at the end of it all I found I'd done it wrong anyway.  What I really need is a class that just converts RTF to HTML, but I had extracted the method that creates the div blocks around the code as well.  Surrounding the code in this way does make the end result nice and pretty, but for the purposes of a generic conversion library it's not needed.&lt;br /&gt;&lt;br /&gt;It was about 11 o'clock last night when I figured this out.  It's always a little disheartening when you find you've just spent the last 3 hours doing something that you now need to discard.&lt;br /&gt;&lt;br /&gt;Guess that's what happens when you try to modify code without truely understanding it.  I can't see any unit tests in the code to give an indication of the intention of some of the code, or to provide a safety net to the quite severe refactoring that I am attempting.&lt;br /&gt;&lt;br /&gt;But I think extracting the RTF to HTML code should be easier than what I did last night.  There were a number of options I needed to extract into a class and pass into the method last night, but I'm sure I don't need all of this for the straight conversion.&lt;br /&gt;&lt;br /&gt;I'll see how it goes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3824789081728486047?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3824789081728486047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3824789081728486047' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3824789081728486047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3824789081728486047'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/trying-to-extracting-features-from.html' title='Trying to Extract Features from AutoFormatter'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-815274360995413007</id><published>2007-09-20T16:13:00.000+01:00</published><updated>2007-09-25T11:22:29.900+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Formatting Currency to Pence and Cents</title><content type='html'>Almost anyone will know how to &lt;a href="http://www.howtogeek.com/howto/programming/format-a-string-as-currency-in-c/"&gt;format a decimal to a currency string&lt;/a&gt;.  It's nice and easy to make a number like 1.25 format like £1.25, (or $1.25 if you're using a &lt;a href="http://msdn2.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx"&gt;CultureInfo&lt;/a&gt; that has a dollar CurrencySymbol in its &lt;a href="http://msdn2.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx"&gt;NumberFormatInfo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;But, say I have the decimal 0.06, and I want this to format to 6p.  Or I might have 0.065 which I want to show as 6.5p.&lt;br /&gt;&lt;br /&gt;How do I do that?&lt;br /&gt;&lt;br /&gt;I understand I may need to multiply this decimal by 100 to get the whole number of pence, but how do I know which symbol to append?  Plus, how do I know which end of the string the symbol needs to go?&lt;br /&gt;&lt;br /&gt;There is nothing in a NumberFormatInfo that describes these things.  The CurrencySymbol gives us our $, £, €, etc, but where's the pence and cents symbols?&lt;br /&gt;&lt;br /&gt;Any ideas?&lt;br /&gt;&lt;br /&gt;Right now we've got a workaround in place that works, but shouldn't this be a part of the NumberFormatInfo?&lt;br /&gt;&lt;br /&gt;I've posted a &lt;a href="http://forums.microsoft.com/msdn/showpost.aspx?postid=2168491&amp;amp;siteid=1#2168491&amp;amp;SiteID=1"&gt;question on the MSDN Forums&lt;/a&gt; about this.&lt;br /&gt;&lt;br /&gt;UPDATE: &lt;a href="http://esendexdeveloper.blogspot.com/"&gt;Kevin&lt;/a&gt; posted a question on the MSDN Forums for this as well, and got a more satisfactory answer than I did.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://esendexdeveloper.blogspot.com/2007/09/numberformat-issue-answered.html"&gt;Read that post here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-815274360995413007?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/815274360995413007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=815274360995413007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/815274360995413007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/815274360995413007'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/formatting-currency-to-pence-and-cents.html' title='Formatting Currency to Pence and Cents'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2061957041884252984</id><published>2007-09-19T22:36:00.000+01:00</published><updated>2007-09-25T14:38:45.511+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS Plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='GData API'/><category scheme='http://www.blogger.com/atom/ns#' term='AutoFormatter'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>RTF to HTML: AutoFormatter 2.0</title><content type='html'>Visual Studio copies code from the editor in RTF format, so technically all you need to do is convert RTF to HTML in order to upload it to a blog post, which will form &lt;a href="http://devproj20.blogspot.com/2007/09/creating-visual-studio-plugins.html"&gt;part of the plugin&lt;/a&gt;, if I ever get around to making it.&lt;br /&gt;&lt;br /&gt;Looking around last night I found &lt;a href="http://blogs.vbcity.com/hotdog/archive/2005/12/30/5759.aspx"&gt;AutoFormatter 2.0&lt;/a&gt;.  This is a .Net 2.0 application written in C# that does a neat job of doing exactly what I need.  The HTML it produces is in a scrolling DIV, formatted in Visual Studio colours, and looks quite nice.&lt;br /&gt;&lt;br /&gt;In fact, as a standalone application this is just what I need to post code samples, but I started down this path to try the &lt;a href="http://code.google.com/apis/blogger/overview.html"&gt;GData API&lt;/a&gt; with a &lt;a href="http://www.devx.com/vstudioextensibility/Article/31354"&gt;Visual Studio plugin&lt;/a&gt;.  I'm hoping to use part of AutoFormatter to do it though.&lt;br /&gt;&lt;br /&gt;If I can extract the conversion code from the AutoFormatter app into a standalone assembly, then theoretically I should be able to use it from the plugin.  The code is available for download, and I made a start at extracting the required elements last night.  If I can get this working then that's a big chunk of the work done I think.&lt;br /&gt;&lt;br /&gt;I'll get in touch with AutoFormatter's author if I manage to get the core functionality extracted to a separate assembly.  Hope he doesn't mind.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2061957041884252984?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2061957041884252984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2061957041884252984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2061957041884252984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2061957041884252984'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/rtf-to-html-autoformatter-20.html' title='RTF to HTML: AutoFormatter 2.0'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7037511295691153632</id><published>2007-09-19T17:27:00.000+01:00</published><updated>2007-09-25T14:39:10.261+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VS Plugins'/><category scheme='http://www.blogger.com/atom/ns#' term='Blogging'/><category scheme='http://www.blogger.com/atom/ns#' term='GData API'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Creating Visual Studio Plugins</title><content type='html'>This is more of a reminder to myself than anything else: &lt;a href="http://www.devx.com/vstudioextensibility/Article/31354"&gt;Exploring Extensibility: Your First Visual Studio Add-in&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I found it at about the same time I was looking into the &lt;a href="http://code.google.com/apis/blogger/overview.html"&gt;GData API&lt;/a&gt;, and I had an idea about creating a plugin to Visual Studio which would allow you to upload a code snippet to a blog post, and have it fully formatted so it was readable.&lt;br /&gt;&lt;br /&gt;Still might do it, but I'm not sure how indepth the wizard approach will be.  I'll probably end up with a standalone application that you paste code into and then upload it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7037511295691153632?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7037511295691153632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7037511295691153632' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7037511295691153632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7037511295691153632'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/creating-visual-studio-plugins.html' title='Creating Visual Studio Plugins'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-168971550872597115</id><published>2007-09-19T14:18:00.000+01:00</published><updated>2007-09-19T17:25:31.863+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>What's the carbon footprint of a potato?</title><content type='html'>BBC News is running an article about the carbon footprint of Walkers Crisps: &lt;a href="http://news.bbc.co.uk/1/hi/magazine/7002450.stm"&gt;What's the carbon footprint of a potato?&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Seemed like a rather &lt;a href="http://devproj20.blogspot.com/2007/08/carbon-emissions-in-walkers-crisps.html"&gt;spurious thing to blog about&lt;/a&gt; at the time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-168971550872597115?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/168971550872597115/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=168971550872597115' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/168971550872597115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/168971550872597115'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/whats-carbon-footprint-of-potato.html' title='What&apos;s the carbon footprint of a potato?'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-9128532436370555464</id><published>2007-09-19T13:06:00.000+01:00</published><updated>2007-09-19T14:10:46.093+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.Net 2.0'/><title type='text'>Configure an Assembly in .Net 2.0</title><content type='html'>Found &lt;a href="http://blogs.msdn.com/suzcook/archive/2004/05/14/132022.aspx"&gt;this article for an example on redirecting an assembly's version via the App.config&lt;/a&gt; file.  In .Net 1.1 it was easy to do this as there was a GUI to let you redirect all version bindings to a different version.  You still get this GUI if you have the .Net 2.0 SDK installed, but you don't get it with the .Net 2.0 Redistributable.&lt;br /&gt;&lt;br /&gt;This way you only redirect specific applications rather than your entire system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-9128532436370555464?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/9128532436370555464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=9128532436370555464' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/9128532436370555464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/9128532436370555464'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/configure-assembly-in-net-20.html' title='Configure an Assembly in .Net 2.0'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-4801519086094986692</id><published>2007-09-17T21:05:00.001+01:00</published><updated>2007-09-17T21:36:14.732+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><title type='text'>Using UDP in XNA</title><content type='html'>I've had an anonymous comment left on a &lt;a href="http://devproj20.blogspot.com/2007/05/set-localendpoint-in-udpclient.html"&gt;UdpClient post&lt;/a&gt; asking if I have used the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.net.sockets.udpclient.aspx"&gt;UdpClient&lt;/a&gt; in an &lt;a href="http://msdn2.microsoft.com/en-us/xna/default.aspx"&gt;XNA&lt;/a&gt; game.  Well, no I haven't--and to be honest I've not used the class much in anything else either.  In fact that previous blog entry was posted after pairing with &lt;a href="http://nicholasbruce.blogspot.com/"&gt;Nick&lt;/a&gt; on a bespoke application for a customer of ours.&lt;br /&gt;&lt;br /&gt;But, the question got me thinking about it anyway.  The comment says that they have a piece of code using the UdpClient that works in a normal .Net application, but when included in an XNA game, it no longer receives anything.&lt;br /&gt;&lt;br /&gt;Now, I can't see why this would be the case if you are compiling to a Windows game.  A Windows game is just running on the standard .Net framework, so everything should be OK.  However, &lt;a href="http://msdn2.microsoft.com/en-us/library/bb203912.aspx"&gt;XBOX 360 games will run on a variation of the .Net Compact Framework&lt;/a&gt;, so there is a difference there to be aware of.&lt;br /&gt;&lt;br /&gt;So assuming you're making a Windows game, why should the UdpClient now not work?  Well to start I made a normal console application with the code snippet posted in the comment, and tried to get that to work.  I made a separate console application to use as the sender.&lt;br /&gt;&lt;br /&gt;And that's when the problem struck--one which I should have seen at first glance anyway.   If you try to have multiple applications on the same computer accessing the same port using UdpClient you will get an exception that says &lt;span style="color: rgb(255, 0, 0);font-family:courier new;" &gt;"Only one usage of each socket address (protocol/network address/port) is normally permitted&lt;/span&gt;".   (&lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2054794&amp;amp;SiteID=1"&gt;Read this article&lt;/a&gt; for a bit more information).&lt;br /&gt;&lt;br /&gt;The only way we've found to stop this happening is to not use UdpClient at all, but to create Sockets yourself and use those instead.&lt;br /&gt;&lt;br /&gt;However, I thought there must be an easier way--someone must have solved this problem before.  And it looks like someone has.&lt;br /&gt;&lt;br /&gt;I've not had a look at it in much depth, but if you want to send and receive UDP packets in XNA then take a look at the &lt;a href="http://code.google.com/p/lidgren-library-network/"&gt;lidgren-library-network&lt;/a&gt;, which is on &lt;a href="http://code.google.com/"&gt;Google Code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I don't know whether this uses UdpClient under the hood or not, but it has an XNA extension for sending Vectors and Matrices so it must have been used in some XNA games somewhere along the line.&lt;br /&gt;&lt;br /&gt;Check it out and see if it helps.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-4801519086094986692?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/4801519086094986692/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=4801519086094986692' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4801519086094986692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4801519086094986692'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/using-udp-in-xna.html' title='Using UDP in XNA'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-798715670680954084</id><published>2007-09-17T20:54:00.000+01:00</published><updated>2007-09-17T21:02:48.981+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net'/><title type='text'>Ajax onreadystatechange Arguments</title><content type='html'>Having not used Ajax that much I was surprised to see that the function you declare for the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms534308.aspx"&gt;onreadystatechange event&lt;/a&gt; could not take any arguments.  I thought that this was a bit of a limitation as it meant that if you wanted that function to use any external data you had to declare that data globally, which has always been a big no-no in my book. &lt;br /&gt;&lt;br /&gt;Global data when it's not needed always leads to a lot of pain in my experience.&lt;br /&gt;&lt;br /&gt;But despair not, there is a way to pass arguments in.  As &lt;a href="http://www.webreference.com/js/column80/4.html"&gt;Javascript supports anonymous methods&lt;/a&gt; you can create a new method inline, and then call another function from there--one that does have the arguments.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.thescripts.com/forum/thread460759.html"&gt;Take a look at this article&lt;/a&gt; if you're still stuck.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-798715670680954084?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/798715670680954084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=798715670680954084' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/798715670680954084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/798715670680954084'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/ajax-onreadystatechange-arguments.html' title='Ajax onreadystatechange Arguments'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8608289514272577041</id><published>2007-09-17T12:40:00.000+01:00</published><updated>2007-09-17T12:44:43.944+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>A Day For Winning</title><content type='html'>I got back from a week's holiday this morning to find that I had not only won &lt;a href="http://julian-hucker.blogspot.com/2007/09/connect-and-communicate.html"&gt;Esendex's new strapline competition&lt;/a&gt;, but I've also taken the spot prize in the Esendex fantasy football mini league.&lt;br /&gt;&lt;br /&gt;Maybe I should go and buy a lottery ticket ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8608289514272577041?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8608289514272577041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8608289514272577041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8608289514272577041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8608289514272577041'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/day-for-winning.html' title='A Day For Winning'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-1974554935913388841</id><published>2007-09-07T14:13:00.000+01:00</published><updated>2007-09-07T14:21:52.530+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><title type='text'>How C# 3.0 and LINQ Evolved</title><content type='html'>Starting Visual Studio today the Start Page's MSDN feed pointed to this article: &lt;a href="http://msdn.microsoft.com/msdnmag/issues/07/06/CSharp30/"&gt;C# 3.0: The Evolution Of LINQ And Its Impact On The Design Of C#&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;It describes the separate language additions that were required to make LINQ work, and is well worth a read in my opinion.&lt;br /&gt;&lt;br /&gt;Having been introduced to &lt;a href="http://devproj20.blogspot.com/2007/06/tech-ed-day-4-more-on-c-30.html"&gt;C#&lt;/a&gt; and &lt;a href="http://devproj20.blogspot.com/2007/06/tech-ed-day-2-dead-phones-dehydration.html"&gt;LINQ&lt;/a&gt; at &lt;a href="http://devproj20.blogspot.com/search/label/Tech%20Ed"&gt;Tech Ed&lt;/a&gt; earlier this year I'm itching to try some of it out when I get the chance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-1974554935913388841?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/1974554935913388841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=1974554935913388841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1974554935913388841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1974554935913388841'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/how-c-30-and-linq-evolved.html' title='How C# 3.0 and LINQ Evolved'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3804560186400865117</id><published>2007-09-07T08:53:00.000+01:00</published><updated>2007-09-07T08:56:46.488+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>My Internet is back</title><content type='html'>I've now got a new cable modem, and things are eventually beginning to look up on the &lt;a href="http://devproj20.blogspot.com/2007/09/angry-with-no-internet.html"&gt;internet connectivity front&lt;/a&gt;.  I'd had that modem since about 2004, and the engineer thought it was time to get a new one.&lt;br /&gt;&lt;br /&gt;It's much smaller than the old one.  We'll see how it goes on the reliability front.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3804560186400865117?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3804560186400865117/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3804560186400865117' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3804560186400865117'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3804560186400865117'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/my-internet-is-back.html' title='My Internet is back'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3195674415178119508</id><published>2007-09-04T17:39:00.000+01:00</published><updated>2007-09-04T17:42:14.168+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Internet Problems Update</title><content type='html'>Apparently my internet provider think &lt;a href="http://devproj20.blogspot.com/2007/09/angry-with-no-internet.html"&gt;the connection problems&lt;/a&gt; are because my modem is broken, and they are sending an engineer around with a replacement on Thursday afternoon.&lt;br /&gt;&lt;br /&gt;We'll see if this fixes the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3195674415178119508?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3195674415178119508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3195674415178119508' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3195674415178119508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3195674415178119508'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/internet-update.html' title='Internet Problems Update'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-5910000241107852635</id><published>2007-09-04T12:20:00.000+01:00</published><updated>2007-09-04T12:24:38.204+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Code Samples'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Essential SQL Server Date, Time and DateTime Functions</title><content type='html'>Just found this article on &lt;a href="http://weblogs.sqlteam.com/jeffs/archive/2007/01/02/56079.aspx"&gt;Essential SQL Server Date, Time and DateTime Functions&lt;/a&gt;.  Has some handy functions you can add to get the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get just the date part of a DateTime value&lt;/li&gt;&lt;li&gt;Get the time part of a DateTime value&lt;/li&gt;&lt;li&gt;Create a DateTime value with explicit Day, Month, Year, Hour Minute and Second parts&lt;/li&gt;&lt;li&gt;Create just a time value (with the date section set to a 'base' date)&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/6691579676571716537-5910000241107852635?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/5910000241107852635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=5910000241107852635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5910000241107852635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5910000241107852635'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/essential-sql-server-date-time-and.html' title='Essential SQL Server Date, Time and DateTime Functions'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8198370253300676230</id><published>2007-09-04T09:06:00.000+01:00</published><updated>2007-09-04T11:37:25.716+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Angry with No Internet</title><content type='html'>I had a plan to play with the &lt;a href="http://code.google.com/apis/blogger/overview.html"&gt;Google Blogger API&lt;/a&gt; last night in order to write an application that would allow me to &lt;a href="http://devproj20.blogspot.com/2007/05/posting-code-on-bloggercom.html"&gt;upload code samples to this blog&lt;/a&gt; more easily than at present, but as I got home my internet connection was down yet again.&lt;br /&gt;&lt;br /&gt;I won't name the company in question, but I connect to the internet at home through a well known supplier here in the UK, but just recently the levels of service I've been receiving have been shocking.  I'm having to reboot the cable modem on a daily basis whereas before a few weeks ago I rarely, if ever, had to do this.&lt;br /&gt;&lt;br /&gt;And it appeared that last night was going to be the same.  Switched on the laptop, watched &lt;a href="http://free.grisoft.com/"&gt;AVG&lt;/a&gt; try (and fail) to update itself, followed by the &lt;a href="http://toolbar.google.com/gmail-helper/notifier_windows.html"&gt;GMail Notifier&lt;/a&gt;'s exclamation mark proclaiming it couldn't establish a connection.  So off I trudged, yet again, to unplug the cable modem.  Wait two minutes.  Switch cable modem back on.  Off I trudged back to my laptop.&lt;br /&gt;&lt;br /&gt;Still no connection.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Sigh&lt;/span&gt;.  Unplug cable modem again.  Wait 10 minutes this time.  Switch back on.  And nothing.&lt;br /&gt;&lt;br /&gt;So I phone their customer services number, only to be told I must pay a 10p connection fee, and then it would be a 25p a minute phone call... How can any company think it's a good idea to charge premium rates for requesting help?  This is worse than &lt;a href="http://devproj20.blogspot.com/2007/08/surefire-money-maker.html"&gt;the company who demand payment to fix bugs&lt;/a&gt; in their software!  It wouldn't be so bad except this company is notorious for leaving you on hold for at least 20-30 minutes.&lt;br /&gt;&lt;br /&gt;Gritting my teeth I resorted to emailing them... but can I find an email address to send to?  No.  I looked back through the recent bills for one, but there's nothing there.&lt;br /&gt;&lt;br /&gt;I pulled out the emergency &lt;a href="http://www.gsmliberty.net/shop/nokia-dku5-data-cable-p-1081.html"&gt;DKU-2 cable&lt;/a&gt; I have and connected my &lt;a href="http://europe.nokia.com/A4142044"&gt;Nokia 6230i&lt;/a&gt; to my laptop.  &lt;a href="http://europe.nokia.com/A4144903"&gt;Nokia PC Suite&lt;/a&gt; allows you to connect to the internet over your mobile phone, so I connected and went to the offending company's website.  The only thing I could find was a General Enquiries email form--and I'm pretty sure that won't be monitored out of office hours.&lt;br /&gt;&lt;br /&gt;So, no service, no free help on the phone, and seemingly no way of requesting help through email.&lt;br /&gt;&lt;br /&gt;I think it's about time I switched suppliers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8198370253300676230?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8198370253300676230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8198370253300676230' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8198370253300676230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8198370253300676230'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/angry-with-no-internet.html' title='Angry with No Internet'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7462521221041620841</id><published>2007-09-03T14:34:00.000+01:00</published><updated>2007-09-03T14:37:26.990+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Calling all drivers (in the UK at least)</title><content type='html'>Try out the &lt;a href="http://news.bbc.co.uk/1/hi/magazine/6976319.stm"&gt;BBC's Highway Code Quiz&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm not going to gloat over my 10 out of 10 score though, the questions didn't seem too difficult.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7462521221041620841?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7462521221041620841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7462521221041620841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7462521221041620841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7462521221041620841'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/09/calling-all-drivers-in-uk-at-least.html' title='Calling all drivers (in the UK at least)'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-798651840707468073</id><published>2007-08-31T09:58:00.000+01:00</published><updated>2007-08-31T10:19:37.295+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='COM+'/><title type='text'>Component Services Hanging When Connecting to Other Computers</title><content type='html'>The &lt;a href="http://www.microsoft.com/windowsserver2003/appserver/entsvcs.mspx"&gt;Component Services&lt;/a&gt; application under Administrative Tools allows you manage the COM+ applications on different computers on your network.  This is done by adding the computer to a list--a list which is then saved for the next time you open the application.&lt;br /&gt;&lt;br /&gt;While this means you don't need to keep adding a computer, it also causes the application to hang if a computer in the list no longer exists.&lt;br /&gt;&lt;br /&gt;If you have a computer in Component Services that no longer exists, you can make the application usable again by following these steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Open Component Services on the affected computer&lt;/li&gt;&lt;li&gt;Drop down into the Computers directory from the Component Services node&lt;/li&gt;&lt;li&gt;Make a note of the computer names in this list (apart from My Computer)&lt;/li&gt;&lt;li&gt;Close Component Services (you may need to kill the application from Task Manager)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Get the local IP address of another computer on your network that the affected computer can access&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Open the &lt;a href="http://en.wikipedia.org/wiki/Hosts_file"&gt;hosts file&lt;/a&gt; in a text editor (the file can be found in &lt;windowsdir&gt;\System32\drivers\etc\&lt;/li&gt;&lt;li&gt;Add entries for each computer name you noted, assigning the IP address from Step 5&lt;/li&gt;&lt;li&gt;Save the file&lt;/li&gt;&lt;li&gt;Reopen Component Service and drop down to the computers list&lt;/li&gt;&lt;li&gt;You may have to give it a few minutes, but now you should be able to select the other computers in the list and remove them&lt;/li&gt;&lt;li&gt;Edit the hosts file again to remove the entries you've added&lt;/li&gt;&lt;/ol&gt;Follow these steps and you should be able to get Component Services back in working order again.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-798651840707468073?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/798651840707468073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=798651840707468073' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/798651840707468073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/798651840707468073'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/component-services-hanging-when.html' title='Component Services Hanging When Connecting to Other Computers'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-4873988375614889186</id><published>2007-08-30T21:33:00.000+01:00</published><updated>2007-08-30T21:43:02.680+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>How to Complain</title><content type='html'>Partially inspired by &lt;a href="http://www.adambird.com/"&gt;Adam&lt;/a&gt;'s &lt;a href="http://www.adambird.com/2007/08/premium-rate-sms-abuse.html"&gt;Premium Rate SMS Abuse&lt;/a&gt; post, I thought I'd republish a post I made a few months back on a different blog about how to complain.  It doesn't fit in completely with the exact situation Adam discusses, but I feel there's a couple of things that are still relevant:&lt;br /&gt;&lt;br /&gt;We all have to complain at some point.  Some people feel the need to complain more than most, but sometimes something will happen that we have every right to complain about.  When that time comes it can often be frustrating even finding the person to complain to, so when you actually get to talk to someone tempers can already be frayed.&lt;br /&gt;&lt;br /&gt;I've been working with software for a number of years now, so I've been on the receiving end of a fair few complaints.  These have ranged from the perfectly calm, reasonable complaint over something that genuinely is a problem, to an angry, swearing marathon yelled down the phone at you as if you were some troublesome infant.  So I thought I would be in a position to share what makes a good complaint that can be resolved quickly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Make sure you actually have a problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Just because what you have isn't doing what you want it to do, doesn't mean it is not capable of doing it.  OK, you might have a problem with the usability of the product, but make sure you make that clear when you complain.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Make sure you can reproduce the problem&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Inconsistent error reports make it very difficult to track down problems.  If you can consistently cause an error by performing a set number of steps, then chances are the people trying to fix your problem will be able to as well.  Reproducing the problem in a controlled environment is the first step towards resolving a problem.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Be clear about what is wrong&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The chances are that the people looking at your problem will have a dozen or so other things to do at the same time.  Their time is better served fixing problems than deciphering what problem you are having.&lt;br /&gt;&lt;br /&gt;What were you doing before the problem?  What version of the software are you using? What data had you entered in? Have you been able to perform these steps before? If yes: has anything changed with your own system since that time? Do you have a customer reference that you can give so I can look at your call history?&lt;br /&gt;&lt;br /&gt;If you don't include answers to at least some of these questions in your initial report the people looking at your problem will just have to ask.  This takes time, especially if you are difficult to get in touch with.  This time could have been spent looking into why your problem was happening, if you had just provided a little more information into what problem you actually have.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4 For God's sake, just be polite!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Chances are that if you have a problem, you're not going to be too happy about it.  It's stopping you working in some way, otherwise it wouldn't be a problem.&lt;br /&gt;&lt;br /&gt;However angry or upset you are, take a few deep breaths and count to 10 before lifting up the phone and yelling at someone.  You'll be more concise when you're calm--people are more likely to help you when you are calm.&lt;br /&gt;&lt;br /&gt;Yes the person you speak to is probably being paid to help you, but that doesn't mean they have to like doing it.  If you are rude and aggressive the only thing they will want to do is get you off the phone.  They will tell you how you can fix the problem quickly, but this might not always solve the root cause of the problem.  Yes, they are being paid to help you, but they are not your slaves/pets/children.  They are still human beings with feelings that deserve to be respected.&lt;br /&gt;&lt;br /&gt;If you're calm and polite and raise an issue, you may get that same quick fix to get you on your way, but you're also more likely to remain in memory.  And who knows, maybe they'll pro actively let you know of better ways of solving the problem later.  Maybe they'll even thank you for highlighting an error they'd missed.&lt;br /&gt;&lt;br /&gt;You don't have to believe in karma to see that what goes around comes around.  If you're polite to them, then they will repay that by being polite to you.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. ...and shut up and listen to them!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This might seem obvious, but too many times people just don't listen to the help they are given.  Make sure you don't fall into this category.&lt;br /&gt;&lt;br /&gt;You might think you know what is causing the problem, and by all means offer this to them, as long as you are polite about it.  But if this doesn't turn out to be the issue, then don't cling to what you think is right!  Customer support does actually look into problems! They wouldn't tell you something different if it wasn't true!&lt;br /&gt;&lt;br /&gt;Listen to them, and understand what you are told.  Don't be too proud to say if you haven't understood.  They should be able to tell you again using concepts you're familiar with.  If you still can't understand then get them to write it down so you can forward it to someone who might.&lt;br /&gt;&lt;br /&gt;You don't want to have to call them again with the same problem do you?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6 Understand that calls are prioritised&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Your problem may be bugging you a lot, but if you are able to work around it, then your problem will be put lower in the pile of outstanding calls.  No company has the man-power to answer every support call it receives immediately, and critical problems will always be investigated first.&lt;br /&gt;&lt;br /&gt;If your problem is that you don't like that you can't change the order of some data in the application you are using, then this will fall behind a call from another company for which the application doesn't work at all.&lt;br /&gt;&lt;br /&gt;All customers are important, and all customer support calls deserve to be answered promptly.  But understand that not all calls can be solved immediately, so don't get angry and think you've been forgotten.  The company that you are dealing with does value your custom and your call, but you have to understand that you are not their only customer, and occasionally other customers' calls need to be dealt with before yours.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-4873988375614889186?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/4873988375614889186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=4873988375614889186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4873988375614889186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/4873988375614889186'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/how-to-complain.html' title='How to Complain'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-6321859672736759506</id><published>2007-08-30T09:10:00.000+01:00</published><updated>2007-08-30T09:38:25.679+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Surefire Money Maker</title><content type='html'>Anyone who has written a non-trivial piece of software will be aware that the occasional bug is inevitable.  Unit and acceptance testing, and a QA process can limit the number of bugs that can creep out into the wild, but there will always be the odd bug out there.&lt;br /&gt;&lt;br /&gt;If a company releases  a piece of software that stops customers working, it is up to that company to put it right as soon as possible.&lt;br /&gt;&lt;br /&gt;I was talking to a friend this week who tells me that not all software companies follow this rule.  He's a software developer too, and (as I understand it) most of his work is dependant on a piece of software provided by another company.&lt;br /&gt;&lt;br /&gt;He found a bug with this piece of software that caused it to be pretty unusable, so filed a bug report, only to be told &lt;span style="font-weight: bold;"&gt;he must pay to have this bug fixed&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;How about that?  A company has released a defective piece of software to a paying customer, and then told that customer they must pay an additional charge to get it working properly.&lt;br /&gt;&lt;br /&gt;Talk about a guaranteed money maker.&lt;br /&gt;&lt;br /&gt;I suppose this is where the software's licence agreement comes in, which usually has a clause saying something like "we make no guarantee that this software will do anything you need it to, including the purpose we sold it to you for".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6321859672736759506?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6321859672736759506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6321859672736759506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6321859672736759506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6321859672736759506'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/surefire-money-maker.html' title='Surefire Money Maker'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-5887041000738360054</id><published>2007-08-29T10:47:00.000+01:00</published><updated>2007-08-29T10:53:07.755+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>Potential Breaking Change For API Customers</title><content type='html'>We are currently working on reassembling multipart inbound messages before they are placed into inboxes, which has the effect of increasing the maximum length of an inbound message from 160 to a purely theoretical 38,862 characters.&lt;br /&gt;&lt;br /&gt;Esendex customers who use the API to receive inbound messages and have restricted their systems to the current 160 maximum will need to increase their current restrictions.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devproj20.blogspot.com/2007/08/esendex-inbound-multipart-messaging.html"&gt;Read more here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-5887041000738360054?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/5887041000738360054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=5887041000738360054' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5887041000738360054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/5887041000738360054'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/potential-breaking-change-for-api.html' title='Potential Breaking Change For API Customers'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3747306371442487819</id><published>2007-08-29T08:56:00.000+01:00</published><updated>2007-08-29T10:46:17.291+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Esendex'/><title type='text'>Esendex Inbound Multipart Messaging Update</title><content type='html'>Most people who use SMS will know that a &lt;a href="http://www.nowsms.com/discus/messages/1/207.html"&gt;standard SMS message is limited to 160 characters&lt;/a&gt; (using a standard 7-bit character set).  But most people will also know that mobile phones are capable of sending a message of more than this.&lt;br /&gt;&lt;br /&gt;The phone does it by &lt;a href="http://discussion.forum.nokia.com/forum/showthread.php?t=74671"&gt;splitting the message into parts&lt;/a&gt;, and placing a header on each part that describes:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;how many total parts there are in the message&lt;/li&gt;&lt;br /&gt;&lt;li&gt;which part this current segment is&lt;/li&gt;&lt;br /&gt;&lt;li&gt;a reference so parts from different messages don't get mixed up&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://www.esendex.com/uk/News-2006-Q1-Esendex-introduces-long-messaging-feature-to-Web-SMS.aspx"&gt;Esendex's outbound service has supported sending these long messages&lt;/a&gt; for more than a year, but at the moment we treat inbound message parts as separate messages.&lt;br /&gt;&lt;br /&gt;We're currently working on an update that will cause these message parts to be reassembled into one message, so all parts (or however many parts we actually receive) will be displayed as 1 message in the Inbox.&lt;br /&gt;&lt;br /&gt;So what is this going to affect?  Well, if you use the &lt;a href="http://www.esendex.com/uk/Products-web-sms.aspx"&gt;website to view your inbox&lt;/a&gt;, or have &lt;a href="http://www.esendex.com/uk/Products-email-sms.aspx"&gt;your messages emailed to you&lt;/a&gt;, then this won't affect you at all--all you will see is a longer than usual message if a multipart message is sent to your account.&lt;br /&gt;&lt;br /&gt;However, if you have &lt;a href="http://www.esendex.com/uk/Products-SMS-SDK.aspx"&gt;written an application&lt;/a&gt; that &lt;a href="http://www.esendex.com/support/SMS-API-Receive-SMS.aspx"&gt;retrieves your messages from your Inbox&lt;/a&gt;, or which receives direct messages through the &lt;a href="http://www.esendex.com/support/SMS-API-Account-Event-Handler.aspx"&gt;Application Notification service&lt;/a&gt;, then this could potentially be a breaking change.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;If you are expecting a message to be a maximum of 160 characters, you will need to modify your code and/or database tables to accept messages longer than this&lt;/span&gt;.  If you need to apply a maximum length, then the limit of 1 Esendex inbound message will now be based on the total characters in the maximum number of parts allowed by the specification.&lt;br /&gt;&lt;br /&gt;The maximum number of parts is stored in an unsigned byte starting at 1, which gives a potential for 254 parts(!).  &lt;span style="font-style: italic;"&gt;Each part can have 153 characters, which gives a technical maximum of 38,862 characters in an inbound message&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;However, I seriously doubt any provider or phone manufacturer will allow anyone to send a 254 part message.  I certainly know that phones have their own limits on the number of parts a handset can send.&lt;br /&gt;&lt;br /&gt;As an example Esendex's outbound service limits you to sending 4 message parts, or a total of 612 characters.&lt;br /&gt;&lt;br /&gt;A maximum of something like 1000 characters should probably handle most cases, but the potential is there for 10s of thousands of characters under the right circumstances.&lt;br /&gt;&lt;br /&gt;This update is currently in development and will hopefully be going live in September sometime.  I've been told an email will be sent around to API customers giving an official announcement, but you can get a head start on any changes you need to make right now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3747306371442487819?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3747306371442487819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3747306371442487819' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3747306371442487819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3747306371442487819'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/esendex-inbound-multipart-messaging.html' title='Esendex Inbound Multipart Messaging Update'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-180707926418484050</id><published>2007-08-22T10:08:00.000+01:00</published><updated>2007-08-22T10:29:31.081+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Logging'/><title type='text'>Enable Internal System.Net Logging</title><content type='html'>Having trouble with certificates while requesting information using &lt;a href="http://msdn2.microsoft.com/en-us/library/system.net.httpwebrequest(vs.80).aspx"&gt;HttpWebRequest&lt;/a&gt;, manifesting itself with the error "&lt;span style="color: rgb(255, 0, 0); font-family: courier new;"&gt;Could not create SSL/TLS secure channel&lt;/span&gt;".  As far as we could tell the certificate should have been ok.&lt;br /&gt;&lt;br /&gt;To diagnose the problem I found this great blog post to enable the &lt;a href="http://blogs.msdn.com/dgorti/archive/2005/09/18/471003.aspx"&gt;internal logging from the System.Net classes&lt;/a&gt; by &lt;a href="http://blogs.msdn.com/dgorti/default.aspx"&gt;Durgaprasad Gorti&lt;/a&gt; over at the &lt;a href="http://blogs.msdn.com/"&gt;MSDN Blogs.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Just needs a new section in the &lt;a href="http://msdn2.microsoft.com/en-us/library/ms184658(vs.80).aspx"&gt;app.Config file&lt;/a&gt; to log out what the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.net.aspx"&gt;System.Net&lt;/a&gt; classes are doing.  One of the samples in the blog post worked straight off for me:&lt;br /&gt;&lt;br /&gt;&lt;FONT face="Courier New" color=#ff0000&gt;&amp;lt;?xml version="1.0" encoding="UTF-8" ?&amp;gt;&lt;BR&gt;&amp;lt;configuration&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;system.diagnostics&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;trace autoflush="true" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sources&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;source name="System.Net" maxdatasize="1024"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;listeners&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="MyTraceFile"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/listeners&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/source&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;source name="System.Net.Sockets" maxdatasize="1024"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;listeners&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="MyTraceFile"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/listeners&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/source&amp;gt;&amp;nbsp;&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/sources&amp;gt;&lt;/FONT&gt;&lt;/P&gt;&lt;br /&gt;&lt;br /&gt;&lt;P&gt;&lt;FONT face="Courier New" color=#ff0000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;sharedListeners&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name="MyTraceFile"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; type="System.Diagnostics.TextWriterTraceListener"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; initializeData="System.Net.trace.log"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/sharedListeners&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;switches&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add name="System.Net" value="Verbose" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;add name="System.Net.Sockets" value="Verbose" /&amp;gt; &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/switches&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/system.diagnostics&amp;gt;&lt;BR&gt;&amp;lt;/configuration&amp;gt;&lt;/FONT&gt;&lt;br /&gt;&lt;br /&gt;It creates a file called System.Net.trace.log in the directory where the EXE is running.  The logging is very comprehensive and will point you in the right direction for fixing your problems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-180707926418484050?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/180707926418484050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=180707926418484050' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/180707926418484050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/180707926418484050'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/enable-internal-systemnet-logging.html' title='Enable Internal System.Net Logging'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-208120561915910506</id><published>2007-08-20T21:58:00.000+01:00</published><updated>2007-08-20T22:03:54.574+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blogging'/><title type='text'>Ohh.. Polls</title><content type='html'>Maybe I'm behind the times a bit with this, but I've found &lt;a href="http://bloggerindraft.blogspot.com/search/label/polls"&gt;you can add polls to your BlogSpot blogs&lt;/a&gt;.  They're a page element you can add from the Template tab.  I'm sure it wasn't there the last time I looked.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-208120561915910506?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/208120561915910506/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=208120561915910506' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/208120561915910506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/208120561915910506'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/ohh-polls.html' title='Ohh.. Polls'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2180689258057270528</id><published>2007-08-20T21:26:00.000+01:00</published><updated>2007-08-20T21:34:34.195+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Blog Rethink</title><content type='html'>I grow tired of maintaining two blogs so I've decided to scrap my &lt;a href="http://ian-dykes.blogspot.com/"&gt;personal blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I'm keeping the blog you're reading now since it gets more traffic and has external links to it.  But I've renamed it as my personal blog instead of Development Blog.&lt;br /&gt;&lt;br /&gt;There'll be no changes in the address though, so the only thing you may notice is the odd post that isn't about software development--something that's been happening lately anyway.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2180689258057270528?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2180689258057270528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2180689258057270528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2180689258057270528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2180689258057270528'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/blog-rethink.html' title='Blog Rethink'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3480095271703309988</id><published>2007-08-20T17:25:00.001+01:00</published><updated>2007-08-20T17:31:25.445+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Jeremy Vine Steps Up</title><content type='html'>The BBC News article &lt;a href="http://news.bbc.co.uk/1/hi/magazine/6954778.stm"&gt;Unmitigated ferocity, here I come&lt;/a&gt; caught my eye during my lunchtime news fix.  In it &lt;a href="http://en.wikipedia.org/wiki/Jeremy_Vine"&gt;Jeremy Vine&lt;/a&gt; talks about an incident he witnessed on the tube in which a man harassed a female passenger while the rest of the carriage looked on.  As the man left, and the doors closed, another passenger flicked two fingers at him, only for the man to return and beat up the passenger when the doors happened to reopen.&lt;br /&gt;&lt;br /&gt;This type of violence is now getting more common in most of the large towns and cities in Britain, and people lucky enough to have not experienced it first hand will probably think that they would not sit idly by and be a silent witness to it.&lt;br /&gt;&lt;br /&gt;The reality, as Vine states, is quite different.  As a nation we are relatively introverted and most people just want to get on with their day and not get involved.  Plus there's the additional risks of getting the beating yourself, or being charged with assault if you happen to succeed in placating the thug.&lt;br /&gt;&lt;br /&gt;As someone who has been on the receiving end of such violence the article struck a particular chord with me.&lt;br /&gt;&lt;br /&gt;After a night out with friends I sat on the last bus home opposite two men (one older than the other) flanking a young woman looking very worse for wear and with no shoes on.  I remember asking the older man (who was already glaring at me) if she was ok with no shoes on.  For my trouble I got a stream of obscenities, but worse was to come when the bus approached my stop.&lt;br /&gt;&lt;br /&gt;All three followed me from the bus and started kicking and punching until I managed to push past the shoeless girl and get away.  Luckily they didn't pursue, as I was bleeding from my head and spent the rest of the night in Kings Mill Hospital.&lt;br /&gt;&lt;br /&gt;Calling an ambulance for an assault led to a police report being filed for an &lt;a href="http://en.wikipedia.org/wiki/Actual_bodily_harm"&gt;ABH&lt;/a&gt;, and although I went through a number of mugshots and indicated a couple of potentials, nothing else has happened.  Apparently the &lt;a href="http://en.wikipedia.org/wiki/Closed-circuit_television"&gt;CCTV&lt;/a&gt; on the bus was not working on that night.&lt;br /&gt;&lt;br /&gt;In hindsight I would have loved to have turned the violence back on them, but at the time all I could think was "This hurts, I need to get away", rather than "This hurts, I need to hurt them too".  I suspect that this is the thought most people would have given a similar situation.&lt;br /&gt;&lt;br /&gt;I would have liked for someone to help as Vine says he will do from now on, but I understood then as I do now the risks that someone else would be taking on my behalf.  It's OK standing up to verbal abuse as he did on the bus, but wading into a fistfight is something else entirely.&lt;br /&gt;&lt;br /&gt;I know I won't be physically fighting for a stranger any time soon, I prefer to keep my head down to avoid such confrontations in the first place.  But I do admit that it is this mindset that is partially responsible for the violence we see now on almost a daily basis in the news.&lt;br /&gt;&lt;br /&gt;Vine is right, by doing nothing we give the thugs permission to carry on as they are.  But members of the public aren't the right people to be stopping such violence.  Police do wade in and break up these fights when they happen late at night in the city centres, but who will stop the violence elsewhere?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3480095271703309988?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3480095271703309988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3480095271703309988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3480095271703309988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3480095271703309988'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/jeremy-vine-steps-up.html' title='Jeremy Vine Steps Up'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-1750080783580069423</id><published>2007-08-20T12:02:00.000+01:00</published><updated>2007-08-20T12:19:45.666+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='TransactionScope'/><title type='text'>TransactionScope Stumbling Block</title><content type='html'>I returned to work this morning after a week's holiday to discover that &lt;a href="http://nicholasbruce.blogspot.com/2007/08/transaction-scope-hopes-dashed.html"&gt;all was not well in the TransactionScope camp&lt;/a&gt;.  A certain four letter word that I won't repeat here sprang immediately to mind.&lt;br /&gt;&lt;br /&gt;Luckily, &lt;a href="http://www.adambird.com/2007/08/in-extreme-programming-world-dont.html"&gt;tests had highlighted the problem&lt;/a&gt; before this went live, but the setback is disappointing at best and for me it's personally infuriating as I was the person who suggested it and took the lead in its development.&lt;br /&gt;&lt;br /&gt;I've not had chance to look in a great depth at what the team investigated during my absence, but there might be a light at the end of the tunnel.  The articles Nicholas has linked to (articles &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=626675&amp;SiteID=1"&gt;1&lt;/a&gt;, &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=113669&amp;amp;SiteID=1"&gt;2&lt;/a&gt; and &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=531830&amp;amp;SiteID=1"&gt;3&lt;/a&gt; for your convenience) certainly suggests a reason to the problems we are seeing, but they might not be the root cause of the particular problems that the tests highlighted.&lt;br /&gt;&lt;br /&gt;I mocked up an application involving instantiating two SqlConnection objects enlisting in the same &lt;a href="http://msdn2.microsoft.com/en-us/library/system.transactions.transactionscope.aspx"&gt;TransactionScope&lt;/a&gt; weeks ago, prior to even suggesting we implement the pattern fully, and saw no problems with it.&lt;br /&gt;&lt;br /&gt;Could this problem be purely down to a long running transaction timing out?&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://nicholasbruce.blogspot.com/"&gt;Nick's&lt;/a&gt; words: To be continued...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-1750080783580069423?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/1750080783580069423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=1750080783580069423' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1750080783580069423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1750080783580069423'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/transactionscope-stumbling-block.html' title='TransactionScope Stumbling Block'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2948268321016031536</id><published>2007-08-09T09:48:00.000+01:00</published><updated>2007-08-09T10:02:00.378+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><title type='text'>Problems Rotating Models in XNA</title><content type='html'>After finding &lt;a href="http://www.blender.org/"&gt;Blender&lt;/a&gt; I've created some simple cubes and exported them into an XNA project.  I want to rotate these after receiving input from the GamePad (although currently I'm testing with the Keyboard).&lt;br /&gt;&lt;br /&gt;The idea that I have calls for the cubes to be rotated 90 degrees after a button press.  The camera isn't moving, so having a cube rotate in this way means that the cube will always be displaying a full face.&lt;br /&gt;&lt;br /&gt;I've figured out how to rotate, but as soon as I rotate around more than 1 axis I have to consider which direction the cube is facing to determine which direction I should rotate based on the next button press.&lt;br /&gt;&lt;br /&gt;The cube needs to rotate up and down, and left and right, and the buttons to do this should be the same regardless of the cube's current orientation.  My initial simple hamfisted attempt at rotating didn't take this into account.  So if I rotated left and then pressed the button to rotate up, the model twists clockwise.&lt;br /&gt;&lt;br /&gt;I rather stupidly failed to realise that the rotations are being done in relation to the model. Hindsight tells me how stupid I am for not realising this--how difficult would model movement and rotation be if everything was done in relation to the camera or an absolute point?&lt;br /&gt;&lt;br /&gt;But now I know this it's got me wondering how I can achieve what I need.  I suspect I need to store the current orientation of the cube, and then based on this determine which way is up so I can rotate accordingly.&lt;br /&gt;&lt;br /&gt;Anyone have any experience of rotating models in this way?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2948268321016031536?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2948268321016031536/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2948268321016031536' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2948268321016031536'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2948268321016031536'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/problems-rotating-models-in-xna.html' title='Problems Rotating Models in XNA'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6691579676571716537.post-1508441921686237928</id><published>2007-08-09T09:13:00.000+01:00</published><updated>2007-08-09T09:15:11.726+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><title type='text'>XNA Arcade</title><content type='html'>Over at &lt;a href="http://ziggyware.blogspot.com/"&gt;Ziggyware XNA News&lt;/a&gt; there's a post about &lt;a href="http://ziggyware.blogspot.com/2007/08/xna-arcade.html"&gt;XNA Arcade&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kyleschouviller.com/"&gt;Kyle Schouviller&lt;/a&gt;'s created the application to allow people to easily distribute their XNA games.&lt;br /&gt;&lt;br /&gt;Haven't checked it out yet, and it is still in it's alpha stage, but the concept certainly sounds interesting.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.kyleschouviller.com/index.php/xna-arcade-alpha-1/"&gt;Check out the application here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-1508441921686237928?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/1508441921686237928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=1508441921686237928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1508441921686237928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1508441921686237928'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/xna-arcade.html' title='XNA Arcade'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-1392035370299745765</id><published>2007-08-02T14:24:00.001+01:00</published><updated>2007-08-20T12:21:51.546+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Carbon emissions in Walkers Crisps</title><content type='html'>Had a pack of Walkers Crisps at lunch, and noticed on the back it says "75g of Carbon emissions calculated per pack".  And this is on a standard packet of 34.5g crisps.&lt;br /&gt;&lt;br /&gt;While I admire Walkers for their transparency when it comes to the carbon emissions I can't help but wonder what they're expecting their customers to do with the information.  Am I more likely to buy a snack that has a lower "carbon footprint" than another?  Well, probably not, but maybe.  I suspect we like to think we buy food based on things like taste and nutritional content, but like it on not we are all swayed by things like packaging and the perceived image of the product.&lt;br /&gt;&lt;br /&gt;So now along with checking how much fat, salt, sugar and calories are in our food, must we now check the carbon emissions too?&lt;br /&gt;&lt;br /&gt;And if I do stop buying food that has high carbon emissions, is it going to make any difference?  The food has already been manufactured by that point--any damage already done.  It would take a lot of customers turning away from high carbon foods to make a manufacturer modify their process to reduce their emissions, and I doubt enough people care to make that happen.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-1392035370299745765?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/1392035370299745765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=1392035370299745765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1392035370299745765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/1392035370299745765'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/carbon-emissions-in-walkers-crisps.html' title='Carbon emissions in Walkers Crisps'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8909226402718908087</id><published>2007-08-02T12:49:00.000+01:00</published><updated>2007-08-02T13:10:35.418+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.Net 2'/><category scheme='http://www.blogger.com/atom/ns#' term='Vista'/><title type='text'>Culture name 'az-az-latn' is not supported.</title><content type='html'>Check out the &lt;a href="http://msdn2.microsoft.com/en-us/library/system.globalization.cultureinfo.aspx"&gt;list of cultures that the .Net Framework supports&lt;/a&gt;, and you'll see that there is no entry for "az-az-latn", and unless you've got this culture string saved somewhere you might be wondering where it's coming from.  Well, look in the text above the list on the same page and you'll come across this little gem:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;On Windows Vista and later, a culture name including a script can be rendered using the pattern &lt;span style="font-family:courier new;"&gt;&lt;languagecode2&gt;-&lt;scripttag&gt;-&lt;country regioncode2=""&gt;&lt;/country&gt;&lt;/scripttag&gt;&lt;/languagecode2&gt;&lt;/span&gt;. An example of this type of culture name is&lt;span style="font-weight: bold;"&gt; uz-Cyrl-UZ&lt;/span&gt; for Uzbek (Uzbekistan, Cyrillic). On pre-Windows Vista operating systems, a culture name including a script is rendered using the pattern &lt;span style="font-family:courier new;"&gt;&lt;languagecode2&gt;-&lt;country regioncode2=""&gt;-&lt;scripttag&gt;&lt;/scripttag&gt;&lt;/country&gt;&lt;/languagecode2&gt;&lt;/span&gt;, for example, &lt;span style="font-weight: bold;"&gt;uz-UZ-Cyrl&lt;/span&gt; for Uzbek (Uzbekistan, Cyrillic)&lt;/blockquote&gt;&lt;br /&gt;So following this pattern "az-az-latn" is an example of a culture name including a script on a pre-Windows Vista operating system.  As we don't run Vista on any of our machines we found it a little puzzling that this error should be being thrown: we have a pre-Vista OS using pre-Vista culture names.&lt;br /&gt;&lt;br /&gt;Then we realised that a number of updates had recently been applied, one of which was for the .Net Framework.  By the looks of it, this .Net Framework update has changed the style of culture names to be the same as the ones on Vista.  Our assembly had old culture names cached, so simply restarting after the update cures the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8909226402718908087?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8909226402718908087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8909226402718908087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8909226402718908087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8909226402718908087'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/culture-name-az-az-latn-is-not.html' title='Culture name &apos;az-az-latn&apos; is not supported.'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2024700288718628155</id><published>2007-08-01T09:09:00.000+01:00</published><updated>2007-08-01T09:19:47.022+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Threading'/><title type='text'>Exceptions from Threads in Threadpool</title><content type='html'>I've had a question in a comment of &lt;a href="http://devproj20.blogspot.com/2007/03/eventtype-clr20r3-from-windows-service.html"&gt;EventType clr20r3 From Windows Service&lt;/a&gt; from &lt;a href="http://www.blogger.com/profile/16716377908657903464"&gt;quantboy&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;if a thread from the threadpool throws, can you prevent that exception from taking down the entire application by wrapping the code that thread runs within a try-catch block?&lt;/blockquote&gt;&lt;br /&gt;Simple answer from my experience is yes.  The only time we've seen a thread take down an application is when it throws something out of the method that the thread is running.  Simply wrapping that code in a try...catch allows the thread to stop gracefully, and if you place some logging in the catch block you'll get much more meaningful errors.&lt;br /&gt;&lt;br /&gt;Then you should be able to work towards fixing why the method is throwing in the first place :).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2024700288718628155?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2024700288718628155/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2024700288718628155' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2024700288718628155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2024700288718628155'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/08/exceptions-from-threads-in-threadpool.html' title='Exceptions from Threads in Threadpool'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-6724159282690806854</id><published>2007-07-31T08:57:00.000+01:00</published><updated>2007-07-31T09:04:49.006+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Blender'/><title type='text'>Getting Started with Blender 3D and XNA</title><content type='html'>&lt;a href="http://www.virtualrealm.com.au/blogs/mykre/"&gt;Glenn&lt;/a&gt;'s posted a comment on&lt;a href="http://devproj20.blogspot.com/2007/07/free-3d-modelling-software.html"&gt; one of my Blender posts&lt;/a&gt; to an article he's written about exporting Blender's 3D models into Game Studio Express.&lt;br /&gt;&lt;br /&gt;Check out &lt;a href="http://www.virtualrealm.com.au/blogs/mykre/archive/2007/07/21/getting-started-with-blender-3d-and-xna.aspx"&gt;Getting Started with Blender 3D and XNA&lt;/a&gt; for more information.&lt;br /&gt;&lt;br /&gt;I'll need to make some models first, but when I've done that this article should provide some much needed assistance.&lt;br /&gt;&lt;br /&gt;Thanks Glenn&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6724159282690806854?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6724159282690806854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6724159282690806854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6724159282690806854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6724159282690806854'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/getting-started-with-blender-3d-and-xna.html' title='Getting Started with Blender 3D and XNA'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8354212489241028072</id><published>2007-07-30T21:27:00.001+01:00</published><updated>2007-07-30T21:34:28.629+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blender'/><title type='text'>Brilliant Blender Tutorials</title><content type='html'>Just starting out with &lt;a href="http://www.blender.org/"&gt;Blender&lt;/a&gt; and I have just discovered something that might be really obvious to other people out there.  Linked from the Blender website is the &lt;a href="http://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro"&gt;Blender 3D: Noob to Pro guide&lt;/a&gt;, which I am finding very comprehensive.  I feel I am beginning to get somewhere with it, rather than just staring at a very complicated looking user interface.&lt;br /&gt;&lt;br /&gt;I'm only up to &lt;a href="http://en.wikibooks.org/wiki/Blender_3D:_Noob_to_Pro/Modeling_a_Simple_Person"&gt;Modeling a Simple Person&lt;/a&gt;, but it's looking very helpful indeed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8354212489241028072?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8354212489241028072/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8354212489241028072' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8354212489241028072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8354212489241028072'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/brilliant-blender-tutorials.html' title='Brilliant Blender Tutorials'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-565765083869296028</id><published>2007-07-30T14:11:00.001+01:00</published><updated>2007-07-30T14:16:58.215+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><category scheme='http://www.blogger.com/atom/ns#' term='Blender'/><title type='text'>Blender - Free 3D Modelling Software</title><content type='html'>I've had an &lt;a href="http://devproj20.blogspot.com/2007/05/introduction-to-3d-in-xna.html"&gt;anonymous comment left on a post&lt;/a&gt; in which I asked if anyone knew of anything free I could download to create some 3D models for an XNA game I want to start.&lt;br /&gt;&lt;br /&gt;The comment suggested &lt;a href="http://www.blender.org/"&gt;Blender&lt;/a&gt;, so I've &lt;a href="http://www.blender.org/download/get-blender/"&gt;downloaded&lt;/a&gt; it and given it a go.  Seeing as I've done zero 3D modelling before it's going to be a steep learning curve, but there seems to be tutorials to walk you through most of it.  There's DirectX's .X format in the Export list as well, so hopefully this should be all I need.&lt;br /&gt;&lt;br /&gt;Thanks for the heads up who ever you are.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-565765083869296028?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/565765083869296028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=565765083869296028' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/565765083869296028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/565765083869296028'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/free-3d-modelling-software.html' title='Blender - Free 3D Modelling Software'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-6459384376658242923</id><published>2007-07-27T09:11:00.000+01:00</published><updated>2007-08-20T12:22:10.298+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>"User" terminology revisited</title><content type='html'>&lt;a href="http://julian-hucker.blogspot.com/"&gt;Julian&lt;/a&gt;'s added a comment on &lt;a href="http://devproj20.blogspot.com/2007/07/interesting-point-about-users.html"&gt;my previous post&lt;/a&gt; asking what we call "users" if we want to get away from using that term explicitly.&lt;br /&gt;&lt;br /&gt;There are comments on &lt;a href="http://blogs.forrester.com/charleneli/2007/07/im-sick-of-user.html"&gt;the original post that I linked to&lt;/a&gt; that discuss some alternatives, with most people concentrating on the relationships between the two parties.  &lt;a href="http://www.typepad.com/t/comments?__mode=red&amp;user_id=146365&amp;amp;id=77206350"&gt;Tim Harrion&lt;/a&gt;'s remark "How about terms like readers, members, contributors, visitors, or guests?" is particularly apt in this regard.&lt;br /&gt;&lt;br /&gt;Companies have customers, blogs have readers, forums have contributers, a website has visitors.  Just because they are using a piece of technology to perform some task doesn't necessarily mean that they should be referred to solely as "users" of that technology.&lt;br /&gt;&lt;br /&gt;People don't become &lt;a href="http://www.esendex.com/uk/Default.aspx"&gt;Esendex&lt;/a&gt; customers to use an ASP.Net web application to submit an SMS message to a mobile phone operator, they become customers to send text messages.&lt;br /&gt;&lt;br /&gt;I agree that it's not always going to be clear cut though.  The term "user" is so broad it encapsulates a number of relationships, and there are situations when it would be pointless to call them anything but users.  But the point that Josh was raising to was to stop thinking of people using technology, and to instead concentrate on what people want to do with your software.&lt;br /&gt;&lt;br /&gt;This may seem like a petty difference, but how many times have the software developers among you implemented something that you think is perfect and works flawlessly, only to be told by your customers "Well, that's cool, but that's not how we work"?&lt;br /&gt;&lt;br /&gt;Designers and developers should always be looking at what tasks people want to carry out rather than simply showcasing new technology.  Getting away from calling those people "users" can help in directing attention to doing this.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6459384376658242923?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6459384376658242923/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6459384376658242923' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6459384376658242923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6459384376658242923'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/user-terminology-revisited.html' title='&quot;User&quot; terminology revisited'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-494862090606392761</id><published>2007-07-26T21:22:00.000+01:00</published><updated>2007-07-26T21:29:57.541+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><title type='text'>Download XNA Card Game Code</title><content type='html'>Please feel free to &lt;a href="http://homepage.ntlworld.com/alan.dykes/files/ElevensGame.zip"&gt;download the code for the card game&lt;/a&gt; I wrote in XNA.  It's not the best card game to play, and I have no idea whether the code is correct from a gaming point of view, but if you want to take a look at a possible way of developing a card game, then you're welcome to take a look.&lt;br /&gt;&lt;br /&gt;If you're looking to write a card game and you need card graphics, then some are included in the download for you to use.&lt;br /&gt;&lt;br /&gt;If anyone finds it useful then please let me know.  The 3D game idea I had has fallen through a little as I can't find any free software that will allow me to create my own simple 3D models.  If anyone knows of one I can use, then let me know about that as well.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-494862090606392761?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/494862090606392761/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=494862090606392761' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/494862090606392761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/494862090606392761'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/download-xna-card-game-code.html' title='Download XNA Card Game Code'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6691579676571716537.post-8902635911922297198</id><published>2007-07-26T15:46:00.000+01:00</published><updated>2007-07-26T15:47:57.986+01:00</updated><title type='text'>Interesting point about "users"</title><content type='html'>&lt;a href="http://blogs.forrester.com/charleneli/2007/07/im-sick-of-user.html"&gt;Interesting post about using the term "users"&lt;/a&gt; when refering to people who visit your website, or are really your customers: &lt;blockquote&gt;Nobody talks about users of dishwashers, or users of retail stores, or users of telephones. So why are we talking about "users" of computers, browsers, and software?&lt;br /&gt;&lt;br /&gt;Try, just for a day, to stop using this word. You'll be amazed at how differently you think about the world.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8902635911922297198?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8902635911922297198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8902635911922297198' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8902635911922297198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8902635911922297198'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/interesting-point-about-users.html' title='Interesting point about &quot;users&quot;'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-7175799382917962279</id><published>2007-07-25T23:49:00.000+01:00</published><updated>2007-07-25T23:56:29.072+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XNA'/><title type='text'>My XNA Card Game - please wait a moment</title><content type='html'>Ken's posted comments on a &lt;a href="http://devproj20.blogspot.com/2007/05/xna-mouse-and-sprite-tests.html"&gt;couple&lt;/a&gt; of &lt;a href="http://devproj20.blogspot.com/2007/05/xna-game-studio-express.html"&gt;posts&lt;/a&gt; asking for the code for the card game that I wrote in XNA.  I'm glad someone asked as I'd totally forgotten I'd said I would make it available.&lt;br /&gt;&lt;br /&gt;It's woken me up from my XNA slumber, I've just had lots of things happening recently that I haven't had chance to look at it as much.&lt;br /&gt;&lt;br /&gt;I've packaged up the code as a download, but I can't find the login credentials for my FTP site right now, and it's getting late and I need to go to bed.&lt;br /&gt;&lt;br /&gt;I swear I'll upload the code tomorrow evening (UK time) and post a link here.  So just watch this space.&lt;br /&gt;&lt;br /&gt;Thanks&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-7175799382917962279?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/7175799382917962279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=7175799382917962279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7175799382917962279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/7175799382917962279'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/my-xna-card-game-please-wait-moment.html' title='My XNA Card Game - please wait a moment'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-8397992723047200498</id><published>2007-07-19T14:59:00.000+01:00</published><updated>2007-08-20T12:22:20.241+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>There's no water here today</title><content type='html'>Most of &lt;a href="http://news.bbc.co.uk/1/hi/england/nottinghamshire/6906288.stm"&gt;Nottingham city centre is currently without water&lt;/a&gt; due to a leak that &lt;a href="http://www.stwater.co.uk/"&gt;Severn Trent&lt;/a&gt; are struggling to find.  Water's been off since we got into the office this morning, but luckily we've got water in the cooler still, so drinks aren't a problem.  Toilets, on the hand...that's another thing ;)&lt;br /&gt;&lt;br /&gt;So, while parts of &lt;a href="http://news.bbc.co.uk/1/hi/england/north_yorkshire/6905882.stm"&gt;Yorkshire are under water&lt;/a&gt;, here in Nottingham we've got officials scratching their heads trying to find where the water's gone.&lt;br /&gt;&lt;br /&gt;But Esendex is struggling on regardless, just as long as the power holds out we'll be fine.  Hope that's not tempting fate... ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-8397992723047200498?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/8397992723047200498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=8397992723047200498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8397992723047200498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/8397992723047200498'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/theres-no-water-here-today.html' title='There&apos;s no water here today'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-720270144369502319</id><published>2007-07-18T17:41:00.000+01:00</published><updated>2007-07-19T10:37:09.628+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Logging'/><title type='text'>Is Log4cpp new, or has it been abandoned?</title><content type='html'>Any C++ programmers use &lt;a href="http://log4cpp.sourceforge.net/"&gt;Log4cpp&lt;/a&gt;?  For C# we use &lt;a href="http://logging.apache.org/log4net/"&gt;Log4net&lt;/a&gt; for logging, and when I found that&lt;a href="http://www.esendex.com/uk/Products-pc-sms.aspx"&gt; PC SMS&lt;/a&gt; used Log4cpp as it's logging framework I just assumed it would be as easy to configure as Log4net.&lt;br /&gt;&lt;br /&gt;But Log4net has a very active user community, and the &lt;a href="http://logging.apache.org/log4net/support.html"&gt;mailing list&lt;/a&gt; gets regular visits from the developers Ron and Nicko.  No so with Log4cpp.&lt;br /&gt;&lt;br /&gt;All I needed was a really simple basic setup to log to a file.  Could I find anything?  Well, would you find &lt;a href="http://log4cpp.sourceforge.net/api/classlog4cpp_1_1SimpleConfigurator.html#d0"&gt;this&lt;/a&gt; useful, which says "The configuration file format is undocumented and may change without notice".  Ok...&lt;br /&gt;&lt;br /&gt;Luckily I found the log4cpp.properties file buried within the tests directory of the log4cpp download, which goes some way to giving the example I needed.&lt;br /&gt;&lt;br /&gt;So, if anyone else is searching for the simplest Log4cpp configuration to log to a file, just use this:&lt;br /&gt;&lt;blockquote&gt;log4j.rootCategory=DEBUG, FILE&lt;br /&gt;&lt;br /&gt;appender.FILE=org.apache.log4j.FileAppender&lt;br /&gt;appender.FILE.fileName=c:\filename.log&lt;br /&gt;appender.FILE.layout=org.apache.log4j.BasicLayout&lt;/blockquote&gt;&lt;br /&gt;And no, that's not a typo, and I haven't cut and paste from the wrong file: Log4cpp uses Log4j stuff in its configuration file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-720270144369502319?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/720270144369502319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=720270144369502319' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/720270144369502319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/720270144369502319'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/is-log4cpp-new-or-has-it-been-abandoned.html' title='Is Log4cpp new, or has it been abandoned?'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6691579676571716537.post-6405120029240098024</id><published>2007-07-18T17:23:00.000+01:00</published><updated>2007-08-20T12:22:32.863+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Revisiting comments</title><content type='html'>Back in &lt;a href="http://devproj20.blogspot.com/2007_05_01_archive.html"&gt;May&lt;/a&gt; I wrote a &lt;a href="http://devproj20.blogspot.com/2007/05/how-to-keep-your-code-from-destroying.html"&gt;response&lt;/a&gt; to a &lt;a href="http://slashdot.org/"&gt;Slashdot&lt;/a&gt; &lt;a href="http://developers.slashdot.org/developers/07/05/30/1813247.shtml"&gt;article&lt;/a&gt; about writing comments.  The jist of my response was that most times you can get away with not writing them if you write self-documenting code.&lt;br /&gt;&lt;br /&gt;And the important part of this is the "self-documenting" part.  C# lends itself very well to being written in an easy to read fashion.  I can't say the same about C++.&lt;br /&gt;&lt;br /&gt;Like most computing graduates I have had exposure to C++, but all my commercial (i.e. real world) experience has been in C#.  Today I had to look at C++ code, and I didn't enjoy one bit of it.&lt;br /&gt;&lt;br /&gt;Esendex's &lt;a href="http://www.esendex.com/uk/Products-pc-sms.aspx"&gt;PC SMS&lt;/a&gt; &lt;a href="http://www.esendex.com/support/Downloads.aspx"&gt;download&lt;/a&gt; is a C++ Windows application that sits in the system tray, notifies you of new inbound messages and allows you to send SMS in much the same way as you would an email.  It's been around for a while now, but I can't say I've worked on any part of it.&lt;br /&gt;&lt;br /&gt;We had a customer today who reported that the application was having trouble with the initial connection.  Having no experience in commercial grade C++ applications I found it very difficult to track down even how to switch logging on.  A few comments here and there would have eased this greatly.&lt;br /&gt;&lt;br /&gt;But I still don't believe source code should be swamped with comments.  When you're working with a fluid code base (as you do with &lt;a href="http://en.wikipedia.org/wiki/Extreme_Programming"&gt;XP&lt;/a&gt;), code is continuously moved around as the design changes, and no one wants to maintain comments as well as code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-6405120029240098024?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/6405120029240098024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=6405120029240098024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6405120029240098024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/6405120029240098024'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/revisiting-comments.html' title='Revisiting comments'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-2003621287773255739</id><published>2007-07-05T20:56:00.000+01:00</published><updated>2007-08-20T12:22:39.957+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>Going Global</title><content type='html'>I must admit I wasn't expecting many people to read this blog when I first set out, but looking through my &lt;a href="https://www.google.com/analytics/"&gt;Google Analytics&lt;/a&gt; reports I've had visits from every continent now.&lt;br /&gt;&lt;br /&gt;Judging by the stats most of you are just viewing 1 page (with &lt;a href="http://devproj20.blogspot.com/2007/03/eventtype-clr20r3-from-windows-service.html"&gt;the post about EventType dr20r3&lt;/a&gt; leading the way) and are new visitors, but I don't mind that as long as you're finding something useful while you're here.&lt;br /&gt;&lt;br /&gt;The returning visitors among you may have noticed a new search bar in the corner, and I debated with myself for ages over whether or not to include it.  But, after manually scrolling through (often poorly labelled) posts, I thought it was about time to put one on and see how it looks.&lt;br /&gt;&lt;br /&gt;Just make sure you select the "My Blog" radio button if you want to search just my blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-2003621287773255739?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/2003621287773255739/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=2003621287773255739' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2003621287773255739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/2003621287773255739'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/going-global.html' title='Going Global'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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-6691579676571716537.post-3073129566675066840</id><published>2007-07-04T17:17:00.000+01:00</published><updated>2007-08-20T12:22:48.300+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Opinions'/><title type='text'>New Developers in an Agile Team</title><content type='html'>Two new developers, Jonathan and Andy, have started at &lt;a href="http://www.esendex.com/uk/"&gt;Esendex&lt;/a&gt; this past week, both fresh from university.  I'm sure they'll start their own blogs soon enough, so watch this space.&lt;br /&gt;&lt;br /&gt;It's got me thinking about the best way of introducing them to the work that they will be doing so that they can be productive as soon as possible.&lt;br /&gt;&lt;br /&gt;Esendex developers are very agile for the most part--we're able to turn out new and updated tested functionality relatively quickly--but while this is great for the company and our customers I'm sure it must be overwhelming for a new starter.&lt;br /&gt;&lt;br /&gt;Documentation helps, and we do have some which explains (in loose terms) the architecture of the internal messaging system, and how our system's tiers hang together.  But for the most part knowledge is passed verbally, if only because the entire system is far too large to describe in documentation.  After all, we'd do nothing but write documents if we had to document everything.&lt;br /&gt;&lt;br /&gt;So the way we have introduced new developers before (and how I believe Andy and Jonathan will be introduced this time), is to get them exposed to the code as soon as possible, and let them ask questions so they get things straight in their own minds.&lt;br /&gt;&lt;br /&gt;Pair programming and test driven development helps here, so they'll always have someone to direct questions at, and the tests should make it clear if something will break another part of the system.&lt;br /&gt;&lt;br /&gt;I guess the key is to not flood them with too much information to begin with.  People can only take in so much information at any one point, so introducing someone to part of the system they are not currently working on will only complicate things.&lt;br /&gt;&lt;br /&gt;If anyone has any suggestions, or stories about what you do in this situation, then please leave a comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6691579676571716537-3073129566675066840?l=devproj20.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://devproj20.blogspot.com/feeds/3073129566675066840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=6691579676571716537&amp;postID=3073129566675066840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3073129566675066840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6691579676571716537/posts/default/3073129566675066840'/><link rel='alternate' type='text/html' href='http://devproj20.blogspot.com/2007/07/new-developers-in-agile-team.html' title='New Developers in an Agile Team'/><author><name>Ian Dykes</name><uri>http://www.blogger.com/profile/08235675789374664427</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>
