<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="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:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-947968907697915479</atom:id><lastBuildDate>Wed, 08 Feb 2012 23:10:54 +0000</lastBuildDate><category>Visual Studio</category><category>User Interface</category><category>Usability</category><category>Microsoft</category><category>Architecture</category><category>SQL Server</category><category>AJAX</category><category>Consulting</category><category>Misc</category><category>Windows</category><category>JC PM</category><category>Oracle</category><category>Interface</category><category>Codeplex</category><category>Dynamics SL</category><category>Web</category><category>Testing</category><category>C++</category><category>Dell</category><category>DRM</category><category>Software</category><category>server 2008</category><category>Link</category><category>LINQ-to-SQL</category><category>Documentation</category><category>strings</category><category>Android</category><category>hardware</category><category>Patent</category><category>Coding</category><category>LINQ</category><category>query builder</category><category>CSS</category><category>programming</category><category>Design</category><category>XML</category><category>IIS</category><category>Google</category><category>Requirements</category><category>C#</category><category>eComic</category><category>RDLC</category><category>WebOS</category><category>PC/SC</category><category>HTML</category><category>Outlook 2007</category><category>VB.Net</category><category>Solomon</category><category>ASP.Net</category><category>JavaScript</category><category>WPF</category><category>CMMI</category><category>.NET</category><category>Silverlight</category><category>terminal server</category><title>A Programmer's Dream</title><description>Yet more Geek ruminations to clutter up the internets.</description><link>http://programmer.wrighton.org/</link><managingEditor>noreply@blogger.com (Stephen Wrighton)</managingEditor><generator>Blogger</generator><openSearch:totalResults>196</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/rss+xml" href="http://feeds.feedburner.com/AProgrammersDream" /><feedburner:info uri="aprogrammersdream" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>AProgrammersDream</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-5236816883294661850</guid><pubDate>Tue, 01 Nov 2011 03:09:00 +0000</pubDate><atom:updated>2011-10-31T22:09:00.548-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">eComic</category><title>eComic 2012</title><description>Well, I'm in the process of ripping apart eComic and rebuilding it from scratch.&lt;br /&gt;
&lt;br /&gt;
The two biggest aspects that will be changed (from the user's POV) are the inclusion of comic properties and library functions.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-hewI6oxdiXk/Tq7GDlWU-nI/AAAAAAAABEk/qGOjr02j3II/s1600/currentStartecom.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="317" src="http://1.bp.blogspot.com/-hewI6oxdiXk/Tq7GDlWU-nI/AAAAAAAABEk/qGOjr02j3II/s320/currentStartecom.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;eComic 2012&lt;/td&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Well, not so much library functions as card catalog functions. Additionally, I'm modifying the UI to allow multiple tabs of comics being open (again--I keep going back and forth on this), and structuring it around a UI layout which I'm highly familiar with: Visual Studio.&lt;br /&gt;
&lt;br /&gt;
As you can see from the image to the right there, it contains the tabbed interface, plus allows for the LIBRARY to reside in an tab all its own, as well as the PROPERTIES element to be always available.&lt;br /&gt;
 &lt;br /&gt;
I'm also keeping the ribbon menu, as I really like Ribbon menus. I'm trying to decide if I want to continue using the circle style application menu (as it exists in the previous version), or go with the square one as shown in the image.&amp;nbsp; I'm not going to lie, I made the icon with the thought that it would fit within the circle-style application menu.&lt;br /&gt;
&lt;br /&gt;
The first aspect of a LIBRARY system that I implemented is the FAVORITES screen. This will also be the start-up screen when a user comes into the application. Each favorite is click-able, and when clicked loads the associated comic into the reader.&lt;br /&gt;
&lt;br /&gt;
The FAVORITES screen will also be the basis for the lists screen (and search results screen) once I get all the library tools built. &lt;br /&gt;
&lt;br /&gt;
I also made the system much more MVVM friendly.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
In the previous version, MVVM was there, but there was still a lot of manual control of the displayed page. Basically, the Reader control was responsible for both loading the pages into the ComicBook class, and controlling which page was selected at any given moment.&lt;br /&gt;
&lt;br /&gt;
I've now made that all controlled via the ComicBook class via Databinding to the relevant list controls.&amp;nbsp; Sure, I can manually modify that with a next/previous and Go To functions, but the primary navigation is now controlled entirely via binding processes. &lt;br /&gt;
&lt;br /&gt;
My next steps are to get the LIBRARY working, and to determine if I want this system to watch files, or if I want it to just control the files that are associated with it. There's pros/cons associated with both paradigms, and I'm not sure which is best.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Sadly, I fear I may have to install iTunes and waltz through it, and figure out what it's doing with its media functionality. &lt;br /&gt;
&lt;br /&gt;
The Kindle software makes more sense (everything's in its folders) but it also has the benefit of being the front-end of a store. The primary way you get content into Kindle is by purchase via KindleStore, and that's just not the case for my software; as the primary way you'd get content for eComic is to either a) download it, or b) media shift the comics that you've purchased. &lt;br /&gt;
&lt;br /&gt;
Additionally, the Zune library works this way, by creating folders and what not on an as-needed basis in a way that makes sense to the software. And that sense tends to be: &lt;root&gt;\&lt;artist&gt;\&lt;album&gt;\&lt;song&gt;.mp3&lt;/song&gt;&lt;/album&gt;&lt;/artist&gt;&lt;/root&gt;&lt;br /&gt;
&lt;br /&gt;
I'm not sure that would work for me, as I have so many fields to consider: Series, Issue Title, Alternate Series Title (i.e. Story Arc Title), Volume, Book Number, Artist, Writer, Publisher and finally Publish Date.&lt;br /&gt;
&lt;br /&gt;
Oh well, I'm sure I'll figure out some sort of solution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-5236816883294661850?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/G0Oha7ERxJ_DphlYU7kwnsC1oRA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G0Oha7ERxJ_DphlYU7kwnsC1oRA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/G0Oha7ERxJ_DphlYU7kwnsC1oRA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/G0Oha7ERxJ_DphlYU7kwnsC1oRA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/PwVZel0s8qY" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/PwVZel0s8qY/ecomic-2012.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-hewI6oxdiXk/Tq7GDlWU-nI/AAAAAAAABEk/qGOjr02j3II/s72-c/currentStartecom.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://programmer.wrighton.org/2011/10/ecomic-2012.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-573252939178539538</guid><pubDate>Mon, 31 Oct 2011 21:43:00 +0000</pubDate><atom:updated>2011-10-31T16:43:49.125-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Software</category><category domain="http://www.blogger.com/atom/ns#">Misc</category><category domain="http://www.blogger.com/atom/ns#">Google</category><category domain="http://www.blogger.com/atom/ns#">User Interface</category><title>The New Google Reader</title><description>I use Google Reader. I've always enjoyed it immensely, and have used it extensively since it was first released.&amp;nbsp; I've tried other RSS Readers, but frankly, none of them offered me the flexibility which Google Reader provided.&lt;br /&gt;
&lt;br /&gt;
Then they added "social" features. Users could "Like" and "Share" RSS items. While I never used the Like feature (and would install a browser add-in which would hide it) I used the Share feature to share links on this blog.&lt;br /&gt;
&lt;br /&gt;
Now, I'm not up in arms about the loss of this feature, though I will miss it. Why I'm posting this, is that I received the updated UI this afternoon, and noticed that in the Tips and tricks, there was a big old article on how to share SHARED items on a blog.&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/-JHZVT_AYQmg/Tq8WYswFhKI/AAAAAAAABEs/GpL94YvYf9Q/s1600/greader.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="262" src="http://2.bp.blogspot.com/-JHZVT_AYQmg/Tq8WYswFhKI/AAAAAAAABEs/GpL94YvYf9Q/s320/greader.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
I mean, talk about rubbing salt into the wound of those 10,000+ users that were begging (and signing petitions) Google to keep that particular feature...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-573252939178539538?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/v8Cm3oLCSTAe1n57aSi3ysYu_90/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v8Cm3oLCSTAe1n57aSi3ysYu_90/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/v8Cm3oLCSTAe1n57aSi3ysYu_90/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v8Cm3oLCSTAe1n57aSi3ysYu_90/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/_DU-8uc43uM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/_DU-8uc43uM/new-google-reader.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-JHZVT_AYQmg/Tq8WYswFhKI/AAAAAAAABEs/GpL94YvYf9Q/s72-c/greader.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2011/10/new-google-reader.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-5285158079039741360</guid><pubDate>Tue, 20 Sep 2011 00:01:00 +0000</pubDate><atom:updated>2011-09-19T19:01:00.180-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Web</category><category domain="http://www.blogger.com/atom/ns#">JavaScript</category><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">VB.Net</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">Coding</category><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Trello Broke My Brain...</title><description>Here's a secret, whenever I stumble across a web application that I think is awesome, I look at its source-code in an attempt to figure out how they're doing it. Quite often, one can find quite a bit of information by looking at various JavaScript elements, not to mention how the various HTML elements are named.&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Xp0BAER4IEw/TneJgCKTtLI/AAAAAAAABEA/mobcMpbT40U/s1600/trello.png" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="142" src="http://4.bp.blogspot.com/-Xp0BAER4IEw/TneJgCKTtLI/AAAAAAAABEA/mobcMpbT40U/s320/trello.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Trello!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
So, of course, when I discovered &lt;a href="http://www.trello.com/"&gt;Trello&lt;/a&gt;, I had to take a gander. And I must say that I do love Trello. It's the first task organizer that I've actually wanted to use, and as one can see, I'm hoping to generate a nice set of tasks for &lt;a href="http://ecomic.codeplex.com/"&gt;eComic&lt;/a&gt; so I can actually keep track of my development efforts there. &lt;br /&gt;
&lt;br /&gt;
At which time, I discovered that Trello doesn't appear to have any of the typical hallmarks by which I would get insights into how things are built.&lt;br /&gt;
&lt;br /&gt;
Case in point, there wasn't really any elements on the page which contained little things like NAMES or IDs.&lt;br /&gt;
&lt;br /&gt;
But, it did provide me the name of a few of the JS libraries that it used. I found the typical JQuery and JQuery UI libraries, and even the somewhat ubiquitous (at least for Frog Creek software products) JSON2 and MARKDOWN libraries. &lt;br /&gt;
&lt;br /&gt;
But there were a few that I had never heard of at all:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;backbone.js&lt;/li&gt;
&lt;li&gt;highcharts.js&lt;/li&gt;
&lt;li&gt;socket.io.js&lt;/li&gt;
&lt;li&gt;underscore.js&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Which is a list which sent me stumbling through the depths of... some developer-appropriate underworld.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.highcharts.com/"&gt;Highcharts.js&lt;/a&gt; was an interesting find, as it's interactive charting object for web projects. But, there's nothing that well, mind-blowing hiding in its background.&lt;br /&gt;
&lt;br /&gt;
That's where those other 3 classes come into play.&amp;nbsp; &lt;a href="http://documentcloud.github.com/underscore/"&gt;Underscore&lt;/a&gt; &amp;amp; &lt;a href="http://documentcloud.github.com/backbone/"&gt;Backbone&lt;/a&gt; work hand-in-hand to provide Model-View-ViewModel and Templating into web projects, while &lt;a href="http://socket.io/"&gt;Socket.Io.js&lt;/a&gt;' whole purpose is for the development of real-time apps.&lt;br /&gt;
&lt;br /&gt;
I read through these elements, and considered how they were integrated in LAMP environments, and then began pondering how I could integrate them into an ASP.Net/IIS world.&lt;br /&gt;
&lt;br /&gt;
What I had, was that I wanted to implement the Model-View-ViewModel scenario, coupled with Real-time collaboration without having the browser POLL for the data changes. Which, let's be honest, is not exactly the most easy thing to do in ASP.Net. &lt;br /&gt;
&lt;br /&gt;
The first thing I went after was the Model-View-ViewModel situation. While reading up on these elements, I discovered the &lt;a href="http://knockoutjs.com/"&gt;KnockOut&lt;/a&gt; library.&amp;nbsp; This looked quite happy, and it was using the JQuery Templating engine, which I had previous experience with. Thus, I ran through its tutorials, and got my code generating templated HTML based upon a view model that had its data loaded by a secondary call to a web service which returns a JSON object.&lt;br /&gt;
&lt;br /&gt;
Well, that had me dancing for a few days, especially after I got things like sorting working the way I would expect for it to on the application.&lt;br /&gt;
&lt;br /&gt;
Which is when I jumped off the deep end.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
The other half of my task was to generate a real-time colloboration system, which basically entails the SQL SERVER having to notify the associated web-pages about changes to the specific set of data that is being displayed on a given web page.&lt;br /&gt;
&lt;br /&gt;
The theory is that if I had two people looking at BOARD A, and three people at BOARD B, whenever BOARD A's data was modified, I wanted those who were looking at BOARD A to be notified (via the data being changed), but NOT those that were looking at BOARD B.&lt;br /&gt;
&lt;br /&gt;
And I was doing this in IIS and .NET without the benefits of NODE.js and Sockets.Io.&amp;nbsp; In a few years, when websockets become more common (sadly, IE9 doesn't even have these things) then the way I did this might change. After all, HTML5 websockets are designed to provide this concept. Sadly, we're not there yet.&lt;br /&gt;
&lt;br /&gt;
But, what we do have ARE &lt;a href="http://msdn.microsoft.com/en-us/library/ms227433%28v=vs.85%29.aspx"&gt;Asynchronous HTTP Handlers&lt;/a&gt;, and the &lt;a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.aspx"&gt;SqlDependency&lt;/a&gt; class.&lt;br /&gt;
&lt;br /&gt;
Basically, what's happening, is that I have an asynchronous web service which I call when I load the page. This web service spawns off a new thread which registers a SqlDependency on the relevant query for a board (and based on last UPDATE time).&amp;nbsp; When the result set for that relevant query changes (i.e. values are MODIFIED!)&amp;nbsp; then it raises an event, which completes the asynchronous call to the handler.&lt;br /&gt;
&lt;br /&gt;
This provides me the ability to have my SQL Server send out notifications to my HTML pages (which are stateless remember!) that its data has changed.&amp;nbsp; Thus, I have the secret to near-real-time collaboration!&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-5285158079039741360?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/hsZaCeSLL5gghilMuPCZShUKKdQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hsZaCeSLL5gghilMuPCZShUKKdQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/hsZaCeSLL5gghilMuPCZShUKKdQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/hsZaCeSLL5gghilMuPCZShUKKdQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/7RV7cAXu_Po" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/7RV7cAXu_Po/trello-broke-my-brain.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-Xp0BAER4IEw/TneJgCKTtLI/AAAAAAAABEA/mobcMpbT40U/s72-c/trello.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2011/09/trello-broke-my-brain.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-4235987789185659705</guid><pubDate>Wed, 31 Aug 2011 22:00:00 +0000</pubDate><atom:updated>2011-08-31T17:00:03.158-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Windows</category><category domain="http://www.blogger.com/atom/ns#">Consulting</category><category domain="http://www.blogger.com/atom/ns#">Software</category><category domain="http://www.blogger.com/atom/ns#">Misc</category><category domain="http://www.blogger.com/atom/ns#">Interface</category><category domain="http://www.blogger.com/atom/ns#">Microsoft</category><category domain="http://www.blogger.com/atom/ns#">Design</category><category domain="http://www.blogger.com/atom/ns#">User Interface</category><title>Win8 Explorer's New UI</title><description>The IT Geek-world is in a something of an uproar over &lt;a href="http://blogs.msdn.com/b/b8/archive/2011/08/29/improvements-in-windows-explorer.aspx"&gt;Microsoft's big reveal on Sunday (8/29) of the improvements that they're baking into Windows 8's Explorer&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Explorer has--at Microsoft's own words--been the foundation of the user experience of the Windows desktop.&amp;nbsp; And likewise, they've gone to considerable lengths to provide the first substantial change to Explorer in years.&amp;nbsp;&amp;nbsp; There's a few... not necessary issues or concerns... but something like that which I, as a technologist, and specifically as a &lt;i&gt;&lt;b&gt;MICROSOFT/WINDOWS&lt;/b&gt;&lt;/i&gt; based technologist, have about not just the new UI, but what this new UI means in terms of the data provided by Microsoft at the linked to post above.&lt;br /&gt;
&lt;br /&gt;
But first, as a Windows 7 user, there is at least one aspect of these UI changes with which I whole-heartedly agree, and that is the return of the UP button. I did not realize just how often I used that simple little command option while performing file-management tasks until it had disappeared. I think that was my biggest stumbling block when switching my OS over to Windows 7.&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/-BBKIuq7a1s8/Tl43rIRXEDI/AAAAAAAABD0/u_4TamDlIVg/s1600/eject.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/-BBKIuq7a1s8/Tl43rIRXEDI/AAAAAAAABD0/u_4TamDlIVg/s1600/eject.png" /&gt;&lt;/a&gt;&lt;/div&gt;
The second thing about Explorer and the Windows-file system that makes me happy is that there will be native support for ISO's in the Explorer. This is good news, especially for folks like me (and my company) who routinely store ISO's on the network for ease of backup and maintenance. &lt;br /&gt;
&lt;br /&gt;
Now, the ribbon menu system itself, I'm less concerned over than most of the other IT blogs out there. I like the ribbon menu, and think it's a great mixture of a traditional menu and command bar that is ultimately more useful for end-users.&lt;br /&gt;
&lt;br /&gt;
But I don't think that's going to be the case here. By Microsoft's own metrics over half of the entry points for Explorer-based commands is the CONTEXT menu (54.5%) with hot keys coming in as second (32.2%). That leaves less than 15% for the command bar and menu bar (and the command bar got 10.9%).&amp;nbsp; What this tells me is that users already aren't using the command bar or the menu.&amp;nbsp; &lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Oddly, Microsoft's reaction to this, is to make it--at least at first glance--more complicated.&lt;br /&gt;
&lt;br /&gt;
&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0iEBmOTqmlw/Tl43OFzDsmI/AAAAAAAABDw/RyilILFT4Jw/s1600/win8ex01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="152" src="http://1.bp.blogspot.com/-0iEBmOTqmlw/Tl43OFzDsmI/AAAAAAAABDw/RyilILFT4Jw/s640/win8ex01.png" width="640" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;Microsoft's Simplifies&amp;nbsp; Explorer&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&amp;nbsp;Luckily, this apparent complication does provide some little pluses. The ribbon provides roughly 200 commands quickly and efficiently to the user. More importantly, the Quick Access Toolbar, allows for customizations for those most important commands.&amp;nbsp; But again, this is odd, since roughly 82% of all commands are as follows:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Paste (~20%)&lt;/li&gt;
&lt;li&gt;Properties (~11%)&lt;/li&gt;
&lt;li&gt;Copy (~11%)&lt;/li&gt;
&lt;li&gt;Delete (~10%)&lt;/li&gt;
&lt;li&gt;Rename (~8%)&lt;/li&gt;
&lt;li&gt;Refresh (~7%)&lt;/li&gt;
&lt;li&gt;Cut (~7%)&lt;/li&gt;
&lt;li&gt;NewMenu (~4%)&lt;/li&gt;
&lt;li&gt;CommandBar (~4%)&lt;/li&gt;
&lt;li&gt;New (~2%)&lt;/li&gt;
&lt;/ul&gt;
When you couple that list with the fact that over half of the commands are accessed via the context menu, I as a technologist is left wondering exactly what's the point.&lt;br /&gt;
&lt;br /&gt;
And the thing is, that this is aimed at the STANDARD USER. This is not aimed at power users, or network admins. In fact, the original blog post describing these changes goes out of the way to indicate as much, by pointing out that the roughly 200 commands found in the ribbon menu will now all support keyboard shortcuts. &lt;br /&gt;
&lt;br /&gt;
Ultimately though, I understand the uproar, while not understanding it. I know from using Office that the Ribbon menu, once users "get" it, is better and more efficient.&amp;nbsp; Additionally, these changes to the ribbon are not aimed at those users who are currently in an uproar.&amp;nbsp; After all, it's going to be the power-users who read up on changes to Windows Explorer months before the associated OS is actually released.&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
The thing is, is that this is a big change. Worse, it's a change which feels like feature creep and/or command bloat.&amp;nbsp; I mean, look at the menu, it's taking up more room, hundreds of commands are now exposed, and it's all shoved into a new interface.&amp;nbsp; This, when MS admits that ~82% of all commands used are the 10 listed above.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Ultimately, I think a lot of the backwash is due to the smooth UI which was the first taste of Windows 8 in the video released a few months ago.&amp;nbsp; Power users and early adopters saw that new desktop experience, and started drooling, ignoring the fact that the desktop has little to nothing to do with the underlying file system or the explorer used to access it.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Could MS have made this "sexier" or "sleeker." Sure. They could have taken Apple's OSX approach, and given dedicated applications to specific types of tasks.&lt;br /&gt;
&lt;br /&gt;
But, I, as a developer, would be pissed at that. I use the file explorer extensively. I have to move artifacts back and forth between servers and even development-sandboxes on my own machine. I rename things. I delete things, I toss them from one folder to another to my desktop.&lt;br /&gt;
&lt;br /&gt;
But that's at work (or while I'm working).&amp;nbsp; At home (or while I'm playing), I rarely, if ever, explore the actual depths of explorer; I'll access a few folders where I have media stored, and access a few applications, most of which are stashed in a DOCK application, and on very rare occasions, I'll move media either to my NAS or burn it to disc (or bring it back over to my machine for consumption).&lt;br /&gt;
&lt;br /&gt;
Truthfully, I think this is something of a non-issue. IMO, it's only causing a row right now because of how it compares to the iPad and other tablet devices when Windows 8's first preview in the wild was based around a tablet interface (and more specifically, the promise which that preview held for tablet interfaces).&lt;br /&gt;
&lt;br /&gt;
Sure, it may mean a bit more training time for new users (some of whom may still be coming from Windows XP). Sure, it may be a bit more confusing those first few weeks after adoption. Sure, it may not be as&amp;nbsp; sleek and stylish as the Mango interface.&lt;br /&gt;
&lt;br /&gt;
But, as long as it does what I need, and stays out of my way while it does it, then I can live with all of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-4235987789185659705?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/PDxO3drVjxz-1PVwEuAyYURScUw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PDxO3drVjxz-1PVwEuAyYURScUw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/PDxO3drVjxz-1PVwEuAyYURScUw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/PDxO3drVjxz-1PVwEuAyYURScUw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/Gy5YlsbfXOo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/Gy5YlsbfXOo/win8-explorers-new-ui.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-BBKIuq7a1s8/Tl43rIRXEDI/AAAAAAAABD0/u_4TamDlIVg/s72-c/eject.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2011/08/win8-explorers-new-ui.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-8261393112643792763</guid><pubDate>Fri, 26 Aug 2011 05:01:00 +0000</pubDate><atom:updated>2011-08-26T00:01:03.269-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Web</category><category domain="http://www.blogger.com/atom/ns#">Architecture</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><category domain="http://www.blogger.com/atom/ns#">Software</category><category domain="http://www.blogger.com/atom/ns#">Misc</category><category domain="http://www.blogger.com/atom/ns#">hardware</category><category domain="http://www.blogger.com/atom/ns#">WebOS</category><title>Hulu on the TouchPad</title><description>&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cXCnhVTg94Q/TlcntkvikYI/AAAAAAAABDk/HT2xkRa-RzA/s1600/HP-touchpad-300x300.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-cXCnhVTg94Q/TlcntkvikYI/AAAAAAAABDk/HT2xkRa-RzA/s1600/HP-touchpad-300x300.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;The tablet PC that &lt;br /&gt;Hulu doesn't like&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
I purchased the TouchPad in its recent fire-sale, and overall, I'm quite happy with the device. I'm still considering placing Android on it once the various hackers out there get the process down to a science, but that's neither here nor there.&lt;br /&gt;
&lt;br /&gt;
My issue that I'm a tad annoyed with is the fact that Hulu refuses to run on this machine. &lt;br /&gt;
&lt;br /&gt;
So, of course, I immediately asked Hulu support why this was, and Hulu's response was:&lt;br /&gt;
&lt;blockquote&gt;
Thanks for writing in about Hulu on the HP TouchPad. Unfortunately, 
due to the contractual agreements with our content providers, we have to
 have a certain set of agreements set up with a device manufacturer 
before we can provide support for that device. We have no partnership 
with HP at this time, so we can't currently stream through their device. &lt;/blockquote&gt;
&lt;blockquote&gt;
We
 get a lot of requests for webOS support, so it's definitely something 
that's on our radar. Though we can't support it right now, we are 
continually evaluating new technologies, and will be adding more devices
 based on user demand. Stay tuned!&lt;br /&gt;&lt;br /&gt;
We have plans to bring Hulu 
Plus to as many devices as possible. For up to date info on which 
devices are currently supported or have been announced, you can go to ( &lt;a href="http://www.hulu.com/plus/devices" target="_blank"&gt;www.hulu.com/plus/devices&lt;/a&gt; ). On this page, you can even sign up to be notified of availability on upcoming devices.&lt;/blockquote&gt;
Which confused me a bit more. After all, a tablet is nothing more but a small-form factor PC. Why does the manufacturer of my PC matter when I try to access a website? It's not like the fact that I'm running a DELL matters when I access Hulu. I mean, does Hulu not work when people build their own gaming rigs? &lt;br /&gt;
 &lt;br /&gt;
So, I of course, pointed this logical fallacy out.&lt;br /&gt;
&lt;br /&gt;
And got this... slightly condescending reply:&lt;br /&gt;
&lt;blockquote&gt;
Thanks for getting back to us. The TouchPad is considered a device 
and as such to play our content on it requires certain licenses and 
approval of the owners of the content on our site. I know it's 
frustrating to have to pay for services you believe should be free. I'd 
love to speak to the issue.&lt;br /&gt;&lt;br /&gt;
When we launched the free Hulu.com 
service, our rights were limited to streaming on the PC. Unfortunately, 
mobile and TV devices were not included in these contracts, and in order
 to add them, we've had to do so under a paid service, Hulu Plus. This 
is for many reasons, including the high price of these types of 
streaming rights and because many shows required they be part of a paid 
service to be on these types of devices.&lt;br /&gt;&lt;br /&gt;
Once again, I'm sorry for the inconvenience. Please let me know if you have any further questions. Happy viewing!&lt;/blockquote&gt;
&lt;br /&gt;
There's two things that really got my goat here.&lt;br /&gt;
&lt;br /&gt;
The first, the implication that a PC is not a PC. I'm a big fan of clarity of thought and word. I know the definition of a PC--it's a rather large part of my job after all.&amp;nbsp; For those of you who are wondering, a PC is a computer designed for use by a single person. I wouldn't expect to be able to stream Hulu to a SERVER since it's designed for use by multiple people, but tablets are designed for use by one person.&lt;br /&gt;
&lt;br /&gt;
&lt;table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: right; margin-left: 1em; text-align: right;"&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-dXHjQgsHOZM/TlcoMI_QqSI/AAAAAAAABDo/-Q4zOKhPgC8/s1600/viliv-s5-mid.jpg" imageanchor="1" style="clear: right; margin-bottom: 1em; margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="188" src="http://3.bp.blogspot.com/-dXHjQgsHOZM/TlcoMI_QqSI/AAAAAAAABDo/-Q4zOKhPgC8/s320/viliv-s5-mid.jpg" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;My &lt;i&gt;OTHER&lt;/i&gt; Tablet that Hulu likes&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
Additionally, I &lt;i&gt;&lt;b&gt;KNOW&lt;/b&gt;&lt;/i&gt; that tablet devices can have Hulu streamed to it. I know this, because I also own a Viliv S5 tablet. And the Viliv device is a smaller form factor (though a thicker, and heavier machine) than the TouchPad. So it's not the size of the device--it's not the fact that it's a tablet that makes a difference to Hulu.&lt;br /&gt;
&lt;br /&gt;
No, it's the operating system. It's the fact that the browser (which runs Flash) on the TouchPad tells Hulu that it's not a &lt;i&gt;Windows &lt;/i&gt;device. In fact, I can prove this by using Fiddler to strip out my user-agent string from my HTTP Headers--let's just say that doing so, makes Hulu not play nice with Windows.&lt;br /&gt;
&lt;br /&gt;
The second is that line about "have to pay for services you believe should be free." That makes a rather large assumption that I'm complaining about the cost of Hulu's services--which is not the case. Additionally, even Hulu's "free" service isn't free. There's commercials attached to the video--which is the traditional way that video services have always been paid for (just sit down in front of your television for proof of this).&lt;br /&gt;
&lt;br /&gt;
And even more important in this regard, is the fact that if I was merely after free content, that can be had. It's &lt;i&gt;easy&lt;/i&gt; to torrent a TV show--and a torrented TV show does not have commercials, and are typically of better quality than the flash-based video which Hulu streams out.&lt;br /&gt;
&lt;br /&gt;
Regardless, this definitely leaves me in a mood to NEVER buy the Hulu service. After all, if they can't stream the standard service to my small form-factor PC which runs a linux-based OS and Flash, then why on earth would I assume that they could stream the HuluPlus version to my small form-factor PC which runs a linux-based OS and Flash?&lt;br /&gt;
&lt;br /&gt;
And of course I asked them... which leaves me wondering if I'll get an answer...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-8261393112643792763?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/6DI1GA4W_5I3fILu_gk2NxU3HiE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6DI1GA4W_5I3fILu_gk2NxU3HiE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/6DI1GA4W_5I3fILu_gk2NxU3HiE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/6DI1GA4W_5I3fILu_gk2NxU3HiE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/GN8A5kDstYI" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/GN8A5kDstYI/hulu-on-touchpad.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-cXCnhVTg94Q/TlcntkvikYI/AAAAAAAABDk/HT2xkRa-RzA/s72-c/HP-touchpad-300x300.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://programmer.wrighton.org/2011/08/hulu-on-touchpad.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-396657938670702516</guid><pubDate>Thu, 25 Aug 2011 22:30:00 +0000</pubDate><atom:updated>2011-08-25T17:30:00.412-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Software</category><category domain="http://www.blogger.com/atom/ns#">SQL Server</category><title>Red Gate's SQL Compare</title><description>I have a new tool in my toolbox of things I get to play--while being paid to do so.&amp;nbsp; This one is the SQL Compare utility from Red Gate.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
This tool is designed to allow a user to compare--and update-- the schema's between two disparate databases.&lt;br /&gt;
&lt;br /&gt;
Which all I can say in regards to this is a hearty YAY!&lt;br /&gt;
&lt;br /&gt;
After all, consider the project upon which I'm currently working, which is our CloudBuster Web Framework system. This project is basically the love-child between a standard .NET CRM utility and SharePoint.&amp;nbsp;&amp;nbsp; It's a massive undertaking in Visual Studio, with roughly 20 discrete projects hiding within it, all as optimized for genericacy and ease of updating and extending as I can make them.&lt;br /&gt;
&lt;br /&gt;
Anyways, we have roughly 25 clients on this framework so far. Some using it as internal intranets (the Sharepoint market space) and others using it as a CRM tool (the DotNetNuke/Joomla market space).&lt;br /&gt;
&lt;br /&gt;
And this is while I'm performing active maintenance and development making the system better and more robust, and have more functions and all that sort of good jazz.&lt;br /&gt;
&lt;br /&gt;
But, the point here is that that's roughly 25 databases that need to be synchronized every time I make a change to my development database or add in a new functionality.&amp;nbsp; And while the code base works fine for either database, it's a matter of allowing new functionality, even as older code gets refactored into newer and better paradigms that drive this need to occasionally synchronize database schemas.&amp;nbsp; Previously, this involved scripting out all the changes I could find between my development database and one of the in-production ones, and then running that script against every database, praying that a) I caught all the changes and b) none of these missing changes were breaking.&amp;nbsp; This meant visually comparing every database structure in every client database.&amp;nbsp; A process that took roughly 6 hours when I had to perform it against 15 databases back in May.&lt;br /&gt;
&lt;br /&gt;
Well, I got SQL Compare, and was able to run it against all 25 databases over the course of 2 hours.&amp;nbsp; Two hours which included time to run backups of every database, as well as checking each client's application both before and after the update.&lt;br /&gt;
&lt;br /&gt;
Fun, fun fun! &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-396657938670702516?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/j7hm6Slyyl2zo6QEJXYALu9yscM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j7hm6Slyyl2zo6QEJXYALu9yscM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/j7hm6Slyyl2zo6QEJXYALu9yscM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/j7hm6Slyyl2zo6QEJXYALu9yscM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/mgqNT5zOHE0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/mgqNT5zOHE0/red-gates-sql-compare.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2011/08/red-gates-sql-compare.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-569795071768610390</guid><pubDate>Fri, 19 Aug 2011 01:33:00 +0000</pubDate><atom:updated>2011-08-19T08:34:56.737-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">LINQ-to-SQL</category><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">SQL Server</category><category domain="http://www.blogger.com/atom/ns#">LINQ</category><title>Row Not Found...</title><description>We (as in the company I work for) have a product which we've named Bounce. Bounce is, as one might guess from the name, a product which reboots servers. It's a solution-in-a-box type thing, that comes in a 1u chassis for server racks. &lt;br /&gt;
&lt;br /&gt;
This product is actual in production at a number of sites, including ours. Additionally, our site is the most complex of the various configurations out there, just because we have a couple of different production networks, our corporate networks, and a "development" network where those servers that use developers torture reside.&lt;br /&gt;
&lt;br /&gt;
Regardless, there was a bug in Bounce, where it would randomly report a failure in one of the servers. Well, this little bug had been bothering the Network guys for a bit, and they finally brought it to my attention as well as the boss' attention--which resulted in some time scheduled to work on the issues, as well as add a few additional enhancements that had been hanging out on the drawing board for a while.&lt;br /&gt;
&lt;br /&gt;
So, I started work, and tested the bounce group that the issue usually popped up in, and found, absolutely nothing.&amp;nbsp; Everything worked perfectly.&lt;br /&gt;
&lt;br /&gt;
So, I chalked it up to gremlins, and implemented the system additions.&lt;br /&gt;
&lt;br /&gt;
Well, I was doing some final system tests, when, lo and behold, the issue cropped up. I opened up the event log, and saw it somewhat flooded with the same message over, and over again, the only difference between those messages were the fact that it was being generated for every server configured in the system.&lt;br /&gt;
&lt;br /&gt;
That error message read: &lt;i&gt;&lt;b&gt;r&lt;/b&gt;&lt;b&gt;ow could not be found or updated.&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Talk about useful.&lt;br /&gt;
&lt;br /&gt;
So, I went to Google, and found some discussions that blamed one of two things:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Concurrency issues generated by the "no count" flag being set on the SQL Server's default connection options&lt;/li&gt;
&lt;li&gt;A difference between the DBML definition of the table, and the actual underlying table&lt;/li&gt;
&lt;/ol&gt;
So, I checked both issues. I mean it's only a matter of moments to open up SQL Management Studio and ensure that no count wasn't checked, and only a bit harder to just flat out delete all the tables and views on the DBML and re-drag them into the designer.&amp;nbsp; Sadly, neither solution worked.&lt;br /&gt;
&lt;br /&gt;
Since I was certain that the DBML looked just like the underlying tables (having just dragged them over) I looked more closely into the concurrency issues that folks are reporting.&lt;br /&gt;
&lt;br /&gt;
And I realized that this isn't a SQL concurrency issue, basically, it's not a race condition where two requests are both trying to modify the table at the same time.&amp;nbsp; This is one of those other definitions for the word concurrency, specifically things being in accordance or agreement.&lt;br /&gt;
&lt;br /&gt;
The below is basically what was happening:&lt;br /&gt;
&lt;blockquote&gt;
Get List of Devices in BOUNCE QUEUE
For Each Device in List&lt;br /&gt;
&lt;blockquote&gt;
get ComputerDetails as LINQ object&lt;br /&gt;
Perform Bounce&lt;br /&gt;
&lt;b&gt;Perform System Checks Function on ComputerObject&lt;/b&gt;&lt;br /&gt;
Update properties of ComputerDetails&lt;br /&gt;
Submit Changes on the DBML&lt;/blockquote&gt;
Next &lt;/blockquote&gt;
What is important is the bolded line there.&amp;nbsp; That Perform System Checks Function was updating the COMPUTER DETAILS table via an EXECUTECOMMAND call on the DBML object.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;
Basically, it was modifying the underlying data table, without updating the CompterDetails LINQ object.&lt;br /&gt;
&lt;br /&gt;
This was fine until I actually updated the ComputerDetails LINQ object and then submitted it back to the database.&amp;nbsp; When I did that, the system performed a concurrency check (in the "in agreement" definition) against the actual row using those properties that were not being updated.&amp;nbsp; Since they had been modified elsewhere, outside of the normal LINQ-to-SQL paradigm, LINQ was unable to find the row--or at least upon finding it decided that "no, this wasn't really the row I was looking for."&lt;br /&gt;
&lt;br /&gt;
This means, that it happily spat out a "Row not found" error.&lt;br /&gt;
&lt;br /&gt;
I immediately thought up two possible solutions for what was happening, the first was to re-work the code to use the LINQ object in all those places where in-line SQL was being used.&amp;nbsp; The second was to re-work the one place I was submitting the LINQ object to use in-line SQL.&amp;nbsp;&amp;nbsp; Being a lazy programmer, I happily took the latter option.&lt;br /&gt;
&lt;br /&gt;
Lo an behold, my event logs are clean, the error has stopped presenting itself and all is happy and right with the world.&amp;nbsp; At least until the next bug. &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-569795071768610390?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rJcuaYoYGTsEKPLvjPqZ07IJatA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rJcuaYoYGTsEKPLvjPqZ07IJatA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rJcuaYoYGTsEKPLvjPqZ07IJatA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rJcuaYoYGTsEKPLvjPqZ07IJatA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/J1ZsUFXS-xk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/J1ZsUFXS-xk/row-not-found.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2011/08/row-not-found.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-2791814378463127251</guid><pubDate>Mon, 30 May 2011 19:13:00 +0000</pubDate><atom:updated>2011-05-30T14:13:47.100-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">VB.Net</category><category domain="http://www.blogger.com/atom/ns#">Architecture</category><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Partitioning .NET code…</title><description>&lt;p&gt;CodeBetter.com has an article up currently on &lt;a href="http://codebetter.com/patricksmacchia/2011/05/30/on-partitionning-net-code/" target="_blank"&gt;Partitioning .NET code&lt;/a&gt;, an issue which I'm intrigued with, and had recently had to actually do. &lt;/p&gt;  &lt;p&gt;My thing was, that the company I work for, has a rather large framework system in place for a lot of our development efforts, especially where intranets are concerned. I was adding functionality to this system, and started having troubles keeping track of my efforts. &lt;/p&gt;  &lt;p&gt;I mean, there were a number of aspects that this system had going on:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;HTTP Modules (entirely code based, and defined in the WEB.Config as opposed to ashx-style handlers)&lt;/li&gt;    &lt;li&gt;Worker classes&lt;/li&gt;    &lt;li&gt;Security &lt;/li&gt;    &lt;li&gt;Data Layer&lt;/li&gt;    &lt;li&gt;Sandboxes for the home page&lt;/li&gt;    &lt;li&gt;Interfaces project for custom additions to the system&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This was in addition to the base web-forms (things like the home page, the master page, content pages, administration pages, calendar pages, etc.), and the add-ins for specific clients (recently a client wanted a new sandbox which displayed a random image from a selected list of images that had been uploaded into the application).&lt;/p&gt;  &lt;p&gt;Now, originally, I had two projects. The first was the framework, and the second was the interface project. This &amp;quot;worked&amp;quot; but it was hard to grok in its entirety.&amp;#160; This was mainly because there were just so many moving parts to the thing.&lt;/p&gt;  &lt;p&gt;So, I did what I felt was the most reasonably solution, I yanked it apart into discrete bits of functional DLLs. Then, I took those DLLs and broke them into logical Namespaces. For example, I have a number of HTTP modules in the system. Two of the categories that they can be broken into is serving images or serving other files from the database.&amp;#160; To handle this, I added a FILE namespace and an IMAGE namespace into the .HttpModules namespace of my library project.&lt;/p&gt;  &lt;p&gt;What all this means is that I have a number of library projects for the core functionality that hides in the system, and those DLLs are then broken up into Namespaces around specifics types of those core functionalities. &lt;/p&gt;  &lt;p&gt;This works, since I have two ways to extend this project. I can either use stand-alone DLLs, that are instantiated at run-time, or I can use a second project which uses ASCX files that again, I can load in at run-time.&lt;/p&gt;  &lt;p&gt;But, the important thing from my point of view, is that I can easily determine where a code object belongs in my core-package. This makes new development, bug fixes and testing much easier. And, I'm also not loading a bunch of classes into the memory space unless absolutely necessarily. &lt;/p&gt;  &lt;p&gt;The only thing with how dynamic this whole system ultimately is, is that it's actually hard to test from within the VS IDE. I have to deploy the projects to a test web-server in order to fully access all of its disparate parts. But, that's more of the fact that objects are being late-bound into the application, rather than any thing to do with the partitions into separate DLLs. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-2791814378463127251?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/sf1a_O_qS0JHZgMp5xJ4EjMsZnI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sf1a_O_qS0JHZgMp5xJ4EjMsZnI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/sf1a_O_qS0JHZgMp5xJ4EjMsZnI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/sf1a_O_qS0JHZgMp5xJ4EjMsZnI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/CF5h9TbxyAg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/CF5h9TbxyAg/partitioning-net-code.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2011/05/partitioning-net-code.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-747104048266171381</guid><pubDate>Tue, 22 Feb 2011 01:59:00 +0000</pubDate><atom:updated>2011-02-21T19:59:00.696-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">eComic</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">Misc</category><title>Data Cubing for fun and profit!</title><description>Amusingly enough, I'm actually am having fun with the data cubing stuff.&lt;br /&gt;
&lt;br /&gt;
After all, I'm not the one writing the query that generates the data, but rather the UI designer/implementer for this.&amp;nbsp; A role which I'm finding myself fulfilling more and more often, as my boss is a much more powerful SQL GURU than I, whereas I'm much more familiar with the UI side of things, especially dynamic UIs on thin clients (web-based).&lt;br /&gt;
&lt;br /&gt;
But, it's still grand fun.&lt;br /&gt;
&lt;br /&gt;
And another that's still grand fun is my 'play project' &lt;a href="http://ecomic.codeplex.com/"&gt;eComic&lt;/a&gt;. Which the last version (which is nearing a year in age now) has over 10,000 downloads (running an average of 317 downloads per week these past six months, and nearly 1,000 page views in the same time frame) and 11,393 unique visitors. Which means that for roughly every 1.3 visitors, that visitor downloads eComic.&lt;br /&gt;
&lt;br /&gt;
But even more importantly, and something that makes me feel good on a personal and professional level, is that eComic was used as a referenced answer in a &lt;a href="http://stackoverflow.com/questions/4395037/image-gallery-control-for-c-windows-applications"&gt;StackOverflow question&lt;/a&gt;.&amp;nbsp; Additionally, it wasn't &lt;i&gt;ME &lt;/i&gt;that used it as such, and I'm not even familiar with the user that did so. It was one of those anonymous things, that make it so powerful. &lt;br /&gt;
&lt;br /&gt;
All that said, I have retired one of my pet projects (which had been resting in limbo, and being obscenely under-utilized), which was The Expanded Universe (a ficlets site). Which is due to the fact that there just was not enough traffic to the site to warrant its continued support.&lt;br /&gt;
&lt;br /&gt;
That said, I do have two additional pet projects which I'm considering, one is something I'm keeping under my belt for the moment, while the other is a web-based version of eComic. That will probably be monetized (whereas eComic itself is not) in that hosting, bandwidth and disk space is expensive--especially since we're dealing with image files. &lt;br /&gt;
&lt;br /&gt;
Oh well, that's enough for tonight, after all, I have coding I have to get done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-747104048266171381?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FFUQ2o3nFNNFjFDPYpd4Fv9GoFQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FFUQ2o3nFNNFjFDPYpd4Fv9GoFQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FFUQ2o3nFNNFjFDPYpd4Fv9GoFQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FFUQ2o3nFNNFjFDPYpd4Fv9GoFQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/wD6L6CefJgQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/wD6L6CefJgQ/data-cubing-for-fun-and-profit.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>1</thr:total><feedburner:origLink>http://programmer.wrighton.org/2011/02/data-cubing-for-fun-and-profit.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-7436673218517245840</guid><pubDate>Fri, 19 Nov 2010 02:40:00 +0000</pubDate><atom:updated>2011-12-03T15:01:37.424-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">VB.Net</category><category domain="http://www.blogger.com/atom/ns#">IIS</category><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><category domain="http://www.blogger.com/atom/ns#">LINQ</category><title>Linq to Sql Error BC30002</title><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/_0dC8-RtLatg/TOVZp2WilkI/AAAAAAAABBY/J6tefSyWn90/s1600/linqerr01.PNG" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="163" src="http://4.bp.blogspot.com/_0dC8-RtLatg/TOVZp2WilkI/AAAAAAAABBY/J6tefSyWn90/s320/linqerr01.PNG" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
I slammed up against a Yellow Screen of Death (YSOD) earlier today which just made my day.&amp;nbsp; And by "made my day" I mean that I wanted to scream, bang my head on the desktop, door and any other hard surface, and any other symbol of extreme frustration and angst which you deem appropriate.&lt;br /&gt;
&lt;br /&gt;
Anyways, this YSOD, gave me the singularly helpful error message of:&lt;br /&gt;
&lt;blockquote&gt;
BC30002: Type 'System.Data.Linq.Mapping.DatabaseAttribute' is not defined &lt;/blockquote&gt;
Now, one would think that was helpful information. After all, it tells you exactly what's wrong, and it even tells you on which file it finds this bit of wrongness.&lt;br /&gt;
&lt;br /&gt;
The problem comes in, when one considers that this particular file is a file that is generated by the Visual Studio IDE.&amp;nbsp; Worse yet, I was not getting any errors in Visual Studio at all.&amp;nbsp; Visual Studio was busy telling me how happy its little world was, while IIS was throwing up yellow every time I hit F5.&lt;br /&gt;
&lt;br /&gt;
So, of course I turned to my good friend Google.&lt;br /&gt;
&lt;br /&gt;
And found basically nothing. One person had gotten this error, and found out that it was due to conflicting namespaces.&amp;nbsp; Unfortunately, that wasn't the case here.&lt;br /&gt;
&lt;br /&gt;
Then I did a slightly different Google search and discovered someone on the DNN boards who had gotten the same message, and that message is apparently an issue of the Web.Config not having all the required assemblies listed for it to do its thing with the LINQ classes.&lt;br /&gt;
&lt;br /&gt;
I sat there for a moment, wondering how that could have happened to me. After all, I built the Web Site application from the ground up this morning.&amp;nbsp; I added the Linq-to-SQL classes via the IDE.&amp;nbsp; Visual Studio is supposed to take care of this for me, the same way it's done so a dozens of other times since VS2008 and Linq-to-SQL has came out.&lt;br /&gt;
&lt;br /&gt;
Surprise!&lt;br /&gt;
&lt;br /&gt;
Visual Studio hadn't.&lt;br /&gt;
&lt;br /&gt;
Bascally, my Configuration/Compilation/Assemblies keys was missing this XML key:&lt;br /&gt;
&lt;blockquote class="tr_bq"&gt;
&lt;pre id="line16"&gt;&lt;span class="start-tag"&gt;add&lt;/span&gt;&lt;span class="attribute-name"&gt; assembly&lt;/span&gt;=&lt;span class="attribute-value"&gt;"System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"&lt;/span&gt; /&lt;span class="end-tag"&gt;&lt;/span&gt;&amp;gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;blockquote&gt;
&lt;add assembly="System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"&gt;&lt;/add&gt;&lt;/blockquote&gt;
After that was added I got a working website, and life once more became good...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-7436673218517245840?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/-rlB5ZzSZFm_WQCfyHNcwAVDfXQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-rlB5ZzSZFm_WQCfyHNcwAVDfXQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/-rlB5ZzSZFm_WQCfyHNcwAVDfXQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/-rlB5ZzSZFm_WQCfyHNcwAVDfXQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/mRggQcz4oEg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/mRggQcz4oEg/linq-to-sql-error-bc30002.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_0dC8-RtLatg/TOVZp2WilkI/AAAAAAAABBY/J6tefSyWn90/s72-c/linqerr01.PNG" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://programmer.wrighton.org/2010/11/linq-to-sql-error-bc30002.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-1773540312594226710</guid><pubDate>Sun, 04 Jul 2010 02:23:00 +0000</pubDate><atom:updated>2010-07-03T21:23:25.232-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">query builder</category><category domain="http://www.blogger.com/atom/ns#">server 2008</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><category domain="http://www.blogger.com/atom/ns#">Outlook 2007</category><category domain="http://www.blogger.com/atom/ns#">terminal server</category><category domain="http://www.blogger.com/atom/ns#">Microsoft</category><title>Outlook's Query Builder</title><description>&lt;p&gt; In Outlook 2007, Microsoft did something that well, I find odd. They coupled the Advanced Search functionality of the Outlook product into the Windows Desktop Search (or the &amp;quot;Windows Search 4.0&amp;quot; if you prefer).&amp;#160; The reason I find it odd, is that from what I've read no one likes Windows Desktop Search. Of course, it's hard-baked into Windows Vista and later, so some folks never had a chance.&lt;/p&gt;  &lt;p&gt;Well, that's all fine and good, until you get to Windows Server 2008 service pack 2.&lt;/p&gt;  &lt;p&gt;Which of course, is the operating system I'm dealing with.&amp;#160; You see, I have two Server 2k8 sp2 boxes working as terminal servers (with NTLB making them into a TS Farm), and have installed Outlook 2007 on them.&amp;#160; Well, the migration from the old terminal servers was going well and we got the users on the new boxes, complete with their 12-14GB inboxes.&lt;/p&gt;  &lt;p&gt;And with inboxes that big, you can't not have advanced search capabilities. &lt;/p&gt;  &lt;p&gt;Which is exactly what happened. &lt;/p&gt;  &lt;p&gt;The users opened up Outlook, popped down the Query Builder tab and was presented with this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_0dC8-RtLatg/TC_wlk76JdI/AAAAAAAABAE/HqTxCRDCL28/s1600-h/outlook_query_disabled_cropped%5B3%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="outlook_query_disabled_cropped" border="0" alt="outlook_query_disabled_cropped" src="http://lh6.ggpht.com/_0dC8-RtLatg/TC_wmP_KAFI/AAAAAAAABAI/P6qs1bNPuPw/outlook_query_disabled_cropped_thumb%5B1%5D.png?imgmax=800" width="455" height="166" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now, whenever you search about this issue, you're presented with a couple of interesting facts:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;If Query Builder is disabled, so is the Instant Search bar (the one right there at the top)&lt;/li&gt;    &lt;li&gt;Both Query Builder and Instant Search are dependent upon Windows Desktop Search/Windows Search 4.0&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;So, I'm quickly slamming my head against the table top where I'm working because I've got the following two facts going on:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Windows Desktop Search/Windows Search 4.0 is not installed on my server&lt;/li&gt;    &lt;li&gt;Instant Search is working, just none of the &amp;quot;advanced&amp;quot; features&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Which is an obvious impossibility according to everything that is being reported on the internet about how search in Outlook works. &lt;/p&gt;  &lt;p&gt;So after fruitlessly searching the internet for more information, I give up in despair and call into Microsoft support. After the grilling phone call regarding how this is impacting my customer's business, I was promised&amp;#160; a callback within the usual 2 hours, and went back to searching to fill the time.&lt;/p&gt;  &lt;p&gt;Well, an hour and a half later, I get my call back, and explain the problem.&lt;/p&gt;  &lt;p&gt;Then I get on the Easy Assist tool and showed the Tech exactly the problem.&lt;/p&gt;  &lt;p&gt;Then I got put on hold.&lt;/p&gt;  &lt;p&gt;And thus, I waited in a soundless Limbo.&lt;/p&gt;  &lt;p&gt;And waited.&lt;/p&gt;  &lt;p&gt;And waited.&lt;/p&gt;  &lt;p&gt;And waited.&lt;/p&gt;  &lt;p&gt;Finally, the tech came back on the line, and I find out what I've been waiting for. Apparently, he had gotten his supervisor and a couple of other techs and built a Server 2008 environment and dropped Outlook 2007 on it to witness this for himself. &lt;/p&gt;  &lt;p&gt;Of course it worked this way, and he came back with the statement: &amp;quot;You need to install Windows Desktop Search in order for the advanced search features to work in Outlook 2007.&amp;quot; &lt;/p&gt;  &lt;p&gt;Which in his defense &lt;em&gt;IS&lt;/em&gt; the party line, and level one tech support ALWAYS follows the party line.&lt;/p&gt;  &lt;p&gt;Of course, if solving this was something simple like installing WDS I wouldn't have had to call technical support.&lt;/p&gt;  &lt;p&gt;So, since I had been &lt;strong&gt;&lt;em&gt;EXPECTING&lt;/em&gt;&lt;/strong&gt; this response, I let out my superior knowledge of my situation, and informed him that WDS refuses to install on Enterprise Server 2008 Service Pack 2. In fact when I tried to install, the installer told me that it was not for my version of Windows.&lt;/p&gt;  &lt;p&gt;Additionally, I didn't want WDS as it's something of a resource hog, and when 60 folks are running on a terminal server at one time, well, resource hogs aren't necessarily good things.&amp;#160; But, I could handle a resource hog, if it got me the needed functionality, but again, it would not install so that was something of a moot point. &lt;/p&gt;  &lt;p&gt;Well, informing the tech of this got me put back on hold, and the soundless Limbo.&lt;/p&gt;  &lt;p&gt;Where I waited some more. &lt;/p&gt;  &lt;p&gt;And some more. &lt;/p&gt;  &lt;p&gt;By this time, I had been on the phone for the better part of an hour, most of it on hold.&lt;/p&gt;  &lt;p&gt;Finally, he returned, and told me that he was going to have to get in touch with the special server support group for more information (my assumption is because he's realized that he can't get WDS installed on his 2008 test environment). &lt;/p&gt;  &lt;p&gt;And here's some speculation as to what's happened so far in regards to development efforts and this situation: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Office 2007 was released and built to use the Windows Desktop Search search APIs. Then when Windows 2008 sp2 was released, it no longer supported the installation of WDS, and the Server OS team didn't talk to the Office team so no one knew to test that particular functionality.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;My speculation up there is based upon the fact that nothing in the Office documentation tells you how to enable the Query Builder without the enabling of Instant Search. According to the documentation they are tied together intimately, and tied around Windows Desktop Search/Windows Search 4.0.&lt;/p&gt;  &lt;p&gt;Digression aside, as the tech is telling me that we need to push this over to the server support group, I lay done my final trump card: during that two hour wait time, while I had been searching, I stumbled across an article on how to enable search services on Windows 2008 sp2, and doing so APPEARED to activate the Query Builder.&lt;/p&gt;  &lt;p&gt;Basically, turning it on, made the screen look like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/_0dC8-RtLatg/TC_wmZVSKoI/AAAAAAAABAM/FJ6akdDRCLg/s1600-h/outlook_query_enabled_cropped%5B4%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="outlook_query_enabled_cropped" border="0" alt="outlook_query_enabled_cropped" src="http://lh6.ggpht.com/_0dC8-RtLatg/TC_wnIdONZI/AAAAAAAABAQ/dZTPy9WXPzE/outlook_query_enabled_cropped_thumb%5B2%5D.png?imgmax=800" width="442" height="131" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;And the query builder appeared to work. Of course, what this is doing to my terminal server I have no clue, as I had drain-stopped this particular node of my TS Farm so I could tinker with it, thus I did not have the expected 50-60 users utilizing it at one time.&lt;/p&gt;  &lt;p&gt;Worse, I have some reservations about this solution.&amp;#160; First, I'm running Outlook in ONLINE mode, and Search Services are only supposed to be impactive on the Outlook search if you're running in cached mode.&amp;#160; Second, Microsoft does not recommend Search Services for Enterprise grade servers (they're pushing SharePoint Services for search there).&amp;#160; &lt;/p&gt;  &lt;p&gt;And that's the ultimate question I'm trying to get answered from Microsoft. What is this going to do customer's experience on their TS Farm, and if this is going to impact my customer's TS experience, how can I get them that stupid Query Builder.&lt;/p&gt;  &lt;p&gt;Anyways, to activate the search services here, you perform the following steps:&lt;/p&gt;  &lt;li&gt;Start Server Manager&lt;/li&gt;  &lt;li&gt;Click Roles in the navigation tree on the left &lt;/li&gt;  &lt;li&gt;Select Add Role in the Roles Summary section&lt;/li&gt;  &lt;li&gt;Select the File Services role and click next&lt;/li&gt;  &lt;li&gt;Select the Windows Search role service&lt;/li&gt;  &lt;p&gt;Additionally, when I activated the system, I did not allow the Search Service to actually index anything—as I'm hoping that that will keep this from eating up resources. &lt;/p&gt;  &lt;p&gt;Now, it's just a waiting game to see what Microsoft comes back with here.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-1773540312594226710?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JRRVgIzV8k-6iw8mzj437lXQxyg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JRRVgIzV8k-6iw8mzj437lXQxyg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JRRVgIzV8k-6iw8mzj437lXQxyg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JRRVgIzV8k-6iw8mzj437lXQxyg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/ReSYQ8l8D8o" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/ReSYQ8l8D8o/outlook-query-builder.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_0dC8-RtLatg/TC_wmP_KAFI/AAAAAAAABAI/P6qs1bNPuPw/s72-c/outlook_query_disabled_cropped_thumb%5B1%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2010/07/outlook-query-builder.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-6870507573300376377</guid><pubDate>Tue, 08 Jun 2010 01:12:00 +0000</pubDate><atom:updated>2010-06-07T20:12:00.939-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">WPF</category><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">VB.Net</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">Coding</category><title>.NET and the Unending Process...</title><description>So I had a problem.  In the scheme of things, it wasn't that big of a problem, at least provided that one didn't stop and restart an application multiple times without doing the same to their PC.&lt;br /&gt;&lt;br /&gt;As one might surmise from the TITLE of this particular post, my problem was a process that just refused to die when my application closed.&lt;br /&gt;&lt;br /&gt;This particular application is a rather massive WPF based Windows application, with hundreds (nearly a thousand) of source-controlled files, scores of icons, themes, and other references, thousands upon thousands of lines of code and to top it all off--the evil thing is multi-threaded.&lt;br /&gt;&lt;br /&gt;So, to say that this is a complex application is a bit of an understatement, and of course to make it all THAT much better, active development on it stopped about this time last year, so the code is basically bone-dry in my brain. &lt;br /&gt;&lt;br /&gt;Which of course meant that I had to find the cause of the problem, fix it and get it re-deployed within an hour.  If not sooner.&lt;br /&gt;&lt;br /&gt;Since I'm a good Consultant, I did not despair, but rather fired up my trusty copy of Visual Studio 2008 and started stepping through code. &lt;br /&gt;&lt;br /&gt;My first thought was that this was something to do with THREADS! I mean, it just makes sense.  After all, every time one turns around in this thing, a BackGroundWorker object is doing SOMETHING to data somewhere within its mass of code files or a timer is elapsing or... or something! &lt;br /&gt;&lt;br /&gt;So, I go about, making sure that all my Timers and BackgroundWorkers and ThreadPools were successfully closing and getting disposed of when my application was shutting down.&lt;br /&gt;&lt;br /&gt;Oddly, that made things worse.&lt;br /&gt;&lt;br /&gt;Not to be out-done by mere code, I applied an ENVIRONMENT.EXIT(0) command in the application's Exit event handler. &lt;br /&gt;&lt;br /&gt;"&lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;THAT&lt;/span&gt; &lt;/span&gt;should kill all the threads hanging out there," I thought to myself. &lt;br /&gt;&lt;br /&gt;So, I restarted the application, let it do its thing, and then shut it down.&lt;br /&gt;&lt;br /&gt;Only to have that phantom thread still left out there, eating memory but not really any processor time.&lt;br /&gt;&lt;br /&gt;I sighed, scratched my head and pondered things.&lt;br /&gt;&lt;br /&gt;And by ponder, I meant I started searching the web for possible answers.&lt;br /&gt;&lt;br /&gt;Which I found on an article that blamed this behavior on the .HIDE method of a form.&lt;br /&gt;&lt;br /&gt;So, I started scrolling through my code. &lt;br /&gt;&lt;br /&gt;After, scrolling through the first 1,500 lines of code in the first file, I hit CTRL+F and searched for &lt;span style="font-weight: bold;"&gt;.Hide&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Which I found in the form of a dialog window that was responsible for re-calibrating data after a hard crash.  This little guy was being created when I created my primary form, and thus would rarely get shown.  Yet, that being the root cause (based on the 'HIDE' thought) didn't make sense to me.  After all, it was a child of the primary form. When the primary form was closed, it should have received the notification and disposed of itself like all the rest of the form's children.&lt;br /&gt;&lt;br /&gt;So, I created  break point in my primary window's CLOSING event, and then launched, let it do its thing for a bit, and then shut it down.  My break point hit, and I started stepping through the code. &lt;br /&gt;&lt;br /&gt;And I made it all the way through the Closing event handler without a problem.&lt;br /&gt;&lt;br /&gt;And then my form was gone. &lt;br /&gt;&lt;br /&gt;I was amazed. Aghast even.&lt;br /&gt;&lt;br /&gt;After all, I had never removed the Environment.Exit command from the application's Exit event handler, and while stepping through the debugger I had never made it to the application's Exit event handler. &lt;br /&gt;&lt;br /&gt;In fact, Visual Studio was reporting that I was &lt;span style="font-weight: bold; font-style: italic;"&gt;STILL&lt;/span&gt; debugging.&lt;br /&gt;&lt;br /&gt;And then a timer elapsed.&lt;br /&gt;&lt;br /&gt;To think, I would probably still be banging my head against the closest hard surface if not for that simple little timer.&lt;br /&gt;&lt;br /&gt;But, the timer fired, and I found myself in the code for the stupid dialog window.&lt;br /&gt;&lt;br /&gt;Which is when I remembered that I was dealing with WPF, and that my application was set up to not register itself as being closed until every form it owned was closed. &lt;br /&gt;&lt;br /&gt;So, I retrace the life cycle for this modal window, and realized that even though it doesn't always get SHOWN, it is always getting created, but is never getting destroyed. &lt;br /&gt;&lt;br /&gt;And the Framework is just assuming that you know what you're doing when you don't destroy windows, and is not going to clean those things up for you, regardless of who you believe is the form's parent.&lt;br /&gt;&lt;br /&gt;So, anyways, after making sure that that happy little modal window received a call to its .CLOSE method, I recompiled the application, let it do its thing for a bit, and then shut it down.&lt;br /&gt;&lt;br /&gt;And I'm happy to report that there were no phantom threads.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-6870507573300376377?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/2G6kwaXDs5fMiI3DtY1AOmqa42s/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2G6kwaXDs5fMiI3DtY1AOmqa42s/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/2G6kwaXDs5fMiI3DtY1AOmqa42s/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/2G6kwaXDs5fMiI3DtY1AOmqa42s/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/v8lRLFq26Sg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/v8lRLFq26Sg/net-and-unending-process.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2010/06/net-and-unending-process.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-3740309117060310754</guid><pubDate>Wed, 26 May 2010 00:35:00 +0000</pubDate><atom:updated>2010-05-25T19:35:00.711-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">Codeplex</category><category domain="http://www.blogger.com/atom/ns#">eComic</category><category domain="http://www.blogger.com/atom/ns#">Misc</category><category domain="http://www.blogger.com/atom/ns#">Coding</category><title>CodePlex &amp; Updated Versions</title><description>CodePlex is Microsoft's Open-Source repository, basically, their gift to the Open Source .NET developers out there.   As such, it has a number of useful and worthwhile features in its code base for said Open Source developers, things such as issue trackers and discussion functions.&lt;br /&gt;&lt;br /&gt;It's good and I like it.&lt;br /&gt;&lt;br /&gt;But there is one place where it is lacking, and that's the ability to have the programs "call home" to the project page and make sure that they are the latest version of the software.&lt;br /&gt;&lt;br /&gt;Ideally, the way this would work, is that we would provide a key on the release page, and when a RESTFUL API was called, that key would be returned. Then a simple compare would do the job.&lt;br /&gt;&lt;br /&gt;Sadly, that doesn't exist.&lt;br /&gt;&lt;br /&gt;Even more sadly, I wanted my project to be able to do this.   Basically, my goal is that after the application launches (provided the user wishes for updates to be checked),  the application would call the eComic home page, and found out the key for the current 'recommended' release.  If it was not the "recommended" release, then an icon would be displayed, and when pressed, launch the eComic home page in the browser, ready for downloads.&lt;br /&gt;&lt;br /&gt;Luckily, I figured out a way around this.&lt;br /&gt;&lt;br /&gt;Since the site provides an RSS feed detailing project releases, I have a viewpoint into the current release. Or at least, the last release that was edited. The other thing that the site provides is the ability to create "Hidden" releases. Basically, these are releases that you've not finished 100% and thus are not released to the public yet. An important thing to note regarding these hidden releases is that they do not show up in the RSS feed.&lt;br /&gt;&lt;br /&gt;So, what I did was I created the following settings in my application:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Check For Updates (User Setting)&lt;/li&gt;&lt;li&gt;Current Version (Application Setting)&lt;/li&gt;&lt;li&gt;Check Update Url (Application Setting)&lt;/li&gt;&lt;/ul&gt;With the &lt;span style="font-weight: bold; font-style: italic;"&gt;Check for Updates&lt;/span&gt; setting, I will allow the user to turn on/off the ability to perform these checks.  That's just a simple and nice setting that any application that performs these types of checks should implement.&lt;br /&gt;&lt;br /&gt;The &lt;span style="font-weight: bold; font-style: italic;"&gt;Check Update Url&lt;/span&gt; is basically a read-only setting, that is the RELEASES RSS feed from the eComic site.&lt;br /&gt;&lt;br /&gt;Finally, the &lt;span style="font-weight: bold; font-style: italic;"&gt;Current Version&lt;/span&gt; is a read-only setting, in which I placed the string identifier for this release.&lt;br /&gt;&lt;br /&gt;After those settings were created, I went and generated a "Hidden" release, and got its &lt;span style="font-weight: bold; font-style: italic;"&gt;Release Id&lt;/span&gt; from the query string.&lt;br /&gt;&lt;br /&gt;I then plugged that &lt;span style="font-style: italic; font-weight: bold;"&gt;Release Id&lt;/span&gt; into the &lt;span style="font-weight: bold; font-style: italic;"&gt;Current Version&lt;/span&gt; setting.&lt;br /&gt;&lt;br /&gt;Finally, I had a function which would perform a web request to the eComic RELEASE RSS feed. After grabbing the first item, I perform a simple compare on the associated link to see if the returned link held the &lt;span style="font-weight: bold; font-style: italic;"&gt;Current Version&lt;/span&gt; value, and displayed my UPDATE icon accordingly.&lt;br /&gt;&lt;br /&gt;Placing it into a Timer.Elapsed event kept if off my main thread (meaning that the update check would not impact usability) and made it a slight delay from the application launch as well.  The final thing is that the whole kit-n-kaboodle is wrapped in a Try/Catch block as I don't want a failure to connect to the web server to bring down the whole application.&lt;br /&gt;&lt;br /&gt;&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: Consolas, "Courier New", Courier, Monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;&lt;br /&gt;.csharpcode .alt &lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;br /&gt;&lt;/style&gt;&lt;br /&gt;&lt;div class="csharpcode"&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt; &lt;span class="kwrd"&gt;Private&lt;/span&gt; &lt;span class="kwrd"&gt;Sub&lt;/span&gt; _timer_Elapsed(&lt;span class="kwrd"&gt;ByVal&lt;/span&gt; sender &lt;span class="kwrd"&gt;As&lt;/span&gt; &lt;span class="kwrd"&gt;Object&lt;/span&gt;, &lt;span class="kwrd"&gt;ByVal&lt;/span&gt; e &lt;span class="kwrd"&gt;As&lt;/span&gt; System.Timers.ElapsedEventArgs) &lt;span class="kwrd"&gt;Handles&lt;/span&gt; _timer.Elapsed&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;        &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; request &lt;span class="kwrd"&gt;As&lt;/span&gt; HttpWebRequest = WebRequest.Create(My.Settings.UpdateUrl)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;            &lt;span class="kwrd"&gt;Dim&lt;/span&gt; response &lt;span class="kwrd"&gt;As&lt;/span&gt; HttpWebResponse = request.GetResponse&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; response.StatusCode = HttpStatusCode.OK &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; xDoc &lt;span class="kwrd"&gt;As&lt;/span&gt; XDocument = XDocument.Load(response.GetResponseStream)&lt;/pre&gt;&lt;br /&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;                _currentVersionUrl = (From xe &lt;span class="kwrd"&gt;In&lt;/span&gt; xDoc.Descendants(&lt;span class="str"&gt;"item"&lt;/span&gt;) _&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;                                                 &lt;span class="kwrd"&gt;Select&lt;/span&gt; xe.Element(&lt;span class="str"&gt;"link"&lt;/span&gt;).Value _&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                                                 ).Take(1).SingleOrDefault&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; &lt;span class="kwrd"&gt;String&lt;/span&gt;.IsNullOrEmpty(_currentVersionUrl) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; _currentVersionUrl.Contains(My.Settings.CurrentRelease) &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;Me&lt;/span&gt;.DisplayUpdate = &lt;span class="kwrd"&gt;True&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                    &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;                &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="rem"&gt;' Check to ensure the link is a VALID url &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;Me&lt;/span&gt;.DisplayUpdate &lt;span class="kwrd"&gt;Then&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; re2 &lt;span class="kwrd"&gt;As&lt;/span&gt; HttpWebRequest = WebRequest.Create(&lt;span class="kwrd"&gt;Me&lt;/span&gt;._currentVersionUrl)&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                re2.AllowAutoRedirect = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                re2.Method = &lt;span class="str"&gt;"Head"&lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;                re2.KeepAlive = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;                &lt;span class="kwrd"&gt;Dim&lt;/span&gt; res &lt;span class="kwrd"&gt;As&lt;/span&gt; HttpWebResponse = request.GetResponse&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="kwrd"&gt;Not&lt;/span&gt; res.StatusCode = HttpStatusCode.OK &lt;span class="kwrd"&gt;Then&lt;/span&gt; &lt;span class="kwrd"&gt;Me&lt;/span&gt;.DisplayUpdate = &lt;span class="kwrd"&gt;False&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;If&lt;/span&gt; &lt;span class="rem"&gt;' Me.DisplayUpdate &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        &lt;span class="kwrd"&gt;Catch&lt;/span&gt; ex &lt;span class="kwrd"&gt;As&lt;/span&gt; Exception&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            &lt;span class="rem"&gt;' Do Nothing.  If this fails, then I'm not concerned, as I'll just continue happily with the current version &lt;/span&gt;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        &lt;span class="kwrd"&gt;End&lt;/span&gt; &lt;span class="kwrd"&gt;Try&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;    &lt;span class="kwrd"&gt;End&lt;/span&gt; Sub&lt;/pre&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/947968907697915479-3740309117060310754?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HPZyZWLxkjm0FLmT8pHMPjf-H_U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HPZyZWLxkjm0FLmT8pHMPjf-H_U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HPZyZWLxkjm0FLmT8pHMPjf-H_U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HPZyZWLxkjm0FLmT8pHMPjf-H_U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/FO4xRBk6uh0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/FO4xRBk6uh0/codeplex-updated-versions.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2010/05/codeplex-updated-versions.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-2067853935124379493</guid><pubDate>Mon, 24 May 2010 05:29:00 +0000</pubDate><atom:updated>2010-05-24T00:29:20.473-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">eComic</category><title>eComic 2010</title><description>&lt;p&gt;Well, I finally got off my backside and slapped together the .NET 4.0 version of eComic.&amp;#160; In addition to all the enhancements which 4.0 provides to WPF I also streamlined the opening of the archive files, and added a host of additional features.&lt;/p&gt;  &lt;p&gt;The most important of these are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Rebuilt form in .NET 4&lt;/li&gt;    &lt;li&gt;Rebuilt Comic opening engine to improve speed and performance&lt;/li&gt;    &lt;li&gt;Removed manual zoom control&lt;/li&gt;    &lt;li&gt;Implemented programmatic PAN/ZOOM functionality on mouse events and ribbon buttons&lt;/li&gt;    &lt;li&gt;Added progress bar charting opening archive progress to status bar&lt;/li&gt;    &lt;li&gt;Modified page number/page name to allow selection of pages via that function&lt;/li&gt;    &lt;li&gt;Added icon to status bar to indicate type of file loaded&lt;/li&gt;    &lt;li&gt;Added ability to open a directory of images&lt;/li&gt;    &lt;li&gt;Added functionality to create simple CBZ file from an opened directory of images&lt;/li&gt;    &lt;li&gt;Added support for a 'full screen' mode&lt;/li&gt;    &lt;li&gt;Added additional buttons to RIBBON element for ease of access to the functions&lt;/li&gt;    &lt;li&gt;Allow for DragDrop of a file from Explorer to force open&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I'm still in the process of building documentation for the thing though, which is something I dislike, but you know how it is. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-2067853935124379493?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/FqsMO5mr3IsV2lOyq-rFjP3JnI4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FqsMO5mr3IsV2lOyq-rFjP3JnI4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/FqsMO5mr3IsV2lOyq-rFjP3JnI4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/FqsMO5mr3IsV2lOyq-rFjP3JnI4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/VjApuyyQfKU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/VjApuyyQfKU/ecomic-2010.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2010/05/ecomic-2010.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-3507688934802259657</guid><pubDate>Sun, 28 Feb 2010 15:36:00 +0000</pubDate><atom:updated>2010-02-28T09:36:43.741-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">eComic</category><title>1,000 Downloads for eComic</title><description>&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_0dC8-RtLatg/S4qNiUGjwCI/AAAAAAAAA-g/NvwJbB_rYFk/s1600-h/ecomic1kdownloads%5B6%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="eComic Download count" border="0" alt="eComic Download count" align="right" src="http://lh5.ggpht.com/_0dC8-RtLatg/S4qNi-BL-MI/AAAAAAAAA-k/FDttsDSbfUI/ecomic1kdownloads_thumb%5B4%5D.png?imgmax=800" width="244" height="232" /&gt;&lt;/a&gt;The latest version of &lt;a href="http://ecomic.codeplex.com/"&gt;eComic&lt;/a&gt; has been downloaded 1,000 times.&amp;#160;&amp;#160; I'm all sorts of stoked about that!&lt;/p&gt;  &lt;p&gt;Even cooler is that when I checked the counts this morning, I managed to grab a screen-grab where it clearly states that there has been 1,000 downloads.&lt;/p&gt;  &lt;p&gt;Glee.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-3507688934802259657?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_y0x6tBPMT9XEFvYz-Ts9Y7rW3o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_y0x6tBPMT9XEFvYz-Ts9Y7rW3o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_y0x6tBPMT9XEFvYz-Ts9Y7rW3o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_y0x6tBPMT9XEFvYz-Ts9Y7rW3o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/VAgc0ATf6jQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/VAgc0ATf6jQ/1000-downloads-for-ecomic.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_0dC8-RtLatg/S4qNi-BL-MI/AAAAAAAAA-k/FDttsDSbfUI/s72-c/ecomic1kdownloads_thumb%5B4%5D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://programmer.wrighton.org/2010/02/1000-downloads-for-ecomic.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-7826734454289120953</guid><pubDate>Tue, 23 Feb 2010 00:30:00 +0000</pubDate><atom:updated>2010-02-22T18:30:00.963-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DRM</category><category domain="http://www.blogger.com/atom/ns#">Usability</category><category domain="http://www.blogger.com/atom/ns#">Misc</category><category domain="http://www.blogger.com/atom/ns#">User Interface</category><title>Gaming For Gamers</title><description>&lt;h3&gt;Or, why I hate UbiSoft....&lt;/h3&gt;I'm a gamer. I &lt;span style="font-style: italic;"&gt;like &lt;/span&gt;video games. Much in the same way that I like cartoons, anime, comic books and all forms of speculative fiction in general. I've been a gamer since we purchased our first gaming console back when I was around five years old. Fundamentally that means that I've been a gamer for nearly as long as my little brother has been alive.&lt;br /&gt;&lt;br /&gt;My wife puts up with it with her usual loving patience. I don't generally play games while my kids are awake, but once they're down for the count, I can often be found shooting up zombies, flying through space or ruling my galactic empire with an iron fist.&lt;br /&gt;&lt;br /&gt;Frankly, I never really thought that I would ever stop being a gamer.&lt;br /&gt;&lt;br /&gt;Yet, UbiSoft is trying their best to make it that way.&lt;br /&gt;&lt;br /&gt;They have a new DRM scheme (and I'm amused that we always talk about DRM in the same way we discuss PONZI, as "schemes") in which the system is required to be ALWAYS online, or else you can't play the game. At all. Even though the game in question is a single player game.&lt;br /&gt;&lt;br /&gt;Think about that. This is UbiSoft saying that they will control your gaming experience and if you don't have the internet? Oh well, you shouldn't have purchased our game.&lt;br /&gt;&lt;br /&gt;Worse is the idiocy inherent in the "benefits" that UbiSoft is proclaiming far and wide in regards to the customer-hate which this DRM fundamentally is.&lt;br /&gt;&lt;br /&gt;Their first benefit is the fact that you can &lt;span style="font-weight: bold;"&gt;install this game on as many PCs as you desire&lt;/span&gt;. Which is funny, as I was always under the impression that that was always the case. Of course, there are some DRM schemes which breaks this, and only allow a limited number of installs per copy (see Spore) but that's anti-customer as well. The truth of the matter is, that I should be allowed to install any game I purchase on as many of my own devices as I desire. Once I purchase a copy of the software, where and how I install it is no longer any of the developer's, much less the distributor's, concern.&lt;br /&gt;&lt;br /&gt;The second benefit is the fact that you will no longer need the &lt;span style="font-weight: bold;"&gt;disc in the tray in order to play the game&lt;/span&gt;. Which is something that Steam has conquered quite well, and users do not need to be online all the time in order to play a Steam game. What's sad is that we shouldn't need to be slaved to an internet connection in order to do something which is just logical in the first place. I'd be pissed as anything if I had to keep a disc in the tray to use Microsoft Word or Visual Studio. Frankly, I installed the game, the entire game, onto my PC. There's no reason I shouldn't be able to place said disc back into storage so it would not get damage.&lt;br /&gt;&lt;br /&gt;The third benefit that UbiSoft is touting is the concept of &lt;span style="font-weight: bold;"&gt;saves in the cloud&lt;/span&gt;. Which is insane and pointless drivel. If I want my game save data to be shared between computers, I can easily tell the game to save data to the shared drive on my network, or I could even move the files manually.&lt;br /&gt;&lt;br /&gt;Of course, the thing that truly angers me is the fact that this system, basically violates the &lt;a href="http://en.wikipedia.org/wiki/Right_of_first_sale"&gt;Right of First Sale&lt;/a&gt;. For those concerned, it is the Copyright Act of 1976, 17 U.S.C &lt;a href="http://www.law.cornell.edu/uscode/17/109.html" rel="nofollow"&gt;§ 109.&lt;/a&gt; This doctrine is the legal right to sell or give away  a lawfully made copy of a copyrighted work without permission.  This DRM scheme breaks that law. It is DESGINED in such a way that I would be unable to give away or sale my legally purchased copy of the game.   And regardless of what EULA's claim, the Courts have ruled that the Right of First Sale do apply to software that is purchased as opposed to licensed.  I.e. if I go to GameStop, Walmart, Amazon or any retail outlet, then I am purchasing a copy of the work, as opposed to a company licensing 30 instances of Word for the PCs in the company.  &lt;span style="font-style: italic;"&gt;Bauer &amp;amp; Cie v. O'Donnell&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;Bobbs-Merrill Co. v. Straus&lt;/span&gt; were both U.S. Supreme Court cases regarding this, and the 2008 ruling in Washington in &lt;span style="font-style: italic;"&gt;Timothy S. Vernor v. Autodesk Inc.&lt;/span&gt; upholds this right in regards to software purchases.&lt;br /&gt;&lt;br /&gt;Remember, I'm a developer as well here. I make my living building software, so these issues are of great importance to me. &lt;br /&gt;&lt;br /&gt;And I think this is bad customer service as well as a losing strategy for a software company.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The thing is that this is not going to stop piracy. It's not. Consider, Winzip, a shareware program whose trail never expires, so users can effectively use it for free (once one gets past the "nag" screen) forever, is pirated software on zero-day sites. Pirates have all the time and energy in the world to crack the DRM, while the publishing company has limited resources to create it in the first place.&lt;br /&gt;&lt;br /&gt;This is not going to stop piracy. Worse, the only people who will enjoy the ability to play an offline game will be those who do pirate the game.  Think about that; the only way to get an enjoyable play experience if you have any type of spotty internet connection (and who of us doesn't?) will be to pirate this software.&lt;br /&gt;&lt;br /&gt;And that's even before we get into issues of latency, DDoS attacks against the authentication servers as well as just pure unadulterated too many requests for the server to handle.  Then there's the issues involving people with dial-in modems (sub-(a)DSL speeds which are the lowest that they will support) or that are not on an "unlimited" connection to their provider (which frankly, the internet providers dream that we will go that way). That's even before we get into their "promise" that they will release a patch to bypass the DRM if they ever do away with the authentication servers (my question is, if they do not have the revenue to power the servers, how will they have the funds to pay the developer to build the patch?).&lt;br /&gt;&lt;br /&gt;So, here's my stance: I will not buy another UbiSoft title.&lt;br /&gt;&lt;br /&gt;Period.&lt;br /&gt;&lt;br /&gt;They have lost a customer for life, and there is nothing they can do to change that now. Even if they send me a game free, I will merely melt the disk enough so that is unusable, send it through my CD/DVD shredder, and then mix the remains in the detritus I scope from my cat's litter box.&lt;br /&gt;&lt;br /&gt;That is what their games deserve.&lt;br /&gt;&lt;br /&gt;They have shown that not only do they dislike their customers, but they are hostile towards them, and actively desire to insult them.&lt;br /&gt;&lt;br /&gt;Why do I say that? Well outside of the whole breaking of the Copyright Act of 1976 and the Doctrine of First Sale, when one looks at the &lt;a href="http://support.uk.ubi.com/online-services-platform/"&gt;FAQ&lt;/a&gt; for this abomination, one sees this:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-weight: bold;"&gt;Why the need for a permanent Internet connection? Why no “offline” mode?&lt;/span&gt;&lt;br /&gt;The online services platform authenticates with a Ubisoft account and a permanent online connection allows us to verify that no one else uses the account at the same time. We know that services such as Steam offer an offline mode but this option is not as efficient in its protection against piracy.&lt;/blockquote&gt;There at the bottom, where they talk about Steam, it states: "this option is not as efficient in its protection against piracy."&lt;br /&gt;&lt;br /&gt;The stance UbiSoft is &lt;span style="font-weight: bold; font-style: italic;"&gt;STARTING &lt;/span&gt;from, is that its customers, the ones that purchase the game, are going to steal it.   That is what they are saying, they are calling everyone who plays their game a thief.&lt;br /&gt;&lt;br /&gt;Frankly, I get peeved when the "Greeters" at Walmart attempt to stop me (and I do mean attempt, because I always ignore their requests to stop, and can't wait for one of them to actually touch me in an attempt to get me to stop), as I see it as the company believes that I'm stealing. I see it as an accusation of theft and defamation of my character (while it may not be enough to be upheld in court as defamation, I still feel it to be a defamation). &lt;br /&gt;&lt;br /&gt;And there's no difference here. This is UbiSoft accusing me of wanting to steal their video game.  This is UbiSoft accusing everyone out there of wanting to steal their video game.&lt;br /&gt;&lt;br /&gt;So, my solution to that is simple: their software will never again be installed on my hardware.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-7826734454289120953?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4OimDSpLGR_gJY3hU7sxVUowue4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4OimDSpLGR_gJY3hU7sxVUowue4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4OimDSpLGR_gJY3hU7sxVUowue4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4OimDSpLGR_gJY3hU7sxVUowue4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/lFboBtu9d7k" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/lFboBtu9d7k/gaming-for-gamers.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2010/02/gaming-for-gamers.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-8845757657412607126</guid><pubDate>Fri, 12 Feb 2010 16:26:00 +0000</pubDate><atom:updated>2010-02-12T10:26:09.320-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DRM</category><category domain="http://www.blogger.com/atom/ns#">Usability</category><category domain="http://www.blogger.com/atom/ns#">hardware</category><title>Why A Free Kindle Is Still Too Expensive…</title><description>&lt;p&gt;&lt;a href="http://techcrunch.com/2010/02/12/amazon-wants-to-give-a-free-kindle-to-all-amazon-prime-subscribers/"&gt;TechCrunch&lt;/a&gt; is reporting that Amazon is considering the possibilities of giving a free Kindle to every &lt;a href="http://www.amazon.com/gp/subs/primeclub/signup/main.html"&gt;Amazon Prime&lt;/a&gt; subscriber. &lt;a href="http://lh5.ggpht.com/_0dC8-RtLatg/S3WBH6gQL2I/AAAAAAAAA-U/XBEmezxF0Hs/s1600-h/kindle%5B7%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 5px; display: inline; border-top: 0px; border-right: 0px" title="kindle" border="0" alt="kindle" align="right" src="http://lh5.ggpht.com/_0dC8-RtLatg/S3WBIP03tzI/AAAAAAAAA-Y/koIFz-S8u7k/kindle_thumb%5B5%5D.jpg?imgmax=800" width="236" height="244" /&gt;&lt;/a&gt; They're even going so far as to consider the implications of multi-year deprecation on the loss which handing out the hardware at no cost would create.&lt;/p&gt;  &lt;p&gt;Now, I love eBooks. Especially ever since I got a droid. I love the convenience of carrying around a library in my pocket. And in truth, I was excited about the Kindle when I first heard about it, just like I was excited about the Nook when I first heard about it.&lt;/p&gt;  &lt;p&gt;But there are things about both of these devices that make them no-go, in my opinion. What I don't like here is DRM and closed file format standards. &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Let's look at some of the fun things that DRM and closed file format have done for us:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://technologizer.com/2009/12/11/office-2003-rights-management-bug-locks-up-files/"&gt;Office 2003 Rights Management Bug Locks up Files&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://consumerist.com/2009/12/sony-asks-customer-for-her-reader-breaks-it-then-sends-it-back.html"&gt;Woman felt compelled to buy a second Sony Reader, after Sony breaks her original one, because all of her content is tied to the Sony device&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.geardiary.com/2009/06/19/kindles-drm-rears-its-ugly-head-and-it-is-ugly/"&gt;Kindle limited number of times that a book could be downloaded to various devices you own&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.crn.com/retail/216500680;jsessionid=ZVXQ2FIL5LQRHQE1GHRSKHWATMY32JVN"&gt;Returning too much to Amazon, closes your Amazon account, meaning that your Kindle becomes an expensive brick&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.ripten.com/2009/01/29/gears-of-war-pc-digital-certificate-expires-kills-the-game/"&gt;Gears of War certificate expired, making the game unplayable on the PC&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.boingboing.net/2009/01/08/ebook-drm-provider-g.html"&gt;eBook DRM provider goes dark, the books you paid for disappear&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And those are just the things I found with five minutes of searching.&lt;/p&gt;  &lt;p&gt;But it gets worse. See, the Kindle uses the Kindle Format for its eBooks. These file formats are DRM'd up the wazoo, and the only device that they can be read upon are those that Amazon thinks are worth developing software for.&lt;/p&gt;  &lt;p&gt;Basically, this means that the books that you &amp;quot;buy&amp;quot; (read rent) from Amazon for the Kindle will only remain usable as long as Amazon remains a viable company, and willing to allow you to view them.&lt;/p&gt;  &lt;p&gt;Of course, this gets even worse when you consider that thanks to the insane laws in this country regarding DRM one cannot media shift these files. &lt;/p&gt;  &lt;p&gt;For an example of this, let's look at DVDs and Linux. If you run a Linux desktop or laptop, then there is not a legal way for you to view a movie that you have purchased. Sure, it's a minor issue to circumnavigate the CSS DRM system utilized by DVDs, but doing so, brings you into conflict with the copyright law, despite the fact that&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;It is easily broken, and therefore no true protection &lt;/li&gt;    &lt;li&gt;Should be considered fair use (i.e. attempting to view your copy of the movie) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Think on that, and apply it to these Kindle books. &lt;/p&gt;  &lt;p&gt;I use my Droid as an eBook reader, and the software I use for it supports ePub format (an open standard). Now, if I purchased an eBook through the Amazon Kindle eBook store, I would be unable to read it on my preferred eBook reader hardware/software combination.&amp;#160; &lt;/p&gt;  &lt;p&gt;Additionally, because the Kindle does not support ePub, then I would be unable to actually read those eBooks I do own. &lt;/p&gt;  &lt;p&gt;At no point do I want the content I purchased to be locked to a piece of hardware. I don't want to have to purchase the same reader every time just in order to retain the &amp;quot;right&amp;quot; to read the books that I purchased. The fact that I purchased the book should be enough to prove that I have the right to read them on any device I own.&lt;/p&gt;  &lt;p&gt;And that's why, even if it is free, an Amazon Kindle is still too expensive.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-8845757657412607126?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/rbjuVFJ4gs-wol_g1g60p1Q4AJw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rbjuVFJ4gs-wol_g1g60p1Q4AJw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/rbjuVFJ4gs-wol_g1g60p1Q4AJw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/rbjuVFJ4gs-wol_g1g60p1Q4AJw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/m9XJ62br5ec" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/m9XJ62br5ec/why-free-kindle-is-still-too-expensive.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_0dC8-RtLatg/S3WBIP03tzI/AAAAAAAAA-Y/koIFz-S8u7k/s72-c/kindle_thumb%5B5%5D.jpg?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2010/02/why-free-kindle-is-still-too-expensive.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-4715755347446612973</guid><pubDate>Fri, 22 Jan 2010 23:30:00 +0000</pubDate><atom:updated>2010-01-22T17:30:00.930-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Usability</category><category domain="http://www.blogger.com/atom/ns#">Misc</category><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">Documentation</category><title>Android Development</title><description>I'm a geek, and I enjoy programming. In fact, I enjoy it so much that despite doing it all day, I will often come home and actually do it more in the evening for the sheer enjoyment of it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://lh5.ggpht.com/_0dC8-RtLatg/SQYKmuzoqEI/AAAAAAAAAbM/cyJIuSctIwc/s800/ecomic_icon-004.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 128px; height: 128px;" src="http://lh5.ggpht.com/_0dC8-RtLatg/SQYKmuzoqEI/AAAAAAAAAbM/cyJIuSctIwc/s800/ecomic_icon-004.png" alt="" border="0" /&gt;&lt;/a&gt;This is most noticeable in my Codeplex project: &lt;a href="http://www.codeplex.com/ecomic/"&gt;eComic&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;That's something that I wrote and maintain and update fundamentally for the sheer enjoyment of it.&lt;br /&gt;&lt;br /&gt;Likewise, every time I get a new toy, I want to expand its capabilities, and make it do more.  Since I'm about to get a new toy, I decided to preemptively set up my ability to play upon it. &lt;br /&gt;&lt;br /&gt;In other words, since I'm getting a DROID, I decided to set up my home PC to allow ANDROID development.&lt;br /&gt;&lt;br /&gt;Now, not to sound egotistical or anything, but I'm a smart guy; I work with computers day in and day out, and in fact it is my primary job description to make computers jump through the hoops I (or my customers) want them to.  It's what I do.&lt;br /&gt;&lt;br /&gt;Which is why setting up that Android DEV environment saddens me so much.&lt;br /&gt;&lt;br /&gt;First off, the recommended environment includes the following elements:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Eclipse IDE&lt;/li&gt;&lt;li&gt;Android SDK&lt;/li&gt;&lt;li&gt;Android ADT &lt;/li&gt;&lt;/ul&gt;Now, that's not the bad thing, the bad thing is getting all those parts working together in a cohesive hole which allows you to actually create programs for the device you're aiming for.&lt;br /&gt;&lt;br /&gt;Microsoft gets a lot of bad rep by geeks. It's big, it's massive, but despite all of the negativity from my peers, I LIKE Microsoft tools--especially the development ones. &lt;br /&gt;&lt;br /&gt;When I went to install Microsoft's IDE on my machine, I downloaded the ISO, loaded it up, and ran the SETUP.EXE file and followed the prompts, making relevant changes as needed/desired to customize my environment.&lt;br /&gt;&lt;br /&gt;Fundamentally, it worked. No hassles. No headaches, just thirty minutes of watching progress bars and then I was kicking and coding.&lt;br /&gt;&lt;br /&gt;Sadly, the Eclipse/Android SDK install was anything but that easy.&lt;br /&gt;&lt;br /&gt;Worse, because there was no installer (and consequently, the application was never identified to Windows) the whole thing flags UAC every time I launch it.&lt;br /&gt;&lt;br /&gt;But, I get the Eclipse IDE downloaded, and shortcuts added to my DOCK tool, and then I have to install the SDK.&lt;br /&gt;&lt;br /&gt;Which is a much Vista-Friendlier experience than installing the Eclipse IDE.&lt;br /&gt;&lt;br /&gt;Then I run into integrating the two. This involves telling the Eclipse IDE where it can download the Android ADT package, and then allowing it access.&lt;br /&gt;&lt;br /&gt;Now, I make this sound easy in this post. The thing is, it took me two tries to get it working. My first try was two weeks ago, and after three hours of trying to get everything installed, I gave up.  Last night, I was successful, only because I followed the instructions in this &lt;a href="http://www.ehow.com/how_4525912_setup-google-android-development-environment.html"&gt;article&lt;/a&gt;.  Which despite being out-of-date, was much more informative and detailed than anything available on Google's Android Developer's website.&lt;br /&gt;&lt;br /&gt;Now maybe I'm lazy, and just haven't utilized enough of those "free" IDEs to realize the "proper" way to go about utilizing the things.  Maybe having Visual Studio's installation be hassle free has made me dumber. &lt;br /&gt;&lt;br /&gt;Yet, in the end I think  I'd rather be stupid that fight through setting up that Android Dev environment again...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-4715755347446612973?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/25HZ4INQufarjop4jPl6JLsGZ-U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/25HZ4INQufarjop4jPl6JLsGZ-U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/25HZ4INQufarjop4jPl6JLsGZ-U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/25HZ4INQufarjop4jPl6JLsGZ-U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/K4UhmJfJ67A" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/K4UhmJfJ67A/android-development.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/_0dC8-RtLatg/SQYKmuzoqEI/AAAAAAAAAbM/cyJIuSctIwc/s72-c/ecomic_icon-004.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2010/01/android-development.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-2781211907679785633</guid><pubDate>Fri, 08 Jan 2010 12:45:00 +0000</pubDate><atom:updated>2010-01-08T10:06:02.636-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">WPF</category><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">VB.Net</category><category domain="http://www.blogger.com/atom/ns#">eComic</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">Coding</category><title>Another New Version of eComic</title><description>&lt;p&gt;Well, I've finally gotten off my lazy backside and implemented a new version of &lt;a href="http://www.codeplex.com/ecomic/"&gt;eComic&lt;/a&gt;.&amp;#160; It's been up for less than 6 hours and it has already been downloaded 6 times.&amp;#160; Not bad for such a specialized application.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_0dC8-RtLatg/S0dX5-TeYYI/AAAAAAAAA9A/J24wx4rxnVU/s1600-h/ecomic20100108%5B9%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 5px 0px; display: inline; border-top: 0px; border-right: 0px" title="eComic" border="0" alt="eComic" align="left" src="http://lh4.ggpht.com/_0dC8-RtLatg/S0dX6Uw7RsI/AAAAAAAAA9E/iCPQblFrBJI/ecomic20100108_thumb%5B7%5D.png?imgmax=800" width="154" height="166" /&gt;&lt;/a&gt;Of course the primary reason I work on &lt;a href="http://www.codeplex.com/ecomic/"&gt;eComic&lt;/a&gt; is to ensure that my skills stay nifty and sharp, as well as a place to learn new tricks and technologies for my particular field.&amp;#160; &lt;/p&gt;  &lt;p&gt;Which is why that as soon as I get both the SDK and my new phone I'll try working on an ANDROID version of &lt;a href="http://www.codeplex.com/ecomic/"&gt;eComic&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;But that's neither here nor there. If you compare this to the previous version you'll notice a few things, including that the navigation box is once again on the side. I felt that it just consumed too much of the reader's screen real estate at the bottom, especially with the thought that wide-screen monitors are becoming more prevalent.&lt;/p&gt;  &lt;p&gt;Secondly, if you look to the left side of things, then you'll see that there's a ZOOM control. In addition to the slider that will allow precise (in a manner of speaking) control of the zoom, there are also a &lt;strong&gt;1:1&lt;/strong&gt; button which makes the image to be its &amp;quot;true&amp;quot; size and a &lt;strong&gt;FILL&lt;/strong&gt; button which makes the control perform a &amp;quot;Uniform&amp;quot; fill of the image currently displayed.&lt;/p&gt;  &lt;p&gt;I considered those necessary with the things like the new Microsoft tablets and netbooks that are out there, and just anyone that doesn't have the 19+ inch monitors.&lt;/p&gt;  &lt;p&gt;At the bottom, there now resides a STATUS bar, which provides little things such as the current page being viewed, as well as the name of the file. I plan on having it also provide other details that can be found in the XML objects that can be associated with a CBR file.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;So, for my next trick, this is my current plan of attack in regards to functionality for this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Work on display XML data in status bar &lt;/li&gt;    &lt;li&gt;Provide way to view NOTES text (either from a Notes.txt file or appropriate field from XML file &lt;/li&gt;    &lt;li&gt;Provide keyboard short-cuts for Menu Items found in the Ribbon bar &lt;/li&gt;    &lt;li&gt;Work on CBR (well, actually CBZ as creating RAR files requires the purchase of a library while creating ZIP files is free) editor &lt;/li&gt;    &lt;li&gt;Work on the GNZ editor &lt;/li&gt;    &lt;li&gt;Implement the 7z decompression function (cb7) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;As always, content for &lt;a href="http://www.codeplex.com/ecomic/"&gt;eComic&lt;/a&gt; can be found in many locations, or even built yourself by scanning in your newly purchased comics.&lt;/p&gt;  &lt;p&gt;But two sites that provide free (and typically public domain) content for eComic are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://goldenagecomics.co.uk/"&gt;Golden Age Comics&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.actionagecomics.com/"&gt;The Action Age!&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/947968907697915479-2781211907679785633?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1sdlkjS-Sy2iWRStMF65dsceYi0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1sdlkjS-Sy2iWRStMF65dsceYi0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1sdlkjS-Sy2iWRStMF65dsceYi0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1sdlkjS-Sy2iWRStMF65dsceYi0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/CHsGMnJRMt8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/CHsGMnJRMt8/another-new-version-of-ecomic.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_0dC8-RtLatg/S0dX6Uw7RsI/AAAAAAAAA9E/iCPQblFrBJI/s72-c/ecomic20100108_thumb%5B7%5D.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://programmer.wrighton.org/2010/01/another-new-version-of-ecomic.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-1897298467134236137</guid><pubDate>Thu, 24 Dec 2009 04:24:00 +0000</pubDate><atom:updated>2009-12-23T22:24:00.363-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Dynamics SL</category><category domain="http://www.blogger.com/atom/ns#">Microsoft</category><category domain="http://www.blogger.com/atom/ns#">Solomon</category><title>Dynamics SL....</title><description>I'm currently stretched between two projects for work. One a rather long-term system to improve the efficiency of document creation for a local loan company and the other is to assist with the customizations inherent in a Microsoft Dynamics SL (Solomon) migration from version 6.5SP1 to 7.0FP1.&lt;br /&gt;&lt;br /&gt;Now, it's that second one that I need to talk about right now, because there's something about this that I'm floored by.  The fact that there seems to be absolutely no one talking about the problems/processes/and what not that they've stumbled across while dealing with Solomon.&lt;br /&gt;&lt;br /&gt;For example, the system is very easy to customize via Visual Basic for Applications (VBA) and is in fact designed from the ground up for that purpose. You're able to move controls, add new ones, and even go so far as to add entirely new data structures to the database and gaining read/write operations against it.&lt;br /&gt;&lt;br /&gt;But, then you have to wonder, where on earth these changes are stored, and the answered to that is within a database field.&lt;br /&gt;&lt;br /&gt;Now, they shove the operations as binary data into a binary field, so looking just at the data structures one would think that there was 1 entry in this table per modification. One would think wrong, as the system would have no way of knowing what modifications would be applicable when or why or how. In fact that would be a nightmare.  No, what's happening, and why there will multiple entries per screen into the customization table is that the system only stores a maximum of 30KB per record. So basically all the VBA is changed into a binary-encrypted string, and then chunked up and stored that way.&lt;br /&gt;&lt;br /&gt;Also, there's no EASY way to identify which controls were added to the form, as it's up to the user to define the naming convention.  This can lead to things being named in the same pattern as Microsoft uses to name its controls as well  as things being called "Button1."&lt;br /&gt;&lt;br /&gt;But, if you export the customization for that screen, then you'll see a list of changes that have been made against all the controls on the screen, and from that, one is able to look and find those controls that have the "Created=True" property. It is those controls that are created by the end-user via the customization screens.&lt;br /&gt;&lt;br /&gt;That knowledge would have saved me days (as I was having search and compare the non-customized version of the screen to the customized version in order to document all the various customizations so that we could ensure they successfully made the migration), but it was no where to be found.   At least out in the open where one can find it.&lt;br /&gt;&lt;br /&gt;In fact, I gained the "&lt;a href="http://stackoverflow.com/badges/63/tumbleweed"&gt;Tumbleweed&lt;/a&gt;" badge at StackOverflow because a question I asked (which the above knowledge would have answered for me)  received low views and no responses for a decent amount of time.&lt;br /&gt;&lt;br /&gt;But hey, I'm here to spread the cheer I guess....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-1897298467134236137?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SDx8uaC1ECvOY17zTk5e_HrVSH4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SDx8uaC1ECvOY17zTk5e_HrVSH4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SDx8uaC1ECvOY17zTk5e_HrVSH4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SDx8uaC1ECvOY17zTk5e_HrVSH4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/TxZMF2x1VG8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/TxZMF2x1VG8/dynamics-sl.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2009/12/dynamics-sl.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-8045532713632764079</guid><pubDate>Thu, 19 Nov 2009 04:27:00 +0000</pubDate><atom:updated>2009-11-18T22:35:46.972-06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Patent</category><category domain="http://www.blogger.com/atom/ns#">.NET</category><category domain="http://www.blogger.com/atom/ns#">IIS</category><category domain="http://www.blogger.com/atom/ns#">ASP.Net</category><category domain="http://www.blogger.com/atom/ns#">SQL Server</category><title>IIS7 and the Case of the Reserved Reports</title><description>I had fun this morning at work hunting down something highly interesting in regards to IIS7.&lt;br /&gt;&lt;br /&gt;What was happening, is that a client had kind of.... deleted the virtual server on which a web application resided. So, it was getting redeployed to a Windows 2008 box that also performed as a SQL SERVER 2008 box.&lt;br /&gt;&lt;br /&gt;Well, my boss deployed the application, and when he went to test, it all worked, but the reports.  Every time he attempted to run a report, the only thing that came back was a "Service Unavailable" message.&lt;br /&gt;&lt;br /&gt;He upgraded the application from .NET 1.1 to 3.5, he played with the configuration values, and a host of other things up to and including special logging just for the 503 error hiding behidn the "Service Unavailable" message.&lt;br /&gt;&lt;br /&gt;Nothing worked. Every other piece of the application was happy, but any of the reports.&lt;br /&gt;&lt;br /&gt;So, we get together and start trouble shooting.&lt;br /&gt;&lt;br /&gt;First thing we do, is create a blank ASPX file that just implements a report viewer, and it still comes back as "Service Unavailable."&lt;br /&gt;&lt;br /&gt;Well, we add another new blank ASPX file, thsi time with out even the report viewer, and it still comes back as "Service Unavailable."&lt;br /&gt;&lt;br /&gt;Then we drop in a old-fashioned HTML file, and get... the exact same results.&lt;br /&gt;&lt;br /&gt;One is starting to get frustrated at this point.&lt;br /&gt;&lt;br /&gt;So, we create a new folder, and try the HTML file in it. And we get served the HTML file.&lt;br /&gt;&lt;br /&gt;So, we copy one of the existing reports into the new folder... and it works.&lt;br /&gt;&lt;br /&gt;Confused, we discuss things, and I had the brilliant idea that maybe, the system was expecting the RDLC files to be located in a different folder than the ASPX files that display them. After all, copying over the one report caused it to work, and that ASPX file points to the path of the RDLC file which it is designed to load.&lt;br /&gt;&lt;br /&gt;So, we create a new RDLC folder, move the RDLC files over to it, update all the aspx files to point to the new RDLC folder, publish, test and....&lt;br /&gt;&lt;br /&gt;get "Service Unavailable."&lt;br /&gt;&lt;br /&gt;So, we back out of all of those changes, republish, and are still getting "Service Unavailable."&lt;br /&gt;&lt;br /&gt;I have him rename the folder in Visual Studio and republish and...&lt;br /&gt;&lt;br /&gt;it works.&lt;br /&gt;&lt;br /&gt;So, we're wondering if it was just a bad compile or something. So we rename the folder back to REPORTS and republish, and upon testing get...&lt;br /&gt;&lt;br /&gt;"Service Unavailable."&lt;br /&gt;&lt;br /&gt;One can imagine the head banging upon wood desks that began at this moment.&lt;br /&gt;&lt;br /&gt;Then a horrible, horrible idea came upon me: what if "reports" was a reserved word in IIS7.&lt;br /&gt;&lt;br /&gt;Almost fearful of the results, we just change the folder name on the server from "reports" to "reporting" and it works.&lt;br /&gt;&lt;br /&gt;One is flabbergasted.&lt;br /&gt;&lt;br /&gt;So, we rename the folder in Visual Studio and then update all the links to the reports and republish, and it's happy as a lark.  It works, spits out the report and as far as it is concerned, life is good.&lt;br /&gt;&lt;br /&gt;Of course, neither myself nor my boss could believe that Microsoft would make the word REPORTS a reserved keyword for IIS.&lt;br /&gt;&lt;br /&gt;The very thought is insane, but that appeared to be what was happening.&lt;br /&gt;&lt;br /&gt;So, of course, this demanded some Google time.&lt;br /&gt;&lt;br /&gt;Ultimately, this &lt;a href="http://forums.iis.net/t/1157304.aspx"&gt;link&lt;/a&gt;  was found, and it explained the reason why the REPORTS folder was giving us a 503 error. &lt;br /&gt;&lt;br /&gt;It seems that when SQL SERVER 2008 is installed with REPORTING SERVICES, the system registered the REPORTS name with the HTTP.SYS process, which means that the request for the REPORTS folder was never actually making it to IIS.&lt;br /&gt;&lt;br /&gt;Which explained why the ASPX page wasn't being served, and why the standard HTML file wasn't being served, in fact it explained just about everything.&lt;br /&gt;&lt;br /&gt;The only thing it didn't explain is why on earth Microsoft would make this decision!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-8045532713632764079?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5Y3ADp8oRVxIw61tnaAF90bXTD4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5Y3ADp8oRVxIw61tnaAF90bXTD4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5Y3ADp8oRVxIw61tnaAF90bXTD4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5Y3ADp8oRVxIw61tnaAF90bXTD4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/uVESuPg42kw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/uVESuPg42kw/iis7-and-case-of-reserved-reports.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2009/11/iis7-and-case-of-reserved-reports.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-7311994206742427483</guid><pubDate>Fri, 25 Sep 2009 01:40:00 +0000</pubDate><atom:updated>2009-09-24T20:40:00.258-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">WPF</category><category domain="http://www.blogger.com/atom/ns#">VB.Net</category><category domain="http://www.blogger.com/atom/ns#">Windows</category><category domain="http://www.blogger.com/atom/ns#">programming</category><category domain="http://www.blogger.com/atom/ns#">Coding</category><category domain="http://www.blogger.com/atom/ns#">Visual Studio</category><title>Keeping Track Of Non-Modal Dialog Windows</title><description>I had a problem.&lt;br /&gt;&lt;br /&gt;My problem revolved around a modal dialog window.  One which the user base needed to be non-modal.&lt;br /&gt;&lt;br /&gt;Now, initially, that sounds like an easy task. It's just a matter of changing the ShowDialog method to a simple Show.&lt;br /&gt;&lt;br /&gt;But that's just initially.  &lt;br /&gt;&lt;br /&gt;The problem comes because this dialog was editing the elements of a list. So, for each page viewed, I could have 1-to-N dialogs, spread out over 1-to-N pages.  And I couldn't re-use the dialog windows over and over again.&lt;br /&gt;&lt;br /&gt;Of course, even this is not THAT big of an issue--at least until you realize that there is a situation where I do need to re-use a dialog window. Basically whenever a user clicks on an already displayed line item, I need to bring that dialog to the front as opposed to popping a new one up.&lt;br /&gt;&lt;br /&gt;And this had to be done without having a handle on the forms, and the control which is spawning these dialogs (and its parents) are not set up as MDI parents.&lt;br /&gt;&lt;br /&gt;So, what the provides is the following list of issues:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Need to be able to launch N dialogs&lt;/li&gt;&lt;li&gt;Those N Dialogs cannot be re-used across list items&lt;/li&gt;&lt;li&gt;If a list item is already loaded in a dialog, that dialog just needs to be granted focus&lt;/li&gt;&lt;li&gt;No MDI Interface &amp;amp; no time to implement a traditional MDI interface&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So, I turned to my trusty friend GOOGLE, and found pretty much zip.  Apparently, most non-modal dialogs are either a singleton type thing or they're spawned and forgotten.  Which for the most part, that's the case. I can see that the constraints that I'm working under are not common.&lt;br /&gt;&lt;br /&gt;So, after thinking some more, I create a new project in Visual Studio to allow me to play with things.  I tried grabbing the HWND object for my dialog but that was obscenely bulky and prone to errors.&lt;br /&gt;&lt;br /&gt;Then I had the grand idea of keeping a list of these dialog windows in my control. That way I would have a handle for all of them.&lt;br /&gt;&lt;br /&gt;So I tried  it. I launched three different list item elements, all of them popped up. When I went back to the main form, and clicked one of those list item elements again, the correct dialog gained focus. I was scrubbing my hands and getting ready to do that "I control the world and am a genius" cackle. &lt;br /&gt;&lt;br /&gt;But I had one last test, which is I closed one of the dialog and then clicked its corresponding list item.&lt;br /&gt;&lt;br /&gt;And got nothing. Zilch. &lt;br /&gt;&lt;br /&gt;After a quick breakpoint add, I discovered that those closed dialogs still existed in my list.&lt;br /&gt;&lt;br /&gt;So, I proceed to bang my head on my desk.&lt;br /&gt;&lt;br /&gt;Then I went and retreived my boss, and presented the problem to him, hoping he'd have some brilliant idea. Which he failed to grasp the problem until I reminded him that whole "there's no MDI" thing, at which point he got this kind of sick/amazed/amused look and basically told me I should have fun trying to solve this one.&lt;br /&gt;&lt;br /&gt;Which is when I remembered events.&lt;br /&gt;&lt;br /&gt;Oh those beautiful, wonderful things called events. &lt;br /&gt;&lt;br /&gt;What had slipped my mind is that an event is raised to the window and then sent down the control chain until it finds a control that basically says "I'm supposed to handle that!"&lt;br /&gt;&lt;br /&gt;So I go into my code, and to the CLOSING event of the dialog I add a new event that I raised. One that is consumed by my calling class.&lt;br /&gt;&lt;br /&gt;When I handle said event, I know that I can remove the associated dialog from my list of open dialogs.&lt;br /&gt;&lt;br /&gt;And wouldn't you know it, it all works just about perfectly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-7311994206742427483?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/4DvJOwuEQWFRFxsmgMMKJWE3278/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4DvJOwuEQWFRFxsmgMMKJWE3278/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/4DvJOwuEQWFRFxsmgMMKJWE3278/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/4DvJOwuEQWFRFxsmgMMKJWE3278/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/b8_msMHAOTM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/b8_msMHAOTM/keeping-track-of-non-modal-dialog.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2009/09/keeping-track-of-non-modal-dialog.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-8634785625743688929</guid><pubDate>Thu, 10 Sep 2009 12:48:00 +0000</pubDate><atom:updated>2009-09-10T09:13:38.811-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Web</category><category domain="http://www.blogger.com/atom/ns#">Usability</category><category domain="http://www.blogger.com/atom/ns#">User Interface</category><title>CAPTCHA Usability</title><description>Here's a secret, I despise CAPTCHA's.  I hate them. I think they are one of the most user-unfriendly form elements in existence.&lt;br /&gt;&lt;br /&gt;Most of the time, I can barely read them.&lt;br /&gt;&lt;br /&gt;I understand their purpose, and I know why they exist. But that doesn't mean that I actually like the things, and it definitely doesn't mean that I like entering data into them.&lt;br /&gt;&lt;br /&gt;But then there's the ones that I find are actively HOSTILE to the end user.&lt;br /&gt;&lt;br /&gt;After all, the usage pattern for these evil things is fairly standard, everyone knows what to do:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Squint and try and make out the relevant letters&lt;/li&gt;&lt;li&gt;Type those letters in as they are displayed&lt;/li&gt;&lt;li&gt;Press the submit icon/button/dongle/blood letting device&lt;/li&gt;&lt;/ol&gt;This process has become ingrained. It's what we expect.&lt;br /&gt;&lt;br /&gt;Which is where I get to that hostile statement above.&lt;br /&gt;&lt;br /&gt;I found one of these captchas, and entered the data, and it came back invalid.&lt;br /&gt;&lt;br /&gt;So I entered it again, with the same results.&lt;br /&gt;&lt;br /&gt;And again, and again.&lt;br /&gt;&lt;br /&gt;Finally, I was starting to want to smack the website's author when I noticed something.&lt;br /&gt;&lt;br /&gt;Instructions.&lt;br /&gt;&lt;br /&gt;Who puts instructions on a captcha I thought to myself as I began to read.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_0dC8-RtLatg/SqkI3HNHbUI/AAAAAAAAA5w/oDAj9D7di70/s1600-h/hostilecaptcha.png"&gt;&lt;img style="margin: 10px auto; display: block; text-align: center; cursor: pointer; width: 320px; height: 50px;" src="http://3.bp.blogspot.com/_0dC8-RtLatg/SqkI3HNHbUI/AAAAAAAAA5w/oDAj9D7di70/s320/hostilecaptcha.png" alt="" id="BLOGGER_PHOTO_ID_5379840972790656322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;For posterity, I made a screen shot. And in case you were wondering, this is the context of that block of text:&lt;br /&gt;&lt;span class="gen"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span class="gen"&gt;Confirmation code &lt;span style="color: rgb(255, 0, 0);"&gt;READ THIS INSTRUCTION CAREFULLY&lt;/span&gt;: * &lt;/span&gt;&lt;br /&gt;&lt;span class="gensmall"&gt;&lt;b&gt;Type a lower-case "w" into the box and then follow it&lt;/b&gt; with the code exactly as you see it. The code is case sensitive and zero has a diagonal line through it. The initial "w" is necessary - the system will reject your registration if you do not include it&lt;/span&gt;&lt;/blockquote&gt;Yes, they REQUIRE you to type a lower-case "w" as the first letter of the field.&lt;br /&gt;&lt;br /&gt;Why? As far as I know it's just to annoy anyone trying to register for their site.&lt;br /&gt;&lt;br /&gt;My ultimate thought: poor, poor design.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-8634785625743688929?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/fH4BQdHFSr6NJnypmiz6z01H6Nw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fH4BQdHFSr6NJnypmiz6z01H6Nw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/fH4BQdHFSr6NJnypmiz6z01H6Nw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/fH4BQdHFSr6NJnypmiz6z01H6Nw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/SkJL_oIlxPc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/SkJL_oIlxPc/captcha-usability.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_0dC8-RtLatg/SqkI3HNHbUI/AAAAAAAAA5w/oDAj9D7di70/s72-c/hostilecaptcha.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://programmer.wrighton.org/2009/09/captcha-usability.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-5110830407329090092</guid><pubDate>Wed, 09 Sep 2009 23:40:00 +0000</pubDate><atom:updated>2009-09-09T18:40:00.442-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Patent</category><category domain="http://www.blogger.com/atom/ns#">Misc</category><title>More Patent Shenanigans...</title><description>Apparently, a company has patented cross-communication between applets of an application utilizing a shared data store with both relational and objective data.&lt;br /&gt;&lt;br /&gt;What that means is that someone patented the concept of including those Apps in Facebook and Twitter and any other application which uses plug-ins (including FireFox and Visual Studio) and a data store and a global network.&lt;br /&gt;&lt;br /&gt;What is sad is that they've convinced a judge that there is reason to force Facebook to provide them the ability to review Facebook's source code.&lt;br /&gt;&lt;br /&gt;Yes, a United States Federal judge has told a company that they must divulge trade, copyrighted secrets to a competitor in order for that competitor to successfully sue them.&lt;br /&gt;&lt;br /&gt;All because Leader Technologies patented the concept of plug-in software.&lt;br /&gt;&lt;br /&gt;I'm sickened by this, and see it as yet another reason why software patents need to disappear forever.&lt;br /&gt;&lt;br /&gt;Of course if I was Facebook, I would facilitate the review of my source code by providing it in hard copy format.&lt;br /&gt;&lt;br /&gt;After all, Facebook wouldn't want to step on anyone's toes by possibly using infringing software that features such niceties as the "Find" function or source code formatting.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-5110830407329090092?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/27a8ZM74GMssp5AGx8ZxScXda3g/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/27a8ZM74GMssp5AGx8ZxScXda3g/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/27a8ZM74GMssp5AGx8ZxScXda3g/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/27a8ZM74GMssp5AGx8ZxScXda3g/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/nhOtoBiBJM4" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/nhOtoBiBJM4/more-patent-shenanigans.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2009/09/more-patent-shenanigans.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-947968907697915479.post-5123164296366977650</guid><pubDate>Wed, 09 Sep 2009 01:15:00 +0000</pubDate><atom:updated>2009-09-08T20:15:00.377-05:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Patent</category><category domain="http://www.blogger.com/atom/ns#">Misc</category><title>Software Patents Are Insane</title><description>I'm a Software Engineer.  I design and build software systems. It's what I do. Even when I'm off work, I design and build software systems.&lt;br /&gt;&lt;br /&gt;And I hate software patents.&lt;br /&gt;&lt;br /&gt;I firmly believe that they are one of (if not THE) worst idea that has ever been inflicted upon my industry and craft.&lt;br /&gt;&lt;br /&gt;Case in point, have you ever typed into the address bar of your web-browser and gone to a website without having to type in the entire domain name?  For example, I'll type in "&lt;span style="font-weight: bold;"&gt;Facebook&lt;/span&gt;" and be taken to &lt;span style="font-weight: bold;"&gt;http://www.facebook.com&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;It's a reasonable action on the part of the browser and it makes sense. Additionally, it's functionality that's been around for many, many years now.&lt;br /&gt;&lt;br /&gt;Which of course means that it is now patented.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.techcrunch.com/2009/09/08/israeli-company-lands-us-patent-that-could-make-internet-search-giants-pay/"&gt;TechCrunch &lt;/a&gt;has an article about an Israeli company that has received a new patent for that behavior (and for the "I'm Feeling Lucky" button that's been on Google's homepage for probably a decade now).&lt;br /&gt;&lt;br /&gt;What this means is that browsers and search engines are either going to have to change the functionality that people expect and use, or pay a hefty sum in order to keep the functionality.&lt;br /&gt;&lt;br /&gt;This is insane.&lt;br /&gt;&lt;br /&gt;As a recent &lt;a href="http://www.cato.org/tech/tk/090828-tk.html"&gt;CATO article described&lt;/a&gt;, imagine if a certain type of plot twist was patented.  Imagine, never again being able to read about someone suddenly being alive again. Never getting to see that type of literary device used in movies, comics, books or television shows.   Unless the company using it paid someone a hefty dollop of dollars.&lt;br /&gt;&lt;br /&gt;Sounds insane doesn't it? &lt;br /&gt;&lt;br /&gt;Yet, we're perfectly accepting of the insanity in the software field?&lt;br /&gt;&lt;br /&gt;No.  Or at least, I think it's insane and pray that the upcoming Supreme Court case overturns the ability to patent software. &lt;br /&gt;&lt;br /&gt;After all, we all need to remember that software systems are not inventions.&lt;br /&gt;&lt;br /&gt;They are copyrightable works of art.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/947968907697915479-5123164296366977650?l=programmer.wrighton.org' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ABPTkTbxjviS21SoPHBG1FXycAs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ABPTkTbxjviS21SoPHBG1FXycAs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ABPTkTbxjviS21SoPHBG1FXycAs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ABPTkTbxjviS21SoPHBG1FXycAs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AProgrammersDream/~4/qTyOrTbInUo" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/AProgrammersDream/~3/qTyOrTbInUo/software-patents-are-insane.html</link><author>noreply@blogger.com (Stephen Wrighton)</author><thr:total>0</thr:total><feedburner:origLink>http://programmer.wrighton.org/2009/09/software-patents-are-insane.html</feedburner:origLink></item></channel></rss>

