Looking for advice on open source licenses

I’ve been developing (and operating) CSFBL, my multiplayer, web-based baseball game, for over eight years. After mulling for quite some time as to the future of the game, Iā€™m seriously considering the transition of the game to an open source project. That being said, finding the right open source license is important.

After doing my reading, I’m thinking of going the route taken by MySQL ā€“ i.e., open-source under the GPL, but the potential for closed-source and commercial options available with a separate license.

Realistically, I highly doubt people would come to license the software for commercial use, but I do want to protect the product, intellectual property, and my sweat equity (I’ve spent an inordinate amount of time, money, and energy on it over 8+ years). My interest is in sharing it (and getting help from others), not letting others profit off it. (Hence I am avoiding licenses such as BSD).

Does anyone have suggestions, thoughts, or words of advice on this matter?

Announcing the ASP.Net Control Adapters, a new open source project

Over the past few weeks, I started doing some experimentation with a different approach to changing the rendering of default ASP.Net controls. For a few years, I (and many others) have used the CSSFriendly project for this. That project does some nice things, but has many shortcomings.

I hemmed and hawed about this a bit (see Rewriting the ASP.Net CSS Friendly Adapters – does anyone care?), but in the end some fundamental interest — and the underlying popularity of the CSSFriendly project (consistently in the top-20 downloads on CodePlex) made me decide to go ahead with it.

So, I am proud to announce a new open source project: the ASP.Net Control Adapters! Continue reading

A free replacement for the Windows defragment utility

Defragmenting hard drives is something that is often unnecessary, but when it is necessary, most people run the built-in Windows “Disk Defragmenter” utility. It’s serviceable, but there is a better option: JkDefrag.

There’s a few things that make JkDefrag an improvement over what Windows offers:

  • It runs on anything that mounts like a disk drive — including USB drives and memory sticks.
  • You can run it from Windows, from a command line, or as a screen saver.
  • It offers several different optimization strategies.
  • It can be configured to defragment specific drives, files, or folders, or to exclude defragmenting specific drives, files, or folders.
  • You can run it in the background and tell it to run at less than full speed.
  • It’s continually developed by a person who you can actually talk to via an online forum.
  • There’s no installer — just extract files from a ZIP archive into a directory and run the executable.
  • It’s free, as in free beer, and open source.

Hats off to Jeroen Kessels for writing a fine utility and making it available for free. He doesn’t even ask for donations (too bad, because I’d have sent him a few bucks if he did!).

Free file archiving and (de)compression with 7-Zip [with expensive minimum donations]

In thinking about all the free and open source tools I use, one seems to run underneath the radar: 7-Zip.

7-Zip will compress, expand, encode, and decode more formats than you can shake a stick at. It integrates seamlessly with Windows Explorer, so you just right-click and choose the option you want, as shown below.

image

[That little fuzzy thing in the background is my dog, Thea. How I miss her!]

The fact that 7-Zip does so much and is free makes me wonder why anyone would pay $30 for a copy of WinZip. Instead, donate that money to Igor Pavlov, author of 7-Zip.

I decided to do just that. Heading over to the donate page for 7-Zip tells you that the “base donation amount is $50 or ā‚¬40, but if you would like to donate more, just change the Quantity field”. Apparently, you can donate more than $50, but you can not donate less than $50 — donations must be whole-number multiples of $50.

This is a bit odd. I would think a minimum donation for a free product would be less than the retail price of a commercial product. I wonder how many people don’t donate due to this high number?

Considering that 99% of the archive files I receive are ZIP files, that Windows can compress and expand ZIP files (albeit slowly), and that minimum $50 price tag, I’m going to pass. If Mr. Pavlov would let me set a lower donation level, I’d be happy to oblige; until then, I have that weird feeling I get when there’s a minimum tip amount added to a restaurant bill.

I guess I’ll look for another free/open-source product to send my money to.

Castle now accepting donations (and getting one from me)

Castle Project is a wonderful thing. I still don’t understand a lot of it, but it’s darn impressive, and has become my library of choice. It’s also no coincidence that my long-sought departure from ASP.Net WebForms was timed with my discovery of Castle MonoRail.

Hammett (the man behind Castle) has finally started accepting donations for his work. I have one thing to say to him:

"It’s about time!"

I know first-hand what it’s like to spend a lot of time on something that:

  1. a lot of people use, and
  2. does not bring in any money (at least, not directly)

My pain has been CSFBL, which today does accept donations (and I truly appreciate every one of them!).

Thinking about this more, it’s been six months since I’ve donated to an open source/free project (I promised last year to donate $5 per month to one), so in order to catch up, I’m sending Hammett $30 ($5 per month). Let’s hope the exchange rate is favorable to him!

My open source donation history to date far is as follows.

Thanks for all your hard work, Hammett, and I hope you can afford yourself a nice vacation for the donations you receive!

Who needs Photoshop? I have Paint.NET!

Granted, I’m no graphics designer, so my graphic editing needs are pretty mundane. Still, I need to crop, resize, recolor, reformat, enhance, distort, and do all those other fun things to images from time to time. I also need to mock up web pages and graphics. I could buy Photoshop to do this, but I don’t have to, because I have Paint.NET — and it’s free!

Paint.NET: free, open-source image editingPaint.NET is a free, open source image editing application for Windows. It has a fantastic feature set and is rock solid — I have never had it crash, become unresponsive, or otherwise trash anything on my system, and that’s after using it for months (and using it on my 4 1/2-year-old underpowered home PC to do some image editing for Christmas cards).

If Paint.NET can’t do what you want out-of-the-box, then you can extend it. It offers a plug-in architecture, and there’s a nice collection of community-written plugins available to download.

Hats off to Rick Brewster and others for this fantastic product. It’s so nice that I’m going to donate as part of my drive to donate $5 per month to a free software product. Since I’m two months behind, the Paint.NET team get ten samoleans. Well worth it, considering Photoshop costs just a bit more than that.

My donation history to date far is as follows.

The ultimate launcher: Launchy

William of Bug this! Technie Journal writes about how he likes Vista’s start menu search feature, which lets you quickly find programs in the start menu (Tools that save you headache on trying to find your program in 100+ items start menu). I also liked the feature, and I agree with him in that the feature is not good enough to warrant a Vista upgrade. However, while he found a solution in Colibri, I prefer Launchy.

What does Launchy let you do? To understand, let’s look at some ways to open Remote Desktop Connection:

  1. Click Start, then All Programs, then Accessories, then Remote Desktop Connection.
  2. Press Windows-R to open a command prompt, then type mstsc, then press enter.
  3. Press ALT-Enter, type rem, then press enter.

Launchy screenshot#3 is Launchy in action. You can mistype commands, and it’ll still find reasonable matches — type reno and you’ll still likely find Remote Desktop Connection. Multiple matches? Choose from a drop-down list that puts the most recently used and best matches at the top. It’s super-productive.

With Launchy, here’s how I open Mozilla: ALT-Enter, moz, enter. Visual Studio? ALT-Enter, vis, enter. Cisco VPN Client: ALT-Enter, vpn, enter. This is very cool.

Thinking of how much I love Launchy reminds me that I’ve totally skipped the month of September in my drive to donate $5 per month to a free software product, so I’m going to donate $10 to Launchy — because it is that cool. My donation history to date far is as follows.

Thanks to Josh Karlin for writing such a great utility!

Wilson’s O/R Mapper going open source

I’ve been a fan (and user) of Paul Wilson‘s O/R mapper for some time now, having contributed to code generation templates, a service library, and a private Subversion repository for registered owners. I’m happy to say that, as of today, Paul has decided to release his O/R mapper as open source, and I’ve been given the honor of being its caretaker in the process.

The open source release of WilsonORMapper will be hosted on Google Code at http://code.google.com/p/wilsonormapper/. I expect to check-in the first official open source release over the next few days, once I clean up a few things and make the necessary license changes to the source. The code will be released under the New BSD License, which is one of the most permissive open source licenses out there.

Thanks to Paul for all his work over the years and for releasing this wonderful product to the community, and for giving me the go-ahead to make it happen.

And for those keeping score… this is the second product I’ve coerced into full public open source in 2007 (the ASP.Net CSS Adapters, back in March, and now WilsonORMapper). Not bad for a hack like me. šŸ™‚

FileHelpers: the .Net way to import text files

I am working on a project where I have to import data from thousands of text files. These text files vary in formats: they use different delimiters; they use quoted identifiers never, sometimes, or always; they sometimes have missing end-of-row columns. Importing these took a combination of custom scripts (to clean up and reformat) and XML format files for SQL’s BCP (bulk copy) command… until I found FileHelpers.

FileHelpers by Marcos Meli is a .Net library which provides services to import and export text in delimited and fixed-length file formats. It takes a unique approach to the file import problem:

  • You write a class, giving it properties to store the data in the text file.
  • You apply attributes to the class and properties, describing the format of the file and applying import rules.
  • You import the file using a single command, which creates an array of objects populated with the data from the text file.

With support for custom converters, null types, optional fields, before/after import events, extensive parsing rules, and so much more — not to mention a web site with gobs of examples and documentation — FileHelpers has single-handedly driven me away from the script and batch file approach to a much more powerful .Net application to import my files.

The fact that FileHelpers uses regular .Net classes allows you to use the same class to both import data from a file and persist it to a database. For example, consider the following sample text file:

1,Chris,Smith
2,Bob,Jones
3,"Mary Jane",Brown

Clearly we have three fields in this comma-delimited file, so we write the following class to hold the data. Attributes provide instructions to FileHelpers — specifying that it is a comma-delimited file, and that the quotes in the first and last name fields are optional. (Note that you can use fields or properties; I use fields below for brevity.)

[DelimitedRecord(",")]
public class Person
{
	public int PersonID;
	[FieldQuoted('"', QuoteMode.OptionalForRead)]
	public string FirstName;
	[FieldQuoted('"', QuoteMode.OptionalForRead)]
	public string LastName;
}

Importing this file now becomes as easy as writing two lines of code.

FileHelperEngine<Person> engine = new FileHelperEngine<Person>();
Person[] records = engine.ReadFile(@"c:\myfile.csv");

You now have an array of Person objects loaded with data from the text file. Now, let’s say you wanted to persist these objects to a database. You can use the same Person object to persist to your database with an O/R mapper. If you were using Paul Wilson’s O/R Mapper and the WilsonORWrapper, you would decorate your class as follows:

[DelimitedRecord(","), IgnoreInheritedClass]
public class Person : WilsonORWrapper.Entities.EntityBase<Person>
{
	public int PersonID;
	[FieldQuoted('"', QuoteMode.OptionalForRead)]
	public string FirstName;
	[FieldQuoted('"', QuoteMode.OptionalForRead)]
	public string LastName;
}

Note I added the base class and the IgnoreInheritedClass attribute, which tells FileHelpers to ignore any inherited fields and properties (otherwise, the IsReadOnly property from EntityBase would be included).

With that, I can now persist all the records I read using FileHelpers back to my database using the O/R mapper.

FileHelperEngine<Person> engine = new FileHelperEngine<Person>();
Person[] records = engine.ReadFile(@"c:\myfile.csv");
foreach ( Person p in records )
{
	Data<Person>.Track(p);
}
Data<Person>.Save(records);

Incredible! We can even add supporting logic. Let’s say I wanted to only insert new persons into the database. I could do this.

FileHelperEngine<Person> engine = new FileHelperEngine<Person>();
Person[] records = engine.ReadFile(@"c:\myfile.csv");
foreach ( Person p in records )
{
	Person pers = Data<Person>.Retrieve("PersonID = " + p.PersonID.ToString());
	if (pers == null)
	{
		Data<Person>.Track(p);
		Data<Person>.Insert(p);
	}
}

FileHelpers makes this and so much more possible. It’s the backbone of a project I’m writing, and it’s making some heavy data-parsing much easier. To top it all off, FileHelpers is open source — you can download the code from their Subversion repository, and post patches on their support forums. Patches are well-received — I’ve already had two (1, 2) I’ve sent and had applied.

Thanks again to Marcos (and recently-added co-developer, Matt Campbell) for providing this fantastic library. For regular updates, be sure to read the FileHelpers Library Blog.