Author Archives: joe

About joe

.NET developer and board game geek located in the greater Atlanta region.

Delving into C#

This year I’ve decided to really get into C#. My .NET experience is shall at best so aiming to rectify, I picked up C# in Depth and commenced skimming!

Now, I’ve made my fair share of M$ snide asides, but I’m having a hard time coming to gripes with C#. Everything I run into either “just works” or exceeds my expectations. And the cool features are in fact, quite cool! Color me impressed!

Noob!

Noob!


For fun I rewrote a few of my Project Euler Solutions to buff up on the syntax. After I got the semi-colons and brackets all figured out, I moved on to something a little bigger.

I wanted a simple program to run and benchmark my solutions, so I wouldn’t have to do as much leg work every time I converted a problem. I figured this would be a simple enough thing to do, and it would provide a good foundation for a future gui application and beginning unit testing.

I wanted to share some particulars that I thought were pretty cool, you can grab the code I’m talking about from the google code repository, and follow along…or something.

Generics, Delegates and Lambdas
Generic Collections provide a data structure that I can access and use just like an array, but also provides methods for dealing with delegates.

Delegates are very similar to closures, blocks, procs, and lambdas like I’ve worked with in other languages, so the transition was smooth. The lambda syntax was particularly reminiscent of pythonic list comprehensions.

Thanks to delegates, I can turn this:

var matchingTypes = new List<Type>();
foreach(t in CurrentTypes) {
	if(t.IsSubclassOf(parentType) {
		matchingTypes.Add(t);
	}
}
return matchingTypes;

Into this:

return CurrentTypes.FindAll(
	delegate(Type t)
	{
		return t.IsSubclassOf(parentType);
	}
);

And finally, via lambda, to this!

return CurrentTypes.FindAll(
	t => t.IsSubclassOf(parentType)
);

Not too shabby, eh?

Reflection
Most of my programming has been in ColdFusion, JavaScript and Ruby. There’s been a little bit of this and a little bit of that peppered in there, particually C and Java while I was at UCF, but for the most part I’ve enjoyed working with dynamic and/or interpreted languages. Meta-programming is common in these types of languages, but I was surprised and impressed to read up on reflection. In this case, reflection allows me to dynamically detect and run my problems, which makes it easier (and cleaner) for me to add new solutions.

Here’s a simplified “ClassMaster” class I use to wrap my reflection calls for listing and creating classes, so you can see what I’m on about:

class ClassMaster
{
	private Assembly CurrentAssembly { get; set; }
	private List<Type> CurrentTypes { get; set; }

	public ClassMaster()
	{
		CurrentAssembly = Assembly.GetExecutingAssembly();
		CurrentTypes = new List<Type>(CurrentAssembly.GetTypes());
	}

	// should probably take arguments to pass thru...somehow
	public Object CreateClass(Type classType)
	{
		return CurrentAssembly.CreateInstance(classType.FullName);
	}

	public List<Type> getTypesByParentClass(Type parentType)
	{
		return CurrentTypes.FindAll(
			t => t.IsSubclassOf(parentType)
		);
	}
}

That’s it for now. I’ll be looking into LINQ and unit testing in the next couple weeks, and then I’m on to the gui. ASP, SilverLight, and WPF here I come!

Here are those links again:
Release
Latest Version

2010 New Years Resolutions

I didn’t make much headway with my formal resolutions last year.

  • I went to a few user group meetings at the beginning, but I trailed off rather quickly.
  • I didn’t contribute ANYTHING to open-source.
  • I didn’t complete any money making projects.
  • And aside from playing around with a few GreaseMonkey scripts I didn’t write any plugins.

However, I did manage to do a few other things in 2009:

And I saved the best for last…

Sara!

Sara!

2009 was the year that I met and engaged the love of my life, Sara!

In short, 2009: Best year ever!

Now, on to this year’s resolutions!

Blog More!

Blog More!


Blog More!
I’ve always done a lot of programming outside of work, but I’ve found that blogging incentivizes me to actually (somewhat and sometimes) finish what I start. I’m much more likely to finish something when I plan on, or start to blog about it and I feel that the extra little nudge can make a big difference.

Unfortunately, I have half a dozen unfinished Flex projects to NOT show for my lack of blogging this year, but I hope to get back on track in 2010.

C#!

C#!

C#!
In addition to my 9-5 ColdFusion and JavaScript programming, the last couple years I’ve spent most of my free time in Ruby and ActionScript. This year I wanted to get more into general, gui type programming. It’s been a long time since I wrote a windows application, and my time spent with the Flex compiler has got me feeling nostalgic for a more structured language and programming environment.

I’ve spent a little bit of time over the holidays on a few C# projects, and I’m loving it and I’m looking forward to really diving into C# this year!

Attend User Group Meetings!

Attend User Group Meetings!

Attend User Group Meetings!
I say this every year, but there are a few active user groups in Orlando that I really like, that I should be attending more frequently and consistently.

Here’s a list, for link-love’s sake:

  1. ADOGO
  2. OJUG
  3. ONETUG
  4. ORUG

I figure I should be able to, no excuse, make at least one a month. AT LEAST!

Work Out!

Work Out!


Work Out!
This is another resolution that I make every year. I didn’t lose any weight in 2009, in fact I gained 5lbs. However I’m lifting a lot more weight now, and I feel healthier so I guess I’m doing something right. I plan on continuing this through 2010.

So that’s it for tonight folks, I’m off to bed.

Happy New Year!

ColdFusion FileSweeper

I’m tired writing scripts to clean up temporary files.

It’s a nigh trivial task. The chance for error is small, but the consequences can be dire!

DIRE!

DIRE!

I wrote a little utility that makes this a little easier. It simply deletes all the files in a folder (recursive or no) that are older than a specified number of seconds.

Example Usage:

// no init needed, but the function's there if you like
fileSweeper = CreateObject("component", "fileSweeper");   

// all arguments are actually defaulted to the values shown
// so you needn't pass any, fancy eh?
fileSweeper.deleteOldFiles(
    folder   = ExpandPath("/temp"),
    seconds  = 600,
    filter   = "*.*",
    recurse = "no",
    lockname = "deleteFiles",
    timeout  = 60,
    logging  = true
);

Download it!

ColdFusion serializeJSON Problem

I ran into a little problem with the CF8 serializeJSON function. The function doesn’t properly escape quotes in struct keys, which results in invalid JSON being generated.

For Example: (all code is in cfscript)

// Struct Key with quotes in it
heightCounts["6'0"""] = 5;

// Serialize function runs alright...
serialized = serializeJSON(heightCounts);

// But the JSON is invalid. The quotes are unescaped! 
writeOutput(serialized);
// => {"6'0"":5.0}

// As you might expect, deserializing throws an error
deserializeJSON(serialized);

I certainly don’t like the idea of having quotes in struct keys, but that’s beside the point. I filed a bug report, but I also wrote a little function to jsStringFormat my struct keys. Problem solved!

function cleanKeys(dirtyData) {
	var cleanData = structNew();
	var cleanKey = "";
	var i = "";

	if(!isStruct(dirtyData)) {
		return dirtyData;
	}

	for(i in dirtyData) {
		cleanKey = jsStringFormat(i);
		cleanData[cleanKey] = cleanKeys(dirtyData[i]);
	}

	return cleanData;
}

You just pass in your quote-fully keyed struct, and get a clean one back:

// Same example as above
heightCounts["6'0"""] = 5;

// This time we sanitize the struct keys
jsSafeHeightCounts = cleanKeys(heightCounts);

// The serializeJSON call still runs without error
serialized = serializeJSON(jsSafeHeightCounts);

// But this time the output is correct!
writeOutput(serialized);
// => {"6'0"":5.0}

// And the deserialize works as expected
deserializeJSON(serialized);

Ta Da!

Simple ColdFusion Feed Caching Manager

ColdFusion 8 added the cffeed tag, a great and simple utility for fetching and parsing rss and atom feeds. It’s a great and simple to use utility, but there are a couple of issues to keep in mind.

Every time you make a “read” call to an external source, you’re preforming an http request. Most feeds that I’ve pulled in aren’t updated more than a few times per week. Just using cffeed, even a modest hit count can quickly add up to thousands of unnecessary requests. Aside from the bandwidth, you’re fully at the mercy of that external server. Each request is potentially slow, invalid, or (ahem, Twitter) otherwise unavailable.

You can totally bypass these problems by simply caching a copy of the feed to diske, and then quickly and safely parsing that file as needed. If you can grab it once, then you’ll always have that information quickly available. I wrote a lightweight utility for doing just this. It’s simple, but it’s made my life so much easier that I thought I’d share.

First create and instantiate the feed manager.

  feedManager = createObject( "component", "feedManager" );
  feedManager.init( folder = absolutePathToSaveFeedFiles );

Then add the feeds, with unique keys for retrieval.

  feedManager.addFeedURL(
    key = "BLOG",
    url = "http://joezack.com/index.php/feed"
  );

  feedManager.addFeedURL(
    key = "CNN",
    url = "http://cnn.com/feed"
  );

Fetch and save the feeds to disk, if available and valid. I run this in a scheduled task, every hour or so.

  feedManager.cacheFeeds();

  // or to just cache one feed
  feedManager.cacheFeed("CNN");

Finally, to retrieve the cffeed parsed file, just call the getFeed method! So long as there has ever been a feed successfully retrieved, you’ll have data.

  // Request feed from disk.
  feed = feedManager.getFeed(key = "BLOG");

Download the file!

Populating Select Boxes with Prototype

Adding removing options from drop downs can be down right annoying, but I came up with a simple prototype function that I think makes it a lot easier.

You just pass your select box object, an object with an enumerable-esque ‘each’ method, and a method for creating the individual options. On the advice of my wonderful co-worker Jim, you can pass an optional 4th argument that lets you maintain the options length. It’s defaulted to 1 in order to preserve the first element in a drop down, which we typically leave blank.

Here’s the function:

// Requires Prototype: http://www.prototypejs.org/
function setDropDown(field, data, method, index) {
  field.options.length = index == null ? 1 : index;
  data.each(
    function(e) {
      field.options.add(method(e));
    }
  );
}

And here are some quick examples:

To clear a drop down:

setDropDown(selectBoxObject,[]);

To copy items from one drop down to another:

setDropDown(
  selectBoxObject,
  otherSelectBoxObject.options,
  function(e) {
    return new Option(e.text, e.value);
  }
);

Quick example using JSON

var json = Object.toJSON( {"COUNTRIES":[{"COUNTRY":"Hong Kong","ID":1},{"COUNTRY":"Japan","ID":2}]} );

setDropDown(
  selectBoxObject,
  json.COUNTRIES,
  function(e) {
    return new Option( e.COUNTRY, e.ID );
  }
);

Project Euler: Problem 30 in Ruby

I realize this isn’t the fast solution, but the more I optimized, the uglier it got so I’m done playing with it. The hardest part was figuring out what the upper bound limit was.

Problem 30

Find the sum of all the numbers that can be written as the sum of fifth powers of their digits.

power, total = 5, 0

(power * 9**power).times do |i|
  total += i if i == i.to_s.split('').inject(0) {
    |sum, n|
    sum + n.to_i**power
  }
end

puts total - 1

Merging Netflix Accounts with ColdFusion and JavaScript

I wrote a little script using ColdFusion and JavaScript to merge two NetFlix accounts. It’s ugly and cheesy, but it works so I thought I’d share.

Here’s how you do it:

  1. Register for a developer key.
  2. Grab the RSS feed url of the queue you want to merge FROM. This can be obtained by logging into the FROM account and clicking on the “RSS” link in the footer.
  3. Log in to the account that you’d like to merge TO.
  4. Hit this script in the same browser you logged into the TO account with, and make sure you allow pop-ups!
<!--- enter your feed here! --->
<cfset feed = "http://rss.netflix.com/QueueRSS?id=P4806480653914107620156446228102116" />
<!--- enter your consumer key here! --->
<cfset key  = "your-consumer-key-here" />
<cfset href = "http://widgets.netflix.com/addToQueue.jsp?output=json&devKey=#key#&queue_type=disc&movie_id=http://api.netflix.com/catalog/movie/" />

<cffeed action="read" name="queue" source="#feed#" />

<cfset movies = queue.item />
<cfset idList = "" />

<cfloop array="#movies#" index="i">
	<cfset idList = ListAppend(idList,ListLast(i.guid.value,"/")) />
</cfloop>

<cfoutput>
	<script src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js"/>
	<--- Pop up a new window, swap the href every second. Told ya it was cheesy! --->
	<script>
		var popUp = window.open('http://google.com');
		var idList = [#idList#];

		new PeriodicalExecuter(
			function(pe) {
				if (idList.length == 0) {
					pe.stop();
				} else {
					popUp.location.href = "#href#" + idList.pop();
				}
			},
			1
		);
	</script>

</cfoutput>

Note: I don’t know if this allowed by the EULA, or if there even is a EULA…so, use at your own risk!

Project Euler: Problem 26 in Ruby

I knew I’d be implementing my own division algorithm for this problem, but I had a hard time figuring out a good way to detect the repeating sequence.

That’s all I have to say about that.

Problem #26

Find the value of d 1000 for which 1/d contains the longest recurring cycle in its decimal fraction part.

def divide n, d, repo = []
  return repo.size - repo.index(n) if repo.include? n
  divide 10 * (n - (n / d) * d), d, repo << n
end

highest = {"d" => 1, "count" => 1}

(1..499).each do |i|
  x     = i * 2 + 1
  count = divide 1, x
  if count > highest['count']
    highest = {"d" => x, "count" => count}
  end
end

puts highest["d"]