Archive for the ‘Programming’ Category

Method I Wish Was There: IEnumerable.IsNullOrEmpty

Thursday, April 22nd, 2010

This one is a bit controversial because what I’m really saying is that I want to call an extension method on null and have it return true, rather than a Null Reference Exception. This violates the best practice of keeping null semantics on extension methods, but it makes my code so easy to write, so I don’t care, I wish it was there.

public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
{
  if(source ==null) return true;
  var collection = source as ICollection<T>;
  if (null != collection && collection.Count==0) return true;
  var enumerator = source.GetEnumerator();
  return enumerator.MoveNext();
}

I say that it makes my code writable because I can write what I’m thinking.

if (somedata.IsNullOrEmpty()) takeAction(); else takeOtherAction();

Method I Wish Was There: string.Join

Wednesday, April 21st, 2010

Yes, I know it is there as a static, but I want it as a method on IEnumerable<string>.

public static string Join(this IEnumerable<string> source, string joiner)
{
            if (source.Count() == 0)
                return "";
            return source.Aggregate((a,b) => a+ joiner + b);
}

So that when I’ve got some strings I can join them :)

var logmessage = people.Select(p=>p.Firstname).Join(“, “);

Method I Wish Was There: PipeTo

Tuesday, April 20th, 2010

Too much F# rots the brain…

Ok, maybe not, but too much F# really changes your C#. I find myself wanting to |> something that isn’t really linq-able (not IEnumerable).

After talking it over with my LINQ guru – Chris Marinos - for a good name for this operation, we both agreed that PipeTo is a good name.

public static void PipeTo<T>(this T source, Action<T> action)
{
  action(source);
}

Sure, its a dead simple implementation, but it means that I can do this:

blah.Where(…).Aggregate(…).PipeTo(Console.WriteLine)

Teaching New Programmers

Monday, April 19th, 2010

I teach at a local community college. This semester I’m teaching one of a handful of sections called “Introduction to Computer Science”. This course is supposed to be a bridge course before throwing new students directly into the typical C++ Programming course.

The thought is that some students need a little extra help before taking that first C++ course. This course is intended to give them some intermediate information and some very basic programming introduction.

Since there are other sections to this course I’ve not had to make my own course material. I’ve used PowerPoint created by others. A few times I’ve had to say things like “Just ignore that bullet, its only true from a certain point of view.”

It wasn’t until the introductory C++ slides that I blew a gasket.

After a slide on “Documentation” with these bullets:

•A well-documented program is easier to understand and modify
•You use comments to document programs
•Comments should appear in a program to:
?Explain the purpose of the program
?Identify who wrote it
?Explain the purpose of particular statements

I advanced to this slide with an example of “good” comments:

int feet; //variable to hold given feet
int inches; //variable to hold given inches
int totalInches; //variable to hold total inches
double centimeters; //variable to hold length in centimeters

At this point I lost my professionalism a bit and cursed quite a lot. I ranted about how this was useless. I feel like a channeled a little bit of everyone who I’ve heard say “comments are evil”.

When I finally got to a complete demo program instead of a code snippet, It was time for conniption.

//named constants
const int CENTIMETERS_PER_INCH = 2.54;

int main() {
  //declare variables
  int feet, inches;
  …
  // statements
  …

For the love of programming will someone explain to me what value any of these comments have?

I can only hope that my ranting was not so extreme that students stopped listening. Hopefully they will all have a better understanding of comments and what NOT to do.

Method I Wish Was There: RegexIsMatch

Friday, April 16th, 2010

I don’t like the verbosity of a couple days ago use of Regex(). That is not to say that I don’t still find the Regex extension method useful, but if I’m just matching I should say so.

var re = @“\d+-\d+-\d+-\d+”.Regex();
var match = re.Match(“things 10-12-5-1”);
//do things with match
var othermatch = re.Match(“stuff 1-6-8-9”);

Regex extension method is great. But for a Boolean statement I should be able to just say “RegexIsMatch?”

if ( someText.RegexIsMatch(@”\d+\.\d+”) ) …

Method I Wish Was There: ContainsDigit

Thursday, April 15th, 2010

Sometimes when dealing with lots of strings or parsing text, I don’t always want to turn directly to regular expressions. I might want to just say “if this thing has a digit”.

public static bool ContainsDigit(this string source) {
  return @"\d".Regex().IsMatch(source);
}

This uses yesterday’s Regex() extension method on string and simply returns true or false, exactly as it reads.

string field1 = GetFieldFromSomeParserOrSomething();
if (field1.ContainsDigit()) …

Method I Wish Was There: Regex

Wednesday, April 14th, 2010

I don’t want to have to pull in System.Text.RegularExpression every time I want a new Regex. Perl, boo, awk and javascript just say // for regex. In C#, I can just say “abc\d{3}”.Regex().

public static System.Text.RegularExpressions.Regex Regex(this string source)
{
  return new System.Text.RegularExpressions.Regex(source);
}

Now I can write:

if (“there are (\d+) lights”.Regex().Match().Groups[1].Value > 0) …

Method I Wish Was There: string.Contains

Monday, April 12th, 2010

Sure, string has a member method of Contains, but its an exact comparison. What I really want is something that takes a StringComparison argument as well.

public static bool Contains(this string source, string search, StringComparison comparison)
{
  return source.IndexOf(source, 0, comparison) > -1;
}

Not much to this extension method, but it gives me the semantics that I want.

if (foo.Contains("bar", StringComparison.CurrentCultureIgnoreCase)) …

FOSDEM Videos Online 2

Sunday, March 14th, 2010

I’ve been watching more FOSDEM videos. They are very cool. Watching in 720p is awesome.

Alan McGovern on The Evolution of MonoTorrent – By far the best bittorrent library for .net. Alan talks about the challenges of writing a library that will handle things like hundreds (if not thousands) of simultaneous socket connections, why using threads to do so is wrong, and how good design and the async pattern made it easy and fast.

Stephane Delcroix on Image Processing – I was really looking forward to this one – Mono.SIMD is awesome – but the whole thing is code and the non-bold small font on a white background did not get picked up by the projector. Needless to say that Mono.SIMD is still awesome, but the talk isn’t really worth watching. I’ll be it was cool live though. If you don’t know Mono.SIMD is yet another Mono innovation that is Mono-only. It provides an object oriented api for the underlying SIMD instructions in modern cpus. These are the SSE instructions that you see listed in the spec about your Core2 CPU.

Jeremie Laval on Parallel Fx – This is NOT just another talk on Parallel Fx aka Task Parallel Library+PLINQ. Jeremie actually wrote Mono’s implementation of TPL. While its great to see Stephen Toub show use cases of TPL, the geek in me wants to see what is under the hood. Jeremie gets into some of the challenges in implementing the scheduler and library. He also mentioned that .NET4’s thread pool actually uses the TPL scheduler underneath. I didn’t know that. He also shows a demo of Future<> which I had never considered. Chaining Future<>’s in a tree like manner in order to create parallel delayed evaluation.

Andreia Gaita on Moonlight and You – Why moonlight is important to mono? WOW! They are working on XAML designers for MonoDevelop. I can’t imagine how awesome moonlight development will be on Linux in the future. Moonlight is super close to working in Chrome on Linux. mxap –desktop lets you create moonlight desktop apps launchable with the mopen command. Very cool. Desktop apps in moonlight. Very cool pixel shaders on video in moonlight 3.

Jim Purbrick on Building The Virtual Babel – Mono in Second Life – The virtual worlds in Second Life and how it has progressed for 7 years. Very cool to hear how an existing language LSL and existing virtual machine was moved to a new virtual machine, Mono. I’ve never heard of JavaGoX or Brakes so listening to the description of script migration was rather mind blowing.(very cool)

Joe Shields on OSCTool – learning C# and Mono by Doing – While probably not of interest to a lot of developers, this one hit close to home for me because I was in a position pretty close to Joe’s about 8 years ago. Of course I didn’t know .NET at the time and Mono was still very young, but I do recall playing with some ASMX web services to do things similar to what he was doing. Joe makes a point that python, perl, C and even Java have cross platform difficulties (think HPUX, Itanium, Tru64 etc) of which Mono seems to mitigate much. The audio goes out for a few minutes in the middle, just skip to about 17:00 and watch the demo.

Mirco Bauer on Smuxi – IRC in a modern environment – Just an irc client with some special features. I’ll definitely be looking into this because I’m an IRC junkie, and it also has the exact twitter client that I’ve been looking for since I started using twitter.

FOSDEM Videos online

Friday, March 12th, 2010

As a .NET programmer in my day job targeting Windows desktop applications (winforms and wpf), I don’t get to stay on top of much ASP.NET or Mono. The ASP.NET stuff I feel like I have a good enough handle on via channels I use to stay on top of .NET in general (user groups, blogs, etc). Mono gets much less coverage there.

Luckily there are some awesome (720p quality) videos from FOSDEM 2010 of some Mono centric presentations.

Lluis Sanchez Gual on MonoDevelop – I knew MonoDevelop 2.2 had some awesome in it, but I didn’t know about some of the code generation things in it. Think R# mixed with CodeRush. It is very sweet.  Lluis’s Blog is always a good read too.

Ivan Porto Carrero on IronRuby – Poor Ivan had some demo troubles, but overall the presentation was excellent. It is VERY cool to see a Banshee add-in written in Ruby. I don’t think I was reading Ivan’s Blog before, but I am now.

Miguel on Mono – I think this is kind of Miguel’s “State of the Monkey” of the day. Its a status overview with a few deep dives into things. I especially thought it was cool that he went deep (well, deeper than most) into Expression<>.

The videos seem to be coming out slowly. I’m posting these brief summaries of the videos as I watch them, so expect me to link to more as I watch them.