About that rapture thing

It’s May 21, and we’re all still here. Not that I expected a different outcome, but there’d been a lot of buzz in the press lately about the latest prediction of the end of the world.

The rapture was even a topic at work on Friday–in jest at first, but more and more serious as the conversation went on. A few of us (two of us Christian, one a sort of agnostic) talked about the crucifixion, the resurrection, the last supper, even Christ in the garden of Gethsemane.

Today at church, our pastor spoke at length on the reactions he’d heard to those who believed the world was ending today–most of them negative. He didn’t agree with their theology, but respected their willingness and seriousness in acting on their faith and sharing it with others. As Seventh-day Adventists (a denomination that came out of a movement that believed Christ would return in 1844), he reminded us that we should be more sympathetic to those with beliefs different than ours.


Introducing NuGet

Today at work, I gave a presentation on NuGet.  I’ve suggested they consider it as an option to ease management of the open source dependencies of our major application, so it was natural that I present the pros and cons.

NuGet is a system for managing .NET packages.  It’s not unlike RubyGems or CPAN (for Ruby and Perl respectively), and while it has some work to do to be on par with those alternatives, they’re off to a very good start.  Today’s presentation focused on just a few the capabilities of NuGet, and I’ll recap a few from my presentation in this post.

The primary use case for NuGet is the management of open source dependencies in a .NET application.  There are a number of key open source libraries that .NET developers like me have been using in projects for years.  Upgrades were always a pain because of having to manage their dependencies manually.  Many of these tools (NHibernate, NUnit, log4net, and more) are already available as NuGet packages at the NuGet Gallery.  I used NHibernate and NUnit in my examples today.  Another tool that proved quite useful in my demo was the NuGet Package Explorer.  Some of its features include:

  • Opening and downloading packages from remote feeds
  • Opening local packages to view and change their metadata and contents
  • Creating new packages (instead of fiddling with XML manually)
In addition to getting packages from Microsoft's official feed, it's possible to create your own feed of NuGet packages.  Phil Haack has a post on how to do this.  My demo for work only included a local folder feed source, but I tried Haack's instructions at home and they worked quite well.

I wrapped up my presentation with two different examples of building NuGet packages without a manually-created .nuspec file as a starting point.  The documentation provides examples of how to generate a .nuspec file from an existing DLL, and how to generate a NuGet package from a .csproj or .vbproj file.  I published the rules engine (which I found in an answer to a stackoverflow.com question), and a test assembly I created to the NuGet Gallery earlier this evening.  If you want to check them out, just search for Arpc.RulesEngine in the NuGet Gallery.  I still need to publish the rules engine source as a package and/or  push it to a symbol server.  Once the enterprise story for NuGet becomes a bit clearer, I hope I have an opportunity to present on that as well.


Practical MVVM

Last Wednesday night, I attended a talk at RockNUG on MVVM by Joel Cochran.  It’s the best explanation of the Model-View-ViewModel design pattern that I’ve seen so far.  I found his talk particularly useful because he focused on the fundamentals of the design pattern instead of a specific framework (of which there are many).

Cochran’s talk was good for second and completely unexpected reason–his use of Mercurial for his code demos.  I’ve been to my share of conferences and user groups and seen a lot of demos, but before that talk, I’d never seen a speaker eliminate the inevitable typos and otherwise speed up his presentation that way.  When there was some code he wanted to show that exhibited an aspect of his Practical MVVM Manifesto, he simply grabbed a commit from his local Mercurial repository and updated the code in place.  The next time I give a talk or do any demos, I hope I can make good use of that trick too.


Wedding Website Up

Here it is: http://ebandscott.tying.the.knot.org/

Thanks again to my friend Sandro for setting this up.


Ballet

This year is the second in a row I’ve gotten to go to a Kennedy Center performance.  Last year, my girlfriend (now fiancée) and I went with another couple to see Porgy & Bess.  This past Thursday, it was the Alvin Ailey American Dance Theater.  Having never seen a ballet before (or anything called modern dance for that matter), I had no idea what to really expect.  It turned out to be quite a fun time.

Of the four works they performed (all of which were impressive), my favorite parts were the solo “The Evolution of a Secured Feminine”, and other dances within “Revelations” (the company’s signature work) that had no more than a handful of dancers.  I suppose that no one goes to the ballet for the music, but with Duke Ellington music as the backdrop for one of the pieces and gospel for some of the others, I certainly enjoyed that as much as the dancing.


.NET Reflector--No Longer Free, But Still Worth It

Those of us who registered with red-gate.com after they bought Reflector from its creator, Lutz Roeder, got an e-mail on February 2 saying the next version of Reflector would no longer be free.  It’s the second time in my recent memory that a free and/or open source package for .NET became closed.  The first one was NCover, which was probably the best option out there for determining how much of your codebase was covered by unit tests.  Even at a price with subscription of $658, it may be a more cost-effective option than paying for the Visual Studio sku that includes team testing tools.

By contrast, the entry-level price for .NET Reflector is relatively low ($35).  As a tool, I think it’s valuable enough to the every-day .NET developer to spend their own money for.


(Finally) Engaged

Back on January 14, I turned my girlfriend Ebony into my fiancée :-)  The next day, we went cruising for a week in the eastern Caribbean with some friends (more on that in another post).

My buddy Sandro is setting up another website that will have all the particulars about the wedding.


Introducing .NET Reflector

I gave a presentation on .NET Reflector at the January 12 meeting of RockNUG.  I took most of my time demonstrating the product and answering questions, so I had very few slides.  So instead of simply posting them here and calling it a day, this blog post will incorporate some of the Q & A that happened during the presentation.

What Is It?

The title slide in my presentation called .NET Reflector an “x-ray machine for (unobfuscated) .NET assemblies”.  That little phrase actually understates what .NET Reflector can do.  Decompiling .NET assemblies is only one of the three major things it does (and is probably the best-publicized of its capabilities).  This tool also provides an excellent class browser and static analysis capabilities.

Why Is It Helpful?

In addition to giving developers to see code for third-party assemblies when they don’t have access to their source files, it can be quite a useful learning tool for seeing what the compiler generates on-the-fly for the source code we write ourselves.

Demos

One of the first features I demonstrated was the ability of .NET Reflector to decompile an assembly into multiple .NET languages.  C# is the default, but VB.NET, Delphi, Oxygene, MC++, F#, and MSIL are the other target languages available out of the box.  Using the add-in architecture of .NET Reflector, one developer added limited support for decompilation to PowerShell (download the PowerShellLanguage.zip file).

Around this point in the presentation, someone asked if you could cut-and-paste decompiled source into a file.  Not only does it work, but with Denis Bauer’s Reflector FileDissassembler plug-in installed, you can decompile an entire assembly into its constituent source code files (though I suspect that Red Gate Software would prefer that you pay for .NET Reflector Pro to get this capability). 

I was also able to demonstrate the much-overlooked static analysis capabilities of .NET Reflector.  They enable developers to learn what code depends on particular methods, where they’re used, what code exposes them, and where they’re called.  It turns out that there’s a free plug-in which extends this capability even further.  The Dependency Structure Matrix (DSM) plug-in allows developers to generate and manipulate matrices for determining the level of complexity in a software architecture.  Considering that a full-featured tool with DSM capability like NDepend costs hundreds of dollars per seat license, even a fraction of those features from a free .NET Reflector plug-in are well worth the time to learn how to leverage.

More Q & A

When I showed that .NET Reflector pulled in source code comments in its display of disassembled code, one member of the audience pointed out (correctly) that this was only possible because the XML file containing the comments was co-located with the assembly.  When I tested the disassembly capability afterwards without the XML file present, the comments didn’t display.

There was also a question from the audience about how .NET Reflector compared with ILDASM (which ships with the .NET Framework).  The short answer is that ILDASM is far more limited by comparison.  It only decompiles to IL, it lacks the analysis capabilities of .NET Reflector, and most importantly it doesn’t have a plug-in architecture to enable expansion of what it can do.

Conclusion

My presentation on January 12 only scratched the surface of what .NET Reflector can do.  I hope this post has added more depth, and piqued your curiosity to use the tool to improve your own development experience.  You may find the following links helpful in leveraging .NET Reflector for your own development work:


Candied Sweet Potatoes

Last month (for Thanksgiving), my dad, sister, a few cousins and I cooked so mom could have a break. The food turned out so well, she asked us to do it again for Christmas–including a candied sweet potato recipe I cobbled together from different ones on the internet. The recipe is below.

Ingredients 4-5 lbs of sweet potatoes 1 20oz can of crushed pineapple 1 1/2 cups of dark brown sugar 1 1/4 cup of I Can’t Believe It’s Not Butter cinnamon, nutmeg, & ginger to taste

Instructions Fill an 8qt pot 2/3rds of the way with water. Bring to a boil. Boil the sweet potatoes for 15 minutes. Drain and set aside to cool for peeling and slicing later.

In a saucepan, melt the I Can’t Believe It’s Not Butter, add the brown sugar and stir. Add cinnamon, nutmeg, and ginger until the sauce tastes how you want it.

After you’ve peeled and sliced the sweet potatoes, lay down a layer of them, drizzle/smear on some of the sauce, and sprinkle on some of the crushed pineapple. Repeat until you’ve filled whatever casserole dish or foil pan you’re using.

Bake this at 425 degrees for 90 minutes.


The problem with exit interviews

The biggest problem with exit interviews is that they’re too little, too late. I had an exit interview recently (since I accepted an offer to go elsewhere), and there wasn’t anything wrong with the questions–it was just that nothing could be done about any of the concerns I raised.

The second major problem with exit interviews is that they focus too narrowly. All the feedback from exit interviews comes from people who’ve decided to leave. Assuming a company has had relatively low turnover for awhile, the feedback could be leaving out information from as much as 90% of its workforce.

If a company is serious about employee retention, they need to get feedback from as much of their workforce as possible on a regular basis. In my exit interview, I got questions about benefits, commute, holidays, and other issues. Regular, anonymous surveys on those issues would probably reveal a lot of useful information about ways benefits could be improved. Gathering this kind of information regularly will mean that at least some (if not most) of the answers you get will be from people who still have a stake in the company’s future.


Deleting TFS Tasks

I changed the state of a TFS task I was working on recently, only to discover the workflow wouldn’t let me return it to it’s prior state.  Until today, I didn’t know it was possible to delete TFS tasks if you made a mistake in changing one.  But some Googling revealed a blog post that explained how to delete tasks.

The direction of the slashes for the URL can point forward (/) instead of backward () and the witadmin.exe destroywi /Collection:<TFS url> /id:<Task id> command still works.


Filtering Heterogeneous Arrays in .NET

One of the bugs I was recently asked to fix for an application required me to determine whether or not to display one of the members of a list.  This proved somewhat challenging since the lists in question were heterogeneous (two difference subtypes of an abstract base class).  It turned out that LINQ provides a nice solution to this sort of problem in the form of the OfType<T> method.

Given an IEnumerable collection with elements of multiple types, calling OfType<T> on the collection where T is the desired type will return a collection containing only elements of type T.  Before learning about OfType<T>, I’d been using the Cast<T> method.  This was fine as long as all the collection elements were of the type T I wanted.  The moment this wasn’t the case, my LINQ query threw a cast exception.  OfType<T> seems to work similarly to the “as” operator in C#, in that it doesn’t complain if a list element isn’t type T–it simply excludes it from the returned collection.


PowerGUI and .NET Framework 4.0

On my current project, we use PowerShell scripts to automate our UI testing.  We’ve been writing and running the scripts in the PowerGUI Script Editor, an excellent tool that’s also free.  When we upgraded our application to run on version 4.0 of the .NET Framework from 3.5, we lost the ability to run PowerShell scripts in debug mode from PowerGUI.

The only work-around for this I’ve found (at least until a version of PowerGUI built on .NET 4.0 comes out), is a registry hack that forces all the .NET apps on the machine to use the latest version of the CLR.  You can find more details in this user discussion at powergui.org, or this discussion on stackoverflow.com.


New MSBuild 4.0 Features

My current assignment has me working with the application build again.  MSBuild 4.0 got a number of new features which I’m only now getting to take advantage of.  The coolest one so far is the extensible task factory.  It lets you define custom MSBuild tasks right in the project file, instead of having to create a separate DLL for them.  Andrew Arnott wrote a custom factory that lets you define custom MSBuild tasks using PowerShell.  Because we’re using PowerShell for UI automation testing of our application, we’ll soon be able to integrate those tests into our build system.

Another feature I just learned about is conditional constructs.  They provide functionality equivalent to a case statement you might see in other languages. It’s much more flexible than the Condition attribute available on most MSBuild tasks.


ScrollViewer+ItemsControl vs. ListView

One of my most recent tasks at work was determining the cause of slow performance in one part of an application and coming up with a fix (if possible).  We tracked the source of the problem down to a use of ItemsControl inside a ScrollViewer.  Because the ItemsControl instance was trying to display hundreds of complex items, it took a noticeably long time to load.  This turns out to be a known issue, with a few possible solutions.  Simply changing the ItemsPanelTemplate of the ItemsControl instance to contain a VirtualizingStackPanel didn’t fix our performance problem.

What did resolve our performance issue was replacing the ScrollViewer and ItemsControl combination with a ListView.  The list of what we changed includes:

  • Giving the ListView the same name as the ItemsControl.
  • Giving the ListView the same ItemsSource as the ItemsControl.
  • Update the ItemsPanelTemplate of the ListView to use VirtualizingStackPanel.
  • Set HorizontalScrollBarVisibility to "Disabled".
  • Bound the Visibility property of the ListView to a Converter.
  • Update the ItemContainerStyle with a ListViewItem style that sets the HighlightBrushKey and ControlBrushKey to be transparent.
Note: The last of those steps does override those styles for the entire application, so it may be best to skip it unless it doesn't negatively impact the look-and-feel of the rest of your application.

The changes we made reduced the load time from around 20 seconds down to less than 2 seconds for 400 items.

The tradeoff in moving to a ListView (with VirtualizingStackPanel) from ScrollViewer+ItemsControl is scrolling speed.  Scrolling through 400 items does go more slowly, but it’s preferable to waiting as long as we did just to see the data.


Bloatware happens when you aren't the only customer

This article in Ars Technica reminded me of one of the things I never liked about PCs you bought from Dell, HP, or any major vendor–bloatware.  Every PC I’ve had that I didn’t build myself, and every Windows laptop had multiple pieces of software that I didn’t want.  The least-offensive of these apps merely took up hard drive space.  The worst made the computer slower and more of a hassle to use.  Switching from Windows to Mac at home meant no more bloatware.  Moving to an Intel chip-based Mac extended the no-bloatware experience to Windows VMs.  Moving to the iPhone a couple of years ago (and sticking with it by buying an iPhone 4) seems to have spared me from vendor bloatware as well.  This is especially important in the mobile space because today’s smartphones have a lot less storage space to waste, and less-powerful CPUs than modern PCs.

Bloatware happens on the PC because even though we buy them, we aren’t the only customer.  Every company with some anti-virus software to sell, a search engine they want you to use, or some utility they want you to buy wants to be on your PC or laptop.  They’re willing to pay to be on your new machine, and PC vendors aren’t going to turn down that money.  A similar thing seems to be happening on Android phones now.  Here’s the key quote from the story:

"It's different from phone to phone and operator to operator," says Keith Nowak, spokesman for HTC. "But in general, the apps are put there to meet the operator's business and revenue needs." (emphasis mine)
The money we pay for our voice and data plans isn't the only money that Verizon, AT&T, Sprint, & T-Mobile want.  Some of these carriers have decided that they'll take money from other companies who want to put applications on the smart-phones they sell.  This highlights one of the key differences between the way Google approaches the mobile phone market and the way Apple does it.

When it comes to Android, you and I aren’t Google’s customers–not really.  The real customers are mobile phone hardware vendors like Motorola and HTC.  They need to care how open and customizable Android is because they expect it to help them sell more phones.  Making the OS free for the vendors is in Google’s interest because the bulk of their revenue comes from advertising.  The more phones there are running Android, the more places their ads will appear.  Android’s openness is only of interest to us as users to the extent it allows us to do what we want with our mobile phone.

Unlike Google, Apple is in business to sell us electronics.  They expect iOS4 to help them sell more iPhones and iPads.  But since you and I are the customers Apple is chasing, no pre-loading of apps from third parties.  It doesn’t mean they won’t feature apps that highlight the phone’s capabilities (Apple does plenty of that).  Nor does it mean we can’t get apps from AT&T, just that putting them on and taking them off is our choice.  There is a tradeoff as far as how long iPhone users wait for features when compared with Android phone users.  But I think the iPhone features all work better, and work together to create arguably the best smartphone available.


My First PowerShell Cmdlet

We’ve been using PowerShell to write automated tests of the UI on my current project.  One of the tasks I took on today was creating a custom cmdlet to enable us to select radio buttons.

I already had an existing assembly of cmdlets to work with, so I just added a new class (SelectRadioButton) to it.  Next, I added references to System.Management.Automation and System.Windows.Automation. With these references in place, I could add this attribute to the class:

[Cmdlet(VerbsCommon.Select, "RadioButton", SupportsShouldProcess = true)]
The attribute determines the actual name of the cmdlet you'll use in scripts (Select-Radiobutton).  The cmdlet needs an instance of AutomationElement to operate on, so that's defined next:
[Parameter(Position = 0, Mandatory = true, HelpMessage = "Element containing a radio button control")] [ValidateNotNull] public AutomationElement Element { get; set;}
Finally, I adapted some of the logic for my override of the ProcessRecord from this article on using UI automation.  The end result looks something like this:
protected override void ProcessRecord() { try { if (Element.Current.ControlType.Equals(ControlType.RadioButton)) { SelectionItemPattern pattern = Element.GetCurrentPattern(SelectionItemPattern.Patern) as SelectionItemPattern; if (pattern != null) pattern.Select(); } else { //Put something in here for handling something other than a RadioButton } } catch (Exception ex) { // You could put some logging here throw; } }

In non-iPhone 4 news

Apple stealthily revised the Mac mini.  Get the full story here, but the part I think is the most interesting is that they designed in a removable panel on the bottom to make it easy to replace the RAM yourself.  It shows a rare bit of flexibility from Apple when it comes to their hardware.

As for the rest of the device:

  • No more power brick?  Nice!
  • Tons of ports (including HDMI).
  • SD card slot
  • No Blu-Ray?  Rats.  "Bag of hurt" or no, that would have been nice.
  • The price bump from the previous version of the Mac mini seems a bit steep.
The original Mac mini was the first computer I ever bought from Apple.

When default settings attack

When you first install SQL Server 2008 Express, the TCP/IP protocol is disabled by default.  Be sure the protocol is enabled (which requires restarting the service) before you try to run an application that depends on it, otherwise you could spend hours trying to figure out why your application won’t work.  It looks like SQL Server 2008 R2 Developer behaves the same way.

I suggested this awhile back to a co-worker who’d been struggling all day with why an application wasn’t working, and it turned out to be the solution.


To Curacao and back

I spent the past 7 days vacationing in Curacao with my girlfriend Ebony and another couple we’re friends with.  In this post, I’ll talk about how it went, and how I might have done things differently if I were visiting again.

Why Curacao?

Ebony has wanted to go there for awhile, because of the beautiful water, sun, and beaches.

What to wear

Definitely wear light clothing.  Average high temperatures in Curacao are mid-to-upper 80s Fahrenheit year-round.  Don’t skimp on sunscreen, or you’ll regret it–even if your skin is already relatively dark.  My friends aren’t that much lighter than me, and all of them got burnt.  Don’t go easy on bug spray either.

Accommodations

We spent two nights at Renaissance Curacao Resort & Casino in Willemstad.  If you’re familiar with and/or a fan of Marriott properties, this one has everything you expect.  They also have plenty of outlets for appliances and electronics from the U.S., so you won’t need to use converters.  The only wi-fi access appeared to be in the lobby, and I never managed to connect with my iPhone.  There’s wired internet access from the rooms, so netbook and laptop users will have an alternative to the business center.  The private beach they talk about on their web page is man-made, and doesn’t connect directly to the ocean, but a large saltwater pool.

We spent the rest of the time at the Hyatt Regency Curacao Golf Resort, Spa, and Marina.  Parts of the property are still under construction, so we got the benefit of a grand opening rate, 4 nights for the price of 3, and free breakfast for the duration of our stay.  The service we received from every member of the staff was excellent.  Without exception, they were all incredibly courteous and polite, and went out of their way to accommodate our requests.  I thought the rooms were nice, but some of the balconies are much better for privacy than others.  The tub has a rather high edge, so it’s a bit of a challenge to get into unless you’re tall.  Strangely, the shower only has frosted glass on half the length of the tub–and no sliding door.

Food

Bistro Le Clochard was expensive, but the food was excellent.  It’s inside Rif Fort, a very short walk from the Renaissance.  We discovered that their kitchen accommodates vegetarians quite well.  It seems to be a quite popular place, so make reservations ahead of time, or you’ll have to eat elsewhere.  The restaurant within the Renaissance is ok.

The Hyatt has three restaurants: Medi, Shor, and Swim.  The food at all of them is quite good, though the serving times vary widely (Shor is the slowest, Swim is the fastest).  Swim will serve you poolside or at the beach.  Their plantain chips and fish tacos were especially good.

How to pay

U.S. currency was accepted everywhere we tried to use it, as were our credit cards.  I checked the tourist board website to get information ahead of time.

Activities, Attractions, & Shopping

Of the attractions available in Curacao, we got to the Kura Hulanda Museum and the Rif Fort in Willemstad.  At Kura Hulanda, the extra money for a tour guide was well worth it.  It provides a great history lesson of many cultures, as well as the slave trade.  With more time, I would have visited the Mikve Israel-Emanuel Synagogue and the Maritime Museum as well.

During our time at the Hyatt, we went on a 3-hour cruise with some time for snorkeling.  I still regret my lack of underwater camera gear for this, because there were a lot of strange and beautiful fish to see.  There was even a small shipwreck close to where we snorkeled that we were able to see.  Ocean Encounters handled our tour, and they did an excellent job.  If we’d planned further in advance, we could have gone on the 7-hour cruise to and from Klein Curacao.  This trip made me wish I knew how to scuba dive.  A trip back for the sole purpose of getting PADI-certified would probably be worth it.

At least in Willemstad, there are tons of places to buy jewelry, electronics, clothes, and souvenirs.  Prices in downtown were pretty good from what I saw.  The street vendors just outside the Rif Fort offered the best prices, and we ended up getting a couple of very nice things in both places.

Getting there (and back)

We flew American Airlines from Reagan National Airport to Hato International via Miami.  Our friends flew to Miami from Philadelphia, then to Hato International.  During the time I researched flight costs, they ranged from $450/person to well over $600/person.  We ended up using frequent flier miles for the DCA-MIA leg of the trip to cut down our out-of-pocket costs.  If I had it to do over again, I’d have planned much further in advance.

One thing I noticed (to my annoyance) about flying into and out of Miami is that the gate personnel decided to pick on either Ebony or both of us about the size of our carry-on luggage.  To make sure you avoid that kind of harassment, make sure your packed carry-on fits in the stupid little cages they have near the gates.  Otherwise, you could end up having to check a bag you weren’t expecting and risk the airline losing it (like American Airlines nearly did with her bag).

The last thing I’ll say about flying to and from Curacao (at least in this post), is to avoid taking the last flight out of Curacao on whatever day you depart.  If there’s a problem with that flight (as there was in our case), you’ll be stuck at least one extra day.