<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEEDSXYzcSp7ImA9WhBTEEU.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599</id><updated>2013-02-05T09:44:38.889-07:00</updated><category term="feeds" /><category term="map/reduce" /><category term="sapir-whorf" /><category term="javascript" /><category term="debugging" /><category term="web" /><category term="apple" /><category term="firebug" /><category term="browser quirks" /><category term="web development" /><category term="adobe" /><category term="SQLite" /><category term="game theory" /><category term="distributed systems" /><category term="sed" /><category term="chrome" /><category term="c#" /><category term="firefox" /><category term="set" /><category term="powershell" /><category term="js" /><category term="shell" /><category term="python" /><category term="steve jobs" /><category term="society" /><category term="software engineering" /><category term="windows" /><category term=".net" /><category term="code" /><category term="probability" /><category term="opera" /><category term="rant" /><category term="asp.net mvc" /><category term="safari" /><category term="humor" /><category term="linux" /><category term="hashset" /><category term="scheme" /><category term="math" /><category term="uuid" /><category term="linguistics" /><category term="java" /><category term="internet explorer" /><category term="programming" /><category term="information" /><category term="lisp" /><category term="racket" /><category term="geek" /><category term="bash" /><category term="reddit" /><category term="ie" /><category term="pdf" /><category term="NServiceBus" /><category term="software" /><category term="functional programming" /><category term="languages" /><category term="asp.net" /><category term="insanity" /><category term="fun" /><category term="statistics" /><category term="command line" /><category term="collections" /><title>CodeWords</title><subtitle type="html">Code, in words.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.code-words.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.code-words.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Jeff Pratt</name><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>36</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/Codewords" /><feedburner:info uri="codewords" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by/3.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FCodewords" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FCodewords" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FCodewords" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/Codewords" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FCodewords" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FCodewords" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FCodewords" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.addtoany.com/?linkname=CodeWords&amp;linkurl=http%3A%2F%2Ffeeds.feedburner.com%2FCodewords&amp;type=feed" src="http://www.addtoany.com/addfr-b.gif">Add to Any Feed Reader</feedburner:feedFlare><entry gd:etag="W/&quot;Dk4FQX86fyp7ImA9WhdaFkQ.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-2638208585168398110</id><published>2011-10-26T23:55:00.000-06:00</published><updated>2011-10-26T23:55:10.117-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-26T23:55:10.117-06:00</app:edited><title>Transition to New Site</title><content type="html">This blog is now being retired in favor of the &lt;a href="http://jeffreypratt.net/notes/"&gt;notes&lt;/a&gt; on my new &lt;a href="http://jeffreypratt.net/"&gt;site&lt;/a&gt;, which has an &lt;a href="http://jeffreypratt.net/notes/2011/10/26/new-site.html"&gt;explanation&lt;/a&gt; of the transition. This blog will remain but will no longer be updated.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=l7w7MvJ0Qac:ZvBRvwRBMds:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=l7w7MvJ0Qac:ZvBRvwRBMds:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=l7w7MvJ0Qac:ZvBRvwRBMds:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=l7w7MvJ0Qac:ZvBRvwRBMds:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=l7w7MvJ0Qac:ZvBRvwRBMds:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=l7w7MvJ0Qac:ZvBRvwRBMds:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=l7w7MvJ0Qac:ZvBRvwRBMds:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=l7w7MvJ0Qac:ZvBRvwRBMds:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=l7w7MvJ0Qac:ZvBRvwRBMds:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=l7w7MvJ0Qac:ZvBRvwRBMds:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=l7w7MvJ0Qac:ZvBRvwRBMds:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=l7w7MvJ0Qac:ZvBRvwRBMds:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=l7w7MvJ0Qac:ZvBRvwRBMds:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/l7w7MvJ0Qac" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/10/transition-to-new-site.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/2638208585168398110?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/2638208585168398110?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/l7w7MvJ0Qac/transition-to-new-site.html" title="Transition to New Site" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/10/transition-to-new-site.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQMRno7fCp7ImA9WhdUGEo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-2208584968231705990</id><published>2011-10-05T22:13:00.001-06:00</published><updated>2011-10-05T22:13:07.404-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-05T22:13:07.404-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="steve jobs" /><category scheme="http://www.blogger.com/atom/ns#" term="apple" /><title>Steve Jobs, Rest in Peace</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://cdn.tipb.com/images/stories//2008/07/steve-jobs.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://cdn.tipb.com/images/stories//2008/07/steve-jobs.jpg" width="155" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Today a great entrepreneur, one of the great American capitalists, Steve Jobs, &lt;a href="http://www.cnn.com/2011/10/05/us/obit-steve-jobs/index.html?iref=BN1&amp;amp;hpt=hp_t1"&gt;passed away&lt;/a&gt; at the rather young age of 56. As others have said, we are all a bit poorer for it.&lt;/p&gt;
&lt;p&gt;I didn't always agree with his style, I wasn't always a fan of his company's products, and I certainly didn't like the personality cult that surrounded him, but I have great respect for the man who believed in what he did, thought big, sought to empower people, and did it with style and aesthetics. He is an inspiration to us all.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=vVLXg7r_a_A:WCyOCTXTQfU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=vVLXg7r_a_A:WCyOCTXTQfU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=vVLXg7r_a_A:WCyOCTXTQfU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=vVLXg7r_a_A:WCyOCTXTQfU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=vVLXg7r_a_A:WCyOCTXTQfU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=vVLXg7r_a_A:WCyOCTXTQfU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=vVLXg7r_a_A:WCyOCTXTQfU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=vVLXg7r_a_A:WCyOCTXTQfU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=vVLXg7r_a_A:WCyOCTXTQfU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=vVLXg7r_a_A:WCyOCTXTQfU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=vVLXg7r_a_A:WCyOCTXTQfU:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=vVLXg7r_a_A:WCyOCTXTQfU:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=vVLXg7r_a_A:WCyOCTXTQfU:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/vVLXg7r_a_A" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/10/steve-jobs-rest-in-peace.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/2208584968231705990?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/2208584968231705990?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/vVLXg7r_a_A/steve-jobs-rest-in-peace.html" title="Steve Jobs, Rest in Peace" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/10/steve-jobs-rest-in-peace.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUESXc6fSp7ImA9WhdXF04.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-8134246207794687561</id><published>2011-08-29T11:12:00.004-06:00</published><updated>2011-08-30T13:40:08.915-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-30T13:40:08.915-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="powershell" /><category scheme="http://www.blogger.com/atom/ns#" term="command line" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><title>Finding Files with PowerShell, Part 2</title><content type="html">&lt;p&gt;This version (see &lt;a href="/2011/08/finding-files-with-powershell.html"&gt;Finding Files with PowerShell&lt;/a&gt;) gives the full path of the items:&lt;/p&gt;
&lt;script src="https://gist.github.com/1178852.js?file=find-files.ps1"&gt;&lt;noscript&gt;Get-ChildItem -Recurse -Filter *some*pattern* | ForEach-Object -Process { $_.FullName }&lt;/noscript&gt;&lt;/script&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=AI1k8grgEwo:KEZZfOJTiSQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=AI1k8grgEwo:KEZZfOJTiSQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=AI1k8grgEwo:KEZZfOJTiSQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=AI1k8grgEwo:KEZZfOJTiSQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=AI1k8grgEwo:KEZZfOJTiSQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=AI1k8grgEwo:KEZZfOJTiSQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=AI1k8grgEwo:KEZZfOJTiSQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=AI1k8grgEwo:KEZZfOJTiSQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=AI1k8grgEwo:KEZZfOJTiSQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=AI1k8grgEwo:KEZZfOJTiSQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=AI1k8grgEwo:KEZZfOJTiSQ:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=AI1k8grgEwo:KEZZfOJTiSQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=AI1k8grgEwo:KEZZfOJTiSQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/AI1k8grgEwo" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/08/finding-files-with-windows-powershell.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/8134246207794687561?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/8134246207794687561?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/AI1k8grgEwo/finding-files-with-windows-powershell.html" title="Finding Files with PowerShell, Part 2" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/08/finding-files-with-windows-powershell.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEEHRn07fip7ImA9WhdQFU8.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-6243039966601628162</id><published>2011-08-16T14:22:00.003-06:00</published><updated>2011-08-16T14:30:37.306-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-16T14:30:37.306-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="powershell" /><category scheme="http://www.blogger.com/atom/ns#" term="command line" /><category scheme="http://www.blogger.com/atom/ns#" term="windows" /><title>Finding Files with PowerShell</title><content type="html">&lt;p&gt;I miss the UNIX &lt;code&gt;find&lt;/code&gt; command in Windows. I could get it with Cygwin or GNUWin32, but that requires littering my machine with extra stuff. So, PowerShell to the rescue:&lt;/p&gt;&lt;script src="https://gist.github.com/1150074.js?file=find.ps1"&gt;&lt;noscript&gt;ls -Recurse -Filter *some*pattern* | ft directory, name&lt;/noscript&gt;&lt;/script&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=jocdam3nYhE:Dp9k5dMRQ3c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=jocdam3nYhE:Dp9k5dMRQ3c:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=jocdam3nYhE:Dp9k5dMRQ3c:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=jocdam3nYhE:Dp9k5dMRQ3c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=jocdam3nYhE:Dp9k5dMRQ3c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=jocdam3nYhE:Dp9k5dMRQ3c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=jocdam3nYhE:Dp9k5dMRQ3c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=jocdam3nYhE:Dp9k5dMRQ3c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=jocdam3nYhE:Dp9k5dMRQ3c:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=jocdam3nYhE:Dp9k5dMRQ3c:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=jocdam3nYhE:Dp9k5dMRQ3c:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=jocdam3nYhE:Dp9k5dMRQ3c:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=jocdam3nYhE:Dp9k5dMRQ3c:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/jocdam3nYhE" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/08/finding-files-with-powershell.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/6243039966601628162?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/6243039966601628162?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/jocdam3nYhE/finding-files-with-powershell.html" title="Finding Files with PowerShell" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/08/finding-files-with-powershell.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MBRXk5eSp7ImA9WhdTF0Q.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-6443594282059553396</id><published>2011-07-15T22:44:00.000-06:00</published><updated>2011-07-15T22:44:14.721-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-15T22:44:14.721-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="reddit" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="humor" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Reddit's Unique Web Server</title><content type="html">&lt;a href="http://www.reddit.com/"&gt;Reddit&lt;/a&gt; has quite a &lt;a href="http://whatsitrun.apphb.com/Query/?url=http%3A%2F%2Fwww.reddit.com%2F"&gt;unique&lt;/a&gt; web server.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=wG7DTrm7FgQ:6mErIslPgRE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=wG7DTrm7FgQ:6mErIslPgRE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=wG7DTrm7FgQ:6mErIslPgRE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=wG7DTrm7FgQ:6mErIslPgRE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=wG7DTrm7FgQ:6mErIslPgRE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=wG7DTrm7FgQ:6mErIslPgRE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=wG7DTrm7FgQ:6mErIslPgRE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=wG7DTrm7FgQ:6mErIslPgRE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=wG7DTrm7FgQ:6mErIslPgRE:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=wG7DTrm7FgQ:6mErIslPgRE:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=wG7DTrm7FgQ:6mErIslPgRE:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=wG7DTrm7FgQ:6mErIslPgRE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=wG7DTrm7FgQ:6mErIslPgRE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/wG7DTrm7FgQ" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/07/reddits-unique-web-server.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/6443594282059553396?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/6443594282059553396?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/wG7DTrm7FgQ/reddits-unique-web-server.html" title="Reddit's Unique Web Server" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/07/reddits-unique-web-server.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkQDQ3Y9fSp7ImA9WhdTFUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-8762036112837300120</id><published>2011-06-20T08:12:00.006-06:00</published><updated>2011-07-13T11:32:52.865-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-13T11:32:52.865-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="statistics" /><category scheme="http://www.blogger.com/atom/ns#" term="probability" /><category scheme="http://www.blogger.com/atom/ns#" term="game theory" /><category scheme="http://www.blogger.com/atom/ns#" term="math" /><title>How Likely Are You to Be Dealt a Royal Flush?</title><content type="html">&lt;p&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-9MN3GLVjBZA/Tf_MDetaruI/AAAAAAAAA-0/8xVyd94rdzA/s1600/flush.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="200" src="http://1.bp.blogspot.com/-9MN3GLVjBZA/Tf_MDetaruI/AAAAAAAAA-0/8xVyd94rdzA/s200/flush.jpg" width="185" /&gt;&lt;/a&gt;&lt;/div&gt;
In the game of &lt;a href="http://en.wikipedia.org/wiki/Poker"&gt;poker&lt;/a&gt;, you have a &lt;a href="http://en.wikipedia.org/wiki/Royal_flush_(poker_hand)#Straight_flush"&gt;royal flush&lt;/a&gt; when you have a 10, J, Q, K, and A all of the same suit. Assuming a uniform random distribution of cards in the deck, what is the probability of being dealt a royal flush?&lt;/p&gt;

&lt;p&gt;A royal flush consists of a certain five cards of the same suit. Assume we are dealt one of these cards. Then the suit is determined, and we now need the remaining four cards of that suit. So, let's take the probability of being dealt one of the certain five cards (10, J, Q, K, A) of &lt;em&gt;any&lt;/em&gt; suit. Since there are five such cards per suit, and there are four suits (the set of suits is \( \{ \diamondsuit, \heartsuit, \clubsuit, \spadesuit \} \)), then we can get any one of those cards to start building a royal flush. Therefore, the probability of getting a starting card is
\[
P(\text{starting card}) = \frac{20}{52}.
\]
Once we have a starting card of a certain suit, our suit is restricted. That is, we may only get the remaining four cards from the same suit as our starting card. Then the probability of getting one of the four cards from the same suit is
\[
P(\text{one of the four from the same suit}) = \frac{4}{51}.
\]
Likewise, after we get the second card, there are three left to get, so the probabilities are \( 3/50 \), then \( 2/49 \), and then \( 1/48 \). What, then, is the probability that we will get &lt;em&gt;all&lt;/em&gt; of the necessary cards? It is the product of all these probabilities:
\[
P(\text{all}) = \frac{20}{52} \cdot \frac{4}{51} \cdot \frac{3}{50} \cdot \frac{2}{49} \cdot \frac{1}{48} = \frac{1}{649\,740} = 1.539\ldots \times 10^{-6} = 0.000\,153\,9\ldots \%.
\]
Not very good odds.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=c7R5DoiAOwM:Yi6w-wxCwiA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=c7R5DoiAOwM:Yi6w-wxCwiA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=c7R5DoiAOwM:Yi6w-wxCwiA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=c7R5DoiAOwM:Yi6w-wxCwiA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=c7R5DoiAOwM:Yi6w-wxCwiA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=c7R5DoiAOwM:Yi6w-wxCwiA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=c7R5DoiAOwM:Yi6w-wxCwiA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=c7R5DoiAOwM:Yi6w-wxCwiA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=c7R5DoiAOwM:Yi6w-wxCwiA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=c7R5DoiAOwM:Yi6w-wxCwiA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=c7R5DoiAOwM:Yi6w-wxCwiA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=c7R5DoiAOwM:Yi6w-wxCwiA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=c7R5DoiAOwM:Yi6w-wxCwiA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/c7R5DoiAOwM" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/06/how-likely-are-you-to-be-dealt-royal.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/8762036112837300120?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/8762036112837300120?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/c7R5DoiAOwM/how-likely-are-you-to-be-dealt-royal.html" title="How Likely Are You to Be Dealt a Royal Flush?" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-9MN3GLVjBZA/Tf_MDetaruI/AAAAAAAAA-0/8xVyd94rdzA/s72-c/flush.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/06/how-likely-are-you-to-be-dealt-royal.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QNQHY6cCp7ImA9WhdXE0o.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-9169362029652611237</id><published>2011-06-18T21:54:00.007-06:00</published><updated>2011-08-26T11:23:11.818-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-26T11:23:11.818-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="math" /><title>Calculating the Number of Trailing Zeros in a Factorial</title><content type="html">&lt;p&gt;The factorial function, denoted \( n! \), where \( n \in \mathbb{Z}^* \), is defined as follows:
\[
n! =
\begin{cases}
1 &amp; \text{if $n = 0$,} \\
n(n - 1)! &amp; \text{otherwise}.
\end{cases}
\]
In the case of \( n = 10 \), \( 10! = 3\,628\,800 \). Note that that value has two trailing zeros. When \( n = 20 \), \( 20! = 2\,432\,902\,008\,176\,640\,000 \) and has four trailing zeros. Can we devise an algorithm to determine how many trailing zeroes there are in \( n! \) without calculating \( n! \)?&lt;/p&gt;

&lt;p&gt;Let us define a function \( z : \mathbb{N} \to \mathbb{N} \) that accepts an argument \( n \) that yields the number of trailing zeros in \( n! \). So, using our two examples above, we know that \( z(10) = 2 \) and \( z(20) = 4 \). Now, what is \( z(100) \)?&lt;/p&gt;

&lt;p&gt;An integer \( a \) has \( k \) trailing zeros iff \( a = b \cdot 10^k \) for some integer \( b \). Now, the prime factors of \( 10 \) are \( 2 \) and \( 5 \). So, what if we consider the prime factors of each factor in a factorial product? For example, consider the first six terms (after \( 1 \)) of \( 100! \) and their prime factors. We omit \( 1 \) because of its &lt;a href="http://en.wikipedia.org/wiki/Idempotence"&gt;idempotence&lt;/a&gt;:
\[
\begin{align}
2 &amp;amp;= 2 \\
3 &amp;amp;= 3 \\
4 &amp;amp;= 2^2 \\
5 &amp;amp;= 5 \\
6 &amp;amp;= 2 \cdot 3 \\
7 &amp;amp;= 7
\end{align}
\]
We see that \( 7! \) contains one \( 5 \) and (more than) one \( 2 \). Therefore, \( 7! \) contains a factor of \( 10 \), so we should expect there to be one trailing zero in \( 7! \). And we see that \( 7! = 5040 \), which does indeed have one trailing zero. This suggests that we could, for any integer \( n \) in \( n! \), cycle through the integers from \( 2 \) to \( n \), finding the prime factorization of each integer, and counting pairs of \( 2 \) and \( 5 \) that we find.&lt;/p&gt;

&lt;p&gt;You might have noticed from our example of \( 7! \) that there are four \( 2 \)s and only one \( 5 \). Consider that there are \( n/2 \) even factors in \( n! \)—that is, every other integer factor of \( n! \), starting at \(2\), is even. So there are \( n/2 \) even factors. Each of these has at least one \( 2 \) in its prime factorization, and many of them have more than one. Now consider how many factors of \( 5 \) there are in \( n! \): there are, in fact, \( n / 5 \). So, we can see that, for every \( 5 \) we find in \( n! \), there is a \( 2 \) we can match with it. This suggests that we only need count the \( 5 \)s and not the pairs of \( 2 \) and \( 5 \).&lt;/p&gt;

&lt;p&gt;This now suggests an algorithm, presented here in Java:
&lt;script src="https://gist.github.com/1033739.js"&gt;&lt;/script&gt;
&lt;noscript&gt;
public class Solution {
    public static void main(String[] args) {
        System.out.println(countTrailingZerosOfFactorial(100));
    }
    
    private static final int countTrailingZerosOfFactorial(final int n) {
        int count = 0;
        for (int factor = 5; factor &amp;amp;amp;amp;lt;= n; factor++)
            count += countFives(factor);
        return count;
    }

    private static final int countFives(int factor) {
        if (!divides(5, factor))
            return 0;

        return 1 + countFives(factor / 5);
    }
    
    private static final boolean divides(final int d, final int n) {
        return n % d == 0;
    }
}
&lt;/noscript&gt;&lt;/p&gt;

&lt;p&gt;Using this algorithm, we find that \( z(100) = 24 \).&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=2I_rCfMDk3w:zc23jktqRTg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=2I_rCfMDk3w:zc23jktqRTg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=2I_rCfMDk3w:zc23jktqRTg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=2I_rCfMDk3w:zc23jktqRTg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=2I_rCfMDk3w:zc23jktqRTg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=2I_rCfMDk3w:zc23jktqRTg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=2I_rCfMDk3w:zc23jktqRTg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=2I_rCfMDk3w:zc23jktqRTg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=2I_rCfMDk3w:zc23jktqRTg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=2I_rCfMDk3w:zc23jktqRTg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=2I_rCfMDk3w:zc23jktqRTg:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=2I_rCfMDk3w:zc23jktqRTg:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=2I_rCfMDk3w:zc23jktqRTg:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/2I_rCfMDk3w" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/06/calculating-number-of-trailing-zeros-in.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/9169362029652611237?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/9169362029652611237?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/2I_rCfMDk3w/calculating-number-of-trailing-zeros-in.html" title="Calculating the Number of Trailing Zeros in a Factorial" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/06/calculating-number-of-trailing-zeros-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8AQX0yfSp7ImA9WhZUF0k.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-2322109131543753076</id><published>2011-06-10T16:27:00.000-06:00</published><updated>2011-06-10T16:27:20.395-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-10T16:27:20.395-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="pdf" /><category scheme="http://www.blogger.com/atom/ns#" term="adobe" /><title>Adobe Reader's Big Problem</title><content type="html">&lt;p&gt;I use PDFs often. Nothing excels them in fidelity of design to documents for which design is important. The Adobe Reader, in its 5.5 days and earlier, was the standard PDF reader of choice. But with version 6, serious bloat occurred, and Adobe Reader is only now, in its latest versions, recovering from that problem. I have a new problem with Adobe Reader, though. Take a look:&lt;/p&gt;

&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.flickr.com/photos/clementi/5819437518/" title="pdf-problem by clementi, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2420/5819437518_9276183ca4_m.jpg" width="240" height="197" alt="pdf-problem"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;This is a document that appears to be made of scanned images placed in text pages, produced by \( \mathrm{\TeX} \). Note how the scanned images appear as completely useless gray boxes. Here is how the document should look, and does look, in other PDF viewers:&lt;/p&gt;

&lt;div style="text-align: center;"&gt;
&lt;a href="http://www.flickr.com/photos/clementi/5819441358/" title="pdf-good by clementi, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2786/5819441358_a251d01103_m.jpg" width="223" height="240" alt="pdf-good"&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;I have searched and searched on this matter, but the results are few and old, and whenever I try to employ a solution I do find, it doesn't work.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=lBAJj4heNKM:-6D8j_RTvzQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=lBAJj4heNKM:-6D8j_RTvzQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=lBAJj4heNKM:-6D8j_RTvzQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=lBAJj4heNKM:-6D8j_RTvzQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=lBAJj4heNKM:-6D8j_RTvzQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=lBAJj4heNKM:-6D8j_RTvzQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=lBAJj4heNKM:-6D8j_RTvzQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=lBAJj4heNKM:-6D8j_RTvzQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=lBAJj4heNKM:-6D8j_RTvzQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=lBAJj4heNKM:-6D8j_RTvzQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=lBAJj4heNKM:-6D8j_RTvzQ:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=lBAJj4heNKM:-6D8j_RTvzQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=lBAJj4heNKM:-6D8j_RTvzQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/lBAJj4heNKM" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/06/adobe-readers-big-problem.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/2322109131543753076?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/2322109131543753076?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/lBAJj4heNKM/adobe-readers-big-problem.html" title="Adobe Reader's Big Problem" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://farm3.static.flickr.com/2420/5819437518_9276183ca4_t.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/06/adobe-readers-big-problem.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEMDRHo9eSp7ImA9WhZUFEw.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-5004570727755179287</id><published>2011-06-06T16:51:00.001-06:00</published><updated>2011-06-06T21:14:35.461-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-06T21:14:35.461-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="uuid" /><category scheme="http://www.blogger.com/atom/ns#" term="bash" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="shell" /><category scheme="http://www.blogger.com/atom/ns#" term="sed" /><title>Generate a Zero-Valued UUID</title><content type="html">&lt;p&gt;Say you want a UUID of &lt;code&gt;00000000-0000-0000-0000-000000000000&lt;/code&gt;, but you just want to make one fast, without having to find out the number and grouping of digits. Here's a way to do it:&lt;/p&gt;

&lt;script src="https://gist.github.com/1011287.js"&gt; &lt;/script&gt;
&lt;noscript&gt;uuidgen | sed 's/[0-9a-f]/0/g'&lt;/noscript&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=W3agFtat7p4:3BcgAq8MrRo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=W3agFtat7p4:3BcgAq8MrRo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=W3agFtat7p4:3BcgAq8MrRo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=W3agFtat7p4:3BcgAq8MrRo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=W3agFtat7p4:3BcgAq8MrRo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=W3agFtat7p4:3BcgAq8MrRo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=W3agFtat7p4:3BcgAq8MrRo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=W3agFtat7p4:3BcgAq8MrRo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=W3agFtat7p4:3BcgAq8MrRo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=W3agFtat7p4:3BcgAq8MrRo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=W3agFtat7p4:3BcgAq8MrRo:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=W3agFtat7p4:3BcgAq8MrRo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=W3agFtat7p4:3BcgAq8MrRo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/W3agFtat7p4" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/06/generate-zero-valued-uuid.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/5004570727755179287?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/5004570727755179287?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/W3agFtat7p4/generate-zero-valued-uuid.html" title="Generate a Zero-Valued UUID" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/06/generate-zero-valued-uuid.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIBRH0zfCp7ImA9WhZVFUw.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-2664012282642909038</id><published>2011-05-27T11:14:00.001-06:00</published><updated>2011-05-27T11:15:55.384-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-27T11:15:55.384-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="lisp" /><category scheme="http://www.blogger.com/atom/ns#" term="functional programming" /><category scheme="http://www.blogger.com/atom/ns#" term="racket" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="scheme" /><category scheme="http://www.blogger.com/atom/ns#" term="math" /><title>The Beauty of Scheme</title><content type="html">&lt;p&gt;
Bertrand Russell once &lt;a href="http://books.google.com/books?id=zwMQAAAAYAAJ&amp;pg=PA60&amp;dq=Mathematics+rightly+viewed+possesses+not+only+truth+but+supreme+beauty+a+beauty+cold+and+austere+like+that+of+sculpture+without+appeal+to+any+part+of+our+weaker+nature+without+the+gorgeous+trappings+inauthor:Russell&amp;hl=en#v=onepage&amp;q=Mathematics%20rightly%20viewed%20possesses%20not%20only%20truth%20but%20supreme%20beauty%20a%20beauty%20cold%20and%20austere%20like%20that%20of%20sculpture%20without%20appeal%20to%20any%20part%20of%20our%20weaker%20nature%20without%20the%20gorgeous%20trappings%20inauthor%3ARussell&amp;f=false"&gt;noted&lt;/a&gt; that
&lt;blockquote&gt;Mathematics, rightly viewed, possesses not only truth, but supreme beauty&amp;mdash;a beauty cold and austere, like that of sculpture, without appeal to any part of our weaker nature, without the gorgeous trappings of painting or music, yet sublimely pure, and capable of a stern perfection such as only the greatest art can show. The true spirit of delight, the exaltation, the sense of being more than Man, which is the touchstone of the highest excellence, is to be found in mathematics as surely as poetry.&lt;/blockquote&gt;
I think much the same can be said of code, especially code written in certain languages. There is something so elegantly simple and beautiful about &lt;a href="http://www.r6rs.org/"&gt;Scheme&lt;/a&gt; (and &lt;a href="http://racket-lang.org/"&gt;Racket&lt;/a&gt;), for example, that shares the same aesthetics of mathematics.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ENMKCf7xhVQ:HbmtbFYJPeU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ENMKCf7xhVQ:HbmtbFYJPeU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ENMKCf7xhVQ:HbmtbFYJPeU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ENMKCf7xhVQ:HbmtbFYJPeU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=ENMKCf7xhVQ:HbmtbFYJPeU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ENMKCf7xhVQ:HbmtbFYJPeU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=ENMKCf7xhVQ:HbmtbFYJPeU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ENMKCf7xhVQ:HbmtbFYJPeU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ENMKCf7xhVQ:HbmtbFYJPeU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=ENMKCf7xhVQ:HbmtbFYJPeU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ENMKCf7xhVQ:HbmtbFYJPeU:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ENMKCf7xhVQ:HbmtbFYJPeU:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=ENMKCf7xhVQ:HbmtbFYJPeU:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/ENMKCf7xhVQ" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/05/beauty-of-scheme.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/2664012282642909038?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/2664012282642909038?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/ENMKCf7xhVQ/beauty-of-scheme.html" title="The Beauty of Scheme" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/05/beauty-of-scheme.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMCSHs4eyp7ImA9WhZVEko.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-7176622376644928946</id><published>2011-05-24T16:44:00.002-06:00</published><updated>2011-05-24T16:51:09.533-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-24T16:51:09.533-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>A Human-Usable URL Parser for Python</title><content type="html">&lt;p&gt;Yes, there is the &lt;code&gt;urlparse&lt;/code&gt; module in Python 2.7 and the &lt;code&gt;urllib.parse&lt;/code&gt; function in Python 3, but each of them just creates a 6-tuple of URL parts, and it's up to you to know that the &lt;code&gt;query&lt;/code&gt; part, for example, is at position 4.&lt;/p&gt;

&lt;p&gt;So here's a neat little wrapper around that functionality which gives named fields to each part:&lt;/p&gt;

&lt;script src="https://gist.github.com/989916.js"&gt; &lt;/script&gt;
&lt;noscript&gt;
import urlparse

class Url(object):
    def __init__(self, url):
        self._original = url
        
        self._parts = urlparse.urlparse(url)

        self.scheme = self._parts[0]
        self.netloc = self._parts[1]
        self.path = self._parts[2]
        self.parameters = self._parts[3]
        self.query = self._parts[4]
        self.fragment = self._parts[5]

    def __str__(self):
        return self._original
&lt;/noscript&gt;

&lt;p&gt;So, to get the &lt;code&gt;query&lt;/code&gt; part, you just do &lt;code&gt;parsed_url.query&lt;/code&gt; instead of &lt;code&gt;parsed_url[4]&lt;/code&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bSZpq5YtrAU:aYr-IBzeiwk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bSZpq5YtrAU:aYr-IBzeiwk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bSZpq5YtrAU:aYr-IBzeiwk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bSZpq5YtrAU:aYr-IBzeiwk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=bSZpq5YtrAU:aYr-IBzeiwk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bSZpq5YtrAU:aYr-IBzeiwk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=bSZpq5YtrAU:aYr-IBzeiwk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bSZpq5YtrAU:aYr-IBzeiwk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bSZpq5YtrAU:aYr-IBzeiwk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=bSZpq5YtrAU:aYr-IBzeiwk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bSZpq5YtrAU:aYr-IBzeiwk:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bSZpq5YtrAU:aYr-IBzeiwk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=bSZpq5YtrAU:aYr-IBzeiwk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/bSZpq5YtrAU" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/05/human-usable-url-parser-for-python.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/7176622376644928946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/7176622376644928946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/bSZpq5YtrAU/human-usable-url-parser-for-python.html" title="A Human-Usable URL Parser for Python" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/05/human-usable-url-parser-for-python.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcHRH4_cSp7ImA9WhZWGEs.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-7153694685624715274</id><published>2011-05-19T22:00:00.001-06:00</published><updated>2011-05-19T22:00:35.049-06:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-19T22:00:35.049-06:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="rant" /><category scheme="http://www.blogger.com/atom/ns#" term="society" /><title>How I Saved My Friends Lots of Money</title><content type="html">&lt;p&gt;Last night I got a phone call from one of my neighbors. She told me that she needed to use some courseware for a class at her university and said that she was unable to use it, and that she was told by someone that she needed to upgrade Windows to use it. They further said that, since a Windows license costs on the order of $200, she should just &lt;em&gt;buy a new laptop&lt;/em&gt;. Now, this courseware is a web application—&lt;em&gt;just a web site&lt;/em&gt;—yet she was told to &lt;em&gt;get a new laptop&lt;/em&gt;. Naturally, my BS-meter went off, and I asked if I could come take a look.&lt;/p&gt; &lt;p&gt;I went over and looked, and saw that the real problem was not that the web site didn’t work—it worked just fine—but that the course documents were Microsoft Word .docx files. Not having Office or any other office apps, she had nothing with which to open them. So, I told her the nature of the problem and installed &lt;a href="http://www.libreoffice.org/"&gt;LibreOffice&lt;/a&gt;. Problem solved for $0.&lt;/p&gt; &lt;p&gt;The moral of this story? These points:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;“Computer literacy,” so called, is woefully scarce in our society. I don’t really fault my neighbor so much as the yahoo she spoke with who told her such outrageous nonsense.  &lt;li&gt;Professors should make their course documents available as PDFs, which is the proper interchange format for important documents. (What’s interesting about this is that Microsoft Word 2007 and 2010, which use the .docx format natively, make producing PDFs from Word easier than ever before.)&lt;/li&gt;&lt;/ul&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eQVjE2dvuJQ:GA_KCbyOF8w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eQVjE2dvuJQ:GA_KCbyOF8w:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eQVjE2dvuJQ:GA_KCbyOF8w:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eQVjE2dvuJQ:GA_KCbyOF8w:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=eQVjE2dvuJQ:GA_KCbyOF8w:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eQVjE2dvuJQ:GA_KCbyOF8w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=eQVjE2dvuJQ:GA_KCbyOF8w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eQVjE2dvuJQ:GA_KCbyOF8w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eQVjE2dvuJQ:GA_KCbyOF8w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=eQVjE2dvuJQ:GA_KCbyOF8w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eQVjE2dvuJQ:GA_KCbyOF8w:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eQVjE2dvuJQ:GA_KCbyOF8w:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=eQVjE2dvuJQ:GA_KCbyOF8w:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/eQVjE2dvuJQ" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/05/how-i-saved-my-friends-lots-of-money.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/7153694685624715274?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/7153694685624715274?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/eQVjE2dvuJQ/how-i-saved-my-friends-lots-of-money.html" title="How I Saved My Friends Lots of Money" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/05/how-i-saved-my-friends-lots-of-money.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYERnw6eSp7ImA9Wx9UGUQ.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-3274478005181416687</id><published>2011-01-28T14:01:00.000-07:00</published><updated>2011-02-17T19:45:07.211-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-02-17T19:45:07.211-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQLite" /><category scheme="http://www.blogger.com/atom/ns#" term="NServiceBus" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="distributed systems" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Making System.Data.SQLite Work in an NServiceBus Endpoint</title><content type="html">Today a colleague and I worked on getting an an &lt;a href="http://www.nservicebus.com/"&gt;NServiceBus&lt;/a&gt; endpoint in a .NET 4.0 project that referenced &lt;a href="http://sqlite.phxsoftware.com/"&gt;System.Data.SQLite&lt;/a&gt; to work properly. It turns out that this is not as straightforward as it may seem.&lt;br /&gt;
&lt;br /&gt;
The System.Data.SQLite binaries are targeted for the .NET 2.0 runtime. When &lt;a href="http://stackoverflow.com/questions/2455654/what-additional-configuration-is-necessary-to-reference-a-net-2-0-mixed-mode-a"&gt;referencing a .NET 2.0 mixed mode assembly in a .NET 4.0 project&lt;/a&gt;, additional configuration is required:&lt;br /&gt;
&lt;br /&gt;
&lt;script src="https://gist.github.com/833167.js"&gt; &lt;/script&gt;&lt;br /&gt;
OK, that's fine. But when running an NServiceBus endpoint in the NServiceBus.Host.exe executable, it seems that this setting in App.config does not get applied in the context of NServiceBus.Host.exe. So, to get this to work, we had to turn the NServiceBus endpoint into a console application with a &lt;code&gt;Main&lt;/code&gt; method that used reflection to invoke the &lt;code&gt;Main&lt;/code&gt; method of NServiceBus.Host.exe. Doing this enables the above setting to be applied in the context of NServiceBus.Host.exe.&lt;br /&gt;
&lt;br /&gt;
It took us the better part of a day to figure this out, so I'm memorializing it here for (my own) future reference.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=SCdiHQZPf-Y:7mMNiAA1FPU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=SCdiHQZPf-Y:7mMNiAA1FPU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=SCdiHQZPf-Y:7mMNiAA1FPU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=SCdiHQZPf-Y:7mMNiAA1FPU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=SCdiHQZPf-Y:7mMNiAA1FPU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=SCdiHQZPf-Y:7mMNiAA1FPU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=SCdiHQZPf-Y:7mMNiAA1FPU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=SCdiHQZPf-Y:7mMNiAA1FPU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=SCdiHQZPf-Y:7mMNiAA1FPU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=SCdiHQZPf-Y:7mMNiAA1FPU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=SCdiHQZPf-Y:7mMNiAA1FPU:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=SCdiHQZPf-Y:7mMNiAA1FPU:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=SCdiHQZPf-Y:7mMNiAA1FPU:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/SCdiHQZPf-Y" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/01/making-systemdatasqlite-work-in.html#comment-form" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/3274478005181416687?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/3274478005181416687?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/SCdiHQZPf-Y/making-systemdatasqlite-work-in.html" title="Making System.Data.SQLite Work in an NServiceBus Endpoint" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://www.code-words.com/2011/01/making-systemdatasqlite-work-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUARXo4eSp7ImA9WhBTEEU.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-6752962384290190316</id><published>2011-01-27T09:07:00.000-07:00</published><updated>2013-02-05T09:37:24.431-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T09:37:24.431-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Generate Test Files From the Command Line</title><content type="html">&lt;strong&gt;Note to self:&lt;/strong&gt; I had to generate some files quickly to test the behavior of the .NET &lt;code&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx"&gt;FileSystemWatcher&lt;/a&gt;&lt;/code&gt;. This little bash script will create 6 zero-filled files of of size \( 2 \times 10^i \)&amp;nbsp;KiB, where \( i \in \{0, 1, \dots, 5\} \).&lt;br /&gt;
&lt;script src="https://gist.github.com/clementi/4715654.js"&gt;&lt;/script&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=raEhVnmfiP0:yJn4tVZgln4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=raEhVnmfiP0:yJn4tVZgln4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=raEhVnmfiP0:yJn4tVZgln4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=raEhVnmfiP0:yJn4tVZgln4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=raEhVnmfiP0:yJn4tVZgln4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=raEhVnmfiP0:yJn4tVZgln4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=raEhVnmfiP0:yJn4tVZgln4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=raEhVnmfiP0:yJn4tVZgln4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=raEhVnmfiP0:yJn4tVZgln4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=raEhVnmfiP0:yJn4tVZgln4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=raEhVnmfiP0:yJn4tVZgln4:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=raEhVnmfiP0:yJn4tVZgln4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=raEhVnmfiP0:yJn4tVZgln4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/raEhVnmfiP0" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/01/generate-test-files-from-command-line.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/6752962384290190316?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/6752962384290190316?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/raEhVnmfiP0/generate-test-files-from-command-line.html" title="Generate Test Files From the Command Line" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/01/generate-test-files-from-command-line.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEDSXYyeyp7ImA9WhBTEEU.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-7465546870997796680</id><published>2011-01-11T07:39:00.000-07:00</published><updated>2013-02-05T09:44:38.893-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-02-05T09:44:38.893-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="c#" /><title>Retrying Code Execution</title><content type="html">&lt;p&gt;I have a bit of code I'm working on at work that makes use of an HTTP endpoint to notify a legacy system of certain events. Because &lt;a href="http://blog.carbonfive.com/2010/11/17/fallacy-1-the-network-is-reliabl/"&gt;the network is not reliable&lt;/a&gt;, we have to handle the case when the network may be down. In this situation, it means to try again a few times, after which the processing request goes into an &lt;a href="http://nservicebus.com/"&gt;error queue&lt;/a&gt;, where it can be handled manually. So, I started out with something like this:&lt;/p&gt;

&lt;script src="https://gist.github.com/clementi/4715685.js"&gt;&lt;/script&gt;

&lt;p&gt;This calls the HTTP endpoint up to five times. If one of those times succeeds, it returns the result and stops trying. If it gets to the sixth time, it gives up.&lt;/p&gt;

&lt;p&gt;Now, in my project, I have several of these types of calls to make. Much of the above code, namely the exception handling and flow control stuff, is common to all of them. So, using some functional .NET and an extension method, we can do this:&lt;/p&gt;

&lt;script src="https://gist.github.com/clementi/4715705.js"&gt;&lt;/script&gt;

This will attempt to execute and return the value of &lt;code&gt;func&lt;/code&gt; up to &lt;code&gt;times&lt;/code&gt; times, and give up after that. With this extension method, we can now put our endpoint-calling code in a &lt;code&gt;Func&amp;lt;int&amp;gt;&lt;/code&gt; and tell it to try to call the endpoint up to five times, like this:

&lt;script src="https://gist.github.com/clementi/4715713.js"&gt;&lt;/script&gt;

Now, is this the best way to do this? Maybe; maybe not. It's just something I've been toying around with in my attempts to eliminate duplication of the aforementioned ugly flow control code. I'll have to walk around in these shoes for a while and see whether I like them.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=v7wqTWgb-8U:ZglcagNqVYA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=v7wqTWgb-8U:ZglcagNqVYA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=v7wqTWgb-8U:ZglcagNqVYA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=v7wqTWgb-8U:ZglcagNqVYA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=v7wqTWgb-8U:ZglcagNqVYA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=v7wqTWgb-8U:ZglcagNqVYA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=v7wqTWgb-8U:ZglcagNqVYA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=v7wqTWgb-8U:ZglcagNqVYA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=v7wqTWgb-8U:ZglcagNqVYA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=v7wqTWgb-8U:ZglcagNqVYA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=v7wqTWgb-8U:ZglcagNqVYA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=v7wqTWgb-8U:ZglcagNqVYA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=v7wqTWgb-8U:ZglcagNqVYA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/v7wqTWgb-8U" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2011/01/retrying-code-execution.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/7465546870997796680?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/7465546870997796680?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/v7wqTWgb-8U/retrying-code-execution.html" title="Retrying Code Execution" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2011/01/retrying-code-execution.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQ387eSp7ImA9Wx9aEUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-8651132472468292161</id><published>2010-12-03T04:56:00.000-07:00</published><updated>2011-03-03T11:58:32.101-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:58:32.101-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="js" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="browser quirks" /><category scheme="http://www.blogger.com/atom/ns#" term="internet explorer" /><category scheme="http://www.blogger.com/atom/ns#" term="insanity" /><category scheme="http://www.blogger.com/atom/ns#" term="ie" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>IE Doesn't Support the trim() Method(!)</title><content type="html">Here's yet another shocker from the half-baked world of Internet Explorer. Start up IE 8. Press F12 or start the Developer Tools. Then, click the Script tab and then the Console tab on the right pane. At the command line at the bottom, type&lt;br/&gt;[sourcecode language="javascript"]&lt;br/&gt;&amp;quot;   this has padded whitespace    &amp;quot;.trim();&lt;br/&gt;[/sourcecode]&lt;br/&gt;press Enter, and behold:&lt;br/&gt;&lt;br/&gt;&lt;img src="http://farm6.static.flickr.com/5086/5229592274_5b09aa90b4_o.png" /&gt;&lt;br/&gt;&lt;br/&gt;Insane! Thankfully, the folks at jQuery have &lt;a href="http://api.jquery.com/jQuery.trim/"&gt;taken care of this&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Ju1sd6k4JN8:YF-uk0KjmWI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Ju1sd6k4JN8:YF-uk0KjmWI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Ju1sd6k4JN8:YF-uk0KjmWI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Ju1sd6k4JN8:YF-uk0KjmWI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=Ju1sd6k4JN8:YF-uk0KjmWI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Ju1sd6k4JN8:YF-uk0KjmWI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=Ju1sd6k4JN8:YF-uk0KjmWI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Ju1sd6k4JN8:YF-uk0KjmWI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Ju1sd6k4JN8:YF-uk0KjmWI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=Ju1sd6k4JN8:YF-uk0KjmWI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Ju1sd6k4JN8:YF-uk0KjmWI:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Ju1sd6k4JN8:YF-uk0KjmWI:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=Ju1sd6k4JN8:YF-uk0KjmWI:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/Ju1sd6k4JN8" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2010/12/ie-doesn-support-trim-method.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/8651132472468292161?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/8651132472468292161?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/Ju1sd6k4JN8/ie-doesn-support-trim-method.html" title="IE Doesn&amp;#39;t Support the trim() Method(!)" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2010/12/ie-doesn-support-trim-method.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQ387fCp7ImA9Wx9aEUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-9091494613184832422</id><published>2010-12-02T03:41:00.000-07:00</published><updated>2011-03-03T11:58:32.104-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:58:32.104-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net mvc" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>The ASP.NET MVC Request-Handling Pipeline</title><content type="html">[scribd id=44539131 key=key-mb5rsfz5wd7wk3u95t1 mode=list]&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eUXGfe1NjbQ:xrCdDA1TpfM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eUXGfe1NjbQ:xrCdDA1TpfM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eUXGfe1NjbQ:xrCdDA1TpfM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eUXGfe1NjbQ:xrCdDA1TpfM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=eUXGfe1NjbQ:xrCdDA1TpfM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eUXGfe1NjbQ:xrCdDA1TpfM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=eUXGfe1NjbQ:xrCdDA1TpfM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eUXGfe1NjbQ:xrCdDA1TpfM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eUXGfe1NjbQ:xrCdDA1TpfM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=eUXGfe1NjbQ:xrCdDA1TpfM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eUXGfe1NjbQ:xrCdDA1TpfM:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=eUXGfe1NjbQ:xrCdDA1TpfM:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=eUXGfe1NjbQ:xrCdDA1TpfM:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/eUXGfe1NjbQ" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2010/12/aspnet-mvc-request-handling-pipeline.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/9091494613184832422?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/9091494613184832422?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/eUXGfe1NjbQ/aspnet-mvc-request-handling-pipeline.html" title="The ASP.NET MVC Request-Handling Pipeline" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2010/12/aspnet-mvc-request-handling-pipeline.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQ387fyp7ImA9Wx9aEUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-4384819593811687590</id><published>2010-11-30T03:06:00.000-07:00</published><updated>2011-03-03T11:58:32.107-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:58:32.107-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="fun" /><category scheme="http://www.blogger.com/atom/ns#" term="humor" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="languages" /><category scheme="http://www.blogger.com/atom/ns#" term="geek" /><title>Java as DSL</title><content type="html">I love it:&lt;br/&gt;&lt;br/&gt;http://twitter.com/#!/avalanche123/status/7062890318143488&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bgs46pXehMQ:NZArKfyZ4MY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bgs46pXehMQ:NZArKfyZ4MY:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bgs46pXehMQ:NZArKfyZ4MY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bgs46pXehMQ:NZArKfyZ4MY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=bgs46pXehMQ:NZArKfyZ4MY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bgs46pXehMQ:NZArKfyZ4MY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=bgs46pXehMQ:NZArKfyZ4MY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bgs46pXehMQ:NZArKfyZ4MY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bgs46pXehMQ:NZArKfyZ4MY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=bgs46pXehMQ:NZArKfyZ4MY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bgs46pXehMQ:NZArKfyZ4MY:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=bgs46pXehMQ:NZArKfyZ4MY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=bgs46pXehMQ:NZArKfyZ4MY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/bgs46pXehMQ" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2010/11/java-as-dsl.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/4384819593811687590?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/4384819593811687590?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/bgs46pXehMQ/java-as-dsl.html" title="Java as DSL" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2010/11/java-as-dsl.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQ386eCp7ImA9Wx9aEUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-5630111984263343064</id><published>2010-11-22T04:05:00.000-07:00</published><updated>2011-03-03T11:58:32.110-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:58:32.110-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="uuid" /><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Generate a Version 4 UUID With Javascript</title><content type="html">[sourcecode language="javascript"]&lt;br/&gt;function uuid4() {&lt;br/&gt;	return &amp;quot;xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx&amp;quot;&lt;br/&gt;		.replace(/[xy]/g, function (c) {&lt;br/&gt;			var r = Math.random() * 16 | 0, v = c == &amp;quot;x&amp;quot; ? r : r &amp;amp; 0x3 | 0x8;&lt;br/&gt;			return v.toString(16);&lt;br/&gt;		});&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;&lt;p&gt;From &lt;a href="https://github.com/joliver/Mvc2.TaskUI"&gt;Mvc2.TaskUI&lt;/a&gt; by &lt;a href="http://jonathan-oliver.blogspot.com/" rel="co-worker met"&gt;Jonathan Oliver&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=dBfbS-NGspg:zoEtsmWEU3M:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=dBfbS-NGspg:zoEtsmWEU3M:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=dBfbS-NGspg:zoEtsmWEU3M:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=dBfbS-NGspg:zoEtsmWEU3M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=dBfbS-NGspg:zoEtsmWEU3M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=dBfbS-NGspg:zoEtsmWEU3M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=dBfbS-NGspg:zoEtsmWEU3M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=dBfbS-NGspg:zoEtsmWEU3M:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=dBfbS-NGspg:zoEtsmWEU3M:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=dBfbS-NGspg:zoEtsmWEU3M:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=dBfbS-NGspg:zoEtsmWEU3M:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=dBfbS-NGspg:zoEtsmWEU3M:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=dBfbS-NGspg:zoEtsmWEU3M:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/dBfbS-NGspg" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2010/11/generate-version-4-uuid-with-javascript.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/5630111984263343064?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/5630111984263343064?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/dBfbS-NGspg/generate-version-4-uuid-with-javascript.html" title="Generate a Version 4 UUID With Javascript" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2010/11/generate-version-4-uuid-with-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQ386eyp7ImA9Wx9aEUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-3981947590238775661</id><published>2010-11-18T02:31:00.000-07:00</published><updated>2011-03-03T11:58:32.113-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:58:32.113-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="functional programming" /><category scheme="http://www.blogger.com/atom/ns#" term="map/reduce" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>Roll Your Own Map/Reduce in Javascript</title><content type="html">I’ve been working on a very Javascript-heavy UI that allows the user to manipulate collections of objects. To ease the task of manipulation, I created a few methods on &lt;code&gt;Array.prototype&lt;/code&gt;, which I rolled into a file I call &lt;a href="https://gist.github.com/705111"&gt;iterable.js&lt;/a&gt;:&lt;br/&gt;&lt;br/&gt;[sourcecode language="javascript"]&lt;br/&gt;var Iterable = {&lt;br/&gt;    func: {&lt;br/&gt;        predicate: {&lt;br/&gt;            TRUE: function (x) { return true; }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;Array.prototype.forEach = function (fn) {&lt;br/&gt;    for (var i = 0; i &amp;lt; this.length; i++)&lt;br/&gt;        fn(this[i]);&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;Array.prototype.filter = function (pred) {&lt;br/&gt;    var result = [];&lt;br/&gt;    this.forEach(function (x) {&lt;br/&gt;        if (pred(x))&lt;br/&gt;            result.push(x);&lt;br/&gt;    });&lt;br/&gt;&lt;br/&gt;    return result;&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;Array.prototype.distinct = function () {&lt;br/&gt;    var result = [];&lt;br/&gt;    this.forEach(function (x) {&lt;br/&gt;        if (!result.any(function (y) { return y == x; }))&lt;br/&gt;            result.push(x);&lt;br/&gt;    });&lt;br/&gt;&lt;br/&gt;    return result;&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;Array.prototype.any = function (pred) {&lt;br/&gt;    pred = pred || Iterable.func.predicate.TRUE;&lt;br/&gt;    &lt;br/&gt;    for (var i = 0; i &amp;lt; this.length; i++)&lt;br/&gt;        if (pred(this[i]))&lt;br/&gt;            return true;&lt;br/&gt;        &lt;br/&gt;    return false;&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;Array.prototype.indexOf = function (expr) {&lt;br/&gt;    if (!(expr instanceof Function))&lt;br/&gt;        expr = function (x) { return x == expr; };&lt;br/&gt;&lt;br/&gt;    for (var i = 0; i &amp;lt; this.length; i++)&lt;br/&gt;        if (expr(this[i]))&lt;br/&gt;            return i;&lt;br/&gt;&lt;br/&gt;    return -1;&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;Array.prototype.singleOrNull = function (pred) {&lt;br/&gt;    var filtered = this.filter(pred);&lt;br/&gt;    if (filtered.length == 0)&lt;br/&gt;        return null;&lt;br/&gt;    if (filtered.length &amp;gt; 1)&lt;br/&gt;        throw &amp;quot;More than one element returned.&amp;quot;;&lt;br/&gt;    &lt;br/&gt;    return filtered[0];&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;Array.prototype.map = function (fn) {&lt;br/&gt;    var mapped = [];&lt;br/&gt;    this.forEach(function (x) { mapped.push(fn(x)); });&lt;br/&gt;    return mapped;&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;Array.prototype.groupBy = function (sel) {&lt;br/&gt;    var groups = [];&lt;br/&gt;&lt;br/&gt;    this.forEach(function (x) {&lt;br/&gt;        var group = groups.singleOrNull(function (y) { return y.key == sel(x); });&lt;br/&gt;        if (!group)&lt;br/&gt;            groups.push({ key: sel(x), members: [x] });&lt;br/&gt;        else&lt;br/&gt;            group.members.push(x);&lt;br/&gt;    });&lt;br/&gt;&lt;br/&gt;    return groups;&lt;br/&gt;};&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Note that this not particularly complete; for example, you’ll see that there is no implementation of a &lt;code&gt;reduce&lt;/code&gt; function. It’s not here because I have not needed it in my project yet, nor am I likely to. But it would be easy to implement:&lt;br/&gt;&lt;br/&gt;[sourcecode language="javascript"]&lt;br/&gt;Array.prototype.reduce = function (fn) {&lt;br/&gt;    if (this.length == 1)&lt;br/&gt;        return this[0];&lt;br/&gt;    return fn(this[0], this.slice(1).reduce(fn));&lt;br/&gt;};&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;Now, I’m aware of &lt;a href="http://documentcloud.github.com/underscore/"&gt;Underscore&lt;/a&gt; and others, so why did I do this? For two reasons, mainly: I only needed a subset of the functions that those libraries offer, and besides, it was fun.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=n1jYllxyQiE:qQDUzmrNAnI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=n1jYllxyQiE:qQDUzmrNAnI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=n1jYllxyQiE:qQDUzmrNAnI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=n1jYllxyQiE:qQDUzmrNAnI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=n1jYllxyQiE:qQDUzmrNAnI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=n1jYllxyQiE:qQDUzmrNAnI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=n1jYllxyQiE:qQDUzmrNAnI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=n1jYllxyQiE:qQDUzmrNAnI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=n1jYllxyQiE:qQDUzmrNAnI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=n1jYllxyQiE:qQDUzmrNAnI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=n1jYllxyQiE:qQDUzmrNAnI:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=n1jYllxyQiE:qQDUzmrNAnI:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=n1jYllxyQiE:qQDUzmrNAnI:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/n1jYllxyQiE" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2010/11/roll-your-own-mapreduce-in-javascript.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/3981947590238775661?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/3981947590238775661?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/n1jYllxyQiE/roll-your-own-mapreduce-in-javascript.html" title="Roll Your Own Map/Reduce in Javascript" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2010/11/roll-your-own-mapreduce-in-javascript.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQ386fSp7ImA9Wx9aEUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-7828771108095684563</id><published>2010-06-08T14:48:00.000-06:00</published><updated>2011-03-03T11:58:32.115-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:58:32.115-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="hashset" /><category scheme="http://www.blogger.com/atom/ns#" term="collections" /><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><category scheme="http://www.blogger.com/atom/ns#" term="set" /><category scheme="http://www.blogger.com/atom/ns#" term="programming" /><title>The .Net HashSet</title><content type="html">I’m relatively new to .Net, coming from the world of Java. Now, the &lt;a href="http://msdn.microsoft.com/en-us/library/bb359438(v=VS.90).aspx"&gt;documentation of the &lt;code&gt;HashSet&lt;/code&gt; class&lt;/a&gt; says, “The HashSet(Of T) class provides high performance set operations. A set is a collection that contains no duplicate elements, and whose elements are in no particular order.” Fair enough, except that &lt;a href="http://msdn.microsoft.com/en-us/library/bb359438(v=VS.90).aspx#3"&gt;the &lt;code&gt;HashSet&lt;/code&gt; class preserves insertion order&lt;/a&gt;. Furthermore, &lt;code&gt;set1.Equals(set2)&lt;/code&gt; will return &lt;code&gt;false&lt;/code&gt; &lt;em&gt;even when the two sets contain the same elements but in a different insertion order&lt;/em&gt;.&lt;br/&gt;&lt;br/&gt;This doesn’t sound like set semantics to me. Fortunately, you can remedy this with a simple extension method and LINQ:&lt;br/&gt;&lt;br/&gt;[sourcecode language="csharp"]&lt;br/&gt;public static bool SetEquals&amp;lt;T&amp;gt;(this HashSet&amp;lt;T&amp;gt; me, HashSet&amp;lt;T&amp;gt; other)&lt;br/&gt;{&lt;br/&gt;    return me.All(other.Contains) &amp;amp;&amp;amp; other.All(me.Contains);&lt;br/&gt;}&lt;br/&gt;[/sourcecode]&lt;br/&gt;&lt;br/&gt;As you can see, the LINQ expression on line 3 is equivalent to the &lt;a href="http://www.cs.odu.edu/~toida/nerzic/content/set/basics.html"&gt;definition of set equality&lt;/a&gt;. Of course, the parameters to this method could be of type &lt;code&gt;ICollection&amp;lt;T&amp;gt;&lt;/code&gt; or something for more genericity.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Md7ZSSqd1aw:mJi6cwvnhwQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Md7ZSSqd1aw:mJi6cwvnhwQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Md7ZSSqd1aw:mJi6cwvnhwQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Md7ZSSqd1aw:mJi6cwvnhwQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=Md7ZSSqd1aw:mJi6cwvnhwQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Md7ZSSqd1aw:mJi6cwvnhwQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=Md7ZSSqd1aw:mJi6cwvnhwQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Md7ZSSqd1aw:mJi6cwvnhwQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Md7ZSSqd1aw:mJi6cwvnhwQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=Md7ZSSqd1aw:mJi6cwvnhwQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Md7ZSSqd1aw:mJi6cwvnhwQ:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=Md7ZSSqd1aw:mJi6cwvnhwQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=Md7ZSSqd1aw:mJi6cwvnhwQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/Md7ZSSqd1aw" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2010/06/net-hashset.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/7828771108095684563?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/7828771108095684563?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/Md7ZSSqd1aw/net-hashset.html" title="The .Net HashSet" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2010/06/net-hashset.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQ386cCp7ImA9Wx9aEUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-8228126460499817876</id><published>2010-03-08T15:20:00.000-07:00</published><updated>2011-03-03T11:58:32.118-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:58:32.118-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software engineering" /><title>Endless Code</title><content type="html">&lt;div id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:42fb7c6b-1d00-45a6-bbcc-46e8752484a1" class="wlWriterEditableSmartContent" style="display:inline;float:none;margin:0;padding:0;"&gt;&lt;br/&gt;&lt;div&gt;&lt;br/&gt;&lt;br/&gt;&lt;a href="http://vimeo.com/9981123"&gt;Bad Code&lt;/a&gt; from &lt;a href="http://vimeo.com/user947916"&gt;unclebob&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;:&lt;br/&gt;&lt;br/&gt;[vimeo 9981123]&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;&lt;/div&gt;&lt;br/&gt;FYI: The piece heard in this video is &lt;em&gt;Atmosphères&lt;/em&gt; by György Sándor Ligeti, who intended the listener “to become lost in the depth of the texture and tone and become completely oblivious to the passage of time,” according to &lt;a href="http://en.wikipedia.org/wiki/Atmosph%C3%A8res"&gt;Wikipedia&lt;/a&gt;.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ESfbVli_jmY:0CDSiWhUbGI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ESfbVli_jmY:0CDSiWhUbGI:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ESfbVli_jmY:0CDSiWhUbGI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ESfbVli_jmY:0CDSiWhUbGI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=ESfbVli_jmY:0CDSiWhUbGI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ESfbVli_jmY:0CDSiWhUbGI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=ESfbVli_jmY:0CDSiWhUbGI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ESfbVli_jmY:0CDSiWhUbGI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ESfbVli_jmY:0CDSiWhUbGI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=ESfbVli_jmY:0CDSiWhUbGI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ESfbVli_jmY:0CDSiWhUbGI:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=ESfbVli_jmY:0CDSiWhUbGI:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=ESfbVli_jmY:0CDSiWhUbGI:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/ESfbVli_jmY" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2010/03/endless-code.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/8228126460499817876?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/8228126460499817876?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/ESfbVli_jmY/endless-code.html" title="Endless Code" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2010/03/endless-code.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQ388eCp7ImA9Wx9aEUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-1768472993955589984</id><published>2010-03-05T06:02:00.000-07:00</published><updated>2011-03-03T11:58:32.170-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:58:32.170-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="software" /><category scheme="http://www.blogger.com/atom/ns#" term="information" /><category scheme="http://www.blogger.com/atom/ns#" term="feeds" /><category scheme="http://www.blogger.com/atom/ns#" term="web" /><title>Feed Reader Problems</title><content type="html">&lt;a href="http://linuxart.com/log/archives/2004/12/06/intelligent-rssatom-feed-reader/"&gt;Garrett LeSage&lt;/a&gt; says that feed readers are not smart enough, and I agree. One of the problems I face is that not all feeds have the same "velocity," which I define as "number of posts per unit time." For example, I have a &lt;a href="http://www.google.com/reader/shared/user%2F03954112942059263219%2Flabel%2FSoftware%20Engineering"&gt;group of feeds&lt;/a&gt; in Google Reader that I read for work and professional development. However, I also read DZone.com and want to add its feeds to the group, but I don't, because its velocity is far greater than the velocities of any of the other feeds in the group. The result, of course, is that DZone dominates the group, and the posts from the other feeds get "crowded out." A feed reader should take into account how &lt;em&gt;often&lt;/em&gt; I read the posts of a given feed, determine &lt;em&gt;what&lt;/em&gt; those posts I read are about, and then filter accordingly (while offering me the opportunity to see the whole, unfiltered feed if I so choose). It should also offer suggestions of new feeds that I may find interesting.&lt;br/&gt;&lt;br/&gt;No feed reader currently meets my needs---and it's not because there is a dearth of feed readers out there. Some come somewhat close, but none have yet done it right.&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=1SDKuc-rU0E:lVoYlRogRdA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=1SDKuc-rU0E:lVoYlRogRdA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=1SDKuc-rU0E:lVoYlRogRdA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=1SDKuc-rU0E:lVoYlRogRdA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=1SDKuc-rU0E:lVoYlRogRdA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=1SDKuc-rU0E:lVoYlRogRdA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=1SDKuc-rU0E:lVoYlRogRdA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=1SDKuc-rU0E:lVoYlRogRdA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=1SDKuc-rU0E:lVoYlRogRdA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=1SDKuc-rU0E:lVoYlRogRdA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=1SDKuc-rU0E:lVoYlRogRdA:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=1SDKuc-rU0E:lVoYlRogRdA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=1SDKuc-rU0E:lVoYlRogRdA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/1SDKuc-rU0E" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2010/03/feed-reader-problems.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/1768472993955589984?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/1768472993955589984?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/1SDKuc-rU0E/feed-reader-problems.html" title="Feed Reader Problems" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2010/03/feed-reader-problems.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAFQ388eip7ImA9Wx9aEUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-8054822645647041340</id><published>2010-01-19T09:20:00.000-07:00</published><updated>2011-03-03T11:58:32.172-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:58:32.172-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linguistics" /><category scheme="http://www.blogger.com/atom/ns#" term="sapir-whorf" /><category scheme="http://www.blogger.com/atom/ns#" term="software engineering" /><title>Sapir-Whorf in Software Engineering</title><content type="html">What follows is a short essay I wrote for &lt;a title="CS 428" href="http://students.cs.byu.edu/~knutson/cs428/"&gt;my software engineering class last semester&lt;/a&gt;.&lt;br/&gt;&lt;blockquote&gt;I have many interests; one of them is linguistics. I first heard of the &lt;a href="http://en.wikipedia.org/wiki/Sapir-whorf"&gt;Sapir-Whorf hypothesis, also called the linguistic relativity principle&lt;/a&gt;, some years ago and it caught my interest. Despite the many objections and resistance brought against it, I have always found it to be rather compelling.&lt;br/&gt;&lt;br/&gt;It seems obvious to me that the language we use to describe and interface with the world should shape our cognition about the world. Many studies have been done which show this in natural languages. But it seems that there have been fewer studies about this principle in programming languages, especially in software engineering.&lt;br/&gt;&lt;br/&gt;I remember when I took CS 330 about a year ago. CS 330 is a course on programming languages, and the language of the class is &lt;a href="http://www.plt-scheme.org/"&gt;Scheme&lt;/a&gt;, a cousin of Lisp. Scheme is a functional programming language, which is to say that, in Scheme, functions are first-class objects, just like any other data type. This was the first time I was ever really exposed to the functional paradigm (although I saw a little of it before in Javascript), and it had a rather profound effect on my skills as a software developer. For when we studied Scheme and used it to investigate the principles of programming languages, my thinking about programming changed; it expanded into new realms, and I could see things that I had never really seen before.&lt;br/&gt;&lt;br/&gt;One of the things studying Scheme did for me was to get me interested in programming languages and related concepts. But more immediately, it added to my cognitive landscape the idea of functional programming. Not long after I began to learn Scheme did I come to see the benefits of functional programming in other languages, like Python, which I learned has a "lambda" keyword like Scheme. Soon I began to incorporate functional principles in my work outside that class, in  other classes, and so on. I was writing software in a way that I would not have done before without having been exposed to this new paradigm.&lt;br/&gt;&lt;br/&gt;And thus it is with software engineering. The long use of the same tools, practices, patterns, languages, etc. often constrain our thinking and deprive us from creating elegant, simple solutions to problems. While I am a firm believer in process---process in the sense that there must be &lt;em&gt;some&lt;/em&gt; means by which a software development organization develops its software, and that it should be at least somewhat structured, I also acknowledge the fact that adhering too rigidly to process and procedure can stifle creativity and ossify the mentality of an organization. This is to be avoided, since software development is a creative enterprise; it is by no means formulaic.&lt;br/&gt;&lt;br/&gt;We software engineers, programmers, or whatever we like to be called, are, in a sense, linguists. We learn and use languages all the time. As such, we are subject to linguistic principles. Despite the objections of Chomsky and others, I have always found Sapir-Whorf to be true---so true, in fact, that it's a self-evident proposition.&lt;/blockquote&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=GpViLuuGCic:dXNRCRnxkc4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=GpViLuuGCic:dXNRCRnxkc4:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=GpViLuuGCic:dXNRCRnxkc4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=GpViLuuGCic:dXNRCRnxkc4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=GpViLuuGCic:dXNRCRnxkc4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=GpViLuuGCic:dXNRCRnxkc4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=GpViLuuGCic:dXNRCRnxkc4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=GpViLuuGCic:dXNRCRnxkc4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=GpViLuuGCic:dXNRCRnxkc4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=GpViLuuGCic:dXNRCRnxkc4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=GpViLuuGCic:dXNRCRnxkc4:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=GpViLuuGCic:dXNRCRnxkc4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=GpViLuuGCic:dXNRCRnxkc4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/GpViLuuGCic" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2010/01/sapir-whorf-in-software-engineering.html#comment-form" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/8054822645647041340?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/8054822645647041340?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/GpViLuuGCic/sapir-whorf-in-software-engineering.html" title="Sapir-Whorf in Software Engineering" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://www.code-words.com/2010/01/sapir-whorf-in-software-engineering.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkAGRHozeSp7ImA9Wx9aEUo.&quot;"><id>tag:blogger.com,1999:blog-1850404271021106599.post-1181450592196806918</id><published>2009-02-27T05:49:00.000-07:00</published><updated>2011-03-03T11:58:45.481-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-03T11:58:45.481-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="javascript" /><category scheme="http://www.blogger.com/atom/ns#" term="web development" /><category scheme="http://www.blogger.com/atom/ns#" term="firefox" /><category scheme="http://www.blogger.com/atom/ns#" term="internet explorer" /><category scheme="http://www.blogger.com/atom/ns#" term="ie" /><category scheme="http://www.blogger.com/atom/ns#" term="safari" /><category scheme="http://www.blogger.com/atom/ns#" term="chrome" /><category scheme="http://www.blogger.com/atom/ns#" term="debugging" /><category scheme="http://www.blogger.com/atom/ns#" term="opera" /><category scheme="http://www.blogger.com/atom/ns#" term="firebug" /><title>Build Firebug Into Firefox</title><content type="html">&lt;p&gt;The other day I came to a startling realization: that all of the major web browsers&amp;mdash;except Firefox&amp;mdash;have Firebug-like developer tools built into them. Specifically, these browsers:&lt;/p&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;&lt;li&gt;Internet Explorer(!) 7 and 8&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Safari&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Google Chrome&lt;/li&gt;&lt;br/&gt;&lt;li&gt;Opera&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;p&gt;This is clearly the way things are going. Firebug and similar tools are so critical to developing web apps now that I think the Mozilla Foundation ought to acquire Firebug and build it into Firefox. I'd accept making it an option on installation, defaulted to "off," so that non-developers needn't deal with it.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=UHnEuX-cdoc:Cs_vV0ICzjQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=UHnEuX-cdoc:Cs_vV0ICzjQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=UHnEuX-cdoc:Cs_vV0ICzjQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=UHnEuX-cdoc:Cs_vV0ICzjQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=UHnEuX-cdoc:Cs_vV0ICzjQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=UHnEuX-cdoc:Cs_vV0ICzjQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=UHnEuX-cdoc:Cs_vV0ICzjQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=UHnEuX-cdoc:Cs_vV0ICzjQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=UHnEuX-cdoc:Cs_vV0ICzjQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=UHnEuX-cdoc:Cs_vV0ICzjQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=UHnEuX-cdoc:Cs_vV0ICzjQ:YwkR-u9nhCs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?d=YwkR-u9nhCs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codewords?a=UHnEuX-cdoc:Cs_vV0ICzjQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codewords?i=UHnEuX-cdoc:Cs_vV0ICzjQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codewords/~4/UHnEuX-cdoc" height="1" width="1"/&gt;</content><link rel="replies" type="text/html" href="http://www.code-words.com/2009/02/build-firebug-into-firefox.html#comment-form" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/1181450592196806918?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1850404271021106599/posts/default/1181450592196806918?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/Codewords/~3/UHnEuX-cdoc/build-firebug-into-firefox.html" title="Build Firebug Into Firefox" /><author><name>Jeff Pratt</name><uri>https://plus.google.com/116301345109542242693</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-oB0h_K7uqh8/AAAAAAAAAAI/AAAAAAAAC0I/Bv7lJIQsDMs/s512-c/photo.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://www.code-words.com/2009/02/build-firebug-into-firefox.html</feedburner:origLink></entry></feed>
