comments suggest edit

Recently I added some seemingly innocent code to Subtext within the Application_BeginRequest method of Global.asax.cs that I adapted from this blog post by Darren Neimke. The purpose of the code is to provide culture aware formatting of dates, times, and numbers specific to the user reading the blog.

// Set the user culture.  Got the idea from

// http://markitup.com/Posts/Post.aspx?postId=52252561-f83d-4463-82f0-769fce82fd82

// but modified it to catch specific exceptions.

//TODO: Make sure we store dates in UTC etc and do the conversion when we pull them.

//        I assume we do this but haven’t checked.

try

{

    if (Request.UserLanguages != null

            && Request.UserLanguages.Length > 0

            && Request.UserLanguages[0] != null)

    {

        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);

    }

}

catch(NotSupportedException nse)

{

    log.Error(“Error while attempting to set CurrentCulture to ‘” + Request.UserLanguages[0] + “’”, nse);

}

Such a simple snippet of code, yet it introduced a couple of bugs, both which can be seen in this screen capture that Jayson Knight kindly sent me.

Archive Links

The first error, the fact that you see the same month over and over, has been fixed in our codebase, but I have yet to deploy it to my blog. That has to do with how different cultures format dates differently when ordering the month and the day.

The second error is the fact that Jayson is seeing the months in what appears to be Portugese in the first place. At one time, he saw the months in Spanish. I started wondering if somehow a thread from the thread pool with a CurrentCulture already set was servicing his request, but that didn’t make any sense since it should be reset for him.

Then it occurred to me today. Subtext makes extensive use of caching on multiple levels from data caching to output caching. When I added this code, I didn’t go through and update all code that caches data to vary the cache by user language. Doh!

Once again, the law of unintended consequences smacks me upside the forehead.

UPDATE: Jon Galloway points out that Scott Hanselman wrote about this very thing recently. I read that post and totally forgot about it when I made my change. Blogs are good, umm’kay.

comments suggest edit

If you’ve started on module development with DotNetNuke 4.0 and above in Visual Studio.NET 2005, you might run into a problem with trying to add a Web User Control (*.ascx file) to a class library.

The fix is similar to what you had to do with Visual Studio.NET 2003.

For C#, follow these steps.

  1. Close VS.NET 2005.
  2. Open the directory C:\Program Files\Microsoft Visual Studio 8\Web\WebNewFileItems\CSharp (assuming a default installation of VS.NET).
  3. Open the CSharpItems.vsdir file in Notepad. Select the text and copy it to the clipboard.
  4. Now open up the file C:\Program Files\Microsoft Visual Studio 8\VC#\CSharpProjectItems\CSharpItems.vsdir and paste the contents of the clipboard underneath the existing text.
  5. Now copy the contents of C:\Program Files\Microsoft Visual Studio 8\Web\WebNewFileItems\CSharp (excluding CSharpItems.vsdir) into the folder C:\Program Files\Microsoft Visual Studio 8\VC#\CSharpProjectItems.

Now “Web User Control” should be an option when you select Add | New Item.

comments suggest edit

Lately I have been spending a little bit of time performing maintenance tasks on my blog’s SQL Server. I noticed that OdeToCode’s Scott Allen was in the same mood.

In looking to free up some database space, he took the somewhat drastic step of deleting all referrals and urls before a certain date. Since he doesn’t care about this data, it isn’t really all that drastic. But it makes a data packrat like me shudder. I wanted to free up some space as well so I created an approach that frees up a lot of space, but keeps the data I care about.

Around 90% to 99% of my referrals are from web searches and online blog readers. As a matter of fact, nearly all of these are from Google. Since those referrals are not that important to me as WebHost4Life also tracks that data, I wrote a script to delete them for Subtext. Note that the following SQL script is pretty aggressive, so use at your own risk. You might even think of some search strings that I missed.

DELETE FROM subtext_Referrals

WHERE UrlID IN

(

  SELECT UrlID

  FROM subtext_URLs

  WHERE Url LIKE ‘http://google.%’

    OR Url LIKE ‘http://%.yahoo.%’

    OR Url LIKE ‘http://yahoo.%’

    OR Url LIKE ‘%/Search/%’

    OR Url LIKE ‘%/Search?%’

    OR Url LIKE ‘http://search.%’

    OR Url LIKE ‘http://bloglines.%’

)

 

DELETE FROM subtext_URLs

WHERE Url LIKE ‘http://google.%’

  OR Url LIKE ‘http://%.yahoo.%’

  OR Url LIKE ‘http://yahoo.%’

  OR Url LIKE ‘%/Search/%’

  OR Url LIKE ‘%/Search?%’

  OR Url LIKE ‘http://search.%’

  OR Url LIKE ‘http://bloglines.%’

I then ran the same commands that Scott did after reading his post.

DBCC DBREINDEX(subtext_URLs)

DBCC DBREINDEX(subtext_Referrals)

DBCC SHRINKDATABASE(SubtextData)

In order to run those commands on .TEXT, just replace the “subtext_” prefix with “blog_” and you are set.

Now I haven’t tested this, but I imagine the corresponding script for Community Server would be the following based on its published schema.

DELETE FROM cs_Referrals

WHERE UrlID IN

(

    SELECT UrlID FROM cs_Urls

    WHERE Url LIKE ‘http://google.%’

      OR Url LIKE ‘http://%.yahoo.%’

      OR Url LIKE ‘http://yahoo.%’

      OR UrlLIKE ‘%/Search/%’

      OR Url LIKE ‘%/Search?%’

      OR Url LIKE ‘http://search.%’

      OR Url LIKE ‘http://bloglines.%’

)

 

DELETE FROM cs_Urls

WHERE Url LIKE ‘http://google.%’

  OR Url LIKE ‘http://%.yahoo.%’

  OR Url LIKE ‘http://yahoo.%’

  OR UrlLIKE ‘%/Search/%’

  OR UrlLIKE ‘%/Search?%’

  OR UrlLIKE ‘http://search.%’

  OR UrlLIKE ‘http://bloglines.%’

comments suggest edit

I got a 1099 for my blog yesterday. Now that is a weird feeling. Google giveth, the federal government taketh away.

Google has some tax information regarding ad-sense income. Basically operating this blog has in effect become a small proprietorship small business. I will deduct hosting costs etc… I wonder if I can deduct time spent on Subtext. That would be pretty sweet.

UPDATE: For my readers not familiar with tax regulations in the U.S., I should mention that the 1099 is used to report income other than wages, salaries, and tips. I linked to the Wikipedia explanation for more details.

comments suggest edit

Troll Cap I love this idea from 37 Signals in handling abusive comments. Rather than simply deleting them, they will take the approach of shaming the abusers with a Troll Cap. Though it is doubtful that those who troll will really feel much shame, at least it serves an educational purpose of teaching others what is considered trolling behavior.

This is definitely an idea to put in Subtext at some point.

comments suggest edit

Looks like Jeff Atwood is not content to let dead dogs lie when he revisits Edit and Continue.

Jeff argues that those decrying E&C are promoting a culture of machismo which implicitely states that “Everyone Should Code The Way We Do”.

As I stated in his comments, I think the real argument is not whether or not E&C is dangerous, but whether it should have a higher priority than other features introduced into VS.NET when the discussion first started.

I am not against E&C as I see it as a tool that can be used or abused like any other. When I was a VB programmer back in the day, I found it helpful at times while debugging a unit test. Rather than endure a compile and re-run unit test cycle that could take a couple minutes, I could simply fix a dumb typo in stride and continue on. I didn’t need it, but used responsibly, it saved me time in certain situations.

However, I wonder if there may have been other features that Microsoft could have focused on that would have been more worthwhile than E&C. When using test driven development practices, I find the need to use E&C greatly reduced. Unit tests provide a bigger bang for my development buck in writing better code. If I had a say in it, I would have suggested that Microsoft really focus on getting the test driven development story right, which they’ve completely failed at so far.

So again, for me it is not a question of whether E&C is useful, I believe it is, but whether it has pushed aside more useful features. What do you think?

comments suggest edit

One common approach to having a script method run when a page loads is to attach a method to the window.onload event like so…

window.onload = function() { someCode; }

This is a common approach with methods for enhancing structural markup with Javascript like my table row rollover library, but it suffers from one major problem.

What happens when you include more than one script that does this? Only one of them will be attached to the onload event.

It would be nice if there was a syntax like the C# delegate syntax for attaching an event handler. For example…

window.onload += function() {} //This doesn’t work

However, there is a better way. In looking at the Lightbox script, I noticed the script references a method written about by Simon Willison. He has a method named addLoadEvent(func); that will append the method to the load event, without interfering with any existing methods set to execute on load.

Read about this technique here.

comments suggest edit

Intro

I have a bit of “me” time today to write some code and I thought I’d treat myself to something light and fun by building something purely for its flashiness and aesthetic. Something that does’t have any useful purpose other than it looks good.

I am a big fan of adding effects to html pages by simply adding a reference to a separate javascript file. This keeps the javascript code separated from the HTML, which is a big help in avoiding “spaghetti script”.

This is a technique that Jon Galloway writes about in his post on Markup Based Javascript Effect Libraries which highlights several approaches for adding interesting behaviors to a page without using Flash or DHTML behaviors (which only work in IE anyways). By referencing a javascript file and adding certain semantic markup to html elements, an author can add very interesting effects to a page.

The Row Mouse Over Effect

The effect I will introduce is simple. Adding a javascript file and a couple CSS classes will allow you to add row highlighting to any table. It provides a mean to change the look and style of a row when you mouse over it, and then change it back when you mouse out.

All you need to do is to reference the tableEffects.js javascript file and add the “highlightTable” css class to a table. At that point, each row of the table will have its CSS class changed to “highlight” or “highlightAlt” when moused over. Its CSS class will be reset when the mouse leaves.

In order to actually see a change when you mouse over, you’ll have to style the rows for highlighting like so:

table.highlightTable tr.highlight td
{
    background: #fefeee;
}
table.highlightTable tr.highlightAlt td
{
    background: #fafae9;
}

The script assumes you want to use a different color for alternating rows. If not, you can simply style both highlight and highlightAlt the same.

See It In Action

col 1 col 2 col 3 col 4
Apple Orange Banana Kiwi
Pinto Porsche Peugot Acura
LAX SFO ANC NYC
No Body Look Here
Red Blue Green Alpha

Get the file

Download the file from here (Right click and save as).

If you have any improvements (as I am sure there will be some), please let me know and I will keep my version updated. I named the script “tableEffects.js” because I hope to add more interesting effects.

And remember, though I tend to preach table-less design, there are semantic uses for tables. When using this script, it helps to make sure that your tables are semantically marked up. For example, if you don’t want your header row to highlight, use <th> tags instead of <tr>. The script ignores the table header tags.

comments suggest edit

BeerSoccer
Ball There is something really satisfying about having a beer after soccer. Especially when you can sit down with a Newcastle at the computer and blog about it. I’ve heard many marathoners say that a beer after a long run is helpful for replenishing lost carbohydrates. Yeah, that’s the ticket. It’s a health drink!

This season has been going much better than last season so far. The team has really picked it up a notch. We started off with a four to zero thrashing of the other team in our first game. I had a goal in the first minute of the second half. Fastest goal off of a kickoff I’ve ever been a part of.

Our second game ended in a two to one victory. Unfortunately that was marred by a near brawl. One of their teammates known for causing trouble smacked one of ours in the head after the game was over. Their biggest guy smacked our smallest guy. Who happened to have a brother on our team as well.

Here is the thing with brothers. If you smack someone, his brother will be more upset than the guy receiving the smack. We had to really struggle to pull everybody apart and keep it from devolving into anarchy.

This week we have a bye so today we had a friendly against my Saturday group of pick-up players. It was a long two and a half hour ordeal and I pretty much ran myself ragged in the midfield. I transitioned to striker just to take a break in the last half hour, when we were down a couple players. Unfortunately all that running left me with a slightly pulled quadricep. Now I can limp around the house and try to muster up some sympathy. And another beer.

comments suggest edit

Screen Showing Code The great thing about being involved in a couple of open source projects is that they provide great opportunities to learn and to teach, especially through the vehicle of code reviews.

To enable this within the Subtext Project, I recently set up commit emails within the CVS repository. This makes it possible for more people to review changes to the code. However, this brings up a bit of a quandary. How should we go about conducting the reviews? We don’t have any policy in place.

Ideally I would love to have regularly scheduled code reviews in which a small group of developers gather around the screen and review the code at the same time. But as several of our team are in Europe, that is just not feasible. At least not so soon after the code is checked in. I think it would be helpful to have more immediate feedback.

There are two ways to handle this that I will put forth in the hopes of soliciting feedback.

Make Suggestions In Comments

One approach proposed by Steve Harman is an approach he uses at work. When reviewing code and finding something that might need to be changed, the reviewer puts a comment like so:

//REVIEW: haacked - Ummm... Hey, this violates an FxCop rule. Perhaps you should do FOO instead.{.example}

What I like about this approach is that it is deferential. You can shoot off an email to the person who wrote the code and say something along the lines of …

Hey, the code you checked in looks good. However, I noticed a few things you might want to look at. I put the appropriate comments in the code.

This approach allows the original author the chance to learn from the reviewer comments as well as to defend or elaborate upon the code if he or she feels that the code is indeed correct. Should the original author not have time to change it, the reviewer can return to change it.

Change the Code and Notify

One drawback to the previous approach is that it takes two people to fix code. One thing you’ll find when participating in an open source project is that people are REALLY BUSY. Sometimes a contributor will contribute a piece of code, and then get slammed at work and home, only to return in three months time to contribute again. That’s a long time to wait for code to get corrected.

An alternate approach is one borrowed from certain agile methodologies. Practices such as Extreme Programming promote the concept of “Collective Ownership”. This is an important principle to apply to open source projects, as the code belongs to everyone. Likewise, everyone should feel free to contribute to any piece of code in a project, assuming they use good judgement and understand the code.

In this approach, one would just fix the code and in the source control checkin comments, explain why the change was made. Additionally the reviewer could send the author a quick email mentioning that he made some changes and to keep an eye out on the commit emails.

The benefit of this approach is that the code gets improved immediately, while still preserving the learning opportunity for the original author. This approach also addresses the fact that any code you change in codebase most like at one point or another was written by someone else. Sometimes a reviewer might be looking at code long after it was committed. The reasonable expectation here is that the reviewer should feel free to modify the code, rather than spending time figuring out who wrote it and making the review comments.

Something In Between?

Perhaps there is an even better option that sits somewhere between these two options. What do you think? I would love to hear from you in my comments.

comments suggest edit

I love this post by Steve Yi (found via Raymond Chen) concerning the mysterious things he as eaten. It just goes to show you that us asian (and half-asian) brothers can eat some seriously weird crap.

I have never tried Sea Cucumber (that I know of) nor Kudu Doo-Doo, but I have had everything else on his list. Here is my own list of mysterious things I have eaten.

1. Fermented Soy Bean (aka Natto)

My wife introduced me to this foul smelling Japanese dish. At first I wondered why she was eating the garbage when I first took a whiff, but I realized that others have said the same thing to me when I would bring Kimchee to school back in the day.

So I told myself I would try and acquire the taste since I was curious why she liked it so much. It has worked, as I now love it.

Image of Natto\ photo copyrighted by Matt Wegener.

2. Raw Chicken

For this dish, I have my wife’s brother to thank. Again this is a gift from the Japanese. Apparently there are several places known for serving raw chicken. I suppose if I was to take the risk of eating raw chicken anywhere, it would be Japan. They are well known for their cleanliness and care in crafting food.

It tasted a lot like tuna sashimi (maguro) and was quiet delicious.

3. Blowfish (Fugu)

I guess Japanese food in general is mysterious to me. I wrote about this experience here.

4. Uni (Raw Sea Urchin)

The first time I had this I nearly gagged. But I have since learned that the first one I tried was not of the highest quality. When a master sushi chef prepares Uni, it is smooth like butter.

Uni (raw sea urchin) \ via Matt Wegener

5. Chicken Feet

This one is often served at a Dim Sum restaurant. My Chinese friends might not find this so mysterious, but I sure do. I am not a big fan, and I’ve given it a couple of chances.

I am sure my wife will remind me of even more mysterious things I have eaten. What are yours?

comments suggest edit

As a kid, one of my favorite tools I had was a shiny red cased Victorinox swiss army knife. I’d carry that sucker around with me everywhere, using the main blade to tackle nearly every problem like a caveman with a stick. Until one day I sliced my finger trying to stick a paper cup to a tree so we could throw ninja stars at it, but that’s a story for another time.

As software developers, we have a swiss army knife of approaches to tackling any given problem. And often, we like to pull out the same blade over and over again. For example, one tool that we pull out nearly all the time is the tool of “iterative” development.

As Atwood said in the comments to Micah’s post on harmful requirements, you gotta go “iterative”.

However, sometimes you really do need to pull out a different tool in your swiss army knife. For large projects, breaking it up into phases and iterations makes sense most of the time, but there are times where an iteration itself may be longer than other iterations. Sometimes such an iteration itself becomes a mini project that requires BDUF.

Here’s a scenario to chew on. Suppose an iteration of the project is to produce a report based on data imported from a couple external sources. The report only has to produce a single number based on a calculation applied to the data. This is the type of problem that may not lend itself well to iteration. The client is interested in the final number, not any number in between.

Sure you can have an iteration in which you mock up the report to show the client to get something in front of them, but even this can be dangerous because you’ve set the expectation that you can deliver the report. But do you know that until you’ve analyzed the data?

This is a situation we found ourselves in. The requirements appeared to be describing a specific calculation we needed to produce. But after a careful look at all the fields we were getting in, the data required to produce that report just isn’t there. And we won’t be getting that data. Yet we have to produce this report by Monday. It seems we’ve walked to the blackboard to solve a series of two equations, but each equation has three variables. “Does Not Compute”

It seems to me that this is a classic situation where some up front analysis would have saved our butt and set expectations properly. Unfortunately, we weren’t brought in to this project till later and had to take it on faith that the analysis had occurred, but it was lacking. Someone, anyone, should have looked at the columns of data we would be receiving, and reconciled the data with the calculation we would be producing. I’m not sure how we can iterate ourselves out of that problem.

In our situation, it may well be that the real calculation we need to produce is much simpler and less useful than the one we thought we were going to produce. So we may be out of the fire on this one. But should the stakeholder disagree, we’ve got issues.

comments suggest edit

Last month, I wrote about some frustrations I had with Microsoft Money. I am pleased to report that everything has been resolved and I want to take the time to thank members of the Microsoft Money team.

It turns out that the Microsoft Money group is more accessible than I thought. It is unfortunate that the Microsoft website doesn’t highlight this more, but there is an active community that participates in the microsoft.public.money newsgroup. One customer also maintains a FAQ.

It turned out that the password character length in Microsoft’s records varied with those given by the bank a while ago. Russ on the Money team was able to confirm this and a patch was out in a matter of days. The final trick to getting it to work was I needed to refresh the online service setup. I was given the following instructions.

  1. Open Money.
  2. Select Account List.
  3. Select the financial institution you want to re-brand in the Account List.
  4. Under Common Tasks click Connect to bank and click the institution’s services link.
  5. Select For Financial Institution Name under View contact information.
  6. Select Update advanced Web settings on the left navigation bar.
  7. Hold down ctrl + shift and then click Restore Defaults.
  8. Click OK and then click Done.
  9. Select the New online services are now available link.
  10. Select the Update Services link to the left of your financial institution name.
  11. Continue through the rest of the Update Services screens.

So now Money is happily integrated with my online broker. Money rules!

P.S. I probably shouldn’t have made that crack about switching back to Quicken. Word on the street (and in my comments) is that Intuit engages in some underhanded practices with their software and that Money is much better than Quicken. I can’t corroborate the underhanded practices, but I did switch to Money from Quicken many years ago and haven’t regretted it.

comments suggest edit

Basement Gamers Video
Screenshot Make some time for this one. This is an eleven minute mockumentary of two hardcore fantasy role playing gamers. If you’ve ever rolled the icosahedron^1^ dice (or live with someone who has), you’ll find this extremely funny, and perhaps painful.

I swear I was never this bad. Really.

Watch it if you dare.

[Via The Old New Thing]

^1^ icosahedron is 20-sided.

comments suggest edit

Micah delves into the dark side of requirement documents. I am glad he is taking on writing about some of the challenges we’ve faced in starting a new company. I’ve been planning to write about many of these challenges as well, but I wanted to give myself more time. Perhaps I was a bit too shell-shocked by all the difficulties to give it a proper treatment. Perhaps I was afraid I would violate the one blogging rule we have, don’t be stupid.

Fortunately, Micah has the bravery to delve into the deep dark dirty recesses of real world project management. Read it at your own risk and hold tight to your sanity.

comments suggest edit

A while ago I told you that I was starting a company with my business partner, Micah. Well the good news is that we’ve officially added another partner/employee, the indefatigable Jon Galloway.

In the link to Micah breaking the news, he says he is really glad our clients don’t pay us to look pretty or we’d be broke. He can speak for himself, because if he read the fine print on the contract I’m working on, being pretty is indeed one of the requirements.

comments suggest edit

This article in Boing Boing about how World of Warcraft (WoW) moderators are warning groups not to adverties their guilds as “GBLT-friendly” (Gay, Bi-sexual, Lesbian, Transgender friendly) got me thinking.

Suppose they allow characters in WoW to publicly declare their sexuality within the game. Now suppose other groups within the game form with the goal of attacking such players completely within the online game (assuming the game allows players to attack other players).

Would that constitute a hate crime?

sql comments suggest edit

My friend Jeremy (no blog) pointed me to these two useful articles on how to perform dynamic WHERE clauses and ORDER BY clauses without using dynamic SQL. These were written long ago, but I had never thought to use COALESCE in this way. Very cool!

I will post them here so I can find them later.

UPDATE: This technique may not be as performant as hoped for. Marty in the comments noted that he saw table scans in using COALESCE in this way. Jeremy showed me an example that demonstrated that the execution plan changed from an index seek to an index scan when using COALESCE. As always, test, test, test before rolling this out.

open source comments suggest edit

This is part 3 in this series on copyright law and open source licensing. If you haven’t already, consider reading Part 1 and Part 2 of this series for background before tackling this topic.

To properly license open source source code, the license agreement must be included prominently with the source code. Many simply put a license.txt file in the root of the source tree and publish the license on their project website. Others take the extra step to include the license text in a comment within every source file.

Take a look at the license for DotNetNuke (DNN), a very popular open source portal software for the .NET platform. In particular note the very first section:

DotNetNuke® - http://www.dotnetnuke.com
Copyright (c) 2002-2005
by Perpetual Motion Interactive Systems Inc. 
( http://www.perpetualmotion.ca )

Notice that Perpetual Motion Interactive Systems Inc. owns the copywrite to the DotNetNuke codebase. “How can that be? How can a corporation own the copyright to code that is open source?” you might ask. Don’t worry, there is nothing sinister going on here.

In part 1 of this series I stated that when you write code, you own the copyright to it (with a couple of exceptions such as work for hire). By default, when you contribute source code to an open source project, you are agreeing to license the code under the terms of that project, but you still retain the copyright.

In some cases, this is fine. But it makes it difficult for the project should they decide they want to relicense or dual-license the project as they have to get permission from every copyright holder. Or if there is need to enforce the copyright, the project would need every affected copyright holder to be involved.

What many projects do is require that contributors assign copyright to a single legal entity or person which then has the power to enforce the copyright without requiring everybody get involved. Keep in mind that although this person or entity then owns the copyright, the code has been released under a license that allows free distribution. Thus the fact that the copyright has been assigned to an individual entity does not make the code any less open.

For example, suppose Perpetual Motion decides they want to exercise their copyright and make a proprietary version of DotNetNuke. They certainly have the right to do so, but they cannot stop others from freely viewing and distributing the code under the pre-existing license up to the point at which they close the source. At that point, contributors would be free to fork the project and continue development under the original license as if nothing had occurred.

According to a lawyer Fogel talked with…

For most, simply getting an informal statement from a contributor on the public list is enough—something to the effect of “I hereby assign copyright in this code to the project, to be licensed under the same terms as the rest of the code.”

Is sufficient. Some organizations such as the Free Software Foundation, on the other hand, apply a very formal process requiring users to sign and mail in paperwork.

In any case, some open source projects do not have such a copyright assignment policy in place, but it makes sense to do so. As Fogel points out, should the terms of the copyright need to be defended, it is much easier for a single entity to do so rather than relying on the cooperation of the entire group of contributors, who may or may not be available.

Having the copyright assigned to a corporation also protects individual developers from exposure to liability in the case of a copyright infringement suit.

Public Domain

This section added in 2013/07/17

Another possibility that I did not originally cover is to have nobody own the copyright by dedicating a work to the public domain. This effectively surrenders any rights to the code and gives the code to the public to do with it as they wish.

In some regards, dedicating a work to the public domain is unusual. Typically, works in the public domain have had their copyright expired or were inapplicable (such as government works). As Wikipedia points out:

Few if any legal systems have a process for reliably donating works to the public domain. They may even prohibit any attempt by copyright owners to surrender rights automatically conferred by law, particularly moral rights.

The Unlicense template is one approach to dedicating a work to the public domain while serving as a fallback “license” for legal systems that don’t recognize public domain. The CC0 license from Creative Commons is another such effort.

comments suggest edit

If Visual Studio .NET 2003 completely crashes during one more debug session in the next hour (I need to be reasonable here), I am going to throw my freaking computer through the window (figuratively speaking).

Thanks for letting me vent.