10 May 2014

throw vs throw ex vs wrap and throw in c-sharp

I've come across the throw vs throw ex 'debate' a few times, even as an interview question, and it's always bugged me because it's never something I've worried about in my own c# code.

background

So here's a typical example of the throw vs throw ex thing: https://stackoverflow.com/questions/730250/is-there-a-difference-between-throw-and-throw-ex

Basically it revolves around either messing up the line numbers in your stack trace (throw ex;) or losing an chunk of your stack entirely (throw;) - exception1 and 2 respectively in this nice clear answer http://stackoverflow.com/a/776756/10245


the third option

I've just figured out why.

Because in my own code, whenever I catch and re-throw I always wrap another exception to add more context before rethrowing, and this means you don't have either of the above problems. For example:

private static void ThrowException3() {
try {
DivByZero(); // line 43
} catch (Exception ex) {
throw new Exception("doh", ex); // line 45
}
}

Exception 3:
System.Exception: doh ---> System.DivideByZeroException: Division by zero
  at puke.DivByZero () [0x00002] in /home/tim/repo/puker/puke.cs:51 
  at puke.ThrowException3 () [0x00000] in /home/tim/repo/puker/puke.cs:43 
  --- End of inner exception stack trace ---
  at puke.ThrowException3 () [0x0000b] in /home/tim/repo/puker/puke.cs:45 
  at puke.Main (System.String[] args) [0x00040] in /home/tim/repo/puker/puke.cs:18 

Obviously 'doh' would be something meaningful about the state of that function ThrowException3 in the real world.

Full example with output at https://gist.github.com/timabell/78610f588961bd0a0b95

This makes life much easier when tracking down bugs / state problems later on. Particularly if you string.format() the new message and add some useful state info.

08 March 2014

Why publish open source when you are commercial?

Why open source your commercial projects?
  • Forces you to decouple them from other internal systems.
  • Encourages thinking in terms of reusable modules, which is better for internal reuse just as much as public reuse.
  • Possibility of contributions to systems useful to your business by others.
  • Easier reuse within your organisation (the public internet is a better search and sharing system than any internal systems).
  • Reputation advantages, the best coders often like to work in open and forward-thinking companies, and having public shared code is a great sign of such an organisation.
Do it early
  • Preferably push your very first commit straight to github.
  • Do it before it has a chance to be tightly coupled to internal systems, otherwise you'll have to unpick it and it will be less decoupled from day one, and inertia might mean that in spite of the best intentions you then never publish it.
  • You'll have it in mind that every commit is public from day one, avoiding adding internal config etc and forcing you to factor it out into config which is all round a good thing.
  • Don't wait for your code to be perfect, there are compromises in all code and sharing something imperfect is better than sharing nothing.

Worried about the brand?
  • Commit under personal email addresses and push to personal github accounts. You can always setup a corporate github account later when you are feeling more confident.

Of course I'm not saying you should open source everything, for example your core product's codebase should probably not go on github if you are a product company!

--

Be brave, be open.
Props to Tom Loosemoore

10 February 2014

Bash command line editing cheat sheet

https://www.gnu.org/software/bash/manual/bashref.html#Readline-Interaction
  • ctrl-a/e start/end of line
  • alt-f/b forward/back a word
  • ctrl-w/alt-d delete to start/end of word
  • ctrl-shift-_ undo (i.e. ctrl-underscore)
  • ctrl-y paste (yank) deleted text
    • alt-y paste older deleted text instead
  • prefix with alt+digit (0-9) to do multiple, e.g. delete two words
    • start with alt-minus to go backwards

Just a few notes I threw together for my own benefit. I finally got around to learning a bit more about editing commands on the Linux shell / terminal.

03 February 2014

Converting kml to gpx with python

Today I wanted to geo-code some of my photos.

I have an SLR digital camera (no gps of course), and an android phone. I recorded a track with My Tracks from google on the phone. (Not entirely recommended but works). I then fired up digikam to run the geo-correlation and add lat-long to the exif of the files only to discover digikam doesn't know how to read kml. Fooey.

 

I looked to gpsbabel, but it apparently can't handle this style of kml file, as differentiated by the coordinates being in the following style of markup:

<gx:Track>
<when>2014-01-25T18:00:13.955Z</when>
<gx:coord>-1.885348 50.769434</gx:coord>
<when>2014-01-25T18:00:14.565Z</when>
<gx:coord>-1.885193 50.769328 53.20000076293945</gx:coord>
<when>2014-01-25T18:00:58.566Z</when>


So I wrote a python script to munge it into gpx shape:

https://gist.github.com/timabell/8791116

This can be run as follows:

./kmlToGpx.py "25-01 12-48.kml" > "25-01 12-48.kml.gpx"

And worked a treat for me.

After I'd done this I discovered my pet tool gpsprune can open the new style kml. (I forked gpsprune a while ago and added a minor feature) However I'm glad to have a command-line tool as I have hundreds of tracks I want to convert.

Incidentally the phone can automatically sync the tracks to google drive, which is kinda handy and then you can download them from the site etc.

07 January 2014

Returning to commercial ASP.NET from Ruby on Rails

Why ASP.NET again after all the noise I made about Ruby on Rails? After a brief stint with commercial Ruby on Rails development I should explain why I've decided my next gig will be an ASP.NET project. In short: currently almost all the Rails work available is in London for digital agencies and start-ups, demanding on-site full time presence, and I burned out doing 3 hours a day commuting in less than half-a-year. This is not a sustainable business plan.

The emphasis on start-ups and agencies bodes well for the commercial future of Rails as many of these projects will bloom into large systems needing continuing development. But for me the market in the Reading area seems too quiet to make a business success from just Rails. The final straw was being formally offered a rare local permanent Rails job working with all my favourite open source technologies (Rails, Postgres, Linux etc) only to be handed an employment contract with less job security, rights and benefits than a contractor would have. This confirmed my growing understanding of the local market not being suitable.

So, my updated plan of action is to return to providing programming services to the vibrant .NET market in the local area.


This article is for my Linked In audience, if you want to become part of my network or learn more about my professional services send me a message or invite here: http://www.linkedin.com/in/timabell

---

From a technical perspective my first-hand experience with Ruby on Rails in a mature project has shown me the that the speed boost of Ruby on Rails over ASP.NET is short-lived and once a project becomes larger and more mature the pace of development appears to my eye to be very similar.

The problems encountered are largely different, but not not biased heavily to one or other stack. For example Rails projects have issues with fragmented and dubiously maintained gems that provide important functionality (not all of them mind; lots are excellent well run projects), whereas Microsoft projects tend to just use whatever Microsoft have supplied warts-and-all; each has pros and cons.

Having learnt all this first-hand I now believe that my initial concern that Rails would take all of Microsoft's market share in web development due to faster (i.e. cheaper) development is unfounded.

I also now understand why the Ruby crowd is so much keener on test-driven development than the C# crowd; it's because they lack all the compile-time checks that catch many classes of programming error up front (e.g. changing a method signature and not updating usages).

The main things I missed when I switched from C# to Ruby were
  • ReSharper:
    • Find usages / definition.
    • Refactoring.
  • A compiler to catch mistakes sooner.
  • Being an expert.