<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1670048653123050463</id><updated>2012-02-15T12:00:01.509-08:00</updated><category term='url'/><category term='cli'/><category term='javascript'/><category term='fck'/><category term='encoding'/><category term='bug'/><category term='webbrowser'/><category term='wmc'/><category term='percent-encoding'/><category term='ietf'/><category term='tumblr'/><category term='http'/><category term='dvd'/><category term='array'/><category term='form'/><category term='console'/><category term='csharp'/><category term='win7'/><category term='accelerator'/><category term='powershell'/><category term='tee'/><category term='extension'/><category term='windows-media-center'/><category term='geolocmock'/><category term='windows'/><category term='.net'/><category term='tv'/><category term='geoloc'/><category term='c++'/><category term='wpad'/><category term='update'/><category term='ie9'/><category term='humor'/><category term='me'/><category term='feed'/><category term='social-drm'/><category term='technical'/><category term='tool'/><category term='user agent'/><category term='blackmail'/><category term='google-reader'/><category term='programming'/><category term='com'/><category term='blog'/><category term='ie'/><category term='drm'/><category term='delicious'/><category term='html'/><category term='sal'/><category term='history'/><category term='fiddlercore'/><category term='clip'/><category term='https'/><category term='weboc'/><category term='jumplist'/><category term='blackmail-drm'/><category term='web browser'/><category term='command line'/><category term='smart-pointer'/><category term='clipboard'/><category term='cpp'/><category term='batch file'/><category term='document mode'/><category term='uri'/><category term='fiddler'/><category term='ipv6'/><category term='google'/><title type='text'>Dave's Blog</title><subtitle type='html'>Dave's technical and personal blog posts go up here and are best viewed at &lt;a href="http://deletethis.net/dave/"&gt;deletethis.net&lt;/a&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>26</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-546284491891509604</id><published>2012-02-15T12:00:00.000-08:00</published><updated>2012-02-15T12:00:01.543-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='uri'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='ietf'/><category scheme='http://www.blogger.com/atom/ns#' term='percent-encoding'/><title type='text'>URI Percent-Encoding Ignorance Level 1 - Purpose</title><content type='html'>&lt;p&gt;&lt;i&gt;As a professional URI aficionado I deal with various levels of ignorance on URI percent-encoding (aka URI encoding, or URL escaping).&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Worse than the lame blog comments hating on percent-encoding is the shipping code which can do actual damage. In one very large project I won't name, I've fixed code that decodes all percent-encoded octets in a URI in order to get rid of pesky percents before calling ShellExecute. An unnamed developer with similar intent but clearly much craftier did the same thing in a loop until the string's length stopped changing. As it turns out percent-encoding serves a purpose and can't just be removed arbitrarily.&lt;/p&gt;&lt;p&gt;Percent-encoding exists so that one can represent data in a URI that would otherwise not be allowed or would be interpretted as a delimiter instead of data. For example, the space character (U+0020) is not allowed in a URI and so must be percent-encoded in order to appear in a URI:&lt;ol&gt;&lt;li&gt;&lt;code&gt;http://example.com/the%20path/&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;http://example.com/the path/&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;In the above the first is a valid URI while the second is not valid since a space appears directly in the URI. Depending on the context and the code through which the wannabe URI is run one may get unexpected failure.&lt;/p&gt;&lt;p&gt;For an additional example, the question mark delimits the path from the query. If one wanted the question mark to appear as part of the path rather than delimit the path from the query, it must be percent-encoded:&lt;ol&gt;&lt;li&gt;&lt;code&gt;http://example.com/foo%3Fbar&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;http://example.com/foo?bar&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;In the second, the question mark appears plainly and so delimits the path "&lt;code&gt;/foo&lt;/code&gt;" from the query "&lt;code&gt;bar&lt;/code&gt;". And in the first, the querstion mark is percent-encoded and so the path is "&lt;code&gt;/foo%3Fbar&lt;/code&gt;".&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-546284491891509604?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/546284491891509604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=546284491891509604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/546284491891509604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/546284491891509604'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2012/02/uri-percent-encoding-ignorance-level-1.html' title='URI Percent-Encoding Ignorance Level 1 - Purpose'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-2756638276610953148</id><published>2012-02-13T12:00:00.000-08:00</published><updated>2012-02-13T12:00:02.263-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='drm'/><category scheme='http://www.blogger.com/atom/ns#' term='blackmail'/><category scheme='http://www.blogger.com/atom/ns#' term='blackmail-drm'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><category scheme='http://www.blogger.com/atom/ns#' term='social-drm'/><title type='text'>Blackmail DRM - Stolen Thoughts</title><content type='html'>&lt;p&gt;Most existing DRM attempts to only allow the user to access the DRM'ed content with particular applications or with particular credentials so that if the file is shared it won't be useful to others. A better solution is to encode any of the user's horrible secrets into unique versions of the DRM'ed content so that the user won't &lt;i&gt;want&lt;/i&gt; to share it.  Entangle the users and the content provider's secrets together in one document and accordingly their interests. I call this Blackmail DRM. For an implementation it is important to point out that the user's horrible secret doesn't need to be verified as accurate, but merely verified as believable.&lt;/p&gt;&lt;p&gt;Apparently I need to get these blog posts written faster because only recently I read about &lt;a href="http://www.publishersweekly.com/pw/by-topic/columns-and-blogs/cory-doctorow/article/50413-with-a-little-help-digital-lysenkoism.html"&gt;Social DRM&lt;/a&gt; which is a light weight version of my idea but with a misleading name. Instead of horrible secrets, they say they'll use personal information like the user's name in the DRM'ed content. More of my thoughts stolen and before I even had a chance to think of it first!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-2756638276610953148?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/2756638276610953148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=2756638276610953148' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/2756638276610953148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/2756638276610953148'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2012/02/blackmail-drm-stolen-thoughts.html' title='Blackmail DRM - Stolen Thoughts'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-1229188482458380028</id><published>2012-02-10T12:00:00.000-08:00</published><updated>2012-02-10T12:00:05.066-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='uri'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='ietf'/><category scheme='http://www.blogger.com/atom/ns#' term='percent-encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='ipv6'/><title type='text'>URI Percent Encoding Ignorance Level 0 - Existence</title><content type='html'>&lt;p&gt;As a professional URI aficionado I deal with various levels of ignorance on URI percent-encoding (aka URI encoding, or URL escaping). The basest ignorance is with respect to the mere existence of percent-encoding. Percents in URIs are special: they always represent the start of a percent-encoded octet. That is to say, a percent is always followed by two hex digits that represents a value between 0 and 255 and doesn't show up in a URI otherwise.&lt;/p&gt;&lt;p&gt;The IPv6 textual syntax for scoped addresses uses the '%' to delimit the zone ID from the rest of the address.  When it came time to define &lt;a href="http://tools.ietf.org/html/rfc4007#page-19"&gt;how to represent scoped IPv6 addresses in URIs&lt;/a&gt; there were two camps: Folks who wanted to use the IPv6 format as is in the URI, and those who wanted to encode or replace the '%' with a different character. The &lt;a href="http://www.ietf.org/mail-archive/web/ipv6/current/msg04613.html"&gt;resulting thread&lt;/a&gt; was more lively than what shows up on the IETF URI discussion mailing list.  Ultimately we went with a percent-encoded '%' which means the percent maintains its special status and singular purpose.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-1229188482458380028?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/1229188482458380028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=1229188482458380028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/1229188482458380028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/1229188482458380028'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2012/02/uri-percent-encoding-ignorance-level-0.html' title='URI Percent Encoding Ignorance Level 0 - Existence'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-4312179088768580080</id><published>2011-12-03T14:46:00.000-08:00</published><updated>2011-12-03T14:46:00.448-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='array'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>JavaScript Array methods in the latest browsers</title><content type='html'>&lt;p&gt;Cool and (relatively) &lt;a href="http://dev.opera.com/articles/view/javascript-array-extras-in-detail/"&gt;new methods on the JavaScript Array object&lt;/a&gt; are here in the most recent versions of your favorite browser! More about them on &lt;a href="http://es5.github.com/#x15.4.4.16"&gt;ECMAScript5&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/k4h76zbx(v=VS.94).aspx"&gt;MSDN&lt;/a&gt;, the &lt;a href="http://blogs.msdn.com/b/ie/archive/2010/06/25/enhanced-scripting-in-ie9-ecmascript-5-support-and-more.aspx"&gt;IE blog&lt;/a&gt;, or &lt;a href="https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array"&gt;Mozilla's&lt;/a&gt; documentation.  Here's the list that's got me excited:&lt;dl&gt;&lt;dt&gt;&lt;a href="http://es5.github.com/#x15.4.4.17"&gt;some&lt;/a&gt; &amp;amp; &lt;a href="http://es5.github.com/#x15.4.4.16"&gt;every&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Does your callback function return true for any (some) or all (every) of the array's elements?&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://es5.github.com/#x15.4.4.20"&gt;filter&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Filters out elements for which your callback function returns false (in a new copy of the Array).&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://es5.github.com/#x15.4.4.19"&gt;map&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Each element is replaced with the result of it run through your callback function (in a new copy of the Array).&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://es5.github.com/#x15.4.4.21"&gt;reduce&lt;/a&gt; &amp;amp; &lt;a href="http://es5.github.com/#x15.4.4.22"&gt;reduceRight&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Your callback is called on each element in the array in sequence (from start to finish in reduce and from finish to start in reduceRight) with the result of the previous callback call passed to the next. Reduce your array to a single value aggregated in any manner you like via your callback function.&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://es5.github.com/#x15.4.4.18"&gt;forEach&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Simply calls your callback passing in each element of your array in turn. I have vague performance concerns as compared to using a normal for loop.&lt;/dd&gt;&lt;dt&gt;&lt;a href="http://es5.github.com/#x15.4.4.14"&gt;indexOf&lt;/a&gt; &amp;amp; &lt;a href="http://es5.github.com/#x15.4.4.15"&gt;lastIndexOf&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Finds the first or last (respectively) element in the array that matches the provided value via strict equality operator and returns the index of that element or -1 if there is no such element. Surprisingly, no custom comparison callback method mechanism is provided.&lt;/dd&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-4312179088768580080?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/4312179088768580080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=4312179088768580080' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/4312179088768580080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/4312179088768580080'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/12/javascript-array-methods-in-latest.html' title='JavaScript Array methods in the latest browsers'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-8511896840448096081</id><published>2011-12-01T12:59:00.000-08:00</published><updated>2011-12-01T12:59:00.147-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Bug Spotting: Ctors with default parameters</title><content type='html'>&lt;p&gt;The following code compiled just fine but did not at all act in the manner I expected:&lt;pre&gt;&lt;code&gt;BOOL CheckForThing(__in CObj *pObj, __in IFigMgr* pFigMgr, __in_opt LPCWSTR url)&lt;br /&gt;{&lt;br /&gt;    BOOL fCheck = FALSE;&lt;br /&gt;    if (SubCheck(pObj))&lt;br /&gt;    {&lt;br /&gt;        ...&lt;/code&gt;&lt;/pre&gt;I’m calling SubCheck which looks like:&lt;pre&gt;&lt;code&gt;bool SubCheck(const CObj&amp; obj);&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;Did you spot the bug? As you can see I should be passing in *pObj not pObj since the method takes a const CObj&amp; not a CObj*.  But then why does it compile?&lt;/p&gt;&lt;p&gt;It works because CObj has a constructor with all but one param with default values and CObj is derived from IUnknown:&lt;pre&gt;&lt;code&gt;CObj(__in_opt IUnknown * pUnkOuter, __in_opt LPCWSTR pszUrl = NULL);&lt;/code&gt;&lt;/pre&gt;Accordingly C++ uses this constructor as an implicit conversion operator.  So instead of passing in my CObj, I end up creating a new CObj on the stack passing in the CObj I wanted as the outer object which has a number of issues.&lt;/p&gt;&lt;p&gt;The lesson is unless you really want this behavior, don't make constructors with all but 1 or 0 default parameters.  If you need to do that consider using the 'explicit' keyword on the constructor.&lt;/p&gt;&lt;p&gt;More info about &lt;a href="http://stackoverflow.com/questions/174349/forcing-single-argument-constructors-to-be-explicit-in-c"&gt;forcing single argument constructors to be explicit&lt;/a&gt; is available on stack overflow.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-8511896840448096081?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/8511896840448096081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=8511896840448096081' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/8511896840448096081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/8511896840448096081'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/12/bug-spotting-ctors-with-default.html' title='Bug Spotting: Ctors with default parameters'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-9044142281140853902</id><published>2011-11-28T15:36:00.000-08:00</published><updated>2011-11-28T15:36:00.749-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='tumblr'/><category scheme='http://www.blogger.com/atom/ns#' term='me'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='google-reader'/><title type='text'>Replacing Google Reader Shared Feeds with Tumblr</title><content type='html'>&lt;p&gt;Last time I wrote about how &lt;a href='http://deletethis.net/dave/?uri=http%3A%2F%2Fdavescoolblog.blogspot.com%2F2011%2F11%2Freplacing-delicious-with-google-reader.html'&gt;I switched from Delicious to Google Reader's shared links feature&lt;/a&gt; only to find out that week that &lt;a href="http://googlereader.blogspot.com/2011/10/upcoming-changes-to-reader-new-look-new.html"&gt;Google was removing the Google Reader shared links feature&lt;/a&gt; in favor of Google Plus social features (I'll save my Google Plus rant for another day).&lt;/p&gt;&lt;p&gt;Forced to find something new again, I'm now very pleased with &lt;a href="http://sequelguy.tumblr.com/"&gt;Tumblr&lt;/a&gt;. Google Reader has Tumblr in its preset list of Send To sites which makes it relatively easy to add articles. And Tumblr's UX for adding things lets me easily pick a photo or video to display from the article - something which I had put together with a less convenient UX on my bespoke blogging system. For adding things outside of Google Reader I made a &lt;a href="http://deletethis.net/dave/activity/"&gt;Tumblr accelerator&lt;/a&gt; to hookup to the Tumblr Add UX.&lt;/p&gt;&lt;p&gt;Of course they have an RSS feed which I hooked up to my blog. The only issue I had there is that when you add a link (and not a video or photo) to Tumblr, the RSS feed entry title for that link is repeated in the entry description as a link followed by a colon and then the actual description entered into Tumblr. I want my title separate so I can apply my own markup so I did a bit of parsing of the description to remove the repeated title from the description.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-9044142281140853902?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/9044142281140853902/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=9044142281140853902' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/9044142281140853902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/9044142281140853902'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/11/replacing-google-reader-shared-feeds.html' title='Replacing Google Reader Shared Feeds with Tumblr'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-7528293767818521387</id><published>2011-11-24T07:00:00.000-08:00</published><updated>2011-11-24T12:53:35.034-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='user agent'/><category scheme='http://www.blogger.com/atom/ns#' term='url'/><category scheme='http://www.blogger.com/atom/ns#' term='ie'/><category scheme='http://www.blogger.com/atom/ns#' term='uri'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='web browser'/><title type='text'>URI Empty Path Segments Matter</title><content type='html'>&lt;p&gt;Shortly after joining the Internet Explorer team I got a bug from a PM on a popular Microsoft web server product that I'll leave unnamed (from now on UWS). The bug said that IE was handling empty path segments incorrectly by not removing them before resolving dotted path segments. For example UWS would do the following:&lt;code&gt;&lt;pre&gt;A.1. http://example.com/a/b//../&lt;br /&gt;A.2. http://example.com/a/b/../&lt;br /&gt;A.3. http://example.com/a/&lt;/pre&gt;&lt;/code&gt;In step 1 they are given a URI with dotted path segment and an empty path segment.  In step 2 they remove the empty path segment, and in step 3 they resolve the dotted path segment.  Whereas, given the same initial URI, IE would do the following:&lt;code&gt;&lt;pre&gt;B.1. http://example.com/a/b//../&lt;br /&gt;B.2. http://example.com/a/b/&lt;/pre&gt;&lt;/code&gt;IE simply resolves the dotted path segment against the empty path segment and removes them both.  So, how did I resolve this bug?  As "By Design" of course!&lt;/p&gt;&lt;p&gt;The URI RFC allows path segments of zero length and does not assign them any special meaning. So generic user agents that intend to work on the web must not treat an empty path segment any different from a path segment with some text in it. In the case above IE is doing the correct thing.&lt;/p&gt;&lt;p&gt;That's the case for generic user agents, however servers may decide that a URI with an empty path segment returns the same resource as a the same URI without that empty path segment. Essentially they can decide to ignore empty path segments. Both IIS and Apache work this way and thus return the same resource for the following URIs:&lt;code&gt;&lt;pre&gt;http://exmaple.com/foo//bar///baz&lt;br /&gt;http://example.com/foo/bar/baz&lt;/pre&gt;&lt;/code&gt;The issue for UWS is that it removes empty path segments before resolving dotted path segments. It must follow normal URI procedure before applying its own additional rules for empty path segments. Not doing that means they end up violating URI equivalency rules: URIs (A.1) and (B.2) are equivalent but UWS will not return the same resource for them.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-7528293767818521387?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/7528293767818521387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=7528293767818521387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/7528293767818521387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/7528293767818521387'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/11/uri-empty-path-segments-matter.html' title='URI Empty Path Segments Matter'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-3312444837591781292</id><published>2011-11-22T07:00:00.000-08:00</published><updated>2011-11-22T07:00:03.519-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='uri'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='form'/><category scheme='http://www.blogger.com/atom/ns#' term='history'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><title type='text'>Features of image type input tags in HTML</title><content type='html'>&lt;p&gt;A bug came up the other day involving markup containing &lt;code&gt;&amp;lt;input type=&amp;quot;image&amp;quot; src=&amp;quot;http://example.com/...&lt;/code&gt;. I knew that &amp;quot;image&amp;quot; was a valid input type but it wasn't until that moment that I realized I didn't know what it did. Looking it up I found that it displays the specified image and when the user clicks on the image, the form is submitted with an additional two name value pairs: the x and y positions of the point at which the user clicked the image.&lt;/p&gt;&lt;p&gt;Take for example the following HTML:&lt;code&gt;&lt;pre&gt;&amp;lt;form action=&amp;quot;http://example.com/&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;image&amp;quot; name=&amp;quot;foo&amp;quot; src=&amp;quot;http://deletethis.net/dave/images/davebefore.jpg&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;/pre&gt;&lt;/code&gt;If the user clicks on the image, the browser will submit the form with a URI like the following:&lt;code&gt;http://example.com/?foo.x=145&amp;amp;foo.y=124&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;This seemed like an incredibly specific feature to be built directly into the language when this could instead be done with javascript. I looked a bit further and saw that its been in HTML since at least &lt;a href="http://tools.ietf.org/html/rfc1866#section-8.1.2.5"&gt;HTML2&lt;/a&gt;, which of course makes much more sense. Javascript barely existed at that point and sending off the user's click location in a form may have been the only way to do something interesting with that action.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-3312444837591781292?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/3312444837591781292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=3312444837591781292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/3312444837591781292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/3312444837591781292'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/11/features-of-image-type-input-tags-in.html' title='Features of image type input tags in HTML'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-2814590637980996314</id><published>2011-11-18T07:00:00.000-08:00</published><updated>2011-11-18T07:00:07.514-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><category scheme='http://www.blogger.com/atom/ns#' term='delicious'/><category scheme='http://www.blogger.com/atom/ns#' term='me'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='google-reader'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='feed'/><title type='text'>Replacing Delicious with Google Reader</title><content type='html'>&lt;p&gt;I had previously replaced my use of Delicious with Google Reader.  Delicious had a number of issues during their switch over from Yahoo to the new owners and I was eventually fed up enough to remove it from daily use.  I used Delicious to do the following things:&lt;ul&gt;&lt;li&gt;Create a list of things to read later&lt;/li&gt;&lt;li&gt;Save things to read again in the future&lt;/li&gt;&lt;li&gt;Search through things I read and enjoyed (esp via tags)&lt;/li&gt;&lt;li&gt;Annotate and share things on my blog&lt;/li&gt;&lt;/ul&gt;I realized that since I did most of my web browsing in Google Reader now anyway I may as well make use of its features. I star things to note I want to read it later or save to read again later. I can annotate with notes in Google Reader and I can share items to my web site by way of the shared items feed.  Additionally for when I'm not in Google Reader there's a bookmarklet to add an arbitrary web site as a shared item in Google Reader.&lt;/p&gt;&lt;p&gt;Of course I wrote this and switched over about 1 week before Google removed the sharing feature from Google Reader. I'm irritated but in practice it forced me to find a different option which has worked out mostly better. New blog post coming soon about that...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-2814590637980996314?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/2814590637980996314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=2814590637980996314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/2814590637980996314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/2814590637980996314'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/11/replacing-delicious-with-google-reader.html' title='Replacing Delicious with Google Reader'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-1284429776676090693</id><published>2011-10-19T12:58:00.000-07:00</published><updated>2011-10-19T16:43:12.276-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='bug'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='smart-pointer'/><category scheme='http://www.blogger.com/atom/ns#' term='cpp'/><title type='text'>Bug Spotting: Smart pointers and parameter evaluation order</title><content type='html'>The following code works fine.  I have a ccomptr&lt;IUri&gt; named resolvedUri and I want to update its hostname so I do the following:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;        CreateIUriBuilder(resolvedUri, 0, 0, &amp;builder);&lt;br /&gt;        builder-&gt;SetHost(host);&lt;br /&gt;        builder-&gt;CreateUri(0xFFFFFFFF, 0, 0, &amp;resolvedUri);&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;But the following similar looking code has a bug:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;    ResolveHost(resolvedUri, &amp;resolvedUri);&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The issue is that doing &amp;resolvedUri gets the address of the pointer but also clears out the pointer due to the definition of my smart pointer class:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;    operator T**()  &lt;br /&gt;    {  &lt;br /&gt;        T *ptrValue = mPtrValue;&lt;br /&gt;        mPtrValue-&gt;Release();&lt;br /&gt;        mPtrValue = NULL;&lt;br /&gt;        return &amp;ptrValue;&lt;br /&gt;    }&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In C++ there’s no guarantee about the order in which parameters for a function or method are evaluated.  In the case above, &amp;resolvedUri clears out the ccomptr before evaluating resolvedUri.Get() and so ResolveHostAlias gets a nullptr.&lt;br /&gt;&lt;br /&gt;An interesting and related thread on stack overflow on &lt;a href="http://stackoverflow.com/questions/367633/what-are-all-the-common-undefined-behaviour-that-a-c-programmer-should-know-abo/367690#367690"&gt;undefined behavior in C++&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-1284429776676090693?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/1284429776676090693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=1284429776676090693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/1284429776676090693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/1284429776676090693'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/10/bug-smart-pointers-and.html' title='Bug Spotting: Smart pointers and parameter evaluation order'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-8415347365327737430</id><published>2011-10-18T11:52:00.000-07:00</published><updated>2011-10-18T12:58:56.173-07:00</updated><title type='text'>Haven't Been Posting Much</title><content type='html'>I haven't been updating my blog recently.  But I have three excellent reasons:&lt;ul&gt;&lt;li&gt;The manner in which I use &lt;a href="http://www.zdnet.com/blog/violetblue/avos-delicious-disaster-lessons-from-a-complete-failure/705"&gt;Delicious is broken&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;I've been playing &lt;a href="http://www.glitch.com/"&gt;Glitch&lt;/a&gt; instead of reading through Google Reader.&lt;/li&gt;&lt;li&gt;I have a &lt;a href="http://deletethis.net/dave/?q=alex&amp;amp;link=off&amp;amp;blog=off"&gt;newborn&lt;/a&gt;!&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-8415347365327737430?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/8415347365327737430/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=8415347365327737430' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/8415347365327737430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/8415347365327737430'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/10/havent-been-posting-much.html' title='Haven&apos;t Been Posting Much'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-5014136890216967288</id><published>2011-06-12T22:34:00.000-07:00</published><updated>2011-06-12T22:39:34.080-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='extension'/><category scheme='http://www.blogger.com/atom/ns#' term='fiddler'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='update'/><category scheme='http://www.blogger.com/atom/ns#' term='wpad'/><title type='text'>WPAD Server Fiddler Extension Update v1.0.1</title><content type='html'>As it turns out the &lt;a href="http://deletethis.net/dave/wpadserverfiddlerextension/"&gt;WPAD Server Fiddler Extension&lt;/a&gt; I made &lt;a href="http://deletethis.net/dave/?uri=http%3A%2F%2Fcerealnumber.livejournal.com%2F51588.html"&gt;a while back&lt;/a&gt; actually has a non-malicious purpose. Apparently its useful for debugging HTTP on the WP7 phone (or so I'm told). Anyway I took some requests and I've fixed a few minor bugs (start button not updating correctly), changed the dialog to be a Fiddler tab so you can use it non-modally, and the WPAD server is now always off when Fiddler starts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-5014136890216967288?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/5014136890216967288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=5014136890216967288' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/5014136890216967288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/5014136890216967288'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/06/wpad-server-fiddler-extension-update.html' title='WPAD Server Fiddler Extension Update v1.0.1'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-4657842629995936098</id><published>2011-05-28T18:00:00.000-07:00</published><updated>2011-06-04T14:20:45.264-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='powershell'/><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='cli'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><title type='text'>Command line for finding missing URLACTIONs</title><content type='html'>&lt;p&gt;I wanted to ensure that my switch statement in my implementation of IInternetSecurityManager::ProcessURLAction had a case for every possible documented URLACTION. I wrote the following short command line sequence to see the list of all URLACTIONs in the SDK header file not found in my source file:&lt;code&gt;&lt;pre&gt;grep URLACTION urlmon.idl | sed 's/.*\(URLACTION[a-zA-Z0-9_]*\).*/\1/g;' | sort | uniq &gt; allURLACTIONs.txt&lt;br /&gt;grep URLACTION MySecurityManager.cpp | sed 's/.*\(URLACTION[a-zA-Z0-9_]*\).*/\1/g;' | sort | uniq &gt; myURLACTIONs.txt&lt;br /&gt;comm -23 allURLACTIONs.txt myURLACTIONs.txt&lt;/pre&gt;&lt;/code&gt;I'm not a sed expert so I had to read the &lt;a href="http://www.gnu.org/software/sed/manual/sed.html"&gt;sed documentation&lt;/a&gt;, and I heard about &lt;a href="http://askawizard.blogspot.com/2008/01/some-handy-commands.html"&gt;comm from Kris Kowal's blog&lt;/a&gt; which happilly was in the &lt;a href="http://unxutils.sourceforge.net/"&gt;Win32 GNU tools pack&lt;/a&gt; I already run.&lt;/p&gt;&lt;p&gt;But in my effort to learn and use PowerShell I found the following similar command line:&lt;code&gt;&lt;pre&gt;diff &lt;br /&gt;(more urlmon.idl | %{ if ($_ -cmatch "URLACTION[a-zA-Z0-9_]*") { $matches[0] } } | sort -uniq) &lt;br /&gt;(more MySecurityManager.cpp | %{ if ($_ -cmatch "URLACTION[a-zA-Z0-9_]*") { $matches[0] } } | sort -uniq)&lt;/pre&gt;&lt;/code&gt;In the PowerShell version I can skip the temporary files which is nice. 'diff' is mapped to 'compare-object' which seems similar to comm but with no parameters to filter out the different streams (although this could be done more verbosely with the ?{ } filter syntax). In PowerShell uniq functionality is built into sort. The builtin -cmatch operator (c is for case sensitive) to do regexp is nice plus the side effect of generating the $matches variable with the regexp results.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-4657842629995936098?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/4657842629995936098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=4657842629995936098' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/4657842629995936098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/4657842629995936098'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/05/command-line-for-finding-missing.html' title='Command line for finding missing URLACTIONs'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-429703209805729186</id><published>2011-05-26T18:00:00.000-07:00</published><updated>2011-05-26T18:00:00.631-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='powershell'/><category scheme='http://www.blogger.com/atom/ns#' term='clip'/><category scheme='http://www.blogger.com/atom/ns#' term='tool'/><category scheme='http://www.blogger.com/atom/ns#' term='clipboard'/><category scheme='http://www.blogger.com/atom/ns#' term='cli'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='tee'/><title type='text'>clip.exe - Useful tool I didn't know shipped with Windows</title><content type='html'>&lt;p&gt;When you run clip.exe, whatever comes into its standard input is put onto the clipboard. So when you need to move the result of something in your command window somewhere else you can pipe the result into clip.exe. Then you won't have to worry about the irritating way cmd.exe does block copy/pasting and you avoid having to manually fixup line breaks in wrapped lines.  For instance, you can put the contents of a script into the clipboard with:&lt;code&gt;&lt;pre&gt;more cdo.cmd | clip&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;I've got a lot of stuff dumped in my bin folder that I sync across all my PCs so I didn't realize that clip.exe is a part of standard Windows installs.&lt;/p&gt;&lt;p&gt;Nice for avoiding the block copy in cmd.exe but I'd prefer to have the contents sort of tee'd into the clipboard and standard output. So TeeClip.ps1:&lt;code&gt;&lt;pre&gt;$input | tee -var teeclipout | clip;&lt;br /&gt;$teeclipout;&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-429703209805729186?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/429703209805729186/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=429703209805729186' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/429703209805729186'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/429703209805729186'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/05/clipexe-useful-tool-i-didnt-know.html' title='clip.exe - Useful tool I didn&apos;t know shipped with Windows'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-8290674282470951917</id><published>2011-05-24T18:00:00.000-07:00</published><updated>2011-05-24T18:00:00.803-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sal'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>_opt Mnemonic</title><content type='html'>&lt;p&gt;​I always have trouble remembering where the opt goes in &lt;a href="http://msdn.microsoft.com/en-us/library/aa383701(VS.85).aspx"&gt;SAL&lt;/a&gt; in the __deref_out case. The mnemonic is pretty simple: the _opt at the start of the SAL is for the pointer value at the start of the function. And the _opt at the end of the SAL is for the dereferenced pointer value at the end of the function.&lt;table&gt;&lt;br /&gt;&lt;tr&gt;&lt;th&gt;SAL&lt;/th&gt;&lt;th&gt;foo == nullptr allowed at function start?&lt;/th&gt;&lt;th&gt;*foo == nullptr allowed at function end?&lt;/th&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;__deref_out void **foo&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;__deref&lt;b&gt;_opt&lt;/b&gt;_out void **foo&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;__deref_out&lt;b&gt;_opt&lt;/b&gt; void **foo&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;__deref&lt;b&gt;_opt&lt;/b&gt;_out&lt;b&gt;_opt&lt;/b&gt; void **foo&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-8290674282470951917?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/8290674282470951917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=8290674282470951917' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/8290674282470951917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/8290674282470951917'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/05/opt-mnemonic.html' title='_opt Mnemonic'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-8376157926373107990</id><published>2011-05-22T14:20:00.000-07:00</published><updated>2011-05-22T14:34:46.800-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='powershell'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='batch file'/><category scheme='http://www.blogger.com/atom/ns#' term='console'/><title type='text'>PowerShell Script Batch File Wrapper</title><content type='html'>&lt;p&gt;I'm trying to learn and use PowerShell more, but plenty of other folks I know don't use PowerShell. To allow them to use my scripts I use the following cmd.exe batch file to make it easy to call PowerShell scripts. To use, just name the batch file name the same as the corresponding PowerShell script filename and put it in the same directory.&lt;br /&gt;&lt;code&gt;&lt;pre&gt;@echo off&lt;br /&gt;if "%1"=="/?" goto help&lt;br /&gt;if "%1"=="/h" goto help&lt;br /&gt;if "%1"=="-?" goto help&lt;br /&gt;if "%1"=="-h" goto help&lt;br /&gt;&lt;br /&gt;%systemroot%\system32\windowspowershell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -Command . %~dpn0.ps1 %*&lt;br /&gt;goto end&lt;br /&gt;&lt;br /&gt;:help&lt;br /&gt;%systemroot%\system32\windowspowershell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -Command help %~dpn0.ps1 -full&lt;br /&gt;goto end&lt;br /&gt;&lt;br /&gt;:end&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Additionally for PowerShell scripts that modify the current working directory I use the following batch file:&lt;code&gt;&lt;pre&gt;@echo off&lt;br /&gt;if "%1"=="/?" goto help&lt;br /&gt;if "%1"=="/h" goto help&lt;br /&gt;if "%1"=="-?" goto help&lt;br /&gt;if "%1"=="-h" goto help&lt;br /&gt;&lt;br /&gt;%systemroot%\system32\windowspowershell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -Command . %~dpn0.ps1 %*;(pwd).Path 1&gt; %temp%\%~n0.tmp 2&gt; nul&lt;br /&gt;set /p newdir=&lt;%temp%\%~n0.tmp&lt;br /&gt;cd /d %newdir%&lt;br /&gt;goto end&lt;br /&gt;&lt;br /&gt;:help&lt;br /&gt;%systemroot%\system32\windowspowershell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -Command "help %~dpn0.ps1"&lt;br /&gt;goto end&lt;br /&gt;&lt;br /&gt;:end&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-8376157926373107990?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/8376157926373107990/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=8376157926373107990' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/8376157926373107990'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/8376157926373107990'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/05/powershell-script-batch-file-wrapper.html' title='PowerShell Script Batch File Wrapper'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-375553475007025353</id><published>2011-04-06T17:00:00.000-07:00</published><updated>2011-04-06T17:00:04.183-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='http'/><category scheme='http://www.blogger.com/atom/ns#' term='fiddler'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='https'/><category scheme='http://www.blogger.com/atom/ns#' term='geolocmock'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='fiddlercore'/><title type='text'>Capturing HTTPS with FiddlerCore</title><content type='html'>&lt;p&gt;I used &lt;a href="http://fiddler.wikidot.com/fiddlercore"&gt;FiddlerCore&lt;/a&gt; in &lt;a href="http://deletethis.net/dave/dev/geolocmock/"&gt;GeolocMock&lt;/a&gt; to edit HTTPS responses and ran into two stumbling blocks that I'll document here.  The first is that I didn't check if the Fiddler root cert existed or was installed, which of course is necessary to edit HTTPS traffic.  The following is my code where I check for the certs.&lt;/p&gt;&lt;code&gt;&lt;pre&gt;    if (!Fiddler.CertMaker.rootCertExists())&lt;br /&gt;    {&lt;br /&gt;        if (!Fiddler.CertMaker.createRootCert())&lt;br /&gt;        {&lt;br /&gt;            throw new Exception("Unable to create cert for FiddlerCore.");&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    if (!Fiddler.CertMaker.rootCertIsTrusted())&lt;br /&gt;    {&lt;br /&gt;        if (!Fiddler.CertMaker.trustRootCert())&lt;br /&gt;        {&lt;br /&gt;            throw new Exception("Unable to install FiddlerCore's cert.");&lt;br /&gt;        }&lt;br /&gt;    }&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The second problem I had (which would have been solved had I read all the sample code first) was that my changes weren't being applied.  In my app I only need the BeforeResponse but in order to modify the response I must also sign up for the BeforeRequest event and mark the bBufferResponse flag on the session before the response comes back.  For example:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;    Fiddler.FiddlerApplication.BeforeRequest += new SessionStateHandler(FiddlerApplication_BeforeRequest);&lt;br /&gt;    Fiddler.FiddlerApplication.BeforeResponse += new SessionStateHandler(FiddlerApplication_BeforeResponse);&lt;br /&gt;...&lt;br /&gt;    private void FiddlerApplication_BeforeRequest(Session oSession)&lt;br /&gt;    {&lt;br /&gt;        if (IsInterestingSession(oSession))&lt;br /&gt;        {&lt;br /&gt;            oSession.bBufferResponse = true;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-375553475007025353?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/375553475007025353/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=375553475007025353' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/375553475007025353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/375553475007025353'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/04/capturing-https-with-fiddlercore.html' title='Capturing HTTPS with FiddlerCore'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-1115399204951118616</id><published>2011-04-05T17:00:00.000-07:00</published><updated>2011-04-05T17:00:02.483-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='webbrowser'/><category scheme='http://www.blogger.com/atom/ns#' term='.net'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><title type='text'>JavaScript &amp; .NET interop via WebBrowser Control</title><content type='html'>&lt;p&gt;For my &lt;a href="http://deletethis.net/dave/dev/geolocmock/"&gt;GeolocMock&lt;/a&gt; weekend project I intended to use the Bing Maps API to display a map in a WebBrowser control and allow the user to interact with that to select a location to be consumed by my application.  Getting my .NET code to talk to the JavaScript in the WebBrowser control was surprisingly easy.&lt;/p&gt;&lt;p&gt;To have .NET execute JavaScript code you can use the InvokeScript method passing the name of the JavaScript function to execute and an object array of parameters to pass:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;this.webBrowser2.Document.InvokeScript("onLocationStateChanged",&lt;br /&gt;   new object[] {&lt;br /&gt;      latitudeTextBoxText,&lt;br /&gt;      longitudeTextBoxText,&lt;br /&gt;      altitudeTextBoxText,&lt;br /&gt;      uncertaintyTextBoxText&lt;br /&gt;   });&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;The other direction, having JavaScript call into .NET is slightly more complicated but still pretty easy as far as language interop goes.  The first step is to mark your assembly as ComVisible so that it can interact with JavaScript via COM.  VS had already added a ComVisible declaration to my project I just had to change the value to true.&lt;/p&gt;&lt;code&gt;&lt;pre&gt;[assembly: ComVisible(true)]&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Next set ObjectForScripting attribute to the object you want to expose to JavaScript.&lt;/p&gt;&lt;code&gt;&lt;pre&gt;this.webBrowser2.ObjectForScripting = this.locationState;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Now that object is exposed as window.external in JavaScript and you can call methods on it.&lt;/p&gt;&lt;code&gt;&lt;pre&gt;window.external.Set(lat, long, alt, gUncert);&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;However you don't seem to be able to test for the existence of methods off of it.  For example the following JavaScript generates an exception for me even though I have a Set method:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;if (window.external &amp;amp;&amp;amp; window.external.Set) {&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-1115399204951118616?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/1115399204951118616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=1115399204951118616' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/1115399204951118616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/1115399204951118616'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/04/javascript-net-interop-via-webbrowser.html' title='JavaScript &amp; .NET interop via WebBrowser Control'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-7320694778093736225</id><published>2011-04-04T17:00:00.000-07:00</published><updated>2011-04-04T17:00:03.693-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='weboc'/><category scheme='http://www.blogger.com/atom/ns#' term='fck'/><category scheme='http://www.blogger.com/atom/ns#' term='ie'/><category scheme='http://www.blogger.com/atom/ns#' term='document mode'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='ie9'/><title type='text'>IE9 Document Mode in WebOC</title><content type='html'>&lt;p&gt;Working on &lt;a href="http://deletethis.net/dave/dev/geolocmock/"&gt;GeolocMock&lt;/a&gt; it took me a bit to realize why my HTML could use the W3C Geolocation API in IE9 but not in my WebBrowser control in my .NET application.  Eventually I realized that I was getting the wrong IE doc mode.  Reading this old &lt;a href="http://blogs.msdn.com/b/ie/archive/2009/03/10/more-ie8-extensibility-improvements.aspx"&gt;More IE8 Extensibility Improvements IE&lt;/a&gt; blog post from the IE blog I found the issue is that for app compat the WebOC picks older doc modes but an app hosting the WebOC can set a regkey to get different doc modes.  The IE9 mode isn't listed in that article but I took a guess based on the values there and the decimal value 9999 gets my app IE9 mode.  The following is the code I run in my application to set its regkey so that my app can get the IE9 doc mode and use the geolocation API.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;        static private void UseIE9DocMode()&lt;br /&gt;        {&lt;br /&gt;            RegistryKey key = null&amp;#x3B;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                key = Registry.CurrentUser.OpenSubKey(&amp;quot;Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION&amp;quot;, true)&amp;#x3B;&lt;br /&gt;            }&lt;br /&gt;            catch (Exception)&lt;br /&gt;            {&lt;br /&gt;                key = Registry.CurrentUser.CreateSubKey(&amp;quot;Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl\\FEATURE_BROWSER_EMULATION&amp;quot;)&amp;#x3B;&lt;br /&gt;            }&lt;br /&gt;            key.SetValue(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName, 9999, RegistryValueKind.DWord)&amp;#x3B;&lt;br /&gt;            key.Close()&amp;#x3B;&lt;br /&gt;        }&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-7320694778093736225?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/7320694778093736225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=7320694778093736225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/7320694778093736225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/7320694778093736225'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/04/ie9-document-mode-in-weboc.html' title='IE9 Document Mode in WebOC'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-4723417518145223507</id><published>2011-04-03T19:00:00.000-07:00</published><updated>2011-04-03T19:17:40.684-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fiddler'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='geoloc'/><category scheme='http://www.blogger.com/atom/ns#' term='ie9'/><category scheme='http://www.blogger.com/atom/ns#' term='fiddlercore'/><title type='text'>GeolocMock Tool - Tell IE9 Where You Are</title><content type='html'>&lt;p&gt;I've made &lt;a href="http://deletethis.net/dave/dev/geolocmock/"&gt;GeolocMock&lt;/a&gt;. If your PC has no geolocation devices, IE9 uses a webservice to determine your location.  GeolocMock uses FiddlerCore to intercept the response from the webservice and allows the user to replace the location in the response with another.  This was a fun weekend project in order to play with &lt;a href="http://fiddler.wikidot.com/fiddlercore"&gt;FiddlerCore&lt;/a&gt;, the &lt;a href="http://blogs.msdn.com/b/ie/archive/2011/02/17/w3c-geolocation-api-in-ie9.aspx"&gt;W3C Geoloc APIs in IE9&lt;/a&gt;, hosting the IE9 WebOC in a .NET app, and the &lt;a href="http://msdn.microsoft.com/en-us/library/gg427611.aspx"&gt;Bing Maps APIs&lt;/a&gt;.&lt;/p&gt;&lt;a href="http://deletethis.net/dave/dev/geolocmock/"&gt;&lt;img src="http://deletethis.net/dave/dev/geolocmock/screenshot.png" width="216" height="228"/&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-4723417518145223507?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/4723417518145223507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=4723417518145223507' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/4723417518145223507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/4723417518145223507'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/04/geolocmock-tool-tell-ie9-where-you-are.html' title='GeolocMock Tool - Tell IE9 Where You Are'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-6032198445841527452</id><published>2011-02-23T21:13:00.000-08:00</published><updated>2011-02-23T22:07:51.844-08:00</updated><title type='text'>Listen to Max Tannone and Watch Moon</title><content type='html'>&lt;a href="http://www.maxtannone.com/"&gt;Max Tannone&lt;/a&gt; does awesome remix albums:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.maxtannone.com/projects/jaydiohead/"&gt;&lt;img src="http://www.maxtannone.com/wp-content/uploads/2010/10/jaydiohead_full2-150x150.jpg" width="150" height="150" /&gt;&lt;/a&gt;Jaydiohead - Radiohead &amp;amp; Jay-Z mashup.  Listen:&lt;br /&gt;&lt;object width="100%" height="81"&gt; &lt;param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F147259"&gt; &lt;param name="allowscriptaccess" value="always"&gt; &lt;embed height="81" type="application/x-shockwave-flash" width="100%" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F147259" allowscriptaccess="always"&gt;&lt;/embed&gt; &lt;/object&gt;  &lt;span&gt;&lt;a href="http://soundcloud.com/maxtannone/jaydiohead-06-dirt-off-your-android"&gt;Jaydiohead - 06 - Dirt Off Your Android&lt;/a&gt; by &lt;a href="http://soundcloud.com/maxtannone"&gt;Max Tannone&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.seleneproject.com/"&gt;&lt;img src="http://www.seleneproject.com/Selene_EP_front_cover_web.jpg" width="150" height="150" /&gt;&lt;/a&gt;Selene - Richard Rich &amp;amp; beats over the Moon soundtrack.  Listen:&lt;br /&gt;&lt;object width="100%" height="81"&gt; &lt;param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F10975440"&gt; &lt;param name="allowscriptaccess" value="always"&gt; &lt;embed height="81" type="application/x-shockwave-flash" width="100%" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F10975440" allowscriptaccess="always"&gt;&lt;/embed&gt; &lt;/object&gt;  &lt;span&gt;&lt;a href="http://soundcloud.com/maxtannone/selene-01-you-are-here"&gt;Selene - 01 - You Are Here&lt;/a&gt; by &lt;a href="http://soundcloud.com/maxtannone"&gt;Max Tannone&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://www.maxtannone.com/projects/dcyh/"&gt;&lt;img src="http://www.maxtannone.com/wp-content/uploads/2010/10/dcyh_cover_full-150x150.jpg" width="150" height="150" /&gt;&lt;/a&gt;Double Check Your Head - Beastie Boys albums mixed together.  Listen:&lt;br /&gt;&lt;object width="100%" height="81"&gt; &lt;param name="movie" value="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F557454"&gt; &lt;param name="allowscriptaccess" value="always"&gt; &lt;embed height="81" type="application/x-shockwave-flash" width="100%" src="http://player.soundcloud.com/player.swf?url=http%3A%2F%2Fapi.soundcloud.com%2Ftracks%2F557454" allowscriptaccess="always"&gt;&lt;/embed&gt; &lt;/object&gt;  &lt;span&gt;&lt;a href="http://soundcloud.com/maxtannone/beastie-boys-02-pass-the-gratitude"&gt;Beastie Boys - 02 - Pass The Gratitude&lt;/a&gt; by &lt;a href="http://soundcloud.com/maxtannone"&gt;Max Tannone&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://movies.netflix.com/WiMovie/Moon/70112500?trkid=2361637#height2210"&gt;&lt;img src="http://cdn-0.nflximg.com/en_US/boxshots/gsd/70112500.jpg"&gt;&lt;/a&gt;&lt;br /&gt;Also, the movie &lt;a href="http://movies.netflix.com/WiMovie/Moon/70112500?trkid=2361637#height2210"&gt;Moon&lt;/a&gt; is really good on a variety of points.  Sam Rockwell and the voice of Kevin Spacey!  Its available on Netflix Watch Instantly so you have no excuse!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-6032198445841527452?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/6032198445841527452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=6032198445841527452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/6032198445841527452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/6032198445841527452'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2011/02/listen-to-max-tannone-and-watch-moon.html' title='Listen to Max Tannone and Watch Moon'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-8444228991627756294</id><published>2010-12-28T18:42:00.000-08:00</published><updated>2010-12-28T18:56:46.814-08:00</updated><title type='text'>Ratatat Rocks</title><content type='html'>I just found out that I like the group &lt;a href="http://en.wikipedia.org/wiki/Ratatat"&gt;Ratatat&lt;/a&gt;.  I'd first heard them way back when the Zune was first released as the backing for &lt;a href="http://72andsunny.com/#/work/zune/zune_arts/film/los_corazones/"&gt;Los Corazones&lt;/a&gt; on the zune-arts.net website.&lt;br /&gt;&lt;br/&gt;&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/lWK7rDJ2RKM?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/lWK7rDJ2RKM?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br/&gt;&lt;br/&gt;&lt;br /&gt;But I didn't know who they were until today when I watched this Filmography 2010 video (via &lt;a href="http://kottke.org/10/12/the-year-in-film-2010"&gt;Kottke&lt;/a&gt;)&lt;br&gt;&lt;br /&gt;&lt;object width="640" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/I4dEWOB6THE?fs=1&amp;amp;hl=en_US"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/I4dEWOB6THE?fs=1&amp;amp;hl=en_US" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br&gt;&lt;br&gt;Until about 1:16 in, the music is &lt;a href="http://www.youtube.com/watch?v=kVtGCACwpW8"&gt;Ratatat's Nostrand&lt;/a&gt;.  On the first viewing it drove me crazy because I could only vaguely recall hearing something like that music before.  I tracked it down via the zune-arts thing above and eventually found my way to the Nostrand video.  Funny, all the recent comments on that one are from people who also just watched the Filmography video.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-8444228991627756294?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/8444228991627756294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=8444228991627756294' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/8444228991627756294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/8444228991627756294'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2010/12/ratatat-rocks.html' title='Ratatat Rocks'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-4400209729821033414</id><published>2010-12-13T19:14:00.001-08:00</published><updated>2010-12-13T19:28:13.463-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='win7'/><category scheme='http://www.blogger.com/atom/ns#' term='jumplist'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='console'/><title type='text'>Console Build Window Jump Lists Tool</title><content type='html'>&lt;p&gt;I've made two simple command line tools related to the console window and Win7 jump lists.  The source is available for both but neither is much more than the sort of samples you'd find on MSDN =).&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://deletethis.net/dave/dev/setappusermodelid/"&gt;SetAppUserModelId&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://deletethis.net/dave/dev/setjumplist/"&gt;SetJumpList&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;SetAppUserModelId lets you change the Application User Model ID for the current console window.  The AppUserModelId is the value Win7 uses to group together icons on the task bar and is what the task bar's jump lists are associated with.  The tool lets you change that as well as the icon and name that appear in the task bar for the window, and the command to launch if the user attempts to re-launch the application from its task bar icon.&lt;/p&gt;&lt;p&gt;SetJumpList lets you set the jump list associated with a particular AppUserModelId.  You pass the AppUserModelId as the only parameter and then in its standard input you give it lines specifying items that should appear in the jump list and what to execute when those items are picked.&lt;/p&gt;&lt;p&gt;I put these together to make my build environment easier to deal with at work.  I have to deal with multiple enlistments in many different branches and so I wrote a simple script around these two tools to group my build windows by branch name in the task bar, and to add the history of commands I've used to launch the build environment console windows to the jump list of each.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-4400209729821033414?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/4400209729821033414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=4400209729821033414' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/4400209729821033414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/4400209729821033414'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2010/12/console-build-window-jump-lists-tool.html' title='Console Build Window Jump Lists Tool'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-6265418634142159904</id><published>2010-08-20T18:20:00.001-07:00</published><updated>2010-12-13T19:25:35.424-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='accelerator'/><category scheme='http://www.blogger.com/atom/ns#' term='csharp'/><category scheme='http://www.blogger.com/atom/ns#' term='com'/><title type='text'>Windows 7 Accelerator Platform COM / C# Interop</title><content type='html'>&lt;p&gt;For a new project I'm working on involving IE's installed Accelerators and OpenSearch search providers via the &lt;a href="http://msdn.microsoft.com/en-us/library/dd565720(v=VS.85).aspx"&gt;Windows 7 Accelerator Platform&lt;/a&gt;, I've created a C#/COM interop class for those APIs.&lt;/p&gt;&lt;p&gt;Download the &lt;a href="http://deletethis.net/dave/powershell/osinterop.cs"&gt;osinterop.cs&lt;/a&gt; interop file here.&lt;/p&gt;&lt;p&gt;&lt;iframe width="600px" height="400px" src="http://deletethis.net/dave/powershell/osinterop.cs"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-6265418634142159904?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/6265418634142159904/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=6265418634142159904' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/6265418634142159904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/6265418634142159904'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2010/08/windows-7-accelerator-platform-com-c.html' title='Windows 7 Accelerator Platform COM / C# Interop'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-7418839341420694025</id><published>2010-08-17T22:05:00.000-07:00</published><updated>2010-12-13T19:26:16.565-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='powershell'/><category scheme='http://www.blogger.com/atom/ns#' term='wmc'/><category scheme='http://www.blogger.com/atom/ns#' term='technical'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><category scheme='http://www.blogger.com/atom/ns#' term='dvd'/><category scheme='http://www.blogger.com/atom/ns#' term='windows-media-center'/><title type='text'>DVD Ripping and Viewing in Windows Media Center</title><content type='html'>&lt;p&gt;I've just got a new media center PC connected directly to my television with lots of HD space and so I'm ripping a bunch of my DVDs to the PC so I don't have to fuss with the physical media.  I'm ripping with &lt;a href="http://lifehacker.com/355281/dvd-rip-automates-one+click-dvd-ripping"&gt;DVD Rip&lt;/a&gt;, viewing the results in Windows 7's Windows Media Center after turning on the &lt;a href="http://support.microsoft.com/kb/930526"&gt;WMC DVD Library&lt;/a&gt;, and using a powershell script I wrote to copy over cover art and metadata.&lt;/p&gt;&lt;p&gt;My powershell script follows.  To use it you must do the following:&lt;ol&gt;&lt;li&gt;Run Windows Media Center with the DVD in the drive and view the disc's metadata info.&lt;/li&gt;&lt;li&gt;Rip each DVD to its own subdirectory of a common directory.&lt;/li&gt;&lt;li&gt;The name of the subdirectory to which the DVD is ripped must have the same name as the DVD name in the metadata.  An exception to this are characters that aren't allowed in Windows paths (e.g. &amp;lt;, &amp;gt;, ?, *, etc)&lt;/li&gt;&lt;li&gt;Run the script and pass the path to the common directory containing the DVD rips as the first parameter.&lt;/li&gt;&lt;/ol&gt;Running WMC and viewing the DVD's metadata forces WMC to copy the metadata off the Internet and cache it locally.  After playing with Fiddler and reading this &lt;a href="http://www.mediabrowser.tv/forum/viewtopic.php?f=9&amp;amp;t=2934"&gt;blog post on WMC metadata&lt;/a&gt; I made the following script that copies metadata and cover art from the WMC cache to the corresponding DVD rip directory.&lt;/p&gt;&lt;p&gt;Download &lt;a href="http://deletethis.net/dave/wmce-zune-hack/copydvdinfo.ps1"&gt;copydvdinfo.ps1&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-7418839341420694025?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/7418839341420694025/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=7418839341420694025' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/7418839341420694025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/7418839341420694025'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2010/08/dvd-ripping-and-viewing-in-windows.html' title='DVD Ripping and Viewing in Windows Media Center'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1670048653123050463.post-7754384779941356016</id><published>2010-07-08T16:00:00.000-07:00</published><updated>2010-07-08T16:30:06.962-07:00</updated><title type='text'>Google and Outlook Calendar Sync'ing</title><content type='html'>I previously described my desire to &lt;a href="http://deletethis.net/dave/?uri=http%3A%2F%2Fwww.google.com%2Fsupport%2Fcalendar%2Fbin%2Fanswer.py%3Fanswer%3D89955"&gt;hook my Outlook calendar up to my Google calendar&lt;/a&gt;.  I just found out that I can do this and the reverse as both support publishing calendars to the Internet.  The following are how I set this up under Outlook 2010 and Google Calendar:&lt;br /&gt;&lt;br /&gt;In Outlook, I go to the calendar view, right click on my calendar and select "Share  Publish to Office.com".  At this point I can change the permissions to allow anonymous Internet access, and under Detail change between 'Full details' (full calendar), 'Limited details' (subject lines &amp;amp; availability only), 'Availability only'.  Availability only is almost just what I want -- I'd also like to include location but availability only is good enough.  After hitting OK here I get a 'Do you want to send an invitation...' dialog box.  I hit 'Yes' and I can copy the webcals:// URL out of the email window that opens up.  Next, to add it to my Google calendar, I open &lt;a href="http://www.google.com/calendar/"&gt;http://www.google.com/calendar/&lt;/a&gt;, and under 'Other calendars', I select 'Add  Add by URL', paste in that webcals:// URL but change the 'webcals' at the start to 'https'.&lt;br /&gt;&lt;br /&gt;In Google Calendar, I can click on my calendar name under 'My calendars', select 'Calendar settings', and on the new page, look under 'Calendar Address', click the ICAL icon, and copy the URL in the new dialog.  Now back in Outlook I go to the Calendar view, right click on 'My Calendars', and select 'Add Calendar  From Internet...'.  In the new dialog that pops up I paste in the URL from Google Calendar. &lt;br /&gt;&lt;br /&gt;In this fashion I can share public calendar data between my personal and work calendars.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1670048653123050463-7754384779941356016?l=davescoolblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://davescoolblog.blogspot.com/feeds/7754384779941356016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1670048653123050463&amp;postID=7754384779941356016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/7754384779941356016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1670048653123050463/posts/default/7754384779941356016'/><link rel='alternate' type='text/html' href='http://davescoolblog.blogspot.com/2010/07/google-and-outlook-calendar-syncing.html' title='Google and Outlook Calendar Sync&apos;ing'/><author><name>Dave</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
