New Gig

Tomorrow will be my first day with FEi Systems.  They design, build and maintain healthcare IT systems, including health information exchanges and electronic health record (EHR) systems.  I’ll be helping their efforts in those areas as a senior developer.  I’m looking forward to being back in the healthcare sector (I worked for another healthcare IT company earlier in my career).  I think it can benefit a great deal from the deployment and usage of well-designed IT systems.

I wouldn’t have been aware of this company, or this opportunity without Stack Overflow Careers.  I was a beta tester on the original site (Stack Overflow), and since it launched it’s been a big help to me in solving a number challenging technical problems on a variety of projects.  Both the career site and Q&A site are worth your while if you write code for a living.

Retraction

Just came across this story relating to my January 25th blog post on Mike Daisey’s story of his visits to factories in Shenzhen. As it turns out they were indeed stories–large portions of his monologue have been revealed as complete fabrications.

This American Life has fully retracted the story, so I thought I would do the same since I linked to it when it first aired.

Inserting stored procedure results into a table

Working with one of my colleagues earlier today, we found that we needed a way to store the results of a stored procedure execution in a table. He found this helpful blog post that shows exactly how.

One thing we found that the original blog post didn’t mention is that this approach works with table variables as well.  A revised example that uses a table variable is available as a gist on GitHub.

Saving Changes is Not Permitted (SQL Server 2008 R2)

We just upgraded our development VMs at work, and I got bitten by one of the more annoying default settings in SQL Server Management Studio again. I imported some data for use in some queries and needed to change one of the column types. But when I tried to save the change, I got the dreaded “Saving changes is not permitted.” error.

Fortunately, this blog post directed me to the setting I needed to change in order for SSMS to do what I wanted.

A Brief Introduction to LINQPad

I presented a brief talk on LINQPad at RockNUG a couple of weeks ago.  This post will elaborate on that presentation a bit, since the 30 minutes I had wasn’t nearly enough to do justice to a tool I only half-joking called the Swiss Army knife of .NET development.

In addition to enabling developers to write and execute LINQ queries, LINQPad can be used to execute SQL queries as well as compose and run code snippets in C#, VB.NET, and F#.  LINQ can query a wide variety of collections and data, including SQL databases and XML.  The ability to query XML with LINQ becomes quite powerful when the XML comes from WCF Data Services (an implementation of the OData protocol).

During my presentation, I queried a local version of the Northwind database, as well as the OData endpoint of Netflix.  StackOverflow publishes their data via an OData endpoint as well. Additional producers of OData services can be found here, or in the Windows Azure Marketplace.

One of the nice features of LINQPad is the number of export options it provides for your query results.  The results of any SQL or LINQ query written in LINQPad can be exported to Excel, Word, or HTML.  The Excel and Word export capabilities give you the option of preserving the formatting LINQPad provides, or leaving it out.  Once you’ve queried a database with LINQ, the results display allows you to toggle between the equivalent fluent LINQ, SQL and MSIL syntax.  I demonstrated this feature by executing a SQL query against the Northwind sample database, then cutting and pasting the equivalent syntax to new query windows and running them to show that the query results were the same.

The LINQPad website pitches the tool as a replacement for SQL Server Management Studio.  To test this proposition, I demonstrated LINQPad’s ability to execute stored procedures.  I used the TenMostExpensiveProducts stored procedure in the Northwind database, and this script to show one way to use LINQPad to run stored procedures that take parameters.

LINQPad’s capabilities as a code snippet runner are further supported by its ability to reference custom assemblies and namespaces.  So instead of dealing with all the overhead of Visual Studio just to write a console application, you could simply write them in LINQPad and reference any custom assemblies you needed.

The latest version of LINQPad also has an extensibility model, if you wanted to query databases other than SQL Server (or different querying sources).

One feature I wished I’d had time to delve into further was LINQPad’s ability to query Entity Framework models defined in Visual Studio.  There’s a brief description of that capability here.

All of the query files from my presentation are available on Github.

Mr. Daisey and the Apple Factory

If you haven’t already heard this episode of This American Life, it’s definitely worth your time.  I won’t look at any of my “iStuff” the same way again after hearing it.  The suicides at Foxconn made the news last year (along with a mass suicide threat earlier this year), but this piece gives a lot of insight into the conditions that could drive people to kill themselves.

I found it difficult to listen to this piece and not feel complicit in how the workers at these plants are treated.  I wish I knew how much more per product it would cost to improve working conditions (and hope I’d be a decent enough human being to pay extra).

Ninja UI

Since yesterday’s post about my goals for next year, I heard from my friend Faisal about a jQuery plugin he’s been working on called Ninja UI.  It’s on github, so I’ll definitely be checking it out as part of my learning of jQuery for next year.  Going beyond using open source tools to being a committer on one would be a big step forward for me.

Another Year Gone

It’s annual review time again, which means this year has gone by even more quickly than usual. Filling out my self-assessment was a good reminder of all the work I had a hand in completing.  I’m still deciding on goals for 2012, and I’m posting all of them here so I can look back on them over the course of next year and track my progress.

  1. Learn jQuery.  I got a bit of exposure to it this year through a couple of projects that I worked on, and a .NET user group presentation or two, but haven’t done the sort of deep dive that would help me improve the look-and-feel of the web applications I build and maintain.
  2. Learn a functional programming language.  I’ve been thinking about this more recently since some of our work involves the implementation of valuation models in code.  I also came across this article in the November Communications of the ACM advocating OCaml.  Since I work in a Microsoft shop, picking up something like F# might have a slightly better chance of making it into production code than OCaml or Haskell.  Part of my objective in learning a functional programming language is to help me recognize and make better use of functional techniques in a language like C#, which has added more and more support for the functional programming style of the years.
  3. Give a few technical talks/presentations.  This year, I presented on NuGet at my job, and on Reflector at RockNUG. Having to present on a tool or technology to group has always been a great incentive to do some deep learning of a subject.  It’s also a chance to exercise some speaking skills (which developers need a lot more than they might think in order to be successful) and to handle a Q & A session.  I haven’t developed any new presentations yet, but some prospective topics include: LINQPad, elmah,
  4. Take more online training. We have access to Pluralsight .NET training through work.  I watched quite a few of their videos over the course of the year.  2012 shouldn’t be any different in that respect.  I recently came across free webcasts on a variety of topics from DevelopMentor.  Since they’re downloadable as well as streamable, I’ll definitely use my commute to watch some of them.
  5. Write a compiler. It’s been awhile since I’ve cracked open “the dragon book”, so I’m probably overdue to exercise my brain in that way.  I found that suggestion (and a number of other very useful ones) here.
  6. Practice.  I’d heard of the “code kata” idea before, but hadn’t really explored it.  Dave Thomas of Pragmatic Programmers has nearly a couple dozen here.

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.

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.