<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>James Newton-King</title><link>http://james.newtonking.com/default.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/jamesnewtonking" type="application/rss+xml" /><item><title>Simple .NET Profanity Filter</title><link>http://feedproxy.google.com/~r/jamesnewtonking/~3/203T_LisX8A/simple-net-profanity-filter.aspx</link><pubDate>Fri, 03 Jul 2009 10:27:04 GMT</pubDate><guid isPermaLink="false">bce7ef4a-1ab4-4a64-ae34-bb54d1362c7e:31727</guid><dc:creator>James Newton-King</dc:creator><slash:comments>6</slash:comments><comments>http://james.newtonking.com/archive/2009/07/03/simple-net-profanity-filter.aspx#comments</comments><description>&lt;p&gt;A website I am working on right now accepts public comments, and one of the requirements is to do a basic check for dirty language. Surprisingly for such a common problem I wasn’t able to find any code on the net that did what I wanted and so I’ve ended up writing my own.&lt;/p&gt;  &lt;p&gt;The Censor class is pretty simple: you give it a list of words you want to censor, either simple text or with wildcards, and the censor will star out any matches it finds.&lt;/p&gt;  &lt;div class="overflowpanel"&gt;   &lt;div class="code"&gt;     &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&gt;       &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; censoredWords = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#a31515;"&gt;&amp;quot;gosh&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#a31515;"&gt;&amp;quot;drat&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:#a31515;"&gt;&amp;quot;darn*&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;};&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Censor&lt;/span&gt; censor = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Censor&lt;/span&gt;(censoredWords);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;string&lt;/span&gt; result;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;result = censor.CensorText(&lt;span style="color:#a31515;"&gt;&amp;quot;I stubbed my toe. Gosh it hurts!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// I stubbed my toe. **** it hurts!&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;result = censor.CensorText(&lt;span style="color:#a31515;"&gt;&amp;quot;The midrate on the USD -&amp;gt; EUR forex trade has soured my day. Drat!&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// The midrate on the USD -&amp;gt; EUR forex trade has soured my day. ****!&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;result = censor.CensorText(&lt;span style="color:#a31515;"&gt;&amp;quot;Gosh darnit, my shoe laces are undone.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&lt;span style="color:green;"&gt;// **** ******, my shoe laces are undone.&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The first example is a simple whole word match on gosh. The second example replaces drat but doesn’t star out the drat in midrate. The final example shows the censor starting out multiple matches and also matching darnit against the wildcard darn*.&lt;/p&gt;

&lt;p&gt;I’m passing a collection of strings in my examples but it is easy enough to find a list of swear words on the net, put them in a text file and call something like &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.file.readalllines.aspx" target="_blank"&gt;File.GetAllLines&lt;/a&gt; to get an array of words to filter on.&lt;/p&gt;

&lt;p&gt;The code:&lt;/p&gt;

&lt;div class="overflowpanel"&gt;
  &lt;div class="code"&gt;
    &lt;div style="font-family:courier new;color:black;font-size:10pt;"&gt;
      &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Censor&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IList&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; CensoredWords { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; Censor(&lt;span style="color:#2b91af;"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt; censoredWords)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (censoredWords == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;censoredWords&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; CensoredWords = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:blue;"&gt;string&lt;/span&gt;&amp;gt;(censoredWords);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; CensorText(&lt;span style="color:blue;"&gt;string&lt;/span&gt; text)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (text == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; censoredText = text;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color:blue;"&gt;string&lt;/span&gt; censoredWord &lt;span style="color:blue;"&gt;in&lt;/span&gt; CensoredWords)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; regularExpression = ToRegexPattern(censoredWord);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; censoredText = &lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Replace(censoredText, regularExpression, StarCensoredMatch,&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.IgnoreCase | &lt;span style="color:#2b91af;"&gt;RegexOptions&lt;/span&gt;.CultureInvariant);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; censoredText;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; StarCensoredMatch(&lt;span style="color:#2b91af;"&gt;Match&lt;/span&gt; m)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; word = m.Captures[0].Value;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;, word.Length);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ToRegexPattern(&lt;span style="color:blue;"&gt;string&lt;/span&gt; wildcardSearch)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;string&lt;/span&gt; regexPattern = &lt;span style="color:#2b91af;"&gt;Regex&lt;/span&gt;.Escape(wildcardSearch);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; regexPattern = regexPattern.Replace(&lt;span style="color:#a31515;"&gt;@&amp;quot;\*&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;.*?&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; regexPattern = regexPattern.Replace(&lt;span style="color:#a31515;"&gt;@&amp;quot;\?&amp;quot;&lt;/span&gt;, &lt;span style="color:#a31515;"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (regexPattern.StartsWith(&lt;span style="color:#a31515;"&gt;&amp;quot;.*?&amp;quot;&lt;/span&gt;))&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; regexPattern = regexPattern.Substring(3);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; regexPattern = &lt;span style="color:#a31515;"&gt;@&amp;quot;(^\b)*?&amp;quot;&lt;/span&gt; + regexPattern;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; regexPattern = &lt;span style="color:#a31515;"&gt;@&amp;quot;\b&amp;quot;&lt;/span&gt; + regexPattern + &lt;span style="color:#a31515;"&gt;@&amp;quot;\b&amp;quot;&lt;/span&gt;;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; regexPattern;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fjames.newtonking.com%2farchive%2f2009%2f07%2f03%2fsimple-net-profanity-filter.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fjames.newtonking.com%2farchive%2f2009%2f07%2f03%2fsimple-net-profanity-filter.aspx" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://james.newtonking.com/aggbug.aspx?PostID=31727" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamesnewtonking/~4/203T_LisX8A" height="1" width="1"/&gt;</description><category domain="http://james.newtonking.com/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://james.newtonking.com/archive/2009/07/03/simple-net-profanity-filter.aspx</feedburner:origLink></item><item><title>.NET Ajax Survey 2009</title><link>http://feedproxy.google.com/~r/jamesnewtonking/~3/m0cbPm6Rtkc/net-ajax-survey-2009.aspx</link><pubDate>Mon, 22 Jun 2009 21:57:32 GMT</pubDate><guid isPermaLink="false">bce7ef4a-1ab4-4a64-ae34-bb54d1362c7e:31716</guid><dc:creator>James Newton-King</dc:creator><slash:comments>2</slash:comments><comments>http://james.newtonking.com/archive/2009/06/22/net-ajax-survey-2009.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://codeclimber.net.nz/archive/2009/06/22/ajax-survey-2009-jquery-and-ms-ajax-are-almost-tied.aspx" target="_blank"&gt;Json.NET usage up 193%&lt;/a&gt; *&lt;/p&gt;  &lt;p&gt;&lt;img title="Mmm.... pi" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="246" alt="Mmm.... pi" src="http://james.newtonking.com/images/3e1aa72ea685.NETAjaxSurvey2009_8BF9/image.png" width="453" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;* &lt;a href="http://www.syringe.net.nz/" target="_blank"&gt;Chris&lt;/a&gt; immediately started to point out the statistical flaws of the survey. My response was that regardless, Json.NET’s share of the flawed survey market has increased &lt;img src="http://james.newtonking.com/emoticons/emotion-5.gif" alt="Wink" /&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://james.newtonking.com/aggbug.aspx?PostID=31716" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamesnewtonking/~4/m0cbPm6Rtkc" height="1" width="1"/&gt;</description><category domain="http://james.newtonking.com/archive/tags/Json.NET/default.aspx">Json.NET</category><feedburner:origLink>http://james.newtonking.com/archive/2009/06/22/net-ajax-survey-2009.aspx</feedburner:origLink></item><item><title>Sunday Podcasts 2</title><link>http://feedproxy.google.com/~r/jamesnewtonking/~3/ZxhNox_Bmjs/sunday-podcasts-2.aspx</link><pubDate>Sun, 21 Jun 2009 05:17:21 GMT</pubDate><guid isPermaLink="false">bce7ef4a-1ab4-4a64-ae34-bb54d1362c7e:31714</guid><dc:creator>James Newton-King</dc:creator><slash:comments>1</slash:comments><comments>http://james.newtonking.com/archive/2009/06/20/sunday-podcasts-2.aspx#comments</comments><description>&lt;p&gt;&lt;strong&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="Remember, you can always find East by staring directly at the sun." border="0" alt="Remember, you can always find East by staring directly at the sun." align="right" src="http://james.newtonking.com/images/SundayPodcasts2_F305/podcast_logo.jpg" width="140" height="153" /&gt; This American Life&lt;/strong&gt; - &lt;a href="http://www.thislife.org/Radio_Episode.aspx?sched=1299" target="_blank"&gt;Classifieds&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.thislife.org" target="_blank"&gt;This American Life&lt;/a&gt; is a fantastic weekly podcast about everyday aspects of life. Each week’s show has a theme and then a number of stories around that theme.&lt;/p&gt;  &lt;p&gt;This episode is based on stories gathered from classified ads, all found from a single single newspaper on a single day. A man who posted an ad about a missing dog, a personnel ad to win back a lost love, and my favourite: assembling a disparate group of musicians from classified ads to form a band for one day only and record a song – Rocket Man.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://james.newtonking.com/downloads/music/Jon%20Langford%20and%20the%20One%20Day%20Band%20-%20Rocket%20Man.mp3" target="_blank"&gt;Jon Langford and the One Day Band - Rocket Man.mp3&lt;/a&gt;:&lt;/p&gt; &lt;object type="application/x-shockwave-flash" data="http://james.newtonking.com/flash/podango_player.swf" id="audioplayer1" height="24" width="290"&gt; &lt;param name="movie" value="http://james.newtonking.com/flash/podango_player.swf"&gt; &lt;param name="FlashVars" value="playerID=1&amp;amp;bg=0xF8F8F8&amp;amp;leftbg=0xEEEEEE&amp;amp;text=0x666666&amp;amp;lefticon=0x666666&amp;amp;rightbg=0xCCCCCC&amp;amp;rightbghover=0x999999&amp;amp;righticon=0x666666&amp;amp;righticonhover=0xFFFFFF&amp;amp;slider=0x666666&amp;amp;track=0xFFFFFF&amp;amp;loader=0x9FFFB8&amp;amp;border=0x666666&amp;amp;listen_wrapper=off&amp;amp;soundFile=http://james.newtonking.com/downloads/music/Jon Langford and the One Day Band - Rocket Man.mp3"&gt;  &lt;param name="quality" value="high"&gt; &lt;param name="menu" value="false"&gt; &lt;param name="wmode" value="transparent"&gt; &lt;/object&gt;  &lt;p&gt;&lt;strong&gt;Hanselminutes&lt;/strong&gt; – &lt;a href="http://www.hanselminutes.com/default.aspx?showID=176" target="_blank"&gt;Visiting Fog Creek Software and Joel Spolsky&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Scott Hanselman interviews Joel Spolsky about technology, business, blogging and shark jumping. I can’t say I agree with many of Spolsky’s opinions on programming (&lt;a href="http://www.joelonsoftware.com/items/2003/10/13.html" target="_blank"&gt;eww&lt;/a&gt;) but he has a good head for business and marketing.&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom:0px;border-left:0px;display:inline;margin-left:0px;border-top:0px;margin-right:0px;border-right:0px;" title="I hope this has taught you kids a lesson: kids never learn." border="0" alt="I hope this has taught you kids a lesson: kids never learn." align="right" src="http://james.newtonking.com/images/SundayPodcasts2_F305/aardvark_thumb.png" width="340" height="132" /&gt; While Fog Creek is most known for a project management tool called Fogbuz they also have created a remote desktop service called Copilot. A DVD I brought not long after I started my first software development job is a documentary about Copilot called &lt;a href="http://www.projectaardvark.com/movie/" target="_blank"&gt;&lt;strong&gt;Aardvark&amp;#39;d: Twelve Weeks with Geeks&lt;/strong&gt;&lt;/a&gt;. Aardvark is a fun little movie about the software and the small group of interns who made it. Recommended.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://james.newtonking.com/aggbug.aspx?PostID=31714" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamesnewtonking/~4/ZxhNox_Bmjs" height="1" width="1"/&gt;</description><category domain="http://james.newtonking.com/archive/tags/Other/default.aspx">Other</category><category domain="http://james.newtonking.com/archive/tags/Interesting/default.aspx">Interesting</category><feedburner:origLink>http://james.newtonking.com/archive/2009/06/20/sunday-podcasts-2.aspx</feedburner:origLink></item><item><title>ThreadSafeStore</title><link>http://feedproxy.google.com/~r/jamesnewtonking/~3/mZrg-42IDzM/threadsafestore.aspx</link><pubDate>Thu, 18 Jun 2009 11:23:20 GMT</pubDate><guid isPermaLink="false">bce7ef4a-1ab4-4a64-ae34-bb54d1362c7e:31711</guid><dc:creator>James Newton-King</dc:creator><slash:comments>5</slash:comments><comments>http://james.newtonking.com/archive/2009/06/18/threadsafestore.aspx#comments</comments><description>&lt;p&gt;Developers and multithreading fall into 3 camps:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Doesn’t know anything. This developer avoids thinking about other threads at all costs. Followers of the HttpContext. &lt;strong&gt;90% of developers.&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Knows everything. This developer is either a savant or writes operating systems for fun. Most likely sports a sweet hippy beard. &lt;strong&gt;3.14159% of developers.&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;Doesn’t know everything but knows enough. This developer will happily write multithreaded applications. It turns out however he/she &lt;em&gt;&lt;strong&gt;doesn’t&lt;/strong&gt;&lt;/em&gt; know enough and said applications are full of hard to find, intermittent bugs just waiting to corrupt data and deadlock. &lt;strong&gt;The rest us.&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I fall into the third category: knows enough to be dangerous.&lt;/p&gt;  &lt;p&gt;The latest example of my thread safety &lt;a href="http://www.sadtrombone.com/" target="_blank"&gt;failure&lt;/a&gt; is knowing that two threads modifying a dictionary at the same time is very bad, but then not considering that getting from a dictionary that is being modified is also not a terribly good idea. Thanks to &lt;a href="http://json.codeplex.com/WorkItem/View.aspx?WorkItemId=13457" target="_blank"&gt;Amir&lt;/a&gt; for the pointer.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ThreadSafeStore&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;I’ve written a simple helper class that wraps a &lt;a href="http://msdn.microsoft.com/en-us/library/xfhwa508.aspx" target="_blank"&gt;Dictionary&lt;/a&gt; called ThreadSafeStore. ThreadSafeStore treats its internal Dictionary as immutable. Each time a new value is added the wrapper will create a new Dictionary with the new value and reassigns the internal reference. There is no chance a thread could access the Dictionary while it is being modified. ThreadSafeStore is aimed towards read performance with no lock on read required.&lt;/p&gt;  &lt;p&gt;The downside to this approach is a new Dictionary is being created with every add. An improvement would be to introduce a second level Dictionary and buffer up new values before adding them to the main store, reducing total object’s allocated. For now I’ve left it simple. Suggestions welcome &lt;img src="http://james.newtonking.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/p&gt;  &lt;div class="overflowpanel"&gt;   &lt;div class="code"&gt;     &lt;div style="font-family:courier new;color:black;font-size:10pt;"&gt;       &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ThreadSafeStore&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt; _store;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt; _creator;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; ThreadSafeStore(&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt; creator)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (creator == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;creator&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; _creator = creator;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; TValue Get(TKey key)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (_store == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; AddValue(key);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; TValue value;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (!_store.TryGetValue(key, &lt;span style="color:blue;"&gt;out&lt;/span&gt; value))&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; AddValue(key);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; value;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; TValue AddValue(TKey key)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;lock&lt;/span&gt; (&lt;span style="color:blue;"&gt;this&lt;/span&gt;)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; TValue value;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (_store == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _store = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt;();&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value = _creator(key);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _store[key] = value;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;else&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// double check locking&lt;/span&gt;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (_store.TryGetValue(key, &lt;span style="color:blue;"&gt;out&lt;/span&gt; value))&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; value;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt; newStore = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Dictionary&lt;/span&gt;&amp;lt;TKey, TValue&amp;gt;(_store);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; value = _creator(key);&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newStore[key] = value;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _store = newStore;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; value;&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;&amp;#160; }&lt;/pre&gt;

      &lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://james.newtonking.com/aggbug.aspx?PostID=31711" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamesnewtonking/~4/mZrg-42IDzM" height="1" width="1"/&gt;</description><category domain="http://james.newtonking.com/archive/tags/.NET/default.aspx">.NET</category><feedburner:origLink>http://james.newtonking.com/archive/2009/06/18/threadsafestore.aspx</feedburner:origLink></item><item><title>CodeCamp 2009 - .NET 4.0 Code Contracts</title><link>http://feedproxy.google.com/~r/jamesnewtonking/~3/cJVLsuyXTNw/codecamp-2009-net-4-0-code-contracts.aspx</link><pubDate>Mon, 15 Jun 2009 04:29:23 GMT</pubDate><guid isPermaLink="false">bce7ef4a-1ab4-4a64-ae34-bb54d1362c7e:31704</guid><dc:creator>James Newton-King</dc:creator><slash:comments>0</slash:comments><comments>http://james.newtonking.com/archive/2009/06/14/codecamp-2009-net-4-0-code-contracts.aspx#comments</comments><description>&lt;p&gt;&lt;img title="That&amp;#39;s why I love elementary school, Edna. The children believe anything you tell them." style="border-right:0px;border-top:0px;display:inline;margin:0px 0px 5px 5px;border-left:0px;border-bottom:0px;" height="201" alt="That&amp;#39;s why I love elementary school, Edna. The children believe anything you tell them." src="http://james.newtonking.com/images/CodeCamp2009.NET4.0CodeContracts_E7A8/CodeCampLogo_thumb_thumb.png" width="200" align="right" border="0" /&gt; Over the weekend I presented a session on .NET 4.0 Code Contracts at &lt;a href="http://www.codecamp.net.nz/" target="_blank"&gt;Code Camp 2009&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;One of my &lt;a href="http://james.newtonking.com/archive/2008/11/09/thoughts-on-c-4-0-and-net-4-0.aspx" target="_blank"&gt;favourite&lt;/a&gt; announcements at PDC2008, I volunteered too talk about Code Contracts to force myself into learning everything I could about them &lt;img src="http://james.newtonking.com/emoticons/emotion-2.gif" alt="Big Smile" /&gt;&lt;/p&gt;  &lt;p&gt;The slides for my presentation can be downloaded &lt;a href="http://james.newtonking.com/downloads/codecamp2009/codecontracts.pptx" target="_blank"&gt;&lt;strong&gt;here&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Thanks to the organisers and other speakers for all the great content. Stand out session goes to Ivan for not only covering everything new in C# 4.0 in 4 minutes but also showing us all some &lt;a href="http://www.youtube.com/watch?v=Kyx0Ee6AOe0" target="_blank"&gt;sweet dance moves&lt;/a&gt;.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://james.newtonking.com/aggbug.aspx?PostID=31704" width="1" height="1"&gt;&lt;img src="http://feeds.feedburner.com/~r/jamesnewtonking/~4/cJVLsuyXTNw" height="1" width="1"/&gt;</description><feedburner:origLink>http://james.newtonking.com/archive/2009/06/14/codecamp-2009-net-4-0-code-contracts.aspx</feedburner:origLink></item></channel></rss>
