﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>bloggingonit.com -- IT Blog Feeds Consolidated</title>
    <link>http://www.bloggingonit.com</link>
    <description>IT Blog Feeds Consolidated</description>
    <copyright>Copyright 2006 bloggingonit.com</copyright>
    <language>en-us</language>
    <lastBuildDate>Tue, 21 Feb 2006 17:25:21 GMT</lastBuildDate>
    <category>IT Blogs</category>
    <ttl>60</ttl>
    <image>
      <url>http://www.bloggingonit.com/logo.gif</url>
      <title>bloggingonit.com</title>
      <link>http://www.bloggingonit.com/</link>
    </image>
    <item>
      <title>New Version of YEG Buildings up</title>
      <link>http://www.opgenorth.net/2010/08/28/new-version-of-yeg-buildings-up/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=new-version-of-yeg-buildings-up</link>
      <description>Last night I pushed a new build of YEG Buildings out to the Android Market. The two changes with this one: Rather than showing the latitude/longitude of were you are, the application will try to translate that into a more human-friendly address.&amp;#160; Note that the address might not be 100% accurate.&amp;#160; It depends on how [...]</description>
      <guid>http://www.opgenorth.net/2010/08/28/new-build-of-yeg-buildings-up/</guid>
      <pubDate>Sat, 28 Aug 2010 08:56:04 -0700</pubDate>
      <encoded>&lt;p&gt;Last night I pushed a new build of &lt;a rel="nofollow" target="_blank" href="http://www.androidzoom.com/android_applications/reference/yeg-buildings_icyx.html"&gt;YEG Buildings&lt;/a&gt; out to the Android Market. The two changes with this one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rather than showing the latitude/longitude of were you are, the application will try to translate that into a more human-friendly address.&amp;#160; Note that the address might not be 100% accurate.&amp;#160; It depends on how much accuracy the GPS has.&lt;/li&gt;
&lt;li&gt;The application no longer uses Google Maps and a KML feed when show where all the historical buildings in Edmonton are.&amp;#160; The map of Edmonton is now rendered locally, and all &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just for fun, I also &lt;a rel="nofollow" target="_blank" href="http://contest.apps4edmonton.ca/apps/21"&gt;submitted YEG Buildings&lt;/a&gt; as part of the &lt;a rel="nofollow" target="_blank" href="http://contest.apps4edmonton.ca/"&gt;Apps4Edmonton contest&lt;/a&gt;.&amp;#160; So, feel free to check out the contest page – there are a lot of neat applications there.&amp;#160; Also feel free to vote mine up.&amp;#160; &lt;img src='http://www.opgenorth.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley'/&gt; &lt;/p&gt;
&lt;p&gt;If you are using or have used YEG Buildings, feel free to let me know your thoughts.&amp;#160; If you find a bug, let me know.&amp;#160; If you have a feature you’d like to see, I’d love to hear about it.&lt;/p&gt;</encoded>
    </item>
    <item>
      <title>Integration - Is It Worth It?</title>
      <link>http://haveyougotwoods.com/archive/2010/08/28/317.aspx</link>
      <description>One thing I get asked to do a lot is integrate systems with each other or incorporate other systems into one we are currently building. In a lot of scenarios I have been starting to give some pushback on this. Sure integration is cool and all but should it be done?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Expense&lt;/span&gt;&lt;br /&gt;
The first (and ongoing) issue is the expense of integrating systems. First you have to understand the systems (or at least the APIs being exposed) of each system which can take a lot of time. Secondly we have to write code to integrate the services and adapt concepts from one system to another. This work also needs to be tested and debugged. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Perpetuating The Legacy&lt;/span&gt;&lt;br /&gt;
The bigger issue I have seen in organizations is that tying a legacy system into your system makes it harder to change or replace the legacy system. If a legacy system has 3-4 systems that depend on it then any changes have to be tested and approved by the consuming systems (expense again). &lt;br /&gt;
&lt;br /&gt;
If we want to replace the legacy system with something better then we have two options. We can either rewrite the system and keep the old API exposed or we can throw it away and force our consumers to change. Rewriting a system and keeping the API may work IF the original API was perfect (or close to perfect). In practice I find that the API is ok but if a person were to rewrite it they could alleviate a lot of the issues and shortcomings discovered over the years. If we do a brand new interface then all our consumers need to change their code which can be.... expensive.&lt;br /&gt;
&lt;br /&gt;
From being in this situation before I have compromised. I created a new system with a better API that was more expressive and simpler to use. I then created a separate project that exposed the old API and translated that to the new API. This does add some performance overhead in translation and lots of things to test (expensive). It does allow new consumers to use a better API and allowed consumers of the old system to decide if it was worth migrating to the new API. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Integration For Integrations Sake&lt;/span&gt;&lt;br /&gt;
Many people automatically assume that if the information is in another system that we should integrate the two systems. This does help centralize rules, reduce duplication, and centralize information. This is all true but not always necessary. I would find it acceptable to have some minor duplication if it eliminated a coupling on another system. This is a very careful call to make though as this duplication can lead to duplication of maintainance. Even worse it can lead to their now being two sources of data so when a third system comes along it now consumes both sources for data to try and determine which one is accurate.&lt;br /&gt;
&lt;br /&gt;
One classic example I have is from a client of mine. They have a system that dispatches their vehicles and another system that uses GPS to track their vehicles. They asked for these systems to be integrated as they are always switching between the two. In this case the value of integrating the systems was very low. Instead I recommend that all their operators get two monitors and have both applications open. This is not the 100% perfect solution (unless you are an accountant) but it gets the job done for the right price.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Alternatives&lt;/span&gt;&lt;br /&gt;
There are ways to integrate but not integrate. One of the simpler ones is to have a button/link/menu item/whatever that fires up a system you would normally integrate with and pass along necessary data. I.e. a button that runs "otherProgram.exe /RunSalesReport 10-10-2009 10-10-2010" or http://server/SalesReport.aspx?start=10-10-2009&amp;amp;end=10-10-2010. Granted there is a bit of coupling there and some things to maintain but not as much as if we had to call a service, translate the results, and show it on a UI.&lt;br /&gt;
&lt;br /&gt;
Another method is to use manual entry. An example of this would be to use one system to find a product and then type that products manufacture code into your system you are building. Sure it is not as fast and the costs of this slowdown will add up over time but is the cost of integration still higher than the cost it takes for a user to copy/paste a code from one program to another? Not an easy question to answer but one that should be evaluated.&lt;br /&gt;
&lt;br /&gt;
The last method is one typically avoided: double entry. This is where the same (or similar) data is entered into two separate systems. An example of this might be for a sales operation. It may be acceptable for the sales system to have a list of all products, descriptions, and prices of products that they sell. The warehouse system might have its one list of products, dimensions, and inventory levels. As long as when a sale comes in that the order can be filled AND that the sales system does not need to know inventory levels when they make a sale (i.e. if there is none in the warehouse it will just get backordered). This is a very tight line to walk as if an item were entered into one system incorrectly the customer may order 20 Widgets but instead get 20 Gadgets due to the product codes not lining up.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Final Thoughts&lt;/span&gt;&lt;br /&gt;
I have learned that integration is more expensive than I first thought it would be. I thought that reducing code I had to write would make life easier. It does in some ways but in other ways it adds overhead to development and maintenance. If we just stop and think if it is really necessary to tie two systems together then we might just have a little less coupling and a little more freedom to upgrade some legacy systems. Not integrating is not the only solution.... but neither is integrating. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://haveyougotwoods.com/aggbug/317.aspx" width="1" height="1"/&gt;</description>
      <guid>http://haveyougotwoods.com/archive/2010/08/28/317.aspx</guid>
      <pubDate>Sat, 28 Aug 2010 07:56:46 -0700</pubDate>
    </item>
    <item>
      <title>New Version of YEG Buildings (formerly Historical Buildings)</title>
      <link>http://www.opgenorth.net/2010/08/26/new-version-of-yeg-buildings-formerly-historical-buildings/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=new-version-of-yeg-buildings-formerly-historical-buildings</link>
      <description>After a few months of neglect, I put a new version of my Edmonton Historical Buildings application up on the Android Market.&amp;#160; I’ve renamed it to just YEG Buildings, as I’d like to eventually include buildings that aren’t historical, but interesting in general for some reason.&amp;#160; The previous version had a nasty bug that would [...]</description>
      <guid>http://www.opgenorth.net/2010/08/26/new-version-of-yeg-buildings-formerly-historical-buildings/</guid>
      <pubDate>Thu, 26 Aug 2010 16:34:00 -0700</pubDate>
      <encoded>&lt;p&gt;After a few months of neglect, I put a new version of my Edmonton Historical Buildings application up on the Android Market.&amp;#160; I’ve renamed it to just &lt;a rel="nofollow" target="_blank" href="http://www.androidzoom.com/android_applications/reference/yeg-buildings_icyx.html"&gt;YEG Buildings&lt;/a&gt;, as I’d like to eventually include buildings that aren’t historical, but interesting in general for some reason.&amp;#160; The previous version had a nasty bug that would crash when you tried to view the location of a building on the map.&amp;#160; Was one of those curious things where it worked in the emulator but not on a real device.&amp;#160; I’ve tried it out on my HTC Dream running &lt;a rel="nofollow" target="_blank" href="http://www.cyanogenmod.com/"&gt;Cyanogen 6.0 RC3&lt;/a&gt; (this is Android 2.2), and it seemed to work.&amp;#160; &lt;/p&gt;
&lt;p&gt;I’ve also added a feature where you could see all the Historical Buildings from the &lt;a rel="nofollow" target="_blank" href="http://data.edmonton.ca"&gt;City Of Edmonton’s Data Catalogue&lt;/a&gt; at once in Google Maps.&amp;#160; It’s a bit slow (mostly for reasons beyond my control at this point), but it basically works.&lt;/p&gt;
&lt;p&gt;You can download it from the Android Market, or via this &lt;a rel="nofollow" target="_blank" href="http://www.androidzoom.com/android_applications/reference/yeg-buildings_icyx_download.html"&gt;handy page&lt;/a&gt; at &lt;a rel="nofollow" target="_blank" href="http://www.androidzoom.com"&gt;AndroidZoom&lt;/a&gt;.&amp;#160; You’ll need Android 1.6 or higher.&lt;/p&gt;</encoded>
    </item>
    <item>
      <title>Using IntelliJ for Android Development – the Sequel</title>
      <link>http://www.opgenorth.net/2010/08/24/using-intellij-for-android-development-the-sequel/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=using-intellij-for-android-development-the-sequel</link>
      <description>A while ago, I posted a blog article about using IntelliJ for Android development.&amp;#160; Given that was a year ago, and one version of IntelliJ later, I thought I would do a follow up post.&amp;#160; Long story short (and to sound like a TV commercial):&amp;#160; I liked IntelliJ IDEA 9 so much, I bought a [...]</description>
      <guid>http://www.opgenorth.net/2010/08/24/using-intellij-for-android-development-the-sequel/</guid>
      <pubDate>Tue, 24 Aug 2010 14:26:00 -0700</pubDate>
      <encoded>&lt;p&gt;A while ago, I posted a blog article about &lt;a rel="nofollow" target="_blank" href="http://www.opgenorth.net/2009/06/19/using-intellij-for-android-development-2/"&gt;using IntelliJ for Android development&lt;/a&gt;.&amp;#160; Given that was a year ago, and one version of IntelliJ later, I thought I would do a follow up post.&amp;#160; Long story short (and to sound like a TV commercial):&amp;#160; I liked IntelliJ IDEA 9 so much, I bought a license.&lt;/p&gt;
&lt;p&gt;Since I blogged last year, the Android plug-in for IntelliJ has really matured.&amp;#160; I guess the only draw back to it is that you only get the Android plug-in when you buy the Unlimited Edition of IntelliJ – it’s not in the Community Edition.&amp;#160; Here are some general comments/thoughts/observations of mine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It’s cool to have IntelliSense in the XML files.&amp;#160; One of the biggest failings of Android (perhaps Java in general?) is the painful lack of a surface designer for a user interface.&amp;#160; &lt;a rel="nofollow" target="_blank" href="http://www.droiddraw.org/"&gt;DroidDraw&lt;/a&gt; is tolerable with enough &lt;a rel="nofollow" target="_blank" href="http://www.malts.com/index.php/Gateway-en"&gt;scotch&lt;/a&gt;.&amp;#160; One could say say the same thing about the UI “designer” that comes with the &lt;a rel="nofollow" target="_blank" href="http://developer.android.com/sdk/eclipse-adt.html"&gt;ADT&lt;/a&gt;.&amp;#160; So, much of the time I find myself just plugging away at the UI in XML.&amp;#160; Sub-optimal, but I don’t have the resources to write a nice designer for the Android layout files, so I’ll just pour another double of Talisker and carry on.&amp;#160; &lt;img src='http://www.opgenorth.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley'/&gt; &lt;/li&gt;
&lt;li&gt;I like the fact that, as a Resharper junkie, IntelliJ seems very natural to me to use.&amp;#160; The keyboard mappings are not 100% between IntelliJ and Resharper, but that is merely semantics. I find that within about 30 minutes or so I’ve recovered from the differences and that I don’t suffer to much of a penalty switching between the two.&lt;/li&gt;
&lt;li&gt;I’m a bit more structured when it comes to deplopyment.&amp;#160; I don’t like how IntelliJ wraps all the deployment magic for me.&amp;#160; Don’t get me wrong – it’s handy as all hell for development and getting an APK on my phone real quick.&amp;#160; For production level stuff though, I’m finding that Rake more than handles what I need done.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, with &lt;a rel="nofollow" target="_blank" href="http://www.monodroid.net/"&gt;Monodroid&lt;/a&gt; now in a closed beta and looming in the future, perhaps IntelliJ will be redundant to me?&amp;#160; Can I actually just write my Android applications in C# and forget about Java? As &lt;a rel="nofollow" target="_blank" href="http://www.monodroid.net/"&gt;Monodroid&lt;/a&gt; is in a closed beta, I can’t really comment much about it at this point in time.&amp;#160; I think I can say, without the &lt;a rel="nofollow"&gt;Mono&lt;/a&gt; gods smiting me from above with hail, thunder, and lightening, that I’m cautiously optimistic that Monodroid will be appealing to those who want to target mobile devices.&lt;/p&gt;
&lt;p&gt;So, over-all impression:&amp;#160; &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I like IntelliJ better than Eclipse for Android development. &lt;/li&gt;
&lt;li&gt;I’d say that IntelliJ is worth the money I spent on the unlimited license.&amp;#160; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;This claim may not be valid in all states.&amp;#160; It is also void where prohibited by law.&amp;#160; There is a good chance that it may not apply in Quebec.&amp;#160; This definitely does not include batteries.&amp;#160; YMMV.&lt;/em&gt;&lt;/p&gt;</encoded>
      <category>Android</category>
    </item>
    <item>
      <title>Learn From My Mistakes?</title>
      <link>http://haveyougotwoods.com/archive/2010/08/20/316.aspx</link>
      <description>One of my frustrations with Silverlight has been that the async model is rammed down your throat. I understand the reasoning that it is good to have the UI thread responsive while long running calls are happening. But to me that is something that I code and I control. &lt;br /&gt;
&lt;br /&gt;
The thing that gets me is that there are times where several network operations may have to happen in sequence. Here is a simple contrived example:&lt;br /&gt;
&lt;br /&gt;
var service = new VehicleRentalService();&lt;br /&gt;
if (service.AreVehiclesAvailableToRent())&lt;br /&gt; {&lt;br /&gt; txtNumberOfCars.Text = service.GetNumberOfCarsForRent();&lt;br /&gt; if (service.IsTheFlakyOnlineRentalServiceRunning())&lt;br /&gt; {&lt;br /&gt; btnBookOnline.Enabled = true;&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;
&lt;br /&gt;
Now for the above example I would run all this on 1 background thread (leaving the UI nice and responsive) and make sure that I properly delegate the control changes to the UI thread (as controls are not thread safe).&lt;br /&gt;
&lt;br /&gt;
Silverlight forces us to async the calls which leads to a lot of functions that chain together. I find this makes the code a lot harder to read and a lot harder to understand. Here is a hand written rewrite of the above example:&lt;br /&gt;
&lt;br /&gt;
public function Start()&lt;br /&gt;
{&lt;br /&gt;
&lt;div style="margin-left:40px;"&gt;var service = new VehicleRentalService();&lt;br /&gt;
service.AreVehiclesAvailableToRentCompleted+=VehiclesAvailableToRentResponseRecieved;&lt;br /&gt;
service.GetNumberOfCarsForRentCompleted+=NumberOfCarsForRentResponseRecieved;&lt;br /&gt;
service.IsTheFlakyOnlineRentalServiceRunningCompleted+=IsTheFlakyOnlineRentalServiceRunningResponseRecieved;&lt;br /&gt;
&lt;br /&gt;
service.AreVehiclesAvailableToRent();&lt;br /&gt;
&lt;/div&gt;
}&lt;br /&gt;
&lt;br /&gt;
public function VehiclesAvailableToRentResponseRecieved(object sender, VehiclesAvailableToRentCompletedEventArgs e)&lt;br /&gt;
{&lt;br /&gt; if (e.Result)&lt;br /&gt; {&lt;br /&gt; service.GetNumberOfCarsForRent();&lt;br /&gt; service.IsTheFlakyOnlineRentalServiceRunning();&lt;br /&gt; }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public function NumberOfCarsForRentResponseRecieved(object sender, NumberOfCarsForRentCompletedEventArgs e)&lt;br /&gt;
{&lt;br /&gt; Dispatcher.BeginInvoke(delegate { txtNumberOfCars.Text = e.Result });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public function IsTheFlakyOnlineRentalServiceRunningResponseRecieved(object sender, IsTheFlakyOnlineRentalServiceRunningResponseRecievedCompletedEventArgs e)&lt;br /&gt;
{&lt;br /&gt; Dispatcher.BeginInvoke(delegate { btnBookOnline.Enabled = e.Result });&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
(Some may argue that there should be a GetSystemStatus method on the service that returns all this info to which I would probably agree. For the sake of this post though I am going to run with it).&lt;br /&gt;
&lt;br /&gt;
So the Silverlight code is longer, harder to read, and harder to maintain. It does have the benefit of getting the number of cars for rent and checking if the online booking system is running at the same time which is a nice plus. &lt;br /&gt;
&lt;br /&gt;
For an example a log more complicated than this one I was using a WebRequest to converse with a server in a very back and forth fashion and found that the code quickly became very hard to read so I set about to change things. My idea was to create a class that uses async calls in the background but appear to be synchronous by blocking the caller. i.e. &lt;br /&gt;
&lt;br /&gt;
string customerData = Request.GetResponse("http://www.dummy.com/getcustomer.aspx", "CustomerId=1");&lt;br /&gt;
string customerAddress = Request.GetResponse("http://www.dummy.com/getaddress.aspx", ParseOutAddressId(customerData));&lt;br /&gt;
&lt;br /&gt;
PLEASE DO NOT USE THIS CODE AS IT DOES NOT WORK (hence the post title):&lt;br /&gt;
&lt;br /&gt; public class SyncRequestResponse&lt;br /&gt; {&lt;br /&gt; ManualResetEvent _requestCompleted;&lt;br /&gt; private WebRequest _request;&lt;br /&gt; private string _postData;&lt;br /&gt; private Uri _requestUrl;&lt;br /&gt; private static string _result;&lt;br /&gt;
&lt;br /&gt; public string GetResponse(Uri requestUrl, string postData)&lt;br /&gt; {&lt;br /&gt; _requestCompleted=new ManualResetEvent(false);&lt;br /&gt; _requestCompleted.Reset();&lt;br /&gt; _postData = postData;&lt;br /&gt; _requestUrl = requestUrl;&lt;br /&gt; StartRequest();&lt;br /&gt; _requestCompleted.WaitOne(1000); //block current thread until the response is received or the timeout is reached&lt;br /&gt; return _result; //the result should be filled now&lt;br /&gt; }&lt;br /&gt;
&lt;br /&gt; private void StartRequest()&lt;br /&gt; {&lt;br /&gt; _request = WebRequest.Create(_requestUrl);&lt;br /&gt; _request.ContentType = "application/x-www-form-urlencoded";&lt;br /&gt; _request.Method = "POST";&lt;br /&gt; _request.BeginGetRequestStream(GetRequestStreamCompleted, null);&lt;br /&gt; }&lt;br /&gt;
&lt;br /&gt; private void GetRequestStreamCompleted(IAsyncResult result)&lt;br /&gt; {&lt;br /&gt; //request stream has returned so fill it&lt;br /&gt; var content = Encoding.UTF8.GetBytes(_postData);&lt;br /&gt; var stream = _request.EndGetRequestStream(result );&lt;br /&gt; stream.Write(content, 0, content.Length);&lt;br /&gt; stream.Close();&lt;br /&gt; _request.BeginGetResponse(GetResponseFromRequest, null);&lt;br /&gt; }&lt;br /&gt;
&lt;br /&gt; private void GetResponseFromRequest(IAsyncResult ar)&lt;br /&gt; {&lt;br /&gt; var response = _request.EndGetResponse(ar);&lt;br /&gt; var sr = new StreamReader(response.GetResponseStream());&lt;br /&gt; _result = sr.ReadToEnd();&lt;br /&gt; _requestCompleted.Set();&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
What I quickly found was that the second my WaitOne() line ran was that the background methods would also hang. After a lot of mucking about and some research I found out one very important thing. The WebRequest and WebResponse methods call interacts with the browsers plugin API which runs on.... the UI thread. So by blocking the UI thread it also blocks any calls to the plugin API which blocks my WebRequest methods.&lt;br /&gt;
&lt;br /&gt;
So to solve this I could probably place my sync wrapper onto a background thread to implement the back and forth conversations and then raise an event when it is done but after mucking around it just makes things too complex to read, follow, and maintain. It may still have its uses one day... but it was not as clean as I would like&lt;br /&gt;
&lt;br /&gt;
Solution?&lt;br /&gt;
My main issue is when you have async methods that change so for WebRequest calls I decided to inline the callback methods it used. Again it is ugly but I find it simpler to follow a linear action:&lt;br /&gt;
&lt;br /&gt;
public string GetCustomerDataAndBindItToTextBox(Uri requestUrl, string postData)&lt;br /&gt; {&lt;br /&gt; var request = WebRequest.Create(requestUrl);&lt;br /&gt; request.ContentType = "application/x-www-form-urlencoded";&lt;br /&gt; request.Method = "POST";&lt;br /&gt; request.BeginGetRequestStream(delegate(IAsyncResult result)&lt;br /&gt; {&lt;br /&gt; byte[] content = Encoding.UTF8.GetBytes(postData);&lt;br /&gt; Stream stream = request.EndGetRequestStream(result);&lt;br /&gt; stream.Write(content, 0, content.Length);&lt;br /&gt; stream.Close();&lt;br /&gt; request.BeginGetResponse(delegate (IAsyncResult result2)&lt;br /&gt; {&lt;br /&gt; WebResponse response = request.EndGetResponse(result2);&lt;br /&gt; var sr = new StreamReader(response.GetResponseStream());&lt;br /&gt; this.txtCustomer.Text = sr.ReadToEnd();&lt;br /&gt; }, null);&lt;br /&gt; }, null);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt; }&lt;br /&gt;&lt;img src="http://haveyougotwoods.com/aggbug/316.aspx" width="1" height="1"/&gt;</description>
      <guid>http://haveyougotwoods.com/archive/2010/08/20/316.aspx</guid>
      <pubDate>Fri, 20 Aug 2010 18:06:05 -0700</pubDate>
      <category>General</category>
    </item>
    <item>
      <title>MVVM and Designer Data</title>
      <link>http://haveyougotwoods.com/archive/2010/08/19/315.aspx</link>
      <description>Over the last week I have been playing around with Silverlight and the Model View View Model (MVVM) pattern that I have heard such great things about. So far it is a really nice way to separate the UI logic from the UI and make it easily testable. &lt;br /&gt;
&lt;br /&gt;
One of the things I loved in Silverlight was the support for design time data. Design time data allowed you to specify dummy data that would appear in VS/Blend so that you could work with the UI with sample data. This saves so much time as now you don't have to open the app, (possibly login), navigate to the area you are working on, and then see if you have it the way you want.&lt;br /&gt;
&lt;br /&gt;
The challenge was now to combine MVVM and this dummy design time data. It is a lot simpler than I thought. I simply created a dummy View Model that inherited from my runtime VM and loaded it with sample data.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Runtime ViewModel:&lt;/span&gt;&lt;br /&gt;
public class SummaryViewModel : BaseViewModel&lt;br /&gt; {&lt;br /&gt; public int MoviesOwned { get; set; }&lt;br /&gt; public int MoviesCurrentlyRentedOut { get; set; }&lt;br /&gt; public ObservableCollection&amp;lt;Category&amp;gt; Categories { get; set; }&lt;br /&gt;
&lt;br /&gt; private readonly MovieServiceClient _service; &lt;br /&gt; public SummaryViewModel()&lt;br /&gt; {&lt;br /&gt; _service = new MovieServiceClient();&lt;br /&gt; _service.GetAllCategoriesCompleted += GetAllCategoriesCompleted;&lt;br /&gt; if (!System.ComponentModel.DesignerProperties.IsInDesignTool) &lt;br /&gt; _service.GetAllCategoriesAsync();&lt;br /&gt; }&lt;br /&gt;
&lt;br /&gt; private void GetAllCategoriesCompleted(object sender, GetAllCategoriesCompletedEventArgs e)&lt;br /&gt; {&lt;br /&gt; Categories = e.Result;&lt;br /&gt; InvokePropertyChanged("Categories");&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Design Time View Model:&lt;/span&gt;&lt;br /&gt; public class DesignTimeSummaryViewModelViewModel : SummaryViewModel &lt;br /&gt; {&lt;br /&gt; public DesignTimeSummaryViewModelViewModel()&lt;br /&gt; {&lt;br /&gt; Categories = new ObservableCollection&amp;lt;Category&amp;gt;();&lt;br /&gt; Categories.Add(new Category() { Name = "Design Time Test" }); ;&lt;br /&gt; Categories.Add(new Category() { Name = "Design Time Test 2" }); ;&lt;br /&gt; Categories.Add(new Category() { Name = "Design Time Test 3" }); ;&lt;br /&gt; MoviesOwned = 10;&lt;br /&gt; MoviesCurrentlyRentedOut = 5;&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Summary.xaml view (designer info in orange, runtime in blue):&lt;/span&gt;&lt;br /&gt;
&amp;lt;UserControl x:Class="MovieRental.UI.MainPage"&lt;br /&gt; xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br /&gt; xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br /&gt; xmlns:d="http://schemas.microsoft.com/expression/blend/2008"&lt;br /&gt; xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"&lt;br /&gt; xmlns:local="clr-namespace:MovieRental.UI.ViewModels"&lt;br /&gt; mc:Ignorable="d"&lt;br /&gt; d:DesignHeight="300" d:DesignWidth="400"&lt;br /&gt;
&lt;span style="color:rgb(255, 153, 0);"&gt; d:DataContext="{d:DesignInstance Type=local:DesignTimeSummaryViewModelViewModel,IsDesignTimeCreatable=True}"&lt;/span&gt;&lt;br style="color:rgb(255, 153, 0);"/&gt; &amp;gt;&lt;br /&gt;
&lt;span style="color:rgb(51, 102, 255);"&gt; &amp;lt;UserControl.Resources&amp;gt;&lt;/span&gt;&lt;br style="color:rgb(51, 102, 255);"/&gt;
&lt;span style="color:rgb(51, 102, 255);"&gt; &amp;lt;local:SummaryViewModel x:Key="vm" /&amp;gt;&lt;/span&gt;&lt;br style="color:rgb(51, 102, 255);"/&gt;
&lt;span style="color:rgb(51, 102, 255);"&gt; &amp;lt;/UserControl.Resources&amp;gt;&lt;/span&gt;&lt;br style="color:rgb(51, 102, 255);"/&gt;
&lt;span style="color:rgb(51, 102, 255);"&gt; &amp;lt;UserControl.DataContext&amp;gt;&lt;/span&gt;&lt;br style="color:rgb(51, 102, 255);"/&gt;
&lt;span style="color:rgb(51, 102, 255);"&gt; &amp;lt;Binding Source="{StaticResource vm}" /&amp;gt;&lt;/span&gt;&lt;br style="color:rgb(51, 102, 255);"/&gt;
&lt;span style="color:rgb(51, 102, 255);"&gt; &amp;lt;/UserControl.DataContext&amp;gt;&lt;/span&gt;&lt;br style="color:rgb(51, 102, 255);"/&gt; &amp;lt;Grid x:Name="LayoutRoot" Background="White"&amp;gt;&lt;br /&gt; &amp;lt;StackPanel&amp;gt;&lt;br /&gt; &amp;lt;StackPanel Orientation="Horizontal"&amp;gt;&lt;br /&gt; &amp;lt;TextBlock Text="Movies Owned" /&amp;gt;&lt;br /&gt; &amp;lt;TextBlock Text="{Binding MoviesOwned}" Padding="7,0,0,0"/&amp;gt;&lt;br /&gt; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt; &amp;lt;StackPanel Orientation="Horizontal"&amp;gt;&lt;br /&gt; &amp;lt;TextBlock Text="Movies Rented"/&amp;gt;&lt;br /&gt; &amp;lt;TextBlock Text="{Binding MoviesCurrentlyRentedOut}" Padding="7,0,0,0" /&amp;gt;&lt;br /&gt; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt; &amp;lt;ListBox ItemsSource="{Binding Categories}" DisplayMemberPath="Name"&amp;gt;&lt;br /&gt; &amp;lt;/ListBox&amp;gt;&lt;br /&gt; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt; &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/UserControl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So far this is working pretty good. The thing that surprised me is that the designer still runs the runtime ViewModels constructor so I had to put a check in around my WCF call to make sure it did not run in the designer via the System.ComponentModel.DesignerProperties.IsInDesignTool line of code.&lt;img src="http://haveyougotwoods.com/aggbug/315.aspx" width="1" height="1"/&gt;</description>
      <guid>http://haveyougotwoods.com/archive/2010/08/19/315.aspx</guid>
      <pubDate>Thu, 19 Aug 2010 09:15:12 -0700</pubDate>
      <category>General</category>
    </item>
    <item>
      <title>Javascript IDE’s</title>
      <link>http://www.opgenorth.net/2010/08/10/javascript-ides/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=javascript-ides</link>
      <description>Lately I’ve found myself doing a lot more web application development in JavaScript.&amp;#160; Typically, I always seem to fall back on plain old Notepad++ or Visual Studio.&amp;#160; As a developer, the user experience in either is, IMHO, somewhat lacking. However, for the past week, I’ve been using RubyMine.&amp;#160; RubyMine is a Ruby on Rails IDE [...]</description>
      <guid>http://www.opgenorth.net/2008/11/15/javascript-ides/</guid>
      <pubDate>Tue, 10 Aug 2010 19:23:00 -0700</pubDate>
      <encoded>&lt;p&gt;Lately I’ve found myself doing a lot more web application development in JavaScript.&amp;#160; Typically, I always seem to fall back on plain old Notepad++ or Visual Studio.&amp;#160; As a developer, the user experience in either is, IMHO, somewhat lacking. &lt;/p&gt;
&lt;p&gt;However, for the past week, I’ve been using &lt;a rel="nofollow" target="_blank" href="http://www.jetbrains.com/ruby/index.html"&gt;RubyMine&lt;/a&gt;.&amp;#160; &lt;a rel="nofollow" target="_blank" href="http://www.jetbrains.com/ruby/index.html"&gt;RubyMine&lt;/a&gt; is a Ruby on Rails IDE from &lt;a rel="nofollow" target="_blank" href="http://www.jetbrains.com"&gt;Jetbrains&lt;/a&gt;, but it seems to work rather well for editing JavaScript and HTML files.&amp;#160; Plus, as an added bonus, it automatically comes with built in support for &lt;a rel="nofollow" target="_blank" href="http://www.jquery.com"&gt;jQuery&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Curious about &lt;a rel="nofollow" target="_blank" href="http://www.jetbrains.com/ruby/index.html"&gt;RubyMine&lt;/a&gt;?&amp;#160; Why not come to the &lt;a rel="nofollow" target="_blank" href="http://www.edmontoncodecamp.com/"&gt;Edmonton Code Camp&lt;/a&gt; on November 29th, 2008 and see it in action during my presentation on &lt;a rel="nofollow" target="_blank" href="http://www.jquery.com"&gt;jQuery&lt;/a&gt;?&amp;#160; Or better yet, download your own copy and check it out.&lt;/p&gt;
&lt;p&gt;&amp;lt;rant&amp;gt; &lt;br /&gt;Now this may strike the one or two readers of blog as odd (assuming they haven’t fallen asleep or navigated away by now) – a lot of what I do is ASP.NET Development (WebForms and ASP.NET MVC), so shouldn’t I have been doing a lot of JavaScript up to now?&lt;/p&gt;
&lt;p&gt;Well, if you allow me to digress a bit, my answer to that is “No”.&amp;#160; I’ve said it before, and I’ll say it again that, as a web developer relying very heavily on WebForms in the past, nothing has done more to emasculate my JavaScript skills than Microsoft’s ASP.NET WebForms.&amp;#160; ASP.NET Webforms, with it’s emphasis on making development as VB6-like as possible, seems to encourage you do try and do everything server-side.&amp;#160; I know that I’ve sat in on at least one presentation by Microsoft employees who have spoken disparagingly of JavaScript.&amp;#160; This is just plain wrong, IMHO.&amp;#160; Ask me why in person, if you’d like to hear the full rant.&lt;/p&gt;
&lt;p&gt;Note:&amp;#160; This is my opinion.&amp;#160; Lots of people are happy with Webforms, and if you are, good for you.&amp;#160; I’m not.&amp;#160; Direct all comments and opinions on my viewpoint to /dev/null.&amp;#160; &lt;/p&gt;
&lt;p&gt;Of course, this rant doesn’t apply if you’re using ASP.NET MVC or MonoRail. &lt;br /&gt;&amp;lt;/rant&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Updated August 10, 2010&lt;/strong&gt; : A bit of time has passed since I first wrote this post, figured an update couldn’t hurt&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;These days I seem to use a combination of &lt;a rel="nofollow" target="_blank" href="http://notepad-plus-plus.org/"&gt;Notepad++&lt;/a&gt; and &lt;a rel="nofollow" target="_blank" href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt;.&amp;#160; Firebug truly rocks.&amp;#160; It would be really nice if it worked for Internet Explorer, but it’s probably more realistic to hope for universal peace or an end to world hunger.&amp;#160; I’m told IE9 is supposed to have some good stuff for JavaScript development, but I somehow doubt that will help me out when I have to debug IE7/IE8 issues.&lt;/p&gt;
&lt;p&gt;I’ve had some people in the past suggest Visual Studio 2008 whenever I do an informal poll.&amp;#160; Personally, I’ve found the JavaScript editing experience in VS2008 to be lacklustre at best.&amp;#160; &lt;/p&gt;
&lt;p&gt;When &lt;a rel="nofollow" target="_blank" href="http://www.jetbrains.com/webstorm/"&gt;WebStorm&lt;/a&gt; was in beta, I tried that combined with Firebug.&amp;#160; I rather liked it for my JavaScript editing needs.&amp;#160; &lt;/p&gt;
&lt;p&gt;If you have any favourite tools (or IDE’s) to help with your JavaScript/jQuery development, I sure would like to hear about it.&lt;/p&gt;</encoded>
    </item>
    <item>
      <title>Android, MapView, and your Google apiKey: Part 2</title>
      <link>http://www.opgenorth.net/2010/08/09/android-mapview-and-your-google-apikey-part-2/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=android-mapview-and-your-google-apikey-part-2</link>
      <description>Just to follow up on my last post about embedding Google Maps into your Android application (this part is kind of anti-climatic). So, by now you’ve signed your application. This is the “hardest” (i.e. busiest part) of the whole process. The next part, getting your Goggle apiKey, is the easy part. First you need to [...]</description>
      <guid>http://www.opgenorth.net/?p=263</guid>
      <pubDate>Mon, 09 Aug 2010 15:11:00 -0700</pubDate>
      <encoded>&lt;p&gt;Just to follow up on my &lt;a rel="nofollow" target="_blank" href="http://www.opgenorth.net/2010/04/07/android-mapview-and-your-google-apikey-part-1/"&gt;last post&lt;/a&gt; about embedding Google Maps into your Android application (this part is kind of anti-climatic).&lt;/p&gt;
&lt;p&gt;So, by now you’ve signed your application. This is the “hardest” (i.e. busiest part) of the whole process. The next part, getting your Goggle apiKey, is the easy part. First you need to get the MD5 fingerprint of your keystore:&lt;/p&gt;
&lt;p&gt;keytool -list -alias androiddebugkey -keystore &amp;lt;path_to_debug_keystore&amp;gt;.keystore -storepass android -keypass android&lt;/p&gt;
&lt;p&gt;Once that is done, you and register for a &lt;a rel="nofollow" target="_blank" href="http://code.google. com/android/maps-api-signup.html"&gt;Google Maps API key&lt;/a&gt;. You need a Google account, and have to agree to some terms of service legal mumbo-jumbo, but it’s pretty simple. Once you click “Generate API Key”, you will get your key string. You then simply add the Maps API key to your MapView in your application. There are a couple of ways to do this, heres how you would do it if you were using the XML layout files:&lt;/p&gt;
&lt;p&gt;Of course, after all this is done, the next trick is managing these keys. You see, when you are working locally, your application is automatically signed using a debug key. This is fine and dandy for most development. However, when you deploy your application, you sign the application using your keystore that you created in &lt;a rel="nofollow" target="_blank" href="http://www.opgenorth.net/2010/04/07/android-mapview-and-your-google-apikey-part-1/"&gt;Step 1&lt;/a&gt;. You may have a brief moment of clarity here and realize that the apiKey from your debug keystore and your deployment keystore are different. I’ve got some ideas on how to deal with that that, but that will be for another day.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://code.google.com/android/add-ons/google-apis/mapkey.html"&gt;Full documentation&lt;/a&gt; for all this can be found on the Android developer’s website.&lt;/p&gt;</encoded>
    </item>
    <item>
      <title>A Word Macro To Simplify Resume Generation</title>
      <link>http://haveyougotwoods.com/archive/2010/08/08/314.aspx</link>
      <description>I have taken the summer off to look after our kids, get caught up on my todo list (yes it is 2 months long), and do some learning. Now that I am mostly caught up I decided to update my resume but find it hard to remember how many years of experience I have in technologies on my skills matrix. I don't like sending out a resume that shows what year I started with a technology as that does not accurately represent the number of years of experience. I figured that I could compamise on this and have a master document that has what year I started with a technology and have a vba macro that converts it into years of experience. Here is what I did&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt; &lt;li&gt;Created a new word document with a table in it with 3 columns (column #3 contains the year started) e.g.&lt;br /&gt; &lt;table width="400" cellspacing="1" cellpadding="1" border="1" align=""&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Category&lt;/td&gt; &lt;td&gt;Skill&lt;/td&gt; &lt;td&gt;Experience&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Languages&lt;/td&gt; &lt;td&gt;C#&lt;/td&gt; &lt;td&gt;2003&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; &lt;td&gt;VB.NET&lt;/td&gt; &lt;td&gt;2003&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; &lt;td&gt;VBA&lt;/td&gt; &lt;td&gt;2010&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; &lt;td&gt; &lt;/td&gt; &lt;td&gt; &lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Database&lt;/td&gt; &lt;td&gt;MSSQL&lt;/td&gt; &lt;td&gt;2000&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; &lt;td&gt;MYSQL&lt;/td&gt; &lt;td&gt;1999&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; &lt;/td&gt; &lt;td&gt;Oracle&lt;/td&gt; &lt;td&gt;1 year&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;/li&gt; &lt;li&gt; Open up the macro editor (Alt+F11) and added a new module to the project&lt;/li&gt; &lt;li&gt;Put in this code:&lt;br /&gt; &lt;pre&gt;Sub UpdateYears()&lt;/pre&gt; &lt;pre&gt; Application.ScreenUpdating = False&lt;/pre&gt; &lt;pre&gt; currentYear = Year(Date)&lt;/pre&gt; &lt;pre&gt; For Each tbl In ActiveDocument.Tables&lt;/pre&gt; &lt;pre&gt; For Each rw In tbl.Rows&lt;/pre&gt; &lt;pre&gt; Dim experience As Integer&lt;/pre&gt; &lt;pre&gt; If IsNumeric(StripJunk(rw.Cells(3))) Then&lt;/pre&gt; &lt;pre&gt; experience = currentYear - StripJunk(rw.Cells(3))&lt;/pre&gt; &lt;pre&gt; If (experience &amp;lt;= 1) Then&lt;/pre&gt; &lt;pre&gt; rw.Cells(3) = experience &amp;amp; " year"&lt;/pre&gt; &lt;pre&gt; Else&lt;/pre&gt; &lt;pre&gt; rw.Cells(3) = experience &amp;amp; " years"&lt;/pre&gt; &lt;pre&gt; End If&lt;/pre&gt; &lt;pre&gt; End If&lt;/pre&gt; &lt;pre&gt; Next&lt;/pre&gt; &lt;pre&gt; Next&lt;/pre&gt; &lt;pre&gt;End Sub&lt;/pre&gt; &lt;pre&gt;&lt;br /&gt;Private Function StripJunk(ByVal s As String)&lt;/pre&gt; &lt;pre&gt; StripJunk = Trim(Replace(s, vbCr &amp;amp; Chr(7), ""))&lt;/pre&gt; &lt;pre&gt;End Function&lt;/pre&gt; &lt;/li&gt; &lt;li&gt;Saved my word document as "Word macro-enabled document *.docm"&lt;/li&gt; &lt;li&gt;Ran the macro (in office 2010-&amp;gt;click "view" on the ribbon. Then click the macro drop down. Then click "View Macros". Run the UpdateYears macro&lt;/li&gt; &lt;li&gt;Save a copy of the document as a regular word doc without the macros and send it off.&lt;/li&gt;
&lt;/ol&gt;
Hopefully this saves you a few hours of VBA/Macro headaches!&lt;img src="http://haveyougotwoods.com/aggbug/314.aspx" width="1" height="1"/&gt;</description>
      <guid>http://haveyougotwoods.com/archive/2010/08/08/314.aspx</guid>
      <pubDate>Sun, 08 Aug 2010 06:51:50 -0700</pubDate>
      <category>General</category>
    </item>
    <item>
      <title>Microsoft.Data.dll and LightSwitch</title>
      <link>http://feedproxy.google.com/~r/igloocoder/~3/VFdz93aUXEc/microsoft.data.dll-and-lightswitch.aspx</link>
      <description>&lt;p&gt;Microsoft has made some announcements over the last week or so. The &lt;a rel="nofollow" target="_blank" href="http://weblogs.asp.net/davidfowler/archive/2010/08/02/introduction-to-microsoft-data-dll.aspx"&gt;first was Microsoft.Data.dll&lt;/a&gt;. I think that &lt;a rel="nofollow" target="_blank" href="http://ayende.com/Blog/archive/2010/08/04/microsoft.data-and-positioning.aspx"&gt;Oren adequately wraps up&lt;/a&gt; the feelings that I have towards it.&lt;/p&gt; &lt;p&gt;The second was &lt;a rel="nofollow" target="_blank" href="http://blogs.msdn.com/b/jasonz/archive/2010/08/03/introducing-microsoft-visual-studio-lightswitch.aspx"&gt;the announcement of Visual Studio LightSwitch&lt;/a&gt;. I have some strong feelings for this as well. Microsoft is positioning this as a tool that allows non-professional developers create line of business (LoB) applications. They suggest that it will allow these non-developers to create applications that can be handed off to IT for maintenance and further enhancement. Since LightSwitch isn’t really Visual Studio, the IT group will have to upgrade the application codebase. Does this sound like anything to &lt;a rel="nofollow" target="_blank" href="http://support.microsoft.com/kb/325017"&gt;you’ve ever heard of before&lt;/a&gt;?&lt;/p&gt; &lt;p&gt;While Microsoft won’t come out and say it, LightSwitch is positioned to fill the space that MS Access has for more than a decade. During that decade plus IT departments and programmers world wide have grown to loathe MS Access application created by business. Invariably those MS Access systems start live as small intra-department apps that service one to a few users. Over time their feature set grows along with their user base. At some point these LoB applications hit an invisible wall. Sometimes it’s that the system has devolved into a mess of macros and VBA. Other times they have collapsed under the pressures of concurrent users. Regardless, the developers that take over these applications are met with a &lt;a rel="nofollow" target="_blank" href="http://www.manning.com/baley"&gt;brownfield mess&lt;/a&gt;. On top of that, the application has likely grown into a brownfield application that is &lt;strong&gt;&lt;em&gt;critical&lt;/em&gt;&lt;/strong&gt; to the business. We professional developers end up picking up the pieces and, often, re-writing the application from scratch, under huge timeline pressure, so that it can meet the requirements and specifications that it has grown to need.&lt;/p&gt; &lt;p&gt;So back to LightSwitch. Why is Microsoft pitching what this product is good at to us professional developers? They say it’s not for us, but instead for non-professional developers. Market it to them then. Don’t waste our time with this marketing campaign. Instead Microsoft, sell us on the part we’re going to have to deal with; the migration and fixing once these “LightSwitch” applications when the business inevitably comes running to us to do this.&lt;/p&gt; &lt;p&gt;To the professional developers that read this blog (most of you I’m guessing), prepare to move your hatred and loathing from MS Access to LightSwitch.&lt;/p&gt;&lt;img src="http://igloocoder.com/aggbug/1455.aspx" width="1" height="1"/&gt;</description>
      <guid>http://igloocoder.com/archive/2010/08/04/microsoft.data.dll-and-lightswitch.aspx</guid>
      <pubDate>Wed, 04 Aug 2010 00:05:47 -0700</pubDate>
    </item>
    <item>
      <title>Going Digital At Home - Part 4 - Digitization Of Media</title>
      <link>http://haveyougotwoods.com/archive/2010/08/03/313.aspx</link>
      <description>The most painful and time consuming part of this project has been digitizing our DVD collection. I thought it would be as simple as downloading a program and rip it is done.... not so much in the end. Most mainstream companies are avoiding the area of DVD digitization due to potential issues of the legality of ripping DVDs. Another issue came down to encoding support in the software I tried (most were doing h.246) which would not play on some of my lower powered devices. The other issue is that there are SO many options and settings to tweak that it takes a long time to get them just right. I started ripping only one chapter of a movie and then watching that on different devices and then tweaking settings.&lt;br /&gt;
&lt;br /&gt;
To start with there are many different ways to digitize your DVDs. The first thing I tried was using VLC media player which (unkown to me) has an option to save a DVD to disk. I found that most outputs it put out was distorted and had lots of green blocks all over. I also tried DVDFab which I could not get the quality I wanted and it was trial software. Handbrake is another popular software but it does not do decryption so you have to install other software (I triewantd AnyDVD which worked awesome) in combination with Handbrake. Handbrake only supported H.246 or MPEG4 and I found the MPEG4 quality was too low (and I could not seem to get it any better).&lt;br /&gt;
&lt;br /&gt;
What I finally got to work is a two step process. The first step was to rip the contents of the DVD to a VOB file using DVDDecryptor which takes about 20 minutes. A VOB file is the raw video/audio/subtitiles from the disk which some programs can read in and convert. The next step was to feed the VOB into a program called MeGUI which is a UI wrapper around AviSynth that works quite well. I found it takes 2-3 hours to encode a video using MeGUI.&lt;br /&gt;
&lt;br /&gt;
Now if you have a lot of movies then you need some automation to this process. What I did was gather up 5 spare DVD roms and combined them into a computer so I could backup 5 DVDs at a time. I then wrote a bit of code (I may publish it later) that starts DVDDecryptor on the command line, rips the disk, ejects the disk, then monitors for a new disk. This allowed me to just walk by and see the ejected trays and then insert new disks which worked well. My big issue was that the raw DVD is about 5 GB so you can fill up storage quick so I moved a lot of the raw files to other computers as the drive on my ripping computer filled up.&lt;br /&gt;
&lt;br /&gt;
Once I had my movies ripped (or my hard drives filled) it was time to compress them down to save some space using MeGUI+Avisynth. When you install the software it asks if you want to download some presets which I did. In the end I used XVid-Balanced to do my encoding. Then I used the one click encoding tool in MeGUI and queued up all my VOB files. As this process takes 2-3 hours (depending on CPU power) I ran it on multiple computers. Many of my computers are multi-core and MeGUI has the option to spin up multiple worker threads but I found that it crashed so I just ran one worker (which still used multiple cores).&lt;img src="http://haveyougotwoods.com/aggbug/313.aspx" width="1" height="1"/&gt;</description>
      <guid>http://haveyougotwoods.com/archive/2010/08/03/313.aspx</guid>
      <pubDate>Tue, 03 Aug 2010 07:47:49 -0700</pubDate>
      <category>General</category>
    </item>
    <item>
      <title>How to set up Office Communicator (for OCO/BPOS) in an alternate chat client (Pidgin)</title>
      <link>http://generatedbyatool.net/content/post/2010/07/30/How-to-set-up-Office-Communicator-(for-OCOBPOS)-in-an-alternate-chat-client-(Pidgin).aspx</link>
      <description>&lt;p&gt;I've got to blog on this one, because it was both maddening and seemingly obscure.&amp;nbsp; (Whenever I can't get a good search result on something, I make a point of blogging on it myself.)&lt;br /&gt;&lt;br /&gt;For a long time now, I've used one chat client to handle all of my online presences: my personal Live Messenger (MSN), 3 Google Talk accounts (personal, corporate, and ENTS), Facebook Chat (which is XMPP compliant these days), IRC, even Twitter (though that started to drive me nuts so I stopped using it).&amp;nbsp; I've tried a few different programs, and am currently finding that &lt;a rel="nofollow" target="_blank" href="http://www.pidgin.im/"&gt;Pidgin&lt;/a&gt; (formerly Gaim) is my personal best choice for everyday use.&lt;br /&gt;&lt;br /&gt;Over the past few months, the office has been transitioning from our existing infrastructure, which was a cobbled-together assortment of SaaS/cloud solutions out there on the interwebs (sort of single-responsibility, pick-the-best-service-for-each-task idea) to a more narrow, integrated approach that reflects our firm commitment to Microsoft software products and solutions.&amp;nbsp; Part of that has meant moving from Google Apps for our email, calendar, contacts, and chat, to &lt;a rel="nofollow" target="_blank" href="http://www.microsoft.com/online/business-productivity.aspx"&gt;Microsoft Business Productivity Online Standard Suite (BPOS)&lt;/a&gt;, which among other things gives us Exchange Online for our email, calendar, and contacts, and Office Communications Online (OCO) for our company chat.&lt;br /&gt;&lt;br /&gt;While GTalk was obviously a zero-effort add to my all-in-one presence via Pidgin, Office Communicator proved a much more difficult beast to integrate.&lt;br /&gt;&lt;br /&gt;The first question was fundamental: &lt;em&gt;what is the server name&lt;/em&gt;?&lt;br /&gt;&lt;br /&gt;I searched for this quite heavily, to no avail, and eventually had to give in and actually install Office Communicator, dreading having to use more than one chat client.&amp;nbsp; See, with BPOS, there's a Single Sign-On app that sits in your tray, and automatically configures Communicator for you.&amp;nbsp; The upside, as I pleasantly discovered, is that even though you never get to enter or know the communications server address, if you open up your Communicator options after successfully signing in and have a look at the Advanced account options, you can just read off the screen the manual configuration that Single Sign-On did.&lt;br /&gt;&lt;br /&gt;Now, Pidgin didn't always support Communicator out-of-the-box, and any information you read about it will suggest that's still the case.&amp;nbsp; Office Communicator implements a version of the standardized SIP/SIMPLE protocol, but Microsoft added enough of their own (clearly documented but non-standard) stuff to it that just using SIP/SIMPLE won't work.&amp;nbsp; The good news is that there's a very good third-party plugin called &lt;a rel="nofollow" target="_blank" href="http://sipe.sourceforge.net/"&gt;SIPe&lt;/a&gt; that adds support for Office Communicator to Pidgin.&amp;nbsp; You might have to install this yourself, as I can't find any indication of where it might have been merged into the trunk, but the Windows binary I have had it already installed, and "Office Communicator" actually appeared as a protocol choice in the Pidgin account management tool already.&lt;br /&gt;&lt;br /&gt;The settings with which I had (eventual) success when adding the account to Pidgin were as follows:&lt;br /&gt;Username: my full email address&lt;br /&gt;Login: just my login name; I didn't put a domain name or full email address&lt;br /&gt;Password obviously.&lt;br /&gt;Now head to the Advanced tab, and put in your server and port you got from the Communicator settings (mine was pool1.oconline.microsoftonline.com:443, which looks probably pretty standard, but I'm sure that could change at any time).&lt;br /&gt;Connection type has to be SSL/TLS, obviously.&lt;br /&gt;Don't check Kerberos, but check Single Sign-On.&lt;br /&gt;&lt;br /&gt;Here's where it got tricky:&lt;br /&gt;If you just leave it at that, you'll get an irritating error message.&lt;/p&gt;
&lt;p style="padding-left:30px;"&gt;&lt;br /&gt;&lt;span style="font-family:courier new, courier;"&gt;You have been rejected by the server: You are currently not using the recommended version of the client.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Well yes, Microsoft, I do realise that.&amp;nbsp; Unfortunately, when they say "recommended", they actually mean &lt;em&gt;mandatory&lt;/em&gt;; this is the header message of a 403 Forbidden that your Pidgin has just been sent.&lt;br /&gt;&lt;br /&gt;You probably noticed the User Agent field that I skipped over in the Pidgin settings, because I didn't know what to do with it when I was first setting this up and assumed it was optional.&amp;nbsp; As it turns out, this is actually used in a SIP header just like the User-Agent of a web request, and OCS strictly adheres to it when deciding if it can support you (so says the &lt;a rel="nofollow" target="_blank" href="http://msdn.microsoft.com/en-us/library/dd923109%28office.12%29.aspx"&gt;Microsoft SIP registration extensions documentation&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;So, I guess we need Pidgin to speak OCS's secret password before it can get into the Communicator clubhouse.&lt;br /&gt;&lt;br /&gt;You &lt;em&gt;could&lt;/em&gt; connect with Communicator and sniff for that if you're feeling ambitious, but let me save you some time.&amp;nbsp; Here's a &lt;a rel="nofollow" target="_blank" href="http://blogs.technet.com/b/toninof/archive/2010/01/12/office-communicator-sip-trace-multiple-points-of-presence.aspx"&gt;really handy unrelated blog entry&lt;/a&gt; that shows us a great example of some functioning OCS SIP headers, including a User-Agent that matches my installed Communicator version.&lt;br /&gt;&lt;br /&gt;So I set my User Agent field in the Pidgin account settings to "&lt;span style="font-family:courier new, courier;"&gt;UCCAPI/3.5.6907.0 OC/3.5.6907.0 (Microsoft Office Communicator 2007 R2)&lt;/span&gt;", and now it works as expected.&lt;br /&gt;&lt;br /&gt;It's quite likely this could break once new versions of Communicator come out, as OCS will probably expect you to upgrade the client, and it's also possible that, if that happens and you pass the new User-Agent string for the new version, you'll experience some bugs or quirks or unsupported behavior.&amp;nbsp; Right now, however, with my build of Pidgin 2.6.6 which integrates SIPe 1.10.0, it's perfectly compatible with Communicator 2007 R2 3.5.6907.0.&lt;br /&gt;&lt;br /&gt;Hope someone out there gets use out of this write-up!&lt;/p&gt;</description>
      <author>Grank</author>
      <guid>http://generatedbyatool.net/content/post.aspx?id=3f381769-0bca-411d-8019-2ce19bcaa928</guid>
      <pubDate>Fri, 30 Jul 2010 14:05:00 -0700</pubDate>
    </item>
    <item>
      <title>Going Digital At Home - Part 3 - The Law</title>
      <link>http://haveyougotwoods.com/archive/2010/07/06/312.aspx</link>
      <description>One of the things I never took much time to consider was the legality off all this. My opinion has been (and hopefully always will be) that if I purchased something I should be able to do whatever I want with it. If I own DVD and want to use it as a decoration on my Christmas tree I feel I have that right. &lt;br /&gt;
&lt;br /&gt;
Again, I am not a lawyer and this is just a summation of my research on the topic so do your own research for your own area.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;DVD Backups&lt;/span&gt;&lt;br /&gt;
The first debate is if you can backup or convert your DVD's to another format. There are two big points in this debate. The first is if you can make a backup of the media. The second is if you can legally circumvent copy protection. In Canada, the current copyright act does not explicitly state if it is legal or not to do either of these. It is legal to make a backup of computer programs, and you are allowed to copy audio/video for personal use. In the current situation it seems quite legal to backup and defeat copy protection. I think this is great as I PURCHASED a product and would like to use it in the manner I see fit. Of course it is illegal for me to share the backup. &lt;br /&gt;
&lt;br /&gt;
From my understanding, in the United States, it is only partially legal to create a backup (yup partially legal). It seems that making a backup copy is totally fine but if you break copy protection it violates the Digital Millenium Copyright Act as it may be considered that you have circumvented copy protection on the DVD. Circumvention though could be in the eye of the beholder as computer software has to open the DVD and decrypt it for playback, capturing the legally decrypted data and placing it on your hard drive may be totally legal.&lt;br /&gt;
&lt;br /&gt;
Canada is working to reform its copyright act so there may be some big changes to modernize it. From reading over &lt;a rel="nofollow"&gt;Bill C-32&lt;/a&gt;, I see this:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="margin-left:40px;"&gt;29.22 (1) It is not an infringement of copyright for an individual to reproduce a work or other subject-matter or any substantial part of a work or other subject-matter if&lt;br /&gt;
(a) the copy of the work or other subject-matter from which the reproduction is made is not an infringing copy;&lt;br /&gt;
(b) the individual legally obtained the copy of the work or other subject-matter from which the reproduction is made, other than by borrowing it or renting it, and owns or is authorized to use the medium or device on which it is reproduced;&lt;br /&gt;
(c) the individual, in order to make the reproduction, did not circumvent, as defined in section 41, a technological protection measure, as defined in that section, or cause one to be circumvented;&lt;br /&gt;
(d) the individual does not give the reproduction away; and&lt;br /&gt;
(e) the reproduction is used only for private purposes.&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
The issue here becomes circumventing technological protection measures. This is where I don't agree as I purchased it so why should I not be able to do what I want with it in my own home? Frankly, if I can't do what I want with content I buy then I will cease buying it. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;DOWNLOADING MEDIA&lt;/span&gt;&lt;br /&gt;
In Canada, this is technically legal as long as you don't distribute it or profit from it. After playing around with converting my own DVDs (that post is coming up), it may be easier to let someone else do the hard work of properly converting a movie and download it from them. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Modifying Your XBOX&lt;/span&gt;&lt;br /&gt;
I have an old xbox just collecting dust so I installed Xbox Media Center on it. This is not an MS product, it is a replacement OS created by the community (that is awesome) but does require a lot of work to get it installed (there are lots of tutorials out there on the internet about it though). Is it legal to modify your xbox? From what I see, yes. If you mod your xbox it voids your warranty and violates Microsoft's use policy so it will probably not work online. For me that is fine as I am just using it as a media center hooked up to my TV.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Streaming Media Over Wireless&lt;/span&gt;&lt;br /&gt;
An interesting potential gotcha is that streaming media over a wireless network may be considered broadcasting. Some media center devices will not stream some content for this very reason (buyer beware for sure). I really think this is a non-issue as most people secure their wireless networks and most neighbors don't have the technical expertise to watch what you are streaming but it could still be an issue.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://haveyougotwoods.com/aggbug/312.aspx" width="1" height="1"/&gt;</description>
      <guid>http://haveyougotwoods.com/archive/2010/07/06/312.aspx</guid>
      <pubDate>Tue, 06 Jul 2010 10:51:45 -0700</pubDate>
    </item>
    <item>
      <title>Going Digital At Home - Part 2 - Sharing</title>
      <link>http://haveyougotwoods.com/archive/2010/06/25/311.aspx</link>
      <description>The next step in providing digital content is being able to share your existing media out to the home. There are several ways to do this.&lt;br /&gt;
&lt;br /&gt;
The first thing I want to talk about though is the codec issue. Video and audio can get quite large and there are many different ways to encode media to shrink its size down. In order to play a video you need the proper codec installed (a codec is a bit of code that properly decodes encoded video). The #1 issue with video playback has typically been that you don't have the right codec installed. Normally when you are missing a codec you go out and download the codec and install it on your computer. When you have a device connected to a T.V. though it may not be possible to add the codec you want (I ran into this with my XBOX 360 for instance).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Simple File Share&lt;/span&gt;&lt;br /&gt;
Most computers and devices can access file shares quite easily. On your media server just right click and goto sharing and then select the users. There are many tutorials out there on how to share a folder so I wont dig into the basics but there are a few key tricks to it. &lt;br /&gt;
&lt;br /&gt;
Most shares require the user to authenticate upon attempting to access a shared folder so that it can grant or deny access to that share. Now unless you have setup a domain controller for your house, it will not know who you are and want a username and password that has been setup on the computer sharing files. A neat trick is that if you have the same username/password setup on both the client and the server then you will automatically be authenticated. Otherwise it will prompt you for credentials. If you have children then it is adviseable to have a folder for family movies that allows the kids credentials and then a higher rated folder that requires an adults credentials.&lt;br /&gt;
&lt;br /&gt;
The other debate is what type of access the share should have. I typically have shared folders that are read only and one folder that allows write so that new content can be dropped in from any computer and then sorted into the proper readonly folder. &lt;br /&gt;
&lt;br /&gt;
The cons with this is that you need credentials, not all devices work over a file share, not all devices can play all types of media (due to the codec issue). For instance my xbox 360 does not access fileshares so this technique does not work)&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Windows Media Sharing&lt;/span&gt;&lt;br /&gt;
I believe that starting with Windows Media Player 10 is an included service that allows you to share media out that is added to your Media Player library. I think that this solution works pretty good for the scenario where a user has one computer running a client operating system (i.e. XP/Vista/Windows 7) with their media and share it out. I have not tried it as I have a hatred for the bloatware that is Windows Media Player but it may just work for you. &lt;br /&gt;
&lt;br /&gt;
From my quick read it does appear to overcome the codec issue via transcoding. This means that the media player on your computer converts the video on the fly to a format the remote device knows how to play. Again I have not tried this but I leave it up to you to experiment.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Windows Media Center &amp;amp; Media Center Extenders&lt;/span&gt;&lt;br /&gt;
Media Center is a chunk of software that ships with some editions of Vista and Win7. It allows you to access all your media, photos, and more via a client. The XBOX 360 ships with just such a client so I tried it out. It was horrible. It could not play a lot of the videos I had (due to codec issues), it was slow to navigate, and I found the video was choppy a lot of the time. Granted, I tried this a few years ago and they have probably made improvements but I have moved on to other technologies. I also don't believe that you can have Media Center on a computer running a server OS (but again, I could be wrong)&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Transcoding Server&lt;/span&gt;&lt;br /&gt;
I have found the best thing for me has been using a transcoding server called TVersity. The app converts video on the fly and streams it out to my devices just fine. The really nice feature is that you can also add internet feeds to the TVersity library. What this means is that I can take a show that published a feed and have my computer download that data, transcode it, and stream it to my xbox 360. I can now watch internet TV... on my TV! There is a lot of neat stuff you can do in this area.&lt;br /&gt;
&lt;br /&gt;
The biggest issue I have found with TVersity is that the service will not respond sometimes and requires me to restart the service. Friends of mine have had no problems but I have had the issue on two separate installs now. &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight:bold;"&gt;Network Considerations&lt;/span&gt;&lt;br /&gt;
For all of these solutions you will need to have the appropriate exceptions in your firewall to allow the services that share media to be accessible. Bandwidth can also be an issue with wireless networks. I currently have my server connected to the router via regular cat 5 cable but the devices I consume media on are wireless. This works fairly well but media sharing is a bandwidth intensive operation so the quality of wireless signal you get may have an effect on streaming. If you can use a hardwire connection then I would recommend it as it is much more reliable than wireless.&lt;img src="http://haveyougotwoods.com/aggbug/311.aspx" width="1" height="1"/&gt;</description>
      <guid>http://haveyougotwoods.com/archive/2010/06/25/311.aspx</guid>
      <pubDate>Fri, 25 Jun 2010 08:49:33 -0700</pubDate>
      <category>General</category>
    </item>
    <item>
      <title>Making the most of Brownfield Application Development &amp;ndash; Winnipeg Edition</title>
      <link>http://feedproxy.google.com/~r/igloocoder/~3/AMJ_UtAU4t4/making-the-most-of-brownfield-application-development-ndash-winnipeg-edition.aspx</link>
      <description>&lt;p&gt;On Friday July 23rd I’ll be in Winnipeg giving a one day seminar on the nuances of &lt;a rel="nofollow" target="_blank" href="http://www.manning.com/baley"&gt;Brownfield Application Development&lt;/a&gt; and how to get the most out of it. More about the day can be found &lt;a rel="nofollow" target="_blank" href="http://www.prairiedevcon.com/postconf.aspx"&gt;here&lt;/a&gt;. I recently did the seminar at the &lt;a rel="nofollow" target="_blank" href="http://www.prairiedevcon.com"&gt;PrairieDevCon&lt;/a&gt; and it was a blast. The day is filled chocka-block with content and ideas that pertain directly to Brownfield codebases and will work in Greenfield situations.&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.regonline.ca/Checkin.asp?EventId=872245"&gt;Registration can be found here&lt;/a&gt; and until July 2nd the session is available at a discount. Hope to see you there!&lt;/p&gt;&lt;img src="http://igloocoder.com/aggbug/1454.aspx" width="1" height="1"/&gt;</description>
      <guid>http://igloocoder.com/archive/2010/06/23/making-the-most-of-brownfield-application-development-ndash-winnipeg-edition.aspx</guid>
      <pubDate>Wed, 23 Jun 2010 15:22:41 -0700</pubDate>
    </item>
    <item>
      <title>Induction Into the Android Army – the Aftermath</title>
      <link>http://www.opgenorth.net/2010/06/15/induction-into-the-android-army-the-aftermath/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=induction-into-the-android-army-the-aftermath</link>
      <description>Thanks to all who attended my “Induction into the Android Army” talk this afternoon at the monthly Edmonton Java User’s Group meeting.&amp;#160; I’d say it was a good turn out, especially when one considers that this is only the second monthly meeting for EJUG.&amp;#160; It was a pretty basic talk, and didn’t dive to deeply [...]</description>
      <guid>http://www.opgenorth.net/2010/06/15/induction-into-the-android-army-the-aftermath/</guid>
      <pubDate>Tue, 15 Jun 2010 16:27:10 -0700</pubDate>
      <encoded>&lt;p&gt;Thanks to all who attended my “Induction into the Android Army” talk this afternoon at the monthly &lt;a rel="nofollow" target="_blank" href="http://groups.google.com/group/ejug"&gt;Edmonton Java User’s Group&lt;/a&gt; meeting.&amp;#160; I’d say it was a good turn out, especially when one considers that this is only the second monthly meeting for EJUG.&amp;#160; It was a pretty basic talk, and didn’t dive to deeply into the “fun” Android stuff.&amp;#160; If anybody from EJUG wants a follow up presentation that’s a bit more in depth, give a shout out on the EJUG mailing list.&amp;#160; If there is enough interest, I’d be happy to put something together.
&lt;p&gt;If you want to &lt;a rel="nofollow" target="_blank" href="http://developer.android.com/resources/samples/NotePad/index.html"&gt;browse the code&lt;/a&gt; and don’t want to download the Android SDK, you can do so at the Android website.&amp;#160; Otherwise if you have downloaded the SDK,&amp;#160; you can the samples/Notepad folder.&amp;#160; For those who want the PowerPoint slide deck, please hang tight and I’ll get a link to that shortly.&amp;#160; Basil already has a copy of it, and he’ll probably post it to the Google Group shortly as well.&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.opgenorth.net/wp-content/uploads/2010/06/GoogleAndroidarmy.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="Google-Android-army" border="0" alt="Google-Android-army" src="http://www.opgenorth.net/wp-content/uploads/2010/06/GoogleAndroidarmy_thumb.jpg" width="244" height="152"/&gt;&lt;/a&gt;&lt;/p&gt;</encoded>
      <category>Android</category>
    </item>
    <item>
      <title>Android at the Edmonton Java User Group</title>
      <link>http://www.opgenorth.net/2010/06/11/android-at-the-edmonton-java-user-group/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=android-at-the-edmonton-java-user-group</link>
      <description>Just a heads up for those interested:&amp;#160; On Tuesday, June 15th the Edmonton Java User’s Group is having it’s monthly meeting at noon at the Canadian Western Bank Building.&amp;#160; The speaker is none other than yours truly.&amp;#160; I’ll be giving a brief introduction to application development to Android, using my trusty G1 and IntelliJ. It’s [...]</description>
      <guid>http://www.opgenorth.net/2010/06/11/android-at-the-edmonton-java-user-group/</guid>
      <pubDate>Fri, 11 Jun 2010 20:51:42 -0700</pubDate>
      <encoded>&lt;p&gt;Just a heads up for those interested:&amp;#160; On Tuesday, June 15th the Edmonton Java User’s Group is having it’s monthly meeting at noon at the Canadian Western Bank Building.&amp;#160; The speaker is none other than yours truly.&amp;#160; I’ll be giving a brief introduction to application development to Android, using my trusty G1 and IntelliJ.&lt;/p&gt;
&lt;p&gt;It’s free to attend, so stop by if you’re so inclined.&lt;/p&gt;</encoded>
    </item>
    <item>
      <title>Visual Studio Project files and coupling</title>
      <link>http://feedproxy.google.com/~r/igloocoder/~3/_tdukKak4u4/visual-studio-project-files-and-coupling.aspx</link>
      <description>&lt;p&gt;The way that we’re told to use Visual Studio is that we create a solution file and add into it one or more project files. Each project file then gets filled with different development artefacts. When you build inside of Visual Studio each project represents a compiled distributable file (exe, dll, etc). Many people carry this practice over into their build scripts. You might be one of them. I’m here to tell you why you’re wrong to be doing this.&lt;/p&gt; &lt;p&gt;Let’s say you’re starting a project. You open Visual Studio, select File | New Project and get things rolling. In a few minutes you have a Solution that contains a few Projects. Maybe you have one for the UI, one for the business logic and one for the data access layer. All is good. A few months later, after adding many artefacts to the different projects, something triggers the need to split the artefacts into one assembly from one DLL into two DLLs. &lt;/p&gt; &lt;p&gt;You set off to make this happen. Obviously you need to add a new Project to your Solution, modify some references, and shift some files from one Project into another. Say you’re stuck using an exclusive locking source control system (like VSS…shudder). You *must* have exclusive access to all the files necessary including:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;the sln so you can add the new project&lt;/li&gt; &lt;li&gt;at least one existing cs/vb/fsproj which you’ll be removing existing code artefacts from&lt;/li&gt; &lt;li&gt;any cs/vb/fs files that will be moved &lt;/li&gt; &lt;li&gt;any cs/vb/fs files that reference the ones moving (using statements will need updating when you change the namespacing on the files being moved) &lt;/li&gt; &lt;li&gt;possibly some resx files that need to be moved&lt;/li&gt; &lt;li&gt;possibly config files that need to be changed or moved&lt;/li&gt; &lt;li&gt;any automated tests that make use of the moving cs/vb/fs files &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;It’s a pretty damn big list of files that you will need to exclusively lock during this process. Chances are you will need to push all of your co-workers out of the development environment so that you can gain access to all of those files. Essentially you are, at this point, halting the development process so that you can do nothing more than split one DLL into two. That in quite inefficient in the short term and it’s completely unsustainable in the long term.&lt;/p&gt; &lt;p&gt;I can hear you now, “Well I use &amp;lt;git/mercurial/svn/etc&amp;gt; so we won’t have those issues”. Really? Think it through for a second. Go ahead, I’ll wait.&lt;/p&gt; &lt;p&gt;With the volume of changes that I listed above, you’ll likely want to be working in some kind of isolation, whether that is local or central. So yes, you can protect yourself from blocking the ongoing development of your co-workers by properly using those version control systems. But remember, you do have to integrate your changes with their work at some point. How are you going to do that? You’ve moved and modified a significant number of files. You will have to merge your changes into a branch (or the trunk) locally or otherwise. Trust me, this will be a merge conflict nightmare. And it won’t be a pain just for you. What about the co-worker that has local changes outstanding when you commit your merged modification? They’re going to end up with a massive piece of merge work on their plate as well. So instead of being blocked while you do the work, you’re actually creating a block for them immediately after you have completed your work. Again, the easiest way to achieve the changes would be to prevent any other developers from working in the code while modifications are occurring. Doesn’t that sound an awful lot like exclusive locking?&lt;/p&gt; &lt;p&gt;Now, I know you’re thinking “Pfft..that doesn’t happen often”. This is where you’re wrong. When you started that application development cycle (remember File | New Project?) you likely didn’t have all of the information necessary to determine what your deployables requirements were. Since you didn’t have all of that information, chances were good, right from the outset, that you were going to be doing the wrong thing. With that being the case, it means that chances were good that you were going to have to make changes like the one described above. To me that indicates that you are, by deciding to tie your Visual Studio Projects to your deployables, accepting that you will undertake this overhead.&lt;/p&gt; &lt;p&gt;People, possibly you, accept this overhead on every software project they participate in. This is where you’re wrong. There is a way to avoid all of this, but people shrug it off as “not mainstream” and “colouring outside the lines”. The thing is it works, so ignore it at your own peril.&lt;/p&gt; &lt;p&gt;There is a lot of talk in some development circles about decoupling code. It’s generally accepted that tightly coupled code is harder to modify, extend and maintain. When you say that a Visual Studio Project is the equivalent of a deployable, you have tightly coupled your deployment and development structures. Like code, and as the example above shows, it makes it hard to modify, extend and maintain your deployment. So why not decouple the Visual Studio Project structure from the deployables requirements?&lt;/p&gt; &lt;p&gt;It’s not that hard to do. You’ll need to write a build script that doesn’t reference the cs/vb/fsproj files at all. The .NET Framework kindly provides configurable compiler access for us. The different language command line compilers (vbc.exe/csc.exe/fsc.exe) allow you to pass in code files, references, resources, etc. By using this capability, you can build any number of assemblies that you want simply by passing a listing of artefacts into the compiler. To make it even easier, most build scripting tools provide built in capability to do this. NAnt and MSBuild both provide (for C#) &amp;lt;csc&amp;gt; tasks that can accept wild carded lists of code files. This means you can end up with something like this coming out of a solution-project structure that has only one project in it:&lt;/p&gt; &lt;p&gt;&amp;lt;csc output="MyApp.DAL.dll" target="library" debug="${debug}"&amp;gt; &lt;br /&gt; &amp;lt;sources&amp;gt; &lt;br /&gt; &amp;lt;include name="MyApp.Core/DAL/**/*.cs"/&amp;gt; &lt;br /&gt; &amp;lt;/sources&amp;gt; &lt;br /&gt; &amp;lt;references&amp;gt; &lt;br /&gt; &amp;lt;include name="log4net.dll"/&amp;gt; &lt;br /&gt; &amp;lt;/references&amp;gt; &lt;br /&gt;&amp;lt;/csc&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;lt;csc output="MyApp.Core.dll" target="library" debug="${debug}"&amp;gt; &lt;br /&gt; &amp;lt;sources&amp;gt; &lt;br /&gt; &amp;lt;include name="MyApp.Core/Business/**/*.cs"/&amp;gt; &lt;br /&gt; &amp;lt;/sources&amp;gt; &lt;br /&gt; &amp;lt;references&amp;gt; &lt;br /&gt; &amp;lt;include name="log4net.dll"/&amp;gt; &lt;br /&gt; &amp;lt;include name="MyApp.DAL.dll"/&amp;gt; &lt;br /&gt; &amp;lt;/references&amp;gt; &lt;br /&gt;&amp;lt;/csc&amp;gt; &lt;/p&gt; &lt;p&gt;&amp;lt;csc output="MyApp.UI.exe" target="winexe" debug="${debug}"&amp;gt; &lt;br /&gt; &amp;lt;sources&amp;gt; &lt;br /&gt; &amp;lt;include name="MyApp.Core/**/*.cs"/&amp;gt; &lt;br /&gt; &amp;lt;exclude name="MyApp.Core/DAL/*.cs"/&amp;gt; &lt;br /&gt; &amp;lt;exclude name="MyApp.Core/Business/*.cs"/&amp;gt; &lt;br /&gt; &amp;lt;/sources&amp;gt; &lt;br /&gt; &amp;lt;references&amp;gt; &lt;br /&gt; &amp;lt;include name="log4net.dll"/&amp;gt; &lt;br /&gt; &amp;lt;include name="MyApp.DAL.dll"/&amp;gt; &lt;br /&gt; &amp;lt;include name="MyApp.Core.dll"/&amp;gt; &lt;br /&gt; &amp;lt;/references&amp;gt; &lt;br /&gt;&amp;lt;/csc&amp;gt; &lt;/p&gt; &lt;p&gt;Likewise, we could consolidate code from multiple projects (really file paths is what the build script sees them as) into one deployable.&lt;/p&gt; &lt;p&gt;&amp;lt;csc output="MyApp.UI.exe" target="winexe" debug="${debug}"&amp;gt; &lt;br /&gt; &amp;lt;sources&amp;gt; &lt;br /&gt; &amp;lt;include name="MyApp.DAL/**/*.cs"/&amp;gt; &lt;br /&gt; &amp;lt;include name="MyApp.Business/**/*.cs"/&amp;gt; &lt;br /&gt; &amp;lt;exclude name="MyApp.UI/**/*.cs"/&amp;gt; &lt;br /&gt; &amp;lt;/sources&amp;gt; &lt;br /&gt; &amp;lt;references&amp;gt; &lt;br /&gt; &amp;lt;include name="log4net.dll"/&amp;gt; &lt;br /&gt; &amp;lt;/references&amp;gt; &lt;br /&gt;&amp;lt;/csc&amp;gt; &lt;/p&gt; &lt;p&gt;Now, when it comes time to change to meet new deployables needs, you just need to modify your build script. Modify the inputs for the different compiler calls and/or add new compilations simply by editing one file. While you’re doing this the rest of your co-workers can continue doing what they need to provide value to the business. When it comes time for you to commit the changes to how things are getting compiled, you only have to worry about merging one file. Because the build script is far less volatile than the code files in your solution-project structure, that merge should be relatively painless.&lt;/p&gt; &lt;p&gt;Another way to look at this is that we are now able to configure and use Visual Studio and the solution-project structure in a way that is optimal for developers to &lt;em&gt;write and edit &lt;/em&gt;code. And, in turn, we configure and use the build script in a way that allows developers to be efficient and effective at &lt;em&gt;compiling and deploying&lt;/em&gt; code. This is the decoupling that we really should have in our process and ecosystem to allow us to react quickly to change, whether it comes from the business or our own design decisions.&lt;/p&gt;&lt;img src="http://igloocoder.com/aggbug/1453.aspx" width="1" height="1"/&gt;</description>
      <guid>http://igloocoder.com/archive/2010/06/09/visual-studio-project-files-and-coupling.aspx</guid>
      <pubDate>Wed, 09 Jun 2010 08:39:40 -0700</pubDate>
    </item>
    <item>
      <title>Rotating text using Graphics.DrawString</title>
      <link>http://feedproxy.google.com/~r/igloocoder/~3/6nHsb7wVbMI/rotating-text-using-graphics.drawstring.aspx</link>
      <description>&lt;p&gt;Recently I needed to create a custom WinForms label-like control that allowed for the text to be displayed in a rotated fashion. Our needs were only for four rotation locations; 0 degrees (the default label position), 90, 180 and 270 degrees. There were other complicating factors, but for this post we’ll only concentrate on this component of the control.&lt;/p&gt; &lt;p&gt;To rotate text using the Graphics.DrawString method you only have to do a couple of things. First you have to use the Graphics.TranslateTransform method, then the Graphics.RotateTransform method, and followed by the Graphics.DrawString. Here’s what it looks like.&lt;/p&gt; &lt;p&gt;using (var brush = new SolidBrush(ForeColor)) &lt;br /&gt;{ &lt;br /&gt; var stringFormat = new StringFormat &lt;br /&gt; { &lt;br /&gt; Alignment = StringAlignment.Near, &lt;br /&gt; LineAlignment = StringAlignment.Near &lt;br /&gt; }; &lt;br /&gt; e.Graphics.TranslateTransform(transformCoordinate.X, transformCoordinate.Y); &lt;br /&gt; e.Graphics.RotateTransform(rotationDegrees); &lt;br /&gt; e.Graphics.DrawString(Text, Font, brush, DisplayRectangle, stringFormat); &lt;br /&gt;}&lt;/p&gt; &lt;p&gt;What you see are the three steps that I outlined above. Let’s start at the bottom and work our way up. The code exists inside of a UserControl’s overridden OnPaint event. The DrawString method makes use of some of the properties on the control, like Text and Font. It also uses the DisplayRectangle property to set the boundaries for the drawing to be the same size as the control. This is one of the keys to making the rotations work. The other key is to provide the DrawString with the StringFormat settings. By setting them to be StringAlignment.Near for both the Alignment and LineAlignment, you are declaring that the text’s location should be based in the top left of the DisplayRectangle’s area.&lt;/p&gt; &lt;p&gt;Graphics.RotateTransform is how you set the rotation value. In the case of our control, we would be putting in a value from the list of 0, 90, 180, and 270. As you might expect the rotations are clockwise with 0 starting with the text in the ‘normal’ location.&lt;/p&gt; &lt;p&gt;Graphics.TranslateTransform is where the last piece of magic occurs. It is here that you set where the top right corner of the text drawing area will be located in the DisplayRectangle’s area. Here are some images that will help clarify the situation.&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.igloocoder.com/images/0degrees.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="0degrees" border="0" alt="0degrees" src="http://www.igloocoder.com/images/0degrees.png" width="240" height="210"/&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;When you need the text to appear the same as “Text Area” does in the above image (rotated 0 degrees), you need to set the TranslateTransform X and Y parameters to be those that are designated by the “X” in the image. In this case, it’s X=0 and Y = 0.&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.igloocoder.com/images/90degrees.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="90degrees" border="0" alt="90degrees" src="http://www.igloocoder.com/images/90degrees.png" width="240" height="211"/&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The picture above shows you what you should be displayed when you are rotating the text “Text Area” 90 degrees. Again, you need to set the TranslateTransform, but this time the values are slightly different. The Y parameter is still 0, but the X parameter equals the height of the text. You can get this value by using the following line of code:&lt;/p&gt; &lt;p&gt;var textSize = TextRenderer.MeasureText(Text, Font); &lt;br /&gt;textSize.Height;&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.igloocoder.com/images/180degrees.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="180degrees" border="0" alt="180degrees" src="http://www.igloocoder.com/images/180degrees.png" width="240" height="209"/&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;To render the text upside down we set the rotation to 180 degrees and then, again, determine the location of the TranslateTransform X and Y coordinates. Like we did for the last rotation, we will need to retrieve the text size to set these values. For this situation Y will be the text height and X will be the text width.&lt;/p&gt; &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.igloocoder.com/images/270degrees.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="270degrees" border="0" alt="270degrees" src="http://www.igloocoder.com/images/270degrees.png" width="240" height="208"/&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;The final step is to make the rotation work for 270 degrees. Like all the others, we need to set the X and Y coordinates for the TranslateTransform method call. Here the Y value will be the text width and the X value will be 0.&lt;/p&gt; &lt;p&gt;This is simply the first step of many to making a control that will allow rotation of the text and locating it in one of 9 locations in a 3x3 grid representation of the control’s DisplayRectangle. More on that in another blog post though.&lt;/p&gt;&lt;img src="http://igloocoder.com/aggbug/1452.aspx" width="1" height="1"/&gt;</description>
      <guid>http://igloocoder.com/archive/2010/06/09/rotating-text-using-graphics.drawstring.aspx</guid>
      <pubDate>Wed, 09 Jun 2010 05:06:17 -0700</pubDate>
    </item>
    <item>
      <title>PrairieDevCon 2010 wrapup</title>
      <link>http://feedproxy.google.com/~r/igloocoder/~3/B8gjnC7EUTc/prairiedevcon-2010-wrapup.aspx</link>
      <description>&lt;p&gt;Friday past brought the end to the first incarnation of the &lt;a rel="nofollow" target="_blank" href="http://www.prairiedevcon.com"&gt;PrairieDevCon&lt;/a&gt; in Regina. The conference had a great buzz of people, interest, conversations and learning about it. It really was a blast to be at it. Thanks to everyone who attended in whatever capacity since it was you that made this event so much fun and productive to be at.&lt;/p&gt; &lt;p&gt;Here are the materials from the sessions that I presented. There isn’t anything for the panel discussion since it was all off the cuff. If you weren’t there you didn’t get to add or absorb….sorry.&lt;/p&gt; &lt;p&gt;Intro To Aspect Oriented Programming: &lt;a rel="nofollow" target="_blank" href="http://www.igloocoder.com/downloads/PrDC10_AOP.pdf"&gt;Slides&lt;/a&gt;, &lt;a rel="nofollow" target="_blank" href="http://www.igloocoder.com/downloads/PrDC10_AOP.zip"&gt;Code&lt;/a&gt; &lt;br /&gt;ORM Fundamentals: &lt;a rel="nofollow" target="_blank" href="http://www.igloocoder.com/downloads/PrDC10_ORM_Fundamentals.pdf"&gt;Slides&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Thanks again everyone and I hope to get invited back to do this all again next year.&lt;/p&gt;&lt;img src="http://igloocoder.com/aggbug/1450.aspx" width="1" height="1"/&gt;</description>
      <guid>http://igloocoder.com/archive/2010/06/06/prairiedevcon-2010-wrapup.aspx</guid>
      <pubDate>Sun, 06 Jun 2010 13:31:05 -0700</pubDate>
    </item>
    <item>
      <title>Prairie Dev Con Materials</title>
      <link>http://haveyougotwoods.com/archive/2010/06/06/310.aspx</link>
      <description>It was a blast presenting at the first Prarie Dev Con. It was great to have so many attendees with a willingness and want to learn new things. As promised, here are the session materials:&lt;br /&gt;
&lt;br /&gt;
&lt;a rel="nofollow" target="_blank" href="http://www.haveyougotwoods.com/Images/haveyougotwoods_com/TDDDemo.zip"&gt;Hands On TDD&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a rel="nofollow" target="_blank" href="http://www.haveyougotwoods.com/Images/haveyougotwoods_com/Silverlight And WCF.zip"&gt;Silverlight &amp;amp; WCF In The Real World&lt;/a&gt;&lt;br /&gt;&lt;img src="http://haveyougotwoods.com/aggbug/310.aspx" width="1" height="1"/&gt;</description>
      <guid>http://haveyougotwoods.com/archive/2010/06/06/310.aspx</guid>
      <pubDate>Sun, 06 Jun 2010 11:16:32 -0700</pubDate>
      <category>Speaking</category>
    </item>
    <item>
      <title>The Tulips are Lovely this Time of Year</title>
      <link>http://www.opgenorth.net/2010/05/30/the-tulips-are-lovely-this-time-of-year/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=the-tulips-are-lovely-this-time-of-year</link>
      <description>&amp;#160; You have to love spring time in Alberta.&amp;#160; The tulips have such a contrast against the snow at 21:30 on a Saturday evening:</description>
      <guid>http://www.opgenorth.net/2010/05/30/the-tulips-are-lovely-this-time-of-year/</guid>
      <pubDate>Sun, 30 May 2010 09:44:13 -0700</pubDate>
      <encoded>&lt;p&gt;&amp;#160;&lt;/p&gt;
&lt;p&gt;You have to love spring time in Alberta.&amp;#160; The tulips have such a contrast against the snow at 21:30 on a Saturday evening:&lt;/p&gt;
&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://www.opgenorth.net/wp-content/uploads/2010/05/omvt.jpg"&gt;&lt;img style="border-bottom:0px;border-left:0px;display:block;float:none;margin-left:auto;border-top:0px;margin-right:auto;border-right:0px;" title="omvt" border="0" alt="omvt" src="http://www.opgenorth.net/wp-content/uploads/2010/05/omvt_thumb.jpg" width="364" height="484"/&gt;&lt;/a&gt;&lt;/p&gt;</encoded>
    </item>
    <item>
      <title>TFS Integration for Source Control in Blend 4, and why it might not be working for you</title>
      <link>http://generatedbyatool.net/content/post/2010/05/28/TFS-Integration-for-Source-Control-in-Blend-4-and-why-it-might-not-be-working-for-you.aspx</link>
      <description>&lt;p&gt;Since I haven't written here in a while, I thought I'd toss out this quick tip while it's on my mind.&lt;/p&gt;
&lt;p&gt;Working with Expression Blend for WPF or Silverlight can be gratifying.&amp;nbsp; Sketchflow in particular is a great way to rapidly develop clickable prototypes.&amp;nbsp; Of course, especially if you're working on a Blend project as a team, you'll want to be using version control with a source repository.&amp;nbsp; Turns out that Blend 4 has TFS 2010 integration built in (and it can be enabled for Blend 3 via patches for both Blend and TFS 2008).&lt;/p&gt;
&lt;p&gt;However, if you're working in Blend, you may find the path to that a little convoluted.&lt;/p&gt;
&lt;p&gt;See, you can't actually initially add a project to source control from within Blend.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;At first, I had created the project in Blend, and then when we got to the point where wanted to work on it as a team, we used the Source Control Explorer in Visual Studio 2010 to map the path and check the files into TFS source control.&amp;nbsp; However, there was no integration with Blend, which was painful, as files would have to be manually checked out through Visual Studio and then manually checked back in.&amp;nbsp; More painfully, new files added to the project would not be picked up and would have to be manually added.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This frustrated me enough (and made me start worrying about potentially sticky bad-merging scenarios) to see if the Internet knew of any way to make Blend behave the same way as Visual Studio does with regards to source controlled projects... only to find that it's supposed to already be a part of Blend 4.&amp;nbsp; So why wasn't it working?&lt;/p&gt;
&lt;p&gt;After a little poking and prodding, I finally realised that although the files were in source control, the solution and project files were not &lt;strong&gt;&lt;em&gt;BOUND &lt;/em&gt;&lt;/strong&gt;to source control.&lt;/p&gt;
&lt;p&gt;This is not something you can accomplish via Blend.&amp;nbsp; However, if you close Blend, open the solution in Visual Studio, go to &lt;em&gt;File &amp;gt; Source Control &amp;gt; Change Source Control&lt;/em&gt;..., select each item listed and click &lt;em&gt;Bind&lt;/em&gt;, since the containing folder is already mapped to a source repository folder and the solution and project files are in source control it'll pick up the correct binding.&amp;nbsp; Save and close Visual Studio, and then open the solution in Blend again, and voila!&amp;nbsp; Blend is now aware of TFS!&amp;nbsp; You can check files in and out manually from the Projects pane, files will automatically be checked out when you edit them in Blend, and new files added to the project will automatically be added to source control, just like in Visual Studio.&lt;/p&gt;
&lt;p&gt;This is one of those things that seems really self-evident after you recognize it, but you might be like me and not recognize it right away.&amp;nbsp; So here it is blogged for the benefit of your Google search results.&lt;/p&gt;</description>
      <author>Grank</author>
      <guid>http://generatedbyatool.net/content/post.aspx?id=3aeef6b2-7cb5-435a-b917-89a2654444ac</guid>
      <pubDate>Fri, 28 May 2010 10:03:00 -0700</pubDate>
    </item>
    <item>
      <title>Gotta Love JetBrains</title>
      <link>http://www.opgenorth.net/2010/05/22/gotta-love-jetbrains/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=gotta-love-jetbrains</link>
      <description>Gotta love companies that &amp;#8220;get it&amp;#8221;. Late last night I was hacking away on some Android stuff using IntelliJ 9.0.2 (on Ubuntu 10.04). For reasons unknown to me, none of my breakpoints seemed to be working. In fact, IntelliJ just didn&amp;#8217;t seem to be working. I narrowed it down to the breakpoints I was setting [...]</description>
      <guid>http://www.opgenorth.net/2010/05/22/gotta-love-jetbrains/</guid>
      <pubDate>Sat, 22 May 2010 20:22:29 -0700</pubDate>
      <encoded>&lt;p&gt;Gotta love companies that &amp;#8220;get it&amp;#8221;. Late last night I was hacking away on some Android stuff using IntelliJ 9.0.2 (on Ubuntu 10.04). For reasons unknown to me, none of my breakpoints seemed to be working. In fact, IntelliJ just didn&amp;#8217;t seem to be working. I narrowed it down to the breakpoints I was setting &amp;#8211; it seemed that every time the breakpoints were being hit. I managed to narrow it down to this error:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;span class="Apple-style-span" style="border-collapse:separate;color:#000000;font-family:'Times New Roman';font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;orphans:2;text-indent:0px;text-transform:none;white-space:normal;widows:2;word-spacing:0px;font-size:medium;"&gt;&lt;span class="Apple-style-span" style="border-collapse:collapse;color:#444444;font-family:arial, sans-serif;font-size:13px;"&gt;[ 166030] ERROR &amp;#8211; lij.debugger.impl.InvokeThread &amp;#8211; null&lt;br /&gt;
java.lang.UnsupportedOperationException&lt;br /&gt;
at com.sun.tools.jdi.ReferenceTypeImpl.sourceDebugExtension(ReferenceTypeImpl.java:774)&lt;br /&gt;
at org.jetbrains.plugins.ruby.jruby.debug.JRubyPositionManager.getPath(JRubyPositionManager.java:141)&lt;br /&gt;
at org.jetbrains.plugins.ruby.jruby.debug.JRubyPositionManager.getPsiFileByLocation(JRubyPositionManager.java:156)&lt;br /&gt;
at org.jetbrains.plugins.ruby.jruby.debug.JRubyPositionManager.getSourcePosition(JRubyPositionManager.java:51)&lt;br /&gt;
at com.intellij.debugger.engine.CompoundPositionManager.getSourcePosition(CompoundPositionManager.java:51)&lt;br /&gt;
at com.intellij.debugger.engine.ContextUtil.getSourcePosition(ContextUtil.java:63)&lt;br /&gt;
at com.intellij.debugger.impl.DebuggerSession$MyDebugProcessListener$2.compute(DebuggerSession.java:462)&lt;br /&gt;
at com.intellij.debugger.impl.DebuggerSession$MyDebugProcessListener$2.compute(DebuggerSession.java:460)&lt;br /&gt;
at com.intellij.psi.impl.PsiDocumentManagerImpl$3.run(PsiDocumentManagerImpl.java:298)&lt;br /&gt;
at com.intellij.psi.impl.PsiDocumentManagerImpl$4.run(PsiDocumentManagerImpl.java:321)&lt;br /&gt;
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:695)&lt;br /&gt;
at com.intellij.psi.impl.PsiDocumentManagerImpl.commitAndRunReadAction(PsiDocumentManagerImpl.java:317)&lt;br /&gt;
at com.intellij.psi.impl.PsiDocumentManagerImpl.commitAndRunReadAction(PsiDocumentManagerImpl.java:296)&lt;br /&gt;
at com.intellij.debugger.impl.DebuggerSession$MyDebugProcessListener.paused(DebuggerSession.java:460)&lt;br /&gt;
at com.intellij.debugger.engine.DebugProcessAdapterImpl.paused(DebugProcessAdapterImpl.java:28)&lt;br /&gt;
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)&lt;br /&gt;
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)&lt;br /&gt;
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)&lt;br /&gt;
at java.lang.reflect.Method.invoke(Method.java:616)&lt;br /&gt;
at com.intellij.util.EventDispatcher.dispatch(EventDispatcher.java:87)&lt;br /&gt;
at com.intellij.util.EventDispatcher.access$100(EventDispatcher.java:33)&lt;br /&gt;
at com.intellij.util.EventDispatcher$1.invoke(EventDispatcher.java:64)&lt;br /&gt;
at $Proxy84.paused(Unknown Source)&lt;br /&gt;
at com.intellij.debugger.engine.SuspendManagerImpl.notifyPaused(SuspendManagerImpl.java:306)&lt;br /&gt;
at com.intellij.debugger.engine.SuspendManagerImpl.b(SuspendManagerImpl.java:299)&lt;br /&gt;
at com.intellij.debugger.engine.SuspendManagerImpl.voteSuspend(SuspendManagerImpl.java:318)&lt;br /&gt;
at com.intellij.debugger.engine.DebugProcessEvents$1.contextAction(DebugProcessEvents.java:412)&lt;br /&gt;
at com.intellij.debugger.engine.events.SuspendContextCommandImpl.action(SuspendContextCommandImpl.java:62)&lt;br /&gt;
at com.intellij.debugger.engine.events.DebuggerCommandImpl.run(DebuggerCommandImpl.java:44)&lt;br /&gt;
at com.intellij.debugger.engine.DebuggerManagerThreadImpl.processEvent(DebuggerManagerThreadImpl.java:148)&lt;br /&gt;
at com.intellij.debugger.engine.DebuggerManagerThreadImpl.processEvent(DebuggerManagerThreadImpl.java:36)&lt;br /&gt;
at com.intellij.debugger.impl.InvokeThread.run(InvokeThread.java:135)&lt;br /&gt;
at com.intellij.debugger.impl.InvokeThread$WorkerThreadRequest.run(InvokeThread.java:52)&lt;br /&gt;
at com.intellij.openapi.application.impl.ApplicationImpl$5.run(ApplicationImpl.java:329)&lt;br /&gt;
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)&lt;br /&gt;
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)&lt;br /&gt;
at java.util.concurrent.FutureTask.run(FutureTask.java:166)&lt;br /&gt;
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)&lt;br /&gt;
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)&lt;br /&gt;
at java.lang.Thread.run(Thread.java:636)&lt;br /&gt;
at com.intellij.openapi.application.impl.ApplicationImpl$1$1.run(ApplicationImpl.java:125)&lt;br /&gt;
[ 166036] ERROR &amp;#8211; lij.debugger.impl.InvokeThread &amp;#8211; IntelliJ IDEA 9.0.2 Build #IU-95.66&lt;br /&gt;
[ 166036] ERROR &amp;#8211; lij.debugger.impl.InvokeThread &amp;#8211; JDK: 1.6.0_18&lt;br /&gt;
[ 166036] ERROR &amp;#8211; lij.debugger.impl.InvokeThread &amp;#8211; VM: OpenJDK Server VM&lt;br /&gt;
[ 166036] ERROR &amp;#8211; lij.debugger.impl.InvokeThread &amp;#8211; Vendor: Sun Microsystems Inc.&lt;br /&gt;
[ 166036] ERROR &amp;#8211; lij.debugger.impl.InvokeThread &amp;#8211; OS: Linux&lt;br /&gt;
[ 166036] ERROR &amp;#8211; lij.debugger.impl.InvokeThread &amp;#8211; Last Action: Debug&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So, the problem to me seemed to be something wonky with IntelliJ. I e-mailed Jetbrains, explaining the symptoms and the above stack trace. This morning, I was pleased to find an e-mail from Serge at Jetbrains. He suggests disabling the Ruby plug-in that I have installed.&lt;/p&gt;
&lt;p&gt;BINGO!&lt;/p&gt;
&lt;p&gt;Worked like a charm. Problem goes away, and in less than 12 hours since I asked for help.&lt;/p&gt;</encoded>
    </item>
    <item>
      <title>Going Digital At Home - Part 1</title>
      <link>http://haveyougotwoods.com/archive/2010/05/04/going-digital-at-home-part-1.aspx</link>
      <description>We have a lot of disparate sources of media around our home. DVDs, CDs, VHS, downloaded content, mp3s, etc. I find it to become more and more of a hastle running around finding the media I want, and then finding the device that can play that. Plus with 3 kids running around it is inevitable that their (and sometimes my) optical media gets scratched or damaged.&lt;br /&gt;
&lt;br /&gt;
To that end I have decided to try and go completely digital in our home and felt that documenting it may be of help to others.&lt;br /&gt;
&lt;br /&gt;
Infastructure:&lt;br /&gt;
Wireless network (802.11g)&lt;br /&gt;
3 televisions&lt;br /&gt;
2 original xboxes&lt;br /&gt;
1 xbox 360&lt;br /&gt;
1 server (more on this later)&lt;br /&gt;
multiple client laptops&lt;br /&gt;
&lt;br /&gt;
Goal:&lt;br /&gt;
-Have all media centralized&lt;br /&gt;
-Have a backup of all media (if I had to do this all over again I would cry)&lt;br /&gt;
-Have different media available from different terminals (kids television should not be able to watch adult shows)&lt;br /&gt;
&lt;br /&gt;
Requirements:&lt;br /&gt;
The first step here was to get a central computer that will store all the media. This computer should have the following:&lt;br /&gt;
-Lots of storage&lt;br /&gt;
-A DVD and or Blue Ray player&lt;br /&gt;
-Have some sort of hard drive redundancy&lt;br /&gt;
-Enough CPU power to convert videos on the fly (A Pentium III 700Mhz is the bare minimum you would want)&lt;br /&gt;
-Enough techincal knowhow to install an operating system, install software, and install hardware into a computer.&lt;br /&gt;
&lt;br /&gt;
To do this I took an old server I had (but a desktop would work just fine) and installed two 2TB drives into it (at the time of writing they cost only $150 each). I also installed Windows Server 2008 R2 onto it but any OS of choice should do. &lt;br /&gt;
&lt;br /&gt;
The biggest difference between my setup and the average user is that my media server has a builtin SATA raid card which I configured to mirror the drives (so I only have 2GB of storage but when (not if, when) one fails I can plunk in another and be on my way). If you don't have hardware RAID and don't want to purchase it you can actually setup a raid in software. Setting up a software raid can be a bit tricky but I found a &lt;a rel="nofollow"&gt;great article&lt;/a&gt; about it. The only thing I would change is to give more than 10GB to windows / programs (at least 40GB nowdways I would think). Trust me in that running out of room on a partition is one of the most annoying things to happen to a person.&lt;br /&gt;
&lt;br /&gt;
Once you have the system setup and running I like to make sure that the drives are actually redundant. I have never ever found that a mirror is not actually working after I set it up but I just like to make sure. To do this I take each hard drive out and slave it into another computer and ensure that they both have the same data on it (just a quick check to make sure that the folder structures are copied to each). Once that is done I put them both back in and ensure the mirror is functioning (sometimes it may detect they are out of sync and need to resync the array). The other way to do this is to remove one drive from the server, turn it on, make sure it works, then repeat with the other drive. This process will require a resync of the array which is time consuming. It took at least 15 hours to resync my 2TB array.&lt;br /&gt;
&lt;br /&gt;
That is about it for now. In the future we will talk about software on the server, ripping DVDs and CDs, and how to watch/listen to this stuff on you TVs and computers effectively.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;img src="http://haveyougotwoods.com/aggbug/309.aspx" width="1" height="1"/&gt;</description>
      <guid>http://haveyougotwoods.com/archive/2010/05/04/going-digital-at-home-part-1.aspx</guid>
      <pubDate>Tue, 04 May 2010 08:48:31 -0700</pubDate>
      <category>General</category>
    </item>
  </channel>
</rss>