Hosted Subversion solutions

Scott Watermasysk (developer of the DotText blog engine, the precursor to SubText, which is used to power this blog was originally used to power this blog) recently wrote about hosted Subversion solutions and the fact that Subversion is the version control engine used by Google Code. A few years ago I switched to Subversion (from Visual SourceSafe) and I’ve never looked back. Between Subversion, TortoiseSVN (a Windows Explorer-integrated Subversion client), and AnkhSVN (a Visual Studio add-in Subversion client), there’s little reason to look elsewhere.

Is Google Code a worthwhile Subversion host? In short, it depends on your needs. Google Code offers lots of disk space (100MB) and provides a free Subversion repository, but it also requires your project to be open source (the create project page requires you to select one of a few open-source licenses). As a result, Google Code is a great solution for an open-source project.

What about closed source projects? For over a year I have used hosted-projects.com and would highly recommend them to anyone needing a private Subversion repository. They offer plans for as low as $7 a month — and throw in SSL data encryption, an unlimited number of repositories, 100MB of disk space, unlimited users, and free Trac project management software (a combined wiki, source browser, and ticketing system). I have about a dozen projects hosted by them, with different developers working on each one, with separate repositories for each one — all for what amounts to $70 a year. You can’t beat that.

Side thought: I will be commenting on CodePlex soon. I recently received an “OK” from Scott Guthrie of Microsoft to move my precompiled CSSFriendly control adapters to CodePlex (I wanted to make sure there wasn’t a licensing violation), and will be doing that this week, so stay tuned.

CSS styled forms

I like using CSS for layouts and for making sites look pretty — partially because it’s a challenge that is quite satisfying when it works, and partially because I’m not a designer and don’t do well with more robust design elements.

One thing that I often liked using CSS for is for forms. For the past two or so years I’ve been tweaking my technique, and I think I finally have something that works well enough in most situations to share it with you.

Requirements

The sample page uses ___layouts for the basic page structure. ___layouts (a heck of a name, I tell ya) is derived from Yahoo’s UI library, but it’s easier to implement.

Compatibility

The following browsers have been tested against the sample page, which also provides instructions and the CSS. Note any compatibility issues.

Important Note: At very small screen widths (generally less than 600 pixels wide), things can get out of control. Firefox 2.0 handles this best, but in all cases, things get messy at very small screen widths. As a result, setting a min-width on your body tag (or using the appropriate hack to do the same in IE6) is recommended.

  • Firefox
    • Firefox 2.0.0.1: No issues.
    • Firefox 1.5.0.4: No issues.
    • Firefox 1.0: No issues.
  • Internet Explorer
    • Internet Explorer 7.0.5730.11: No issues.
    • Internet Explorer 6.0.2900.2180.xpsp_sp2_gdr.050301-1519 (sorry, I couldn’t help myself): Background colors do not fill complete rows. To use background colors, you need to use a CSS hack (I may add this in the future). Incredibly, there are otherwise no issues.
  • Netscape
    • Netscape 8.1: Line around form doesn’t fully wrap with legend, causing a very minor stylistic quirk, but otherwise no issues.
    • Netscape 7.2: Slightly worse handling of fieldset border than Netscape 8.1, causing a minor stylistic quirk, but otherwise no issues.
    • Netscape 6.2: Totally broken. Most content in the form does not render. To resolve this, you need to set overflow:visible on the div.row. However, doing this breaks some scaling features (long text boxes will run outside the box) and breaks the row background color. Considering Netscape 6.2 was launch in November 2001, instead of hacking to support it, tell your visitors who are using it to upgrade.
  • Opera
    • Opera 9.10: No issues.
    • Opera 8.5.4: No issues.
    • Opera 7.11: Totally broken. See the Netscape 6.2 notes for a fix (and why you shouldn’t bother, since Opera 7.11 was released some time in 2003 and likely has a tiny user base).
    • Opera 6.2: Totally broken (though slightly differently than with Opera 7.11). All notes for Opera 7.11 apply here.

To view the CSS used, some brief instructions, and a form sample, go to http://www.sidesofmarch.com/wp-content/uploads/files/cssforms/cssforms.htm.

CodeSmith templates for WORM updated: log4net and memcached support

I’ve just posted an update to my CodeSmith templates for Wilson’s O/R Mapper. New features include:

* Added the CacheManager static class to provide a simple interface to memcached.
* Added interceptor support for log4net as an alternate to NLog.

Let me know what you think — read the (slightly) updated overview and download the templates here: CodeSmith Templates for Wilson’s O/R Mapper.

KISM: Keep it simple, Microsoft

Microsoft, the company who provided the products and tools for millions of people to build careers off (myself included), has often forgotten that the simple solutions are often the best. In a recent blog post, hammett wrote about Microsoft’s missteps in this area and their focus on YAGNI (You Ain’t Gonna Need It) — at least, where “You” refers to most people.

[Digression: Someone at some point commented on Microsoft Word that “90% of the features are used by 10% of the people”. If I was designing a product and 10% of my features were used by 90% of the people, and the other 90% of the features were used by 10%, I’d either write two products, or I’d write one product that was incredibly extensible using a plug-in architecture.]

This feature-bloat approach to technology reminds me of Microsoft’s Enterprise Library and the Data Access Application Block (DAAB). In the first release of the DAAB, you can call a parameterized stored procedure and get a DataReader back using one line of code, as illustrated below.

IDataReader reader = SqlHelper.ExecuteReader(
    connectionString, CommandType.StoredProcedure, storedProc, 
    new SqlParameter("@ID", 1));

In the latest DAAB (part of Enterprise Library 2.0), this becomes:

Database db = DatabaseFactory.CreateDatabase();
DbCommand cmd = db.GetStoredProcCommand(storedProc);
db.AddInParameter(cmd, "ID", DbType.Int32, 1);
IDataReader reader = db.ExecuteReader(cmd);

I also should mention I also should mention that the latter example also requires a special configuration section added to your application config file, whereas the former just requires a connection string (which likely you already include somewhere in your application configuration).

The first example hides the complexity that you may not need in most circumstances. Granted, you can still use (or write your own) SqlHelper, but why break away from this entirely?

Simplicity is a wonderful thing. Let’s hope Microsoft finds it again. Give power to those who need it, and simple elegance to those who don’t. It’s not hard to do both, if you accept the fact that one size does not fit all.