<?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:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkQBSHgzeyp7ImA9WxBbEkk.&quot;"><id>tag:blogger.com,1999:blog-6692354</id><updated>2010-03-10T08:59:19.683-08:00</updated><title>Emil's Wicked Cool Blog</title><subtitle type="html">Hmm...</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://emilsblog.lerch.org/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>147</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/emillerch" /><feedburner:info uri="emillerch" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CkQBSHY_eip7ImA9WxBbEkk.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-8933765719974870314</id><published>2010-03-09T08:51:00.000-08:00</published><updated>2010-03-10T08:59:19.842-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-10T08:59:19.842-08:00</app:edited><title>Working with a feature branch in Subversion (TortoiseSVN on Windows)</title><content type="html">Branching and merging is one of the most nerve-racking activities for people working with Subversion.&amp;nbsp; Unlike Mercurial and other DVCS where branching and merging is commonplace, typical workflows in Subversion do not include this activity.&amp;nbsp; As a result, the terminology is typically confusing, the massive number of changes can be scary, and a lot of people are so concerned about "getting it right" that they typically just avoid the practice altogether and work completely outside of source control.&amp;nbsp; That, of course, is the exact opposite of what we need when working on an important design spike or critical new feature.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Conceptually, what we want with a design spike or large new feature is to:&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Create a new branch for the change&lt;/li&gt;
&lt;li&gt;Work in the new branch, committing early and often&lt;/li&gt;
&lt;li&gt;Periodically pull in (merge) the changes from the project trunk&lt;/li&gt;
&lt;li&gt;When complete, reintegrate the branch into the trunk&lt;/li&gt;
&lt;/ul&gt;For these instructions, I assume that you have a subversion repository checked out and you're actively working on the trunk.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Creating a new branch:&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/__qN00uIxfHI/S5Z1YMVQxGI/AAAAAAAAAPE/egW-piuGjoM/s1600-h/Magical+Snap+-+2010.03.09+08.17+-+003.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/__qN00uIxfHI/S5Z1YMVQxGI/AAAAAAAAAPE/egW-piuGjoM/s400/Magical+Snap+-+2010.03.09+08.17+-+003.png" width="342" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;&amp;nbsp;Right-click on the directory you want to branch.&amp;nbsp; Pick the Branch/Tag operation.&lt;/li&gt;
&lt;li&gt;On the branch/tag screen, enter a new branch (typically the repository has a /branches folder as well as a /trunk folder).&amp;nbsp; The new branch is typically /branches/&lt;i&gt;mynewbranch&lt;/i&gt;, where the branch name itself is a folder that does not exist in the repository.&lt;/li&gt;
&lt;li&gt;In this scenario, you will also want to choose "switch working copy to new branch/tag".&amp;nbsp; We'll be doing work on the new feature or design change immediately, so this tells subversion that any new commits will be on that other branch.&lt;/li&gt;
&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/__qN00uIxfHI/S5Z2y82KyVI/AAAAAAAAAPM/1mohp4XwIX8/s1600-h/Magical+Snap+-+2010.03.09+08.22+-+004.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/__qN00uIxfHI/S5Z2y82KyVI/AAAAAAAAAPM/1mohp4XwIX8/s640/Magical+Snap+-+2010.03.09+08.22+-+004.png" width="587" /&gt;&lt;/a&gt;&lt;/div&gt;&amp;nbsp;At this point you'll want to take note of the revision number that had the last changes.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Work in the new branch, committing early and often&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
This is standard subversion behavior.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Periodically pull in (merge) the changes from the project trunk&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
You'll want to keep track of the last revision you've pulled changes from.&amp;nbsp; In the beginning, this revision number is the revision that represented the branch itself.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/__qN00uIxfHI/S5Z4Xhlrw6I/AAAAAAAAAPU/oA-GM7y9dSU/s1600-h/Magical+Snap+-+2010.03.09+08.32+-+005.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://2.bp.blogspot.com/__qN00uIxfHI/S5Z4Xhlrw6I/AAAAAAAAAPU/oA-GM7y9dSU/s400/Magical+Snap+-+2010.03.09+08.32+-+005.png" width="345" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt; Pick the Merge tool off the TortoiseSVN menu.&lt;/li&gt;
&lt;li&gt;Choose the "Merge a range of revisions" from the first screen of the wizard.&lt;/li&gt;
&lt;li&gt;In the "URL to merge from", choose the trunk.&lt;/li&gt;
&lt;li&gt;In the Revision range to merge, the best approach is to be precise.&amp;nbsp; Put in the last revision number that was merged (e.g. if you branched when the repository was at revision 10, put in 11-HEAD).&amp;nbsp; You can leave this blank, but we want to avoid merging a change twice.&amp;nbsp; You may need to look at the log to help find the right revisions.&lt;/li&gt;
&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/__qN00uIxfHI/S5Z5qeaCiYI/AAAAAAAAAPc/gGYT22UnQPI/s1600-h/Magical+Snap+-+2010.03.09+08.37+-+006.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="588" src="http://4.bp.blogspot.com/__qN00uIxfHI/S5Z5qeaCiYI/AAAAAAAAAPc/gGYT22UnQPI/s640/Magical+Snap+-+2010.03.09+08.37+-+006.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;Hit next and do a test merge just to be sure before performing the actual merge.&amp;nbsp; All other settings can be left at their defaults.&amp;nbsp; Note that the merge is done in your working directory, so you'll have a bunch of local changes to test and commit on your branch.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: large;"&gt;&lt;b&gt;Reintegrate the branch into the trunk&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/__qN00uIxfHI/S5Z75jgC2eI/AAAAAAAAAPk/gHPDaqLeWXM/s1600-h/Magical+Snap+-+2010.03.09+08.47+-+007.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/__qN00uIxfHI/S5Z75jgC2eI/AAAAAAAAAPk/gHPDaqLeWXM/s400/Magical+Snap+-+2010.03.09+08.47+-+007.png" width="343" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;Commit all branch changes&lt;/li&gt;
&lt;li&gt; Switch the working directory back to the trunk.&amp;nbsp; This is done via the TortoiseSVN switch command.&lt;/li&gt;
&lt;li&gt;Pick the Merge command off the TortoiseSVN menu as before.&amp;nbsp; This time, however, we'll pick the "Reintegrate a branch" option.&lt;/li&gt;
&lt;li&gt;In the "From URL" field, put the URL to the branch you've finished working on.&lt;/li&gt;
&lt;li&gt;Test the merge and if happy, perform the merge, test the changes, and commit to the trunk.&lt;/li&gt;
&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/__qN00uIxfHI/S5Z8VLMaQaI/AAAAAAAAAPs/pkv6bpBCZH0/s1600-h/Magical+Snap+-+2010.03.09+08.48+-+008.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="587" src="http://3.bp.blogspot.com/__qN00uIxfHI/S5Z8VLMaQaI/AAAAAAAAAPs/pkv6bpBCZH0/s640/Magical+Snap+-+2010.03.09+08.48+-+008.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br clear="all"/&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-8933765719974870314?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/8933765719974870314/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=8933765719974870314" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/8933765719974870314?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/8933765719974870314?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/k6lr1RZswLk/working-with-feature-branch-in.html" title="Working with a feature branch in Subversion (TortoiseSVN on Windows)" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/__qN00uIxfHI/S5Z1YMVQxGI/AAAAAAAAAPE/egW-piuGjoM/s72-c/Magical+Snap+-+2010.03.09+08.17+-+003.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2010/03/working-with-feature-branch-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8FQ3wzeSp7ImA9WxBUEUk.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-8365634077393367230</id><published>2010-02-25T17:39:00.000-08:00</published><updated>2010-02-25T17:46:52.281-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-25T17:46:52.281-08:00</app:edited><title>Spring.Net-enabled WCF Services available from Microsoft Ajax</title><content type="html">&lt;div class="separator" style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/__qN00uIxfHI/S4chK-qlupI/AAAAAAAAAN8/G1D9eAenni0/s1600-h/Magical+Snap+-+2010.02.25+16.58+-+005.png" imageanchor="1" style="float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/__qN00uIxfHI/S4chK-qlupI/AAAAAAAAAN8/G1D9eAenni0/s320/Magical+Snap+-+2010.02.25+16.58+-+005.png" /&gt;&lt;/a&gt;&lt;/div&gt;Implementing Spring.NET WCF services is fairly straightforward.&lt;br /&gt;
&lt;br /&gt;
Implementing MS Ajax WCF services is also straightforward, if you pick the right New Item to add from Visual Studio.&lt;br /&gt;
&lt;br /&gt;
The complication comes in when you want a Spring.NET WCF service that handles calls from Microsoft Ajax controls.&amp;nbsp; This method will let you add them.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Step 1. Add new "Ajax-Enabled WCF Service"&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/__qN00uIxfHI/S4chMWzTilI/AAAAAAAAAOE/x-zS6CEyYg8/s1600-h/Magical+Snap+-+2010.02.25+16.59+-+006.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="420" src="http://2.bp.blogspot.com/__qN00uIxfHI/S4chMWzTilI/AAAAAAAAAOE/x-zS6CEyYg8/s640/Magical+Snap+-+2010.02.25+16.59+-+006.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Step 2. Create your methods, test and make sure all base functionality  is working.&amp;nbsp; This sample is for a CascadingDropDown control from the  Ajax Control Toolkit, but any control will work.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/__qN00uIxfHI/S4chNb3jWhI/AAAAAAAAAOM/Vz3cQkStdt8/s1600-h/Magical+Snap+-+2010.02.25+17.03+-+007.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" src="http://2.bp.blogspot.com/__qN00uIxfHI/S4chNb3jWhI/AAAAAAAAAOM/Vz3cQkStdt8/s640/Magical+Snap+-+2010.02.25+17.03+-+007.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/__qN00uIxfHI/S4chOmV5CfI/AAAAAAAAAOU/NsiEF8_UBb0/s1600-h/Magical+Snap+-+2010.02.25+17.06+-+011.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/__qN00uIxfHI/S4chOmV5CfI/AAAAAAAAAOU/NsiEF8_UBb0/s320/Magical+Snap+-+2010.02.25+17.06+-+011.png" /&gt;&lt;/a&gt;&lt;/div&gt;Step 3. Introduce an interface to use for the methods.&amp;nbsp; Spring.Net requires an interface, and this is the crux of the problem.&amp;nbsp; Here I've created IMyAjaxService.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;Step 4. Move the [ServiceContract(Namespace = "")] from the class to the interface&lt;/div&gt;&lt;a href="http://3.bp.blogspot.com/__qN00uIxfHI/S4chPblMOfI/AAAAAAAAAOc/1M_DMkG6_0k/s1600-h/Magical+Snap+-+2010.02.25+17.09+-+012.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://3.bp.blogspot.com/__qN00uIxfHI/S4chPblMOfI/AAAAAAAAAOc/1M_DMkG6_0k/s640/Magical+Snap+-+2010.02.25+17.09+-+012.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: left;"&gt;Step 5. Move the [OperationContract] tags from the methods on the class to the interface method definitions&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&amp;nbsp;&lt;a href="http://2.bp.blogspot.com/__qN00uIxfHI/S4chRiyigbI/AAAAAAAAAOk/pXvXay7WAjc/s1600-h/Magical+Snap+-+2010.02.25+17.10+-+013.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="404" src="http://2.bp.blogspot.com/__qN00uIxfHI/S4chRiyigbI/AAAAAAAAAOk/pXvXay7WAjc/s640/Magical+Snap+-+2010.02.25+17.10+-+013.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;
&lt;/div&gt;Step 6. Change web.config endpoint contract (xpath = /configuration/system.serviceModel/services/service/endpoint) to reference the interface&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/__qN00uIxfHI/S4chUQHHrkI/AAAAAAAAAO0/fRytnTrj4zU/s1600-h/Magical+Snap+-+2010.02.25+17.13+-+015.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="252" src="http://2.bp.blogspot.com/__qN00uIxfHI/S4chUQHHrkI/AAAAAAAAAO0/fRytnTrj4zU/s640/Magical+Snap+-+2010.02.25+17.13+-+015.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;br /&gt;
Step 7: Test.  The test should work, without dependency injection from Spring.Net.&amp;nbsp; Now we have a WCF service that responds to Ajax, but has the interface definitions just the way Spring likes them.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="text-align: center;"&gt;&lt;u&gt;&lt;span style="font-size: large;"&gt;Wiring in Spring&lt;/span&gt;&lt;/u&gt;&lt;/div&gt;&lt;br /&gt;
For Spring.NET to handle WCF, you need .NET 3.0 or higher, and you need Spring.Net 1.3.0 or higher.&amp;nbsp; You'll need the following DLLs available for binding (either your bin directory or the GAC):&lt;br /&gt;
&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Spring.Core.dll from the 2.0 folder&lt;/li&gt;
&lt;li&gt;Spring.Web.dll from the 2.0 folder&lt;/li&gt;
&lt;li&gt;Spring.Services.dll from the 3.0 folder&lt;/li&gt;
&lt;/ul&gt;In the Service you've created, edit the markup and add Factory="Spring.ServiceModel.Activation.ServiceHostFactory" onto the end, like so:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/__qN00uIxfHI/S4chVg7RJAI/AAAAAAAAAO8/b26ihrR-aE8/s1600-h/Magical+Snap+-+2010.02.25+17.14+-+016.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="76" src="http://1.bp.blogspot.com/__qN00uIxfHI/S4chVg7RJAI/AAAAAAAAAO8/b26ihrR-aE8/s640/Magical+Snap+-+2010.02.25+17.14+-+016.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;This will get Spring.Net into the activation pipeline for the service.&lt;br /&gt;
&lt;br /&gt;
Lastly, you'll add the new object to spring configuration.&amp;nbsp; It is &lt;span style="background-color: white;"&gt;CRITICAL that the OBJECT ID MATCH THE SERVICE NAME FROM WEB.CONFIG.&amp;nbsp; The Spring.Net documentation mentions this, but I don't think they mention it very loudly.&amp;nbsp; The type information is exactly as you'd expect: the type for the WCF service class.&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: white;"&gt;&lt;br /&gt;
&lt;/span&gt;&lt;br /&gt;
Also CRITICAL:&amp;nbsp; Add singleton="false" to the object definition for Spring for your new object&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-8365634077393367230?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/8365634077393367230/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=8365634077393367230" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/8365634077393367230?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/8365634077393367230?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/rSjqEEBhOow/springnet-enabled-wcf-services.html" title="Spring.Net-enabled WCF Services available from Microsoft Ajax" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/__qN00uIxfHI/S4chK-qlupI/AAAAAAAAAN8/G1D9eAenni0/s72-c/Magical+Snap+-+2010.02.25+16.58+-+005.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2010/02/springnet-enabled-wcf-services.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EBSHs9cSp7ImA9WxNXEkg.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-5230259800923942844</id><published>2009-07-08T22:50:00.001-07:00</published><updated>2009-09-29T13:20:59.569-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-29T13:20:59.569-07:00</app:edited><title>Intermittent Operation Aborted Errors in IE when using MS Ajax</title><content type="html">This issue has been plaguing our project:  operation aborted errors, intermittent in nature, occurring sometimes as little as once/week.  Even in IE 8 there were issues, although thankfully not the crazy dialog box we see in IE 6 and 7.&lt;br /&gt;&lt;br /&gt;It turns out that the problem is due to a bug in Ajax itself.  I won't go into all the details, since they're covered very well in these two blog posts:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;First post with background: &lt;a href="http://seejoelprogram.wordpress.com/2008/06/08/when-sysapplicationinitialize-causes-operation-aborted-in-ie/"&gt;http://seejoelprogram.wordpress.com/2008/06/08/when-sysapplicationinitialize-causes-operation-aborted-in-ie/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Second post with bug fixes to the original bug fix: &lt;a href="http://www.blogger.com/post-create.g?blogID=6692354#%20http://seejoelprogram.wordpress.com/2008/10/03/fixing-sysapplicationinitialize-again/"&gt;http://seejoelprogram.wordpress.com/2008/10/03/fixing-sysapplicationinitialize-again/&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I didn't particularly care for the recommended way of packaging the fix, so instead I've used built-in ASP.NET Ajax functionality to override the default script delivery.  I also updated the fixed functions to work for all versions of Ajax (at the time of this writing - currently Ajax bundled with .NET 3.5 SP1 and below).  First, here are the updated functions:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Sys$_Application$initialize:&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt; function Sys$_Application$initialize() {&lt;br /&gt;     if(!this._initialized &amp;&amp; !this._initializing) {&lt;br /&gt;         this._initializing = true;&lt;br /&gt;         var u = window.navigator.userAgent.toLowerCase(),&lt;br /&gt;             v = parseFloat(u.match(/.+(?:rv|it|ml|ra|ie)[\/: ]([\d.]+)/)[1]);&lt;br /&gt;&lt;br /&gt;         var initializeDelegate = Function.createDelegate(this, this._doInitialize);&lt;br /&gt;&lt;br /&gt;         if (/WebKit/i.test(u) &amp;&amp; v &lt; 525.13)&lt;br /&gt;         {&lt;br /&gt;             this._load_timer = window.setInterval(function()&lt;br /&gt;             {&lt;br /&gt;                 if (/loaded|complete/.test(document.readyState))&lt;br /&gt;                 {&lt;br /&gt;                     initializeDelegate();&lt;br /&gt;                 }&lt;br /&gt;             }, 10);&lt;br /&gt;         }&lt;br /&gt;         else if (/msie/.test(u) &amp;&amp; !window.opera)&lt;br /&gt;         {&lt;br /&gt;             document.attachEvent('onreadystatechange',&lt;br /&gt;                 function (e) {&lt;br /&gt;                     if (e &amp;&amp; arguments.callee &amp;&amp; document.readyState == 'complete') {&lt;br /&gt;                         document.detachEvent('on'+e.type, arguments.callee);&lt;br /&gt;                         initializeDelegate();&lt;br /&gt;                     }&lt;br /&gt;                 }&lt;br /&gt;             );&lt;br /&gt;             if (window == top) {&lt;br /&gt;                 (function () {&lt;br /&gt;                     try {&lt;br /&gt;                         document.documentElement.doScroll('left');&lt;br /&gt;                     } catch (e) {&lt;br /&gt;                         setTimeout(arguments.callee, 10);&lt;br /&gt;                         return;&lt;br /&gt;                     }&lt;br /&gt;                     initializeDelegate();&lt;br /&gt;                 })();&lt;br /&gt;             }&lt;br /&gt;&lt;br /&gt;         }&lt;br /&gt;         else if (document.addEventListener&lt;br /&gt;             &amp;&amp;  ((/opera\//.test(u) &amp;&amp; v &gt; 9) ||&lt;br /&gt;                 (/gecko\//.test(u) &amp;&amp; v &gt;= 1.8) ||&lt;br /&gt;                 (/khtml\//.test(u) &amp;&amp; v &gt;= 4.0) ||&lt;br /&gt;                 (/webkit\//.test(u) &amp;&amp; v &gt;= 525.13))) {&lt;br /&gt;             document.addEventListener("DOMContentLoaded", initializeDelegate, false);&lt;br /&gt;         }&lt;br /&gt;         else&lt;br /&gt;         {&lt;br /&gt;             $addHandler(window, "load", initializeDelegate);&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sys$_Application$_doInitialize():&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt; function Sys$_Application$_doInitialize() {&lt;br /&gt;   if (this._initialized) {&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   Sys._Application.callBaseMethod(this, 'initialize');&lt;br /&gt;   if (this._load_timer !== null)&lt;br /&gt;   {&lt;br /&gt;    clearInterval(this._load_timer);&lt;br /&gt;    this._load_timer = null;&lt;br /&gt;   }&lt;br /&gt;   var handler = this.get_events().getHandler("init");&lt;br /&gt;   if (handler) {&lt;br /&gt;    this.beginCreateComponents();&lt;br /&gt;    handler(this, Sys.EventArgs.Empty);&lt;br /&gt;    this.endCreateComponents();&lt;br /&gt;   }&lt;br /&gt;   if (Sys.WebForms) {&lt;br /&gt;    if (this._onPageRequestManagerBeginRequest) this._beginRequestHandler = Function.createDelegate(this, this._onPageRequestManagerBeginRequest);&lt;br /&gt;    if (this._beginRequestHandler) Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(this._beginRequestHandler);&lt;br /&gt;    if (this._onPageRequestManagerEndRequest) this._endRequestHandler = Function.createDelegate(this, this._onPageRequestManagerEndRequest);&lt;br /&gt;    if (this._endRequestHandler) Sys.WebForms.PageRequestManager.getInstance().add_endRequest(this._endRequestHandler);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   if (this.get_stateString){&lt;br /&gt;    var loadedEntry = this.get_stateString();&lt;br /&gt;    if (loadedEntry !== this._currentEntry) {&lt;br /&gt;     this._navigate(loadedEntry);&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   this.raiseLoad();&lt;br /&gt;   this._initializing = false;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Sys$_Application$_loadHandler():&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt; function Sys$_Application$_loadHandler() {&lt;br /&gt;  if(this._loadHandlerDelegate) {&lt;br /&gt;   Sys.UI.DomEvent.removeHandler(window, "load", this._loadHandlerDelegate);&lt;br /&gt;   this._loadHandlerDelegate = null;&lt;br /&gt;  }&lt;br /&gt;  this._initializing = true;&lt;br /&gt;  this._doInitialize();&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Next, here is how I overrode how the framework delivers the script:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;  &amp;lt;ajaxtoolkit:toolkitscriptmanager runat=&amp;quot;server&amp;quot; enablepartialrendering=&amp;quot;true&amp;quot; id=&amp;quot;ScriptManager&amp;quot;&amp;gt;&lt;br /&gt;       &amp;lt;scripts&amp;gt;&lt;br /&gt;           &amp;lt;asp:scriptreference name=&amp;quot;MicrosoftAjax.js&amp;quot; assembly=&amp;quot;System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&amp;quot; path=&amp;quot;~/js/MicrosoftAjax-withFix.js&amp;quot;&amp;gt;&lt;br /&gt;       &amp;lt;/scripts&amp;gt;&lt;br /&gt;  &amp;lt;/ajaxToolkit:ToolkitScriptManager&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You do not need to use the ToolKitScriptManager - you can also do it this way:&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush:xml"&gt;&lt;br /&gt;   &amp;lt;asp:scriptmanager runat=&amp;quot;server&amp;quot; enablepartialrendering=&amp;quot;true&amp;quot; id=&amp;quot;ScriptManager&amp;quot;&amp;gt;&lt;br /&gt;       &amp;lt;scripts&amp;gt;&lt;br /&gt;&amp;lt;asp:scriptreference name=&amp;quot;MicrosoftAjax.js&amp;quot; assembly=&amp;quot;System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35&amp;quot; path=&amp;quot;~/js/MicrosoftAjax-withFix.js&amp;quot;&amp;gt;&lt;br /&gt;       &amp;lt;/scripts&amp;gt;&lt;br /&gt;   &amp;lt;/asp:ScriptManager&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Note that you can replace ~/js with the directory of your choosing.&lt;br /&gt;&lt;br /&gt;Be aware that when the framework loads the file, it automatically adds .debug or .release onto the end of the file name, so the final file reference provided will be either MicrosoftAjax-withFix.debug.js or MicrosoftAjax-withFix.release.js.&lt;br /&gt;&lt;br /&gt;If you don't want to bother incorporating these fixes into .NET 3.5 SP1 Ajax files, feel free to download them from here:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Debug version: &lt;a href="http://lerch.org/js/MicrosoftAjax-WithFix.debug.js"&gt;http://lerch.org/js/MicrosoftAjax-WithFix.debug.js&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Release version (simply a minified version of the  debug js - run through &lt;a href="http://developer.yahoo.com/yui/compressor/"&gt;YUI Compresssor&lt;/a&gt;): &lt;a href="http://lerch.org/js/MicrosoftAjax-WithFix.release.js"&gt;http://lerch.org/js/MicrosoftAjax-WithFix.release.js&lt;/a&gt;&lt;br /&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/6692354-5230259800923942844?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/5230259800923942844/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=5230259800923942844" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/5230259800923942844?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/5230259800923942844?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/cHElA_26RXU/intermittent-operation-aborted-errors.html" title="Intermittent Operation Aborted Errors in IE when using MS Ajax" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2009/07/intermittent-operation-aborted-errors.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQCQ305eCp7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-4944090063865517807</id><published>2009-07-07T10:56:00.001-07:00</published><updated>2009-07-07T13:59:22.320-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T13:59:22.320-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Javascript" /><title>Javascript Hacks: Using XHR to load binary data</title><content type="html">I recently needed to get image data from a server using Javascript, base64 encode it, and post that data back to an application.  While the details of &lt;span style="font-weight: bold;"&gt;why&lt;/span&gt; I needed to do this are a bit complex, I believe that getting image data through an XMLHttpRequest object and base 64 enconding it will become more valuable in terms of client-side image manipulation using the &lt;a href="http://en.wikipedia.org/wiki/Data_URI_scheme"&gt;data URI scheme&lt;/a&gt; for image tags.&lt;br /&gt;&lt;br /&gt;This would allow a Javascript developer, for instance, to load an existing image (say, a photo), without base64 encoding it on the server, load it into an image tag with a data URI, and make direct manipulations on that image.&lt;br /&gt;&lt;br /&gt;Unfortunately, this area is relatively new and browsers have a lot of differences.  Data URI support is still very new, inconsistent, and limited.  In the meantime, here is how you get that base64 encoded image in the first place:&lt;br /&gt;&lt;br /&gt;Internet Explorer:&lt;br /&gt;&lt;div style="padding-left: 4em;"&gt;&lt;br /&gt;IE has a property of XMLHttpRequest object for binary data &lt;a href="http://msdn.microsoft.com/en-us/library/ms534368%28VS.85%29.aspx"&gt;ResponseBody&lt;/a&gt;.  This contains exactly what we need, but unfortunately the property is not visible to Javascript.  Since the string returned to Javascript by &lt;a href="http://msdn.microsoft.com/en-us/library/ms534369%28VS.85%29.aspx"&gt;ResponseText&lt;/a&gt; will be terminated at the first null value, we must use ResponseBody.  This requires a bit of VBScript, which can do one of the following things:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Get the numeric value of each unsigned byte and turn that into a number in a string of comma delimited numbers.  This is less efficient, but gets you in and out of VBScript as quickly as possible, allowing a generic base64 encoding routine.  This is the route I followed (it may be less efficient, but it pales in comparison with the XHR request just made):&lt;br /&gt;&lt;pre class="brush:vb"&gt;&lt;br /&gt;Function BinaryArrayToAscCSV( aBytes )&lt;br /&gt; Dim j, sOutput&lt;br /&gt;        sOutput = "BinaryArrayToAscCSV"&lt;br /&gt; For j = 1 to LenB(aBytes)&lt;br /&gt;  sOutput= sOutput &amp; AscB( MidB(aBytes,j,1) )&lt;br /&gt;  sOutput= sOutput &amp; ","&lt;br /&gt; Next&lt;br /&gt; BinaryArrayToAscCSV = sOutput&lt;br /&gt;End Function&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Base 64 encode it directly in VBScript.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;Once this is done, we can then base64 encode it using a fairly generic function in Javascript:&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;Base64 = {&lt;br /&gt; &lt;br /&gt; // private property&lt;br /&gt; _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",&lt;br /&gt;&lt;br /&gt; encodeBinaryArrayAsString : function(input){&lt;br /&gt;  var ascArr;&lt;br /&gt;  var output = "";&lt;br /&gt;  var bytebuffer;&lt;br /&gt;  var encodedCharIndexes = new Array(4);&lt;br /&gt;  &lt;br /&gt;  var inx = 0;&lt;br /&gt;  ascArr = input.substring("BinaryArrayToAscCSV".length, input.length - 1).split(',');&lt;br /&gt;  while(inx &lt; ascArr.length){&lt;br /&gt;   // Fill byte buffer array&lt;br /&gt;   bytebuffer = new Array(3);&lt;br /&gt;   for(jnx = 0; jnx &lt; bytebuffer.length; jnx++)&lt;br /&gt;    if(inx &lt; ascArr.length)&lt;br /&gt;     bytebuffer[jnx] = parseInt(ascArr[inx++]); &lt;br /&gt;    else&lt;br /&gt;     bytebuffer[jnx] = 0;&lt;br /&gt;     &lt;br /&gt;   // Get each encoded character, 6 bits at a time&lt;br /&gt;   // index 1: first 6 bits&lt;br /&gt;   encodedCharIndexes[0] = bytebuffer[0] &gt;&gt; 2;  &lt;br /&gt;   // index 2: second 6 bits (2 least significant bits from input byte 1 + 4 most significant bits from byte 2)&lt;br /&gt;   encodedCharIndexes[1] = ((bytebuffer[0] &amp; 0x3) &lt;&lt; 4) | (bytebuffer[1] &gt;&gt; 4);  &lt;br /&gt;   // index 3: third 6 bits (4 least significant bits from input byte 2 + 2 most significant bits from byte 3)&lt;br /&gt;   encodedCharIndexes[2] = ((bytebuffer[1] &amp; 0x0f) &lt;&lt; 2) | (bytebuffer[2] &gt;&gt; 6);  &lt;br /&gt;   // index 3: forth 6 bits (6 least significant bits from input byte 3)&lt;br /&gt;   encodedCharIndexes[3] = bytebuffer[2] &amp; 0x3f;  &lt;br /&gt;   &lt;br /&gt;   // Determine whether padding happened, and adjust accordingly&lt;br /&gt;   paddingBytes = inx - (ascArr.length - 1);&lt;br /&gt;   switch(paddingBytes){&lt;br /&gt;    case 2:&lt;br /&gt;     // Set last 2 characters to padding char&lt;br /&gt;     encodedCharIndexes[3] = 64; &lt;br /&gt;     encodedCharIndexes[2] = 64; &lt;br /&gt;     break;&lt;br /&gt;    case 1:&lt;br /&gt;     // Set last character to padding char&lt;br /&gt;     encodedCharIndexes[3] = 64; &lt;br /&gt;     break;&lt;br /&gt;    default:&lt;br /&gt;     break; // No padding - proceed&lt;br /&gt;   }&lt;br /&gt;   // Now we will grab each appropriate character out of our keystring&lt;br /&gt;   // based on our index array and append it to the output string&lt;br /&gt;   for(jnx = 0; jnx &lt; encodedCharIndexes.length; jnx++)&lt;br /&gt;    output += this._keyStr.charAt(encodedCharIndexes[jnx]);     &lt;br /&gt;  }&lt;br /&gt;  return output;&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;Firefox:&lt;br /&gt;&lt;div style="padding-left: 4em;"&gt;&lt;br /&gt;Firefox works a little differently, as there is no RequestBody property.  In this case, RequestText is not truncated as long as you override the mime type coming from the server, forcing Firefox to pass the data unaltered.  All we need to do is compensate for binary data coming back and being placed in a Unicode Javascript string.  To compensate, we can AND each character with 0xFF to throw away the high-order byte (see &lt;a href="https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data"&gt;https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data&lt;/a&gt;).  The resulting encoding function looks like this:&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;Base64 = {&lt;br /&gt; &lt;br /&gt; // private property&lt;br /&gt; _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",&lt;br /&gt;&lt;br /&gt; encodeBinary : function(input){&lt;br /&gt;  var output = "";&lt;br /&gt;  var bytebuffer;&lt;br /&gt;  var encodedCharIndexes = new Array(4);&lt;br /&gt;  var inx = 0;&lt;br /&gt;  var paddingBytes = 0;&lt;br /&gt;   &lt;br /&gt;  while(inx &lt; input.length){&lt;br /&gt;   // Fill byte buffer array&lt;br /&gt;   bytebuffer = new Array(3);&lt;br /&gt;   for(jnx = 0; jnx &lt; bytebuffer.length; jnx++)&lt;br /&gt;    if(inx &lt; input.length)&lt;br /&gt;     bytebuffer[jnx] = input.charCodeAt(inx++) &amp; 0xff; // throw away high-order byte, as documented at: https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data&lt;br /&gt;    else&lt;br /&gt;     bytebuffer[jnx] = 0;&lt;br /&gt;   &lt;br /&gt;   // Get each encoded character, 6 bits at a time&lt;br /&gt;   // index 1: first 6 bits&lt;br /&gt;   encodedCharIndexes[0] = bytebuffer[0] &gt;&gt; 2;  &lt;br /&gt;   // index 2: second 6 bits (2 least significant bits from input byte 1 + 4 most significant bits from byte 2)&lt;br /&gt;   encodedCharIndexes[1] = ((bytebuffer[0] &amp; 0x3) &lt;&lt; 4) | (bytebuffer[1] &gt;&gt; 4);  &lt;br /&gt;   // index 3: third 6 bits (4 least significant bits from input byte 2 + 2 most significant bits from byte 3)&lt;br /&gt;   encodedCharIndexes[2] = ((bytebuffer[1] &amp; 0x0f) &lt;&lt; 2) | (bytebuffer[2] &gt;&gt; 6);  &lt;br /&gt;   // index 3: forth 6 bits (6 least significant bits from input byte 3)&lt;br /&gt;   encodedCharIndexes[3] = bytebuffer[2] &amp; 0x3f;  &lt;br /&gt;   &lt;br /&gt;   // Determine whether padding happened, and adjust accordingly&lt;br /&gt;   paddingBytes = inx - (input.length - 1);&lt;br /&gt;   switch(paddingBytes){&lt;br /&gt;    case 2:&lt;br /&gt;     // Set last 2 characters to padding char&lt;br /&gt;     encodedCharIndexes[3] = 64; &lt;br /&gt;     encodedCharIndexes[2] = 64; &lt;br /&gt;     break;&lt;br /&gt;    case 1:&lt;br /&gt;     // Set last character to padding char&lt;br /&gt;     encodedCharIndexes[3] = 64; &lt;br /&gt;     break;&lt;br /&gt;    default:&lt;br /&gt;     break; // No padding - proceed&lt;br /&gt;   }&lt;br /&gt;   // Now we will grab each appropriate character out of our keystring&lt;br /&gt;   // based on our index array and append it to the output string&lt;br /&gt;   for(jnx = 0; jnx &lt; encodedCharIndexes.length; jnx++)&lt;br /&gt;    output += this._keyStr.charAt(encodedCharIndexes[jnx]);&lt;br /&gt;  }&lt;br /&gt;  return output;&lt;br /&gt; };&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ideally we'd combine these two functions into a single encoding function, but I've left them separate for clarity.  Note also that these techniques do not appear to work for Safari, Chrome or Opera.  It should work for IE6 if using the correct ActiveX XHR object, but I was not supporting IE6.  I did a spot check on Safari/Chrome/Opera and they were not working, but I did not investigate as they were not supported browsers for my implementation.  The actual XHR function I used was:&lt;br /&gt;&lt;pre class="brush:js"&gt;&lt;br /&gt;LoadBinaryResource = function(url) { &lt;br /&gt;  var req = new XMLHttpRequest();  &lt;br /&gt;  req.open('GET', url, false);  &lt;br /&gt;&lt;br /&gt;  if (req.overrideMimeType)&lt;br /&gt;    req.overrideMimeType('text/plain; charset=x-user-defined');  &lt;br /&gt;  req.send(null);  &lt;br /&gt;  if (req.status != 200) return '';  &lt;br /&gt;  if (typeof(req.responseBody) !== 'undefined') return BinaryArrayToAscCSV(req.responseBody);&lt;br /&gt;  return req.responseText;  &lt;br /&gt;} &lt;br /&gt;&lt;br /&gt;LoadBinaryResourceAsBase64 = function(url) { &lt;br /&gt;  var data = LoadBinaryResource(url);&lt;br /&gt;  &lt;br /&gt;  if (data.indexOf("BinaryArrayToAscCSV") !== -1)&lt;br /&gt;    return Base64.encodeBinaryArrayAsString(data);&lt;br /&gt;  else&lt;br /&gt;    return Base64.encodeBinary(data);  &lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-4944090063865517807?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/4944090063865517807/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=4944090063865517807" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/4944090063865517807?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/4944090063865517807?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/NziPLIU4uXs/javascript-hacks-using-xhr-to-load.html" title="Javascript Hacks: Using XHR to load binary data" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2009/07/javascript-hacks-using-xhr-to-load.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcBQn8ycCp7ImA9WxJUEE8.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-1904125260016878935</id><published>2008-10-28T23:42:00.001-07:00</published><updated>2009-07-07T20:17:33.198-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T20:17:33.198-07:00</app:edited><title>A little surprised no one caught this</title><content type="html">So I just watched last week's &lt;a href="http://www.nbc.com/Saturday_Night_Live/video/categories/weekend-update-thursdays/29439/"&gt;SNL Weekend Update Thursdays &lt;/a&gt;on &lt;a href="http://nbc.com"&gt;NBC.com&lt;/a&gt;, and decided to play around with their viewer.  I haven't watched shows there before, but the Olympics were Silverlight and I wanted to know if they used &lt;a href="http://silverlight.net/"&gt;Silverlight &lt;/a&gt;(no, they use &lt;a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash"&gt;Flash&lt;/a&gt;), and what features they had.  I hit the info button (the thing with the arrow pointing to it), and was greeted with the interface you see below...the red box is mine (added for emphasis).  Clearly they had some of the original mockup "&lt;a href="http://en.wikipedia.org/wiki/Lorem_ipsum"&gt;Lorem Ipsum&lt;/a&gt;" in there and no one bothered to update it or correct it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img11.imageshack.us/img11/286/200810282331.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 1019px; height: 672px;" src="http://img11.imageshack.us/img11/286/200810282331.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-1904125260016878935?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/1904125260016878935/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=1904125260016878935" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/1904125260016878935?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/1904125260016878935?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/BuoIyxr156I/little-surprised-no-one-caught-this.html" title="A little surprised no one caught this" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/10/little-surprised-no-one-caught-this.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ENQno8eSp7ImA9WxRRE0g.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-3128064170444895561</id><published>2008-09-25T09:13:00.000-07:00</published><updated>2008-09-25T09:21:33.471-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-09-25T09:21:33.471-07:00</app:edited><title>It doesn't get much better than this</title><content type="html">How's this for a setup message? Kinda hard to comply with...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://content.screencast.com/users/EmilT/folders/Jing/media/5412a0bb-c6d1-48be-a4df-352829c740e3/2008-09-25_0849.png"&gt;&lt;img style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 400px; CURSOR: hand; TEXT-ALIGN: center" alt="" src="http://content.screencast.com/users/EmilT/folders/Jing/media/5412a0bb-c6d1-48be-a4df-352829c740e3/2008-09-25_0849.png" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-3128064170444895561?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/3128064170444895561/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=3128064170444895561" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/3128064170444895561?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/3128064170444895561?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/ykBzKh_XVv4/it-doesnt-get-much-better-than-this.html" title="It doesn't get much better than this" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/09/it-doesnt-get-much-better-than-this.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4MQHszeip7ImA9WxdSGU0.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-8510287131124604809</id><published>2008-05-27T08:56:00.000-07:00</published><updated>2008-05-27T08:59:41.582-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-27T08:59:41.582-07:00</app:edited><title>One more technical analysis link</title><content type="html">I bumped across &lt;a href="http://www.stoxline.com/"&gt;Stoxline&lt;/a&gt; during my &lt;a href="http://emilsblog.lerch.org/2008/05/excercising-intc-stock-options.html"&gt;recent foray into the technical analysis world&lt;/a&gt;.  It provides a good quick summary of some key price points.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-8510287131124604809?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/8510287131124604809/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=8510287131124604809" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/8510287131124604809?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/8510287131124604809?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/gfNyu_8J0_0/one-more-technical-analysis-link.html" title="One more technical analysis link" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/05/one-more-technical-analysis-link.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYDQ308fCp7ImA9WxdSFUg.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-215299667854185071</id><published>2008-05-23T07:50:00.000-07:00</published><updated>2008-05-23T08:39:32.374-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-23T08:39:32.374-07:00</app:edited><title>Excercising INTC stock options</title><content type="html">So I've excercised the remaining stock options from Intel that remain above water.  There are still a large number of options that will die worthless (my original options were priced at $67 back in 2001, current stock price is $23.52, and there were no splits in between).  The next set of options that even have a shot at becoming in the money are priced around $26, and with 3 weeks out, it would be surprising if they became valuable.  Here's the quick story of how the excercise went down.&lt;br /&gt;&lt;br /&gt;I excercised in three batches.  The first batch I got totally lucky and sold at $27.98, exactly $0.01 off the 52 week high.  Dumb luck.  I sold only half because word on the street was that Q1 would be great, and the price would keep going up.  In retrospect, I think selling half was a good move, but my big mistake here was not to have sold the most expensively priced options.  Those options at $26 would have actually been worth something. &lt;br /&gt;&lt;br /&gt;The stock tanked this year, but recently began to gain ground.  Oddly, it picked up momentum based on almost no news (the overall market was also up).  Intel did &lt;a href="http://www.thestreet.com/s/tech-winners-and-losers-intel/newsanalysis/winnerstech/_msnh/10417027.html?&amp;amp;cm_ven=MSNH&amp;amp;cm_cat=FREE&amp;amp;cm_ite=NA"&gt;get an upgrade&lt;/a&gt; that did pretty well for the stock.  Due to what seemed to be a short term movement and the imminent expiration of my options, I dug out some of my technical analysis knowledge and went to town:&lt;br /&gt;&lt;br /&gt;I watched the following indicators:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.investopedia.com/terms/m/macd.asp"&gt;MACD&lt;/a&gt;:  I was looking pretty short-term (&lt;1&gt;&lt;li&gt;&lt;a href="http://www.investopedia.com/terms/b/bollingerbands.asp"&gt;Bollinger Bands&lt;/a&gt;:  I thought this would be a fairly useless indicator, but in fact, it was just when the stock crossed the upper band that it turned negative.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.investopedia.com/terms/r/rsi.asp"&gt;RSI&lt;/a&gt;:  Fairly useful indicator in this scenario&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.investopedia.com/terms/s/stochasticoscillator.asp"&gt;Slow Stochastic Oscillator&lt;/a&gt;: Fast stoch always seems too touchy for me.  Maybe if I were trading several times a day it would be different, but the slow stoch was useful&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.investopedia.com/terms/p/parabolicindicator.asp"&gt;Parabolic SAR&lt;/a&gt;: My primary source of when the options should be sold.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;When the stock hit 25 and retreated a bit to 24.60, I decided to sell my second batch, a fairly small set of options that were priced in the mid 23's.  My primary thinking here was to lock in some of the options since going up over 5% in one day on no news was just crazy.&lt;br /&gt;&lt;br /&gt;At 25, the MACD, Bollinger Bands and RSI indicators all went bearish, so I thought I'd sell when the price started to dip.  The next day it opened pretty low and then dropped below 24.13, which was the Parabolic SAR trigger point, so now all the indicators I was tracking went bearish.  I sold at 24.08, and so far, it's down another 0.85 from there.&lt;br /&gt;&lt;br /&gt;Lessons learned?  The indicators can work...don't rely on just one, and make sure that you use the right indicator for your goal.&lt;br /&gt;&lt;br /&gt;Another couple links of use:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://research.scottrade.com/public/stocks/charts/charts.asp?symbol=INTC"&gt;Scottrade chart&lt;/a&gt;:  This chart is continuously updated, and summarizes what the indicators are saying (e.g. Parabolic Indicator is bearish/MACD is bullish).  The conintuous updates made it more useful than Yahoo.  It does, however, force you to re-add the indicators - no deep link is possible.&lt;/li&gt;&lt;li&gt;&lt;a href="http://finance.yahoo.com/echarts?s=INTC#chart1:symbol=intc;range=1m;indicator=bollinger+psar+rsi+macd+stochasticfast;charttype=candlestick;crosshair=on;ohlcvalues=0;logscale=off;source=undefined"&gt;Yahoo chart&lt;/a&gt;:  I was originally using this chart from Yahoo.  Since the URL includes all the options, it looks exactly as I was using.  However, it only updates at the end of each day.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.tdameritrade.com/tradingtools/commandcenter.html"&gt;TD Ameritrade Command Center 2.0&lt;/a&gt;:  A Java app available for &lt;a href="http://www.tdameritrade.com/welcome1.html"&gt;TD Ameritrade&lt;/a&gt; customers, it let me watch the stock in real-time during the day.&lt;br /&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/6692354-215299667854185071?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/215299667854185071/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=215299667854185071" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/215299667854185071?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/215299667854185071?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/u2l96okWmIg/excercising-intc-stock-options.html" title="Excercising INTC stock options" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/05/excercising-intc-stock-options.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QDSXw_cCp7ImA9WxdSE0o.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-5325209163409213405</id><published>2008-05-21T07:13:00.000-07:00</published><updated>2008-05-21T07:16:18.248-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-21T07:16:18.248-07:00</app:edited><title>It could have been so much more effective with a little B&amp;E</title><content type="html">A couple days ago I got a flyer on my door advertising a security system and monitoring package.  I'm not sure how many people actually respond to a blanket flyer like that, but it got me thinking...wouldn't the flyer have been more effective had they managed to leave it somewhere &lt;span style="font-weight: bold;"&gt;inside&lt;/span&gt; the house while we weren't home?  Illegal - yes.  Effective: definitely.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-5325209163409213405?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/5325209163409213405/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=5325209163409213405" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/5325209163409213405?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/5325209163409213405?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/ue3BazYZGQ0/it-could-have-been-so-much-more.html" title="It could have been so much more effective with a little B&amp;E" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/05/it-could-have-been-so-much-more.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQBQHc9fip7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-3666716849101529582</id><published>2008-05-02T09:23:00.000-07:00</published><updated>2009-07-07T13:59:11.966-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T13:59:11.966-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Check for valid stored procedures</title><content type="html">I just posted a &lt;a href="http://www.codeproject.com/KB/database/validate-sqlserver-proc.aspx"&gt;small utility&lt;/a&gt; on &lt;a href="http://www.codeproject.com"&gt;CodeProject &lt;/a&gt;to check for valid stored procedures, views, and functions (in SQL Server).  It's actually a polish of some work someone else had done earlier, but if you have a large number of objects and are doing significant database refactoring, you may want to check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-3666716849101529582?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/3666716849101529582/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=3666716849101529582" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/3666716849101529582?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/3666716849101529582?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/XjBNAVBBOC4/check-for-valid-stored-procedures.html" title="Check for valid stored procedures" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/05/check-for-valid-stored-procedures.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIEQH87eip7ImA9WxRaEE4.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-3009303763967582498</id><published>2008-05-01T08:10:00.000-07:00</published><updated>2008-12-11T14:28:21.102-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-11T14:28:21.102-08:00</app:edited><title>Street signs</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__qN00uIxfHI/SBnf7IjXQRI/AAAAAAAAAHg/FRkySu62yKM/s1600-h/walk.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://3.bp.blogspot.com/__qN00uIxfHI/SBnf7IjXQRI/AAAAAAAAAHg/FRkySu62yKM/s200/walk.jpg" alt="" id="BLOGGER_PHOTO_ID_5195429852149661970" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;When crossing the street and seeing one of the standard walk signs (such as the one to the left), I have a habit of imitating the sign and saying "white man walking".&lt;br /&gt;&lt;br /&gt;Well, Sweden is now crossing the gender barrier with their &lt;a href="http://www.npr.org/templates/story/story.php?storyId=90090667"&gt;new signs&lt;/a&gt;.  Where this will lead, I'm not sure.  Non-caucasians?  Dogs?  Cats?  It does make me wonder, if the signs are specific, is Sweden now implying that where this sign is posted, only women are allowed to walk?&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__qN00uIxfHI/SBngiojXQSI/AAAAAAAAAHo/dC_BoH7WVBE/s1600-h/garmanfru.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/__qN00uIxfHI/SBngiojXQSI/AAAAAAAAAHo/dC_BoH7WVBE/s200/garmanfru.jpg" alt="" id="BLOGGER_PHOTO_ID_5195430530754494754" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-3009303763967582498?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/3009303763967582498/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=3009303763967582498" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/3009303763967582498?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/3009303763967582498?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/lbOniZl02nw/street-signs.html" title="Street signs" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/__qN00uIxfHI/SBnf7IjXQRI/AAAAAAAAAHg/FRkySu62yKM/s72-c/walk.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/05/street-signs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08ESX04eyp7ImA9WxZbFEk.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-8291379206950424162</id><published>2008-04-17T07:06:00.000-07:00</published><updated>2008-04-17T07:16:48.333-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-17T07:16:48.333-07:00</app:edited><title>Google Maps update</title><content type="html">I just noticed that &lt;a href="http://maps.google.com"&gt;Google Maps&lt;/a&gt; introduced the ability to show historical "average traffic" for any given time on particular day of the week.  I just used it to confirm my commuting schedule, and it seems to correlate well with my experiences and validate that the times I drive are pretty reasonable.&lt;br /&gt;&lt;br /&gt;There are definitely some systemic traffic slowdowns in the Portland area.  For example, 26 west bound between &lt;a href="http://maps.google.com/?ie=UTF8&amp;amp;layer=t&amp;amp;ll=45.5243,-122.816548&amp;amp;spn=0.021047,0.057335&amp;amp;z=15"&gt;Murray and Bethany&lt;/a&gt; is nearly always a problem from 4PM-7PM, probably stemming from the fact that the road moves from 3 lanes down to 2 just after the Bethany exit.  This is especially unfortunate since the third lane was just added...although I do admit that there are much more serious traffic concerns in the area to focus our resources on. &lt;br /&gt;&lt;br /&gt;It would be nice to know that those that plan road improvements take a look at this type of data to prioritize their efforts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-8291379206950424162?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/8291379206950424162/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=8291379206950424162" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/8291379206950424162?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/8291379206950424162?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/BXriVEvF5js/google-maps-update.html" title="Google Maps update" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/04/google-maps-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIEQH07fyp7ImA9WxRaEE4.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-892337348663160870</id><published>2008-04-02T19:56:00.000-07:00</published><updated>2008-12-11T14:28:21.307-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-11T14:28:21.307-08:00</app:edited><title>Calendar sync bliss (finally)</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/__qN00uIxfHI/R_RHowcMlKI/AAAAAAAAAG4/Ur724udiHQM/s1600-h/Calendar+sync.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/__qN00uIxfHI/R_RHowcMlKI/AAAAAAAAAG4/Ur724udiHQM/s400/Calendar+sync.png" alt="" id="BLOGGER_PHOTO_ID_5184847836533789858" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Finally, a calendar sync solution that works.  After my experiment with &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.daveswebsite.com%2Fsoftware%2Fgsync%2F&amp;amp;ei=z-f0R6zgNoiYoQS90ZC_DQ&amp;amp;usg=AFQjCNH3xj_OGBn4h2o4CMxFzTU8Px_TKQ&amp;amp;sig2=lSOehs0id7vBbq2inRdnNQ"&gt;gSyncIT&lt;/a&gt;, I just couldn't quite get past some of its limitations.  Once multiple calendars get involved, things get a bit ugly.&lt;br /&gt;&lt;br /&gt;A coworker recommended &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.syncmycal.com%2F&amp;amp;ei=Ruj0R7T5EYiYoQSX0Yy_DQ&amp;amp;usg=AFQjCNEmiPLtCDyy3CMY1BHS0iRFzi2pGQ&amp;amp;sig2=jmJ4PsN07peTa6JE9sSXVw"&gt;SyncMyCal&lt;/a&gt; as a way past those issues, and I'm pretty happy.  You'll see my calendaring setup to the right. &lt;br /&gt;&lt;br /&gt;Google Calendar is pretty much my primary calendar, and I have several calendars loaded.  Some calendars, like US, UK, Indian Holidays and the Winterhawks game schedule are information only.  However, I have my own calendar, a family calendar for events the whole family is attending, and two TripIt calendars (one for my wife, one for me) that do a great job representing any travel I'm doing. &lt;br /&gt;&lt;br /&gt;I'd like to make sure that these calendars are available (at least in free/busy form) to other Exchange users at work, and that the calendars get posted to my cell phone using Windows Mobile.  The Outlook 2007 Internet Calendars feature doesn't allow this, so I needed a solution that would allow my Google calendars to merge into my single Outlook calendar.  I was also looking for my work calendar to post out to Google so I could have visibility there as well.&lt;br /&gt;&lt;br /&gt;SyncMyCal had the answer through the use of category synchronization.  Each Google calendar has their events assigned to a specific category, and only those events are sync'd with that calendar.  Anything not assigned to a category (work stuff) gets sync'd to Google under a new "Work" calendar.  I didn't need full synchronization here, but it's nice to know I have it if I need it.&lt;br /&gt;&lt;br /&gt;What's missing?  I can't find a way to have SyncMyCal make all Google-sourced events private on the Outlook side (although it does sync the private flag).  I have to remember to mark anything truly private as such.  Not a big deal, but it's worth mentioning.&lt;br /&gt;&lt;br /&gt;There is definitely whitespace for an entrepreneur to simplify calendaring...I can't believe that my needs are *THAT* special...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-892337348663160870?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/892337348663160870/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=892337348663160870" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/892337348663160870?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/892337348663160870?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/EiAFvjG7xcg/calendar-sync-bliss-finally.html" title="Calendar sync bliss (finally)" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/__qN00uIxfHI/R_RHowcMlKI/AAAAAAAAAG4/Ur724udiHQM/s72-c/Calendar+sync.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/04/calendar-sync-bliss-finally.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQEQHgzfSp7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-890557513805546836</id><published>2008-04-01T08:28:00.000-07:00</published><updated>2009-07-07T13:58:21.685-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T13:58:21.685-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>C# Covariant Generics</title><content type="html">Sorry for the highly technical posts...lighter stuff to come!&lt;br /&gt;&lt;br /&gt;This has really been bugging me on my current project.  In an object oriented system, if one class inherits from another (e.g. "Cat" inherits from "Animal"), and a method expects to receive the base class as a parameter, it is safe to send in a subtype.  In my example, a method operating on "Animal" can take "Cat" safely.  This is sometimes called "downcasting".&lt;br /&gt;&lt;br /&gt;This behavior should extend to generic types.  Again, in my example, if a method expects a List of Animals, I should be able to pass in a List of Cats.  However, C# does not allow this behavior (but the CLR does).  Bah!&lt;br /&gt;&lt;br /&gt;Here is some more background I've dug up on the issue: &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://research.microsoft.com/research/pubs/view.aspx?type=inproceedings&amp;amp;id=1215"&gt;MS Research article&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/browse_thread/thread/b47879b2fecdf61a"&gt;Google Groups discussion&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/6692354-890557513805546836?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/890557513805546836/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=890557513805546836" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/890557513805546836?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/890557513805546836?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/ipEfyQ9hj5o/c-covariant-generics.html" title="C# Covariant Generics" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/04/c-covariant-generics.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQHQnY9fip7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-6654421483382673867</id><published>2008-03-27T08:47:00.001-07:00</published><updated>2009-07-07T13:58:53.866-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T13:58:53.866-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Yet more SQL 2005 fun: Developing search procs</title><content type="html">A common pattern in applications is to have a search stored procedure work as the backend for a search screen.  If a term has not been passed by the user, the intent is that there is no filter on the results for that parameter.  Here's a &lt;a href="http://www.sommarskog.se/dyn-search.html"&gt;great article&lt;/a&gt; discussing the ways that this can be acheived.  I'm a personal fan of the COALESCE statement talked about in the &lt;a href="http://www.sommarskog.se/dyn-search.html#static"&gt;static &lt;/a&gt;discussion.&lt;br /&gt;&lt;br /&gt;One area that was not discussed in the article was the idea of having similar functionality with a list of filters (e.g. filter to these specific books in the library).  I found a &lt;a href="http://weblogs.asp.net/jgalloway/archive/2007/02/16/passing-lists-to-sql-server-2005-with-xml-parameters.aspx"&gt;pretty good article&lt;/a&gt; talking about SQL 2005's use of Xml parameters to do this - Xml's main benefit being that it's more designed for this use case than a delimited string.  However, the same problem now applies...what if I either have a list of books, or don't pass anything, meaning I want to search across all books?&lt;br /&gt;&lt;br /&gt;My solution was to grab all the data from the reference table and build my own Xml string.  Then I could use it in the main select statement:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;IF &lt;/span&gt;@param&lt;span style="color: rgb(102, 102, 102);"&gt; is null  &lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(51, 51, 255);"&gt;SET &lt;/span&gt;@param =&lt;br /&gt;    (&lt;span style="color: rgb(51, 51, 255);"&gt;SELECT &lt;/span&gt;1 &lt;span style="color: rgb(51, 51, 255);"&gt;AS &lt;/span&gt;Tag,0 &lt;span style="color: rgb(51, 51, 255);"&gt;AS &lt;/span&gt;Parent,MyElementName &lt;span style="color: rgb(51, 51, 255);"&gt;AS &lt;/span&gt;[Root!1!string!element]&lt;br /&gt;     &lt;span style="color: rgb(51, 51, 255);"&gt;FROM &lt;/span&gt;sourcetable &lt;span style="color: rgb(51, 51, 255);"&gt;FOR XML EXPLICIT&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;SELECT&lt;/span&gt;...&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;WHERE&lt;/span&gt;...&lt;br /&gt;...&lt;span style="color: rgb(51, 51, 255);"&gt;AND &lt;/span&gt;&lt;br /&gt;FieldName &lt;span style="color: rgb(51, 51, 255);"&gt;IN &lt;/span&gt;&lt;br /&gt;        (&lt;span style="color: rgb(51, 51, 255);"&gt;SELECT &lt;/span&gt;Field.value(&lt;span style="color: rgb(255, 0, 0);"&gt;'.'&lt;/span&gt;,&lt;span style="color: rgb(255, 0, 0);"&gt;'VARCHAR(max)'&lt;/span&gt;) FinalName&lt;br /&gt;        &lt;span style="color: rgb(51, 51, 255);"&gt;FROM &lt;/span&gt;@param.nodes(&lt;span style="color: rgb(255, 0, 0);"&gt;'//string'&lt;/span&gt;) &lt;span style="color: rgb(51, 51, 255);"&gt;AS &lt;/span&gt;Table(Field)) &lt;br /&gt;&lt;br /&gt;I'm sure this wouldn't perform well with large tables, but my reference tables are fairly small (&lt;100 rows each), and it works great.&lt;br /&gt;&lt;br /&gt;FYI: Here is an example COALESCE statement for the standard filters:&lt;br /&gt;&lt;br /&gt;table            &lt;span style="color: rgb(102, 102, 102);"&gt;LIKE &lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;'%'&lt;/span&gt; + &lt;span style="color: rgb(153, 51, 153);"&gt;COALESCE&lt;/span&gt;(@Name,      fac.FacilityName           ) + &lt;span style="color: rgb(255, 0, 0);"&gt;'%'&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-6654421483382673867?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/6654421483382673867/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=6654421483382673867" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/6654421483382673867?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/6654421483382673867?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/Dd4AsN4FtDM/yet-more-sql-2005-fun-developing-search.html" title="Yet more SQL 2005 fun: Developing search procs" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/03/yet-more-sql-2005-fun-developing-search.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQHQnY9fyp7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-4971957042425078858</id><published>2008-03-27T08:24:00.000-07:00</published><updated>2009-07-07T13:58:53.867-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T13:58:53.867-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>More SQL 2005: SqlDependency update</title><content type="html">While SQL Server data update notifications through the SqlDependency object seemed like a great idea, I now believe the architecture is fundamentally flawed...I'm looking forward to changes in this area to make the feature more robust in the next release(s) of SQL Server and/or the .NET Framework.  Here are some of the problems I've run into:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/database/SqlDependencyPermissions.aspx"&gt;Massive amounts&lt;/a&gt; of &lt;a href="http://emilsblog.lerch.org/2008/03/database-permissions-for-sqldependency.html"&gt;required permissions&lt;/a&gt; in the default run mode&lt;/li&gt;&lt;li&gt;Query types available are &lt;a href="http://msdn2.microsoft.com/en-us/library/aewzkxxh.aspx"&gt;incredibly restrictive&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/remusrusanu/archive/2007/10/12/when-it-rains-it-pours.aspx"&gt;Ineffective tear down of resources&lt;/a&gt;, again, in default run mode, with no programatic workaround.  (The worst part?  The problem is actually most acute while doing active development...)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/remusrusanu/archive/2007/10/12/when-it-rains-it-pours.aspx"&gt;Severe ramifications&lt;/a&gt; for any issue, whether caused by environment or poor coding&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Complex (and maybe unusable) &lt;a href="http://www.sqlskills.com/blogs/bobb/2006/06/28/PreprovisioningAndSqlDependency.aspx"&gt;setup for custom service/queue implementation&lt;/a&gt; to alleviate the first two issues.  I never really even figured out that setup when operating in a non-default schema in a restricted permission environment.&lt;/li&gt;&lt;/ul&gt;This feature is a great concept, but with an implementation that severely limits its use.  My recommendation is to avoid this functionality in nearly all cases.  In my current project, I've moved to a custom cache implementation that checks last modified date across all all lookup tables and clears the cache of all out of date lists.  If something happens in between checks, we'll just have to deal with that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-4971957042425078858?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/4971957042425078858/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=4971957042425078858" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/4971957042425078858?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/4971957042425078858?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/MZFIPsdlidQ/more-sql-2005-sqldependency-update.html" title="More SQL 2005: SqlDependency update" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/03/more-sql-2005-sqldependency-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQHQnY9fyp7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-5007173450193024803</id><published>2008-03-20T08:35:00.000-07:00</published><updated>2009-07-07T13:58:53.867-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T13:58:53.867-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SQL" /><title>Database permissions for SQLDependency</title><content type="html">While I like the idea of &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=2&amp;amp;url=http%3A%2F%2Fmsdn2.microsoft.com%2Fen-us%2Flibrary%2Fms130764.aspx&amp;amp;ei=E4XiR9XkL4rAgwPD0fXLAQ&amp;amp;usg=AFQjCNFVAgsQ5pURZzpx_aiqE163Seci0w&amp;amp;sig2=QJL4QWmeS-YWhunMenehfw"&gt;SQL 2005 Query notifications&lt;/a&gt;, the setup restrictions and instructions are fairly opaque.  Blah!  I did manage to get it working after noting all the &lt;a href="http://msdn2.microsoft.com/en-us/library/aewzkxxh.aspx"&gt;restrictions on the query&lt;/a&gt; in this MSDN article, but then I made the mistake of removing dbo permissions from the user, and was thrown into the mix again for another hour of churning. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.msdn.com/dataaccess/archive/2005/09/27/474447.aspx"&gt;This blog post&lt;/a&gt; was pretty useful, but didn't go quite all the way.  Later, I found &lt;a href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=533779&amp;amp;SiteID=1"&gt;a post describing more details&lt;/a&gt; after some searching, and came up with this set of grant statements to make it work:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;GRANT ALTER ON SCHEMA :: [schemaname] TO [Role]&lt;/li&gt;&lt;li&gt;GRANT CREATE PROCEDURE TO [Role]&lt;/li&gt;&lt;li&gt;GRANT CREATE QUEUE TO [Role]&lt;/li&gt;&lt;li&gt;GRANT CREATE SERVICE TO [Role]&lt;/li&gt;&lt;li&gt;GRANT REFERENCES on CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] to [Role]&lt;/li&gt;&lt;li&gt;GRANT VIEW DEFINITION TO [Role]&lt;/li&gt;&lt;li&gt;GRANT SELECT to [Role]&lt;/li&gt;&lt;li&gt;GRANT SUBSCRIBE QUERY NOTIFICATIONS TO [Role]&lt;/li&gt;&lt;li&gt;GRANT RECEIVE ON QueryNotificationErrorsQueue TO [Role]&lt;/li&gt;&lt;li&gt;GRANT IMPERSONATE ON USER::DBO TO [Role]&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/6692354-5007173450193024803?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/5007173450193024803/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=5007173450193024803" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/5007173450193024803?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/5007173450193024803?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/3mYSkrh-YW8/database-permissions-for-sqldependency.html" title="Database permissions for SQLDependency" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/03/database-permissions-for-sqldependency.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYHRXY6fSp7ImA9WxZWGEs.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-8201651742541981694</id><published>2008-03-18T08:20:00.000-07:00</published><updated>2008-03-18T10:42:14.815-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-18T10:42:14.815-07:00</app:edited><title>Windsor Solutions</title><content type="html">After 7 years at &lt;a href="http://www.intel.com"&gt;Intel&lt;/a&gt;, I've have now joined &lt;a href="http://www.windsorsolutions.com"&gt;Windsor Solutions&lt;/a&gt;, a 35 employee company focused on systems to manage environmental reporting and compliance at various state and local governments.  It's energizing to be part of such a vibrant, growing organization, with the ability to wear many hats!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-8201651742541981694?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/8201651742541981694/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=8201651742541981694" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/8201651742541981694?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/8201651742541981694?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/xS46iilc8qQ/windsor-solutions.html" title="Windsor Solutions" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/03/windsor-solutions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEANSXo5fip7ImA9WxZWE04.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-1664184906816868743</id><published>2008-03-12T08:21:00.000-07:00</published><updated>2008-03-12T07:39:58.426-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-12T07:39:58.426-07:00</app:edited><title>Javascript/PHP annoyances</title><content type="html">I ran across a problem the other day in a PHP script, where a variable wasn't getting populated.  It turned out that I misspelled the variable name - clearly my fault.  However, it got me thinking about the language itself, and how it is actually somewhat hypocriful.  On one hand, PHP (and Javascript for that matter), is relaxed when it comes to variables.  There is no strong typing, and in PHP, you don't even need to declare a variable before using it.  On the other hand, both languages are type sensitive. &lt;br /&gt;&lt;br /&gt;It seems to me that if you're going to have a laid back policy in regards to variable naming, you should also be laid back when it comes to case.  Being case sensitive with weak controls on variable definition doesn't make sense.  It's the computer science equivelent of mixing first and third person.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-1664184906816868743?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/1664184906816868743/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=1664184906816868743" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/1664184906816868743?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/1664184906816868743?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/zGVXFu8tSoA/javascriptphp-annoyances.html" title="Javascript/PHP annoyances" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/03/javascriptphp-annoyances.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIMSX8_cCp7ImA9WxZXGUw.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-7675144026733587117</id><published>2008-03-07T11:15:00.000-08:00</published><updated>2008-03-07T11:19:48.148-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-03-07T11:19:48.148-08:00</app:edited><title>Add-in manager not disabling add-ins in Visual Studio?</title><content type="html">I stumbled across this problem today, and found an interesting feedback page to Microsoft regarding the issue:  &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105560"&gt;http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=105560&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Workaround:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Regedit: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\AddIns&lt;/li&gt;&lt;li&gt;Go into the add-in key you're interested in disabling&lt;/li&gt;&lt;li&gt;Manually set the LoadBehavior entry to 0x0&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/6692354-7675144026733587117?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/7675144026733587117/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=7675144026733587117" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/7675144026733587117?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/7675144026733587117?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/1ezv2D3vL8w/add-in-manager-not-disabling-add-ins-in.html" title="Add-in manager not disabling add-ins in Visual Studio?" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/03/add-in-manager-not-disabling-add-ins-in.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMHQng8cSp7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-6333509837486071652</id><published>2008-03-06T10:06:00.000-08:00</published><updated>2009-07-07T14:00:33.679-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T14:00:33.679-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><title>Google Calendar Sync</title><content type="html">Looks like Google just released a &lt;a href="http://www.google.com/support/calendar/bin/answer.py?answer=89955"&gt;tool to synchronize Google Calendars with Outlook&lt;/a&gt;.  Woo hoo!  Unfortunately, it will only sync with your primary calendar, so in the meantime, I'm still using &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=1&amp;amp;url=http%3A%2F%2Fwww.daveswebsite.com%2Fsoftware%2Fgsync%2F&amp;amp;ei=MjjQR6b2N4KigQPF2sH6Ag&amp;amp;usg=AFQjCNH3xj_OGBn4h2o4CMxFzTU8Px_TKQ&amp;amp;sig2=FZhFdIeiEzAExQfTmEUZsg"&gt;gsyncit&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-6333509837486071652?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/6333509837486071652/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=6333509837486071652" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/6333509837486071652?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/6333509837486071652?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/1zE0vfwK1k4/google-calendar-sync.html" title="Google Calendar Sync" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/03/google-calendar-sync.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMHQng8cSp7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-6614815401014506946</id><published>2008-03-05T07:28:00.000-08:00</published><updated>2009-07-07T14:00:33.679-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T14:00:33.679-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><title>Tip of the day using 7-Zip</title><content type="html">I just stumbled across some interesting behavior in 7-Zip.  Not sure why this is how it works, but if you drag and drop a file from 7-Zip into a directory to extract, the extract will first go to the temporary directory and then be copied over into the destination file.  If you click the "Extract" button and select the directory, the file is extracted directly in the destination directory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-6614815401014506946?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/6614815401014506946/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=6614815401014506946" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/6614815401014506946?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/6614815401014506946?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/ZaSyOs2qxaQ/tip-of-day-using-7-zip.html" title="Tip of the day using 7-Zip" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/03/tip-of-day-using-7-zip.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMHQngzeCp7ImA9WxJUEE0.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-3040143751705879369</id><published>2008-03-04T08:09:00.000-08:00</published><updated>2009-07-07T14:00:33.680-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-07T14:00:33.680-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><title>Uniball 207</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__qN00uIxfHI/R81146dxGnI/AAAAAAAAAGw/CQGwwKB_jWg/s1600-h/Uniball207.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/__qN00uIxfHI/R81146dxGnI/AAAAAAAAAGw/CQGwwKB_jWg/s400/Uniball207.jpg" alt="" id="BLOGGER_PHOTO_ID_5173921167545801330" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I had a little pen issue - a few of my good pens were wearing out.  Bad pens kind of bother me.  I'm too cheap to spend a lot of money on pens.  I did a quick search on the Internet, came across &lt;a href="http://www.google.com/url?sa=t&amp;amp;ct=res&amp;amp;cd=2&amp;amp;url=http%3A%2F%2Fwww.moleskinerie.com%2F2006%2F06%2Fpen_review_unib.html&amp;amp;ei=Y3TNR_mlLIqmpASn4Jz6Dw&amp;amp;usg=AFQjCNGpdn4gtLXgHNFFafCf2HdYWA88vA&amp;amp;sig2=WYOUzwwaUAwsN5nS-GyTsQ"&gt;this review&lt;/a&gt;, and was sold.  Costco carries a &lt;a href="http://www.costco.com/Browse/Productgroup.aspx?Prodid=11275103&amp;amp;search=207&amp;amp;Mo=2&amp;amp;cm_re=1_en-_-Top_Left_Nav-_-Top_search&amp;amp;lang=en-US&amp;amp;Nr=P_CatalogName:BC&amp;amp;Sp=S&amp;amp;N=5000043&amp;amp;whse=BC&amp;amp;Dx=mode+matchallpartial&amp;amp;Ntk=Text_Search&amp;amp;Dr=P_CatalogName:BC&amp;amp;Ne=4000000&amp;amp;D=207&amp;amp;Ntt=207&amp;amp;No=0&amp;amp;Ntx=mode+matchallpartial&amp;amp;Nty=1&amp;amp;topnav=&amp;amp;s=1"&gt;pack of 12 for $15.68&lt;/a&gt; online (I thought they were 11.59 in the store, though).  Done deal - after about a month, I'm still &lt;span style="font-weight: bold;"&gt;very&lt;/span&gt; happy with the choice.&lt;br /&gt;&lt;br /&gt;(Note:  I do not participate in paid review stuff...my opinions are 100% uninfluenced).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-3040143751705879369?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/3040143751705879369/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=3040143751705879369" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/3040143751705879369?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/3040143751705879369?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/B64FixPp80k/uniball-207.html" title="Uniball 207" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/__qN00uIxfHI/R81146dxGnI/AAAAAAAAAGw/CQGwwKB_jWg/s72-c/Uniball207.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/03/uniball-207.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A04GSXc6eyp7ImA9WxZXE08.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-5636925527850814222</id><published>2008-02-29T15:59:00.001-08:00</published><updated>2008-02-29T16:05:28.913-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-02-29T16:05:28.913-08:00</app:edited><title>...And, we're back!</title><content type="html">What a crazy few months - more on that later.  Just wanted to mention that I do intend to pick up the blog again (roughly daily as I did last year).  Future topics:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Work-related stuff&lt;/li&gt;&lt;li&gt;Javascript/PHP hypocrisy&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Consumer electronics (FIOS TV service, Logitech MX 5000 for BT, Jabra BT8010, etc.)&lt;/li&gt;&lt;li&gt;Work done to the house&lt;/li&gt;&lt;li&gt;Other stuff on my mind that no one probably cares about&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Also wanted to quickly mention a big CONGRATULATIONS to Doug and Lisa Downey on the birth of their daughter Greta Marie!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-5636925527850814222?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/5636925527850814222/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=5636925527850814222" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/5636925527850814222?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/5636925527850814222?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/U-IMdYO0j6s/and-were-back.html" title="...And, we're back!" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2008/02/and-were-back.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAGQHc8fCp7ImA9WB5bFE8.&quot;"><id>tag:blogger.com,1999:blog-6692354.post-5011909956015579765</id><published>2007-08-29T15:42:00.001-07:00</published><updated>2007-08-29T15:48:41.974-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2007-08-29T15:48:41.974-07:00</app:edited><title>Standards...or lack thereof</title><content type="html">I was just typing up an email, and noticed that I looked down at the keyboard to find the delete key.  I asked myself why, and then looked at the keyboards around me.  Home, End, Delete, Insert, page up and page down are all grouped together, but on every keyboard I use, they're in a different configuration.&lt;br /&gt;&lt;br /&gt;My Dell keyboard at work is:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;Home       PgUp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;End    PgDn&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Delete   Insert&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;My Thinkpad:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;Insert Home PgUp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Delete End   PgDwn&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;My &lt;a href="http://www.logitech.com/index.cfm/keyboards/keyboard_mice_combos/devices/140&amp;cl=us,en"&gt;new keyboard&lt;/a&gt; at home:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-family: courier new;"&gt;Home     End&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Insert PgUp&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;Delete PgDwn&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;All three configurations make sense (especially the Thinkpad, which has an additional complexity of space issues), but it seems that at least on the desktop, there should be a standard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6692354-5011909956015579765?l=emilsblog.lerch.org' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://emilsblog.lerch.org/feeds/5011909956015579765/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6692354&amp;postID=5011909956015579765" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/5011909956015579765?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6692354/posts/default/5011909956015579765?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/emillerch/~3/NtR8xK440pI/standardsor-lack-thereof.html" title="Standards...or lack thereof" /><author><name>Emil</name><uri>http://www.blogger.com/profile/01757041603259708109</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="04331911129376220709" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://emilsblog.lerch.org/2007/08/standardsor-lack-thereof.html</feedburner:origLink></entry></feed>
