home · blog · groups · about us · contact us
DevelopmentNow Blog
 Tuesday, January 31, 2006
 
 

I'm in Portland, but I'm working on some projects with people in Chicago. In order to collaborate better, I was looking into ways to share my desktop with other users. I've used WebEx and other tools before, but I wanted something free. I also wanted something that worked through NATs (since I'm behind one), supported my multiple monitors, and was very easy for non-technical people to use. As in "click-on-this-URL-and-see-my-desktop" easy. So I started surfing around and saw the suggestion to use VNC, which I'd used in the past but not recently. 

VNC (Virtual Network Computing) is a desktop sharing/remote control program like Remote Desktop, PC Anywhere, etc. There is a server part (VNC Server) that runs on the shared PC, and a viewer (VNC Viewer) application that is run by people wanting to view and/or control the shared PC. The original VNC was open source, which spawn variants like TightVNC, UltraVNC, RealVNC's Free Edition, and others. RealVNC is the group that originally created VNC, and they have a limited, free version, along with some better non-free ($30-$50) versions.

Web-based Desktop Sharing

Users normally connect to shared desktops using the Standalone VNC Viewer, an installed application that connects over port 5900. However, VNC (at least RealVNC and UltraVNC) also offers a web-based java viewer. So instead of installing software, user could instead open a web browser, go to a URL, and connect to a shared desktop via a java applet. Easy peasy.

Behind the scenes, the VNC Server contains a mini web service that listens on port 5800. A user can open a web browser and connect to the IP of a shared computer, e.g. http://somesharedpc.yourdomain.com:5800. When users hit that page, they see a web page and a small java applet that allows them to connect to that PC's VNC server (if running). Once connected, they can see the desktop, use the mouse and keyboard, transfer files, and share the clipboard. 

I was able to connect to my PC from other computers on my LAN, but I wanted to make sure that my partners in Chicago could also see my desktop. Since my computer is behind a firewall, I needed to connect to my router and forward ports 5800 (for the web-based sharing) and 5900 (if people use the standalone viewer). Once that was done, VNC worked just fine over the internet.

Note that you can configure the VNC Server to prompt you before allowing connections, and to only offer view-only access to users.

Remote Support

UltraVNC also offers an intriguing remote support application called SingleClick. It's a small EXE that users can download in order to let you view and control their desktops.

SingleClick Screenshot

As a software developer, you can brand and customize the EXE with your own logo, text, IP address, button labels, etc. You can also include your own rc4 encryption key for secure connections. Once you have your customized SingleClick EXE, you can put it on your web site, email it to clients, etc. Then when a client (or technophobic relative) has computer troubles, you run the VNC Viewer, the user runs the SingleClick EXE and authorizes the connection, and after a few seconds you're logged into their computer. Once the session is done, SingleClick uninstalls itself from the user's PC. And although you (as the viewer) need to ensure port 5500 is forwarded to your PC, your users normally won't need to worry about firewall settings unless their firewall is blocking port 5500 outbound (which would only be the case in secure corporate environments). If that's the case you could always reconfigure your SingleClick EXE to run over port 80, which should be allowed in almost any company.

There is a pretty detailed walkthrough in the UltraVNC forums on creating your own SingleClick EXE to perform remote support. I made my own EXE and was pleased with how easily it worked. I do wish it was a bit prettier, though. Since it's open source, you might be able to make your own skin.

Other Features

Some other interesting features I noticed were

  • file transfer (TightVNC and UltraVNC)
  • multi-monitor support (UltraVNC and RealVNC)
  • Microsoft Windows Logon authentication, so users have to use MS logins to connect (UltraVNC and RealVNC)
  • a special video driver to speed up connections and reduce CPU utilization on the server (UltraVNC)
  • chat windows (UltraVNC)
  • some cool networking options like Repeater and NAT-to-NAT to get around NAT issues (UltraVNC)

Security

While the password exchange is secured in VNC, any text typed during the sharing session is normally passed in plaintext. That's probably OK if you're not typing anything sensitive, but any passwords, credit cards, etc. would be out in the open. In order to secure the entire session, you can install an SSH server and use SSH tunneling to connect to the shared computer. Non-Windows users can use OpenSSH while Windows users can use SSHWindows and follow Digital Media Minute's SFTP install guide to get SSH running (SFTP uses SSH).

If you don't want to deal with SSH, RealVNC's non-free versions support session encryption, and UltraVNC supports a Data Stream Encryption plugin.

Conclusion

When I used VNC years ago, it worked well but was pretty basic. But now I'm pleasantly surprised at the new features, speed, and stability. RealVNC's paid versions might be nice if you need tech support, want easy-to-use session encryption, and like paying for software. If you're a novice user or just want the no-frills version, you could also try RealVNC's free version -- I found the setup & installation of RealVNC to be a bit easier than UltraVNC. Otherwise I'd suggest giving UltraVNC a whirl.

If you're mostly interested in the remote support features, but want something easier to use and don't mind paying for it, there are some non-free applications that are based on VNC. EchoWinVNC is one, as is NetworkStreaming.

January 31, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Wednesday, January 25, 2006
 
 

The best way to get cheap, dedicated employees is to get them when they're young (before they know any better), have them work on projects they think are cool, and give them lots of free candy and soda. The more sugar the better. 

But why mess around with newly-minted Comp Sci college grads? That's so 2005. I instead suggest finding kids between 10 and 14 and having them learn the Kid's Programming Language. It's based on .NET, but with a simplified IDE and API.

Put your kids (or spouse, or neighbor, or relative) to work building a next-generation tool so that you can retire young and finally have time to enjoy World of Warcraft. :)

Note: I am being tongue-in-cheek about "cheap labor." I don't advocate child labor or anything. I just thought this tool was cool (especially considering the brain drain & dropping numbers of IT grads) ad might be a good way to bond with youngins or help your local middle school students get into IT. But...I couldn't resist being flippant.

 

January 25, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 
 

Fresh from reddit: Joe Hewitt (the DOM inspector dude) has recently released FireBug, a Firefox plugin that's "like a combination of the Javascript Console, DOM Inspector, and a command line Javascript interpreter." It looks perty sweet.

FireBug Screenshot

Grab it in the Mozilla Addons site.

January 25, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Tuesday, January 24, 2006
 
 

So I bought a nice quiet 200mb Segate drive and stuck it into an external USB drive. I'm using it to store my Virtual PC images (boosts performance) and other shared files. But whenever I want to turn it off, Windows XP really doesn't want to let me stop it using the "Safely Remove Hardware" function, instead serving up a "The device 'Generic volume' cannot be stopped right now. Try stopping the device again later."

After digging around a bit I found the solution on a post on Geekly Rambling -- Norton Protected Recycle Bin (aka Unerase Wizard) kept holding onto the drive. Once I told Norton to stop protecting that drive, I was able to Stop it easily.

To configure Norton Protected Recycle Bin (if you installed Norton SystemWorks, you probably have it) to leave your USB drive alone:

  • Connect your USB drive to your computer & power it up. Wait until Windows recognizes it.
  • Right-click the Norton Protected Recycle Bin wastebasket on your desktop and click Properties.
  • Go to the Norton Protection tab.
  • Choose the drive letter of your USB drive from the dropdown, and uncheck the Enable Protection checkbox. Click OK.

That's it! Now, you might be wondering why I bother to Stop the drive at all...why not just unplug it from the PC? Well, that's because I configured the drive for higher performance using the "Optimize for Performance" setting in the Device Manager. The downside of that is you should use "Safely Remove Hardware" before unplugging it.

January 24, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Sunday, January 22, 2006
 
 

I was restoring a database backup on my new project when I noticed that some of the stored procedures where owned by a specific user instead of 'dbo.' That's a nono for several reasons -- not all the procs were owned by the same user, plus it can get messy if you have two copies of the same proc, one owned by dbo & one owned by the user, plus if stored procs are owned by a specific user then you can't remove the user from that database, plus other users won't be able to access those procs by default. Plus other stuff. :)

Steve Shofield has a quick blog post about changing ownership using the INFORMATION_SCHEMA views, but I didn't see an equivalent script for stored procedures that works in SQL Server 2000. So here's my versions:

-- convert tables to dbo
select 'sp_changeobjectowner ''[' + table_schema + '].[' + table_name + ']'', ''dbo'''+char(13)+char(10)+'go' from information_schema.tables where table_schema <> 'dbo'
-- convert stored procedures to dbo
select 'sp_changeobjectowner ''[' + routine_schema + '].[' + routine_name + ']'', ''dbo'''+char(13)+char(10)+'go' from information_schema.routines where routine_schema <> 'dbo'


Log into query analyzer, hit CTRL+T to get results in text mode, run the above, and you'll see the in results window some SQL code that you can copy & paste into the query analyzer & run again. You may get a warning saying "Caution: Changing any part of an object name could break scripts and stored procedures", which basically means that if your stored procedures or queries are written to refer to objects by the username.objectname syntax, they might break. But that probably isn't an issue for you if you're running this script.

January 22, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Wednesday, January 18, 2006
 
 

In one of my projects, the client is concerned about the size of the database. He wants to save money on hosting, so I was going to poke around & see where I could cull data (if any).

After a quick surf, Bill Graziano's script from SQLTeam.com did what I needed. Make sure to run DBCC UPDATEUSAGE('databasename') to get the most accurate results.

/**************************************************************************************
*
* BigTables.sql
* Bill Graziano (SQLTeam.com)
* graz@sqlteam.com
* v1.11
*
**************************************************************************************/


declare @id int
declare @type character(2)
declare @pages int
declare @dbname sysname
declare @dbsize dec(15,0)
declare @bytesperpage dec(15,0)
declare @pagesperMB dec(15,0)


create table #spt_space
(
objid int null,
rows int null,
reserved dec(15) null,
data dec(15) null,
indexp dec(15) null,
unused dec(15) null
)

set nocount on

-- Create a cursor to loop through the user tables
declare c_tables cursor for
select id
from sysobjects
where xtype = 'U'

open c_tables

fetch next from c_tables
into @id

while @@fetch_status = 0
begin

/* Code from sp_spaceused */
insert into #spt_space (objid, reserved)
select objid = @id, sum(reserved)
from sysindexes
where indid in (0, 1, 255)
and id = @id

select @pages = sum(dpages)
from sysindexes
where indid < 2
and id = @id
select @pages = @pages + isnull(sum(used), 0)
from sysindexes
where indid = 255
and id = @id
update #spt_space
set data = @pages
where objid = @id


/* index: sum(used) where indid in (0, 1, 255) - data */
update #spt_space
set indexp = (select sum(used)
from sysindexes
where indid in (0, 1, 255)
and id = @id)
- data
where objid = @id

/* unused: sum(reserved) - sum(used) where indid in (0, 1, 255) */
update #spt_space
set unused = reserved
- (select sum(used)
from sysindexes
where indid in (0, 1, 255)
and id = @id)
where objid = @id

update #spt_space
set rows = i.rows
from sysindexes i
where i.indid < 2
and i.id = @id
and objid = @id

fetch next from c_tables
into @id
end


select top 25
Table_Name = (select left(name,25) from sysobjects where id = objid),
rows = convert(char(11), rows),
reserved_KB = ltrim(str(reserved * d.low / 1024.,15,0) + ' ' + 'KB'),
data_KB = ltrim(str(data * d.low / 1024.,15,0) + ' ' + 'KB'),
index_size_KB = ltrim(str(indexp * d.low / 1024.,15,0) + ' ' + 'KB'),
unused_KB = ltrim(str(unused * d.low / 1024.,15,0) + ' ' + 'KB'),
idx_data_ratio = ltrim(str(indexp*100 /data) + '%'),
unused_pct = ltrim(str(unused * 100 /reserved) + '%')

from #spt_space, master.dbo.spt_values d
where d.number = 1
and d.type = 'E'
order by reserved desc

drop table #spt_space
close c_tables
deallocate c_tables

January 18, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Tuesday, January 17, 2006
 
 

One of my current projects involves creating a data warehouse from multiple datafeeds. For cost reasons we're going with MySQL Community Edition, but we're sticking with ASP.NET, C#, and Windows on the code end.

I'll admit that Windows, C#, and MySQL are an unusual combination, but I love C#, and MySQL recently came out with version 5.0, which features stored procedures, transactions, triggers, foreign keys -- lots of good stuff. How could I resist? If you've never installed MySQL before, don't worry...the installer is pretty easy to follow, and the install guide helps you through. Just make sure you also download the tools and the ODBC connector driver.

Since I'm going with an ELT approach (bulk load into an unconstrained temporary table, perform cleanup & transformations, then import into the "real" tables), I needed a way to review the import process and check the errors. A lot of the examples on the web have you doing everything from the command line, calling the MySQL command line tools from PHP, piping stuff out to text files, etc. I wanted to instead wrap the import process into a nice little C# app. So let's jump into the code!

First we need to connect to the database. I'm using the ODBC driver instead of the new ADO.NET provider, because the ODBC overhead isnt' an issue with so few queries, and the ADO.NET provider is so new that I don't quite trust it yet. :)


string conString = "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; DATABASE=test; UID=theuser; PASSWORD=thepassword; OPTION=3";
OdbcConnection mysqlConnection = new OdbcConnection(conString);
mysqlConnection.Open();

Next we're going to bump the max error count to something big. The default of 64 just isn't enough when you're importing a lot of data. You want to see all the problems encountered during the import.


OdbcCommand updateErrorCount = new OdbcCommand("set max_error_count = 10000;", mysqlConnection);
updateErrorCount.ExecuteNonQuery();

Now let's import data from a flat file into a staging table using the MySQL LOAD DATA bulk import command. This staging table should have a schema that matches the flat file, but shouldn't have any constraints other than a primary key. If there are any constraints (foreign key, etc), and even one record violates them, then the whole import will roll back. And if you have 1 bad row out of 100,000, you would probably prefer to get the 99,999 good records instead of zero. If you designate a primary key, then you can write a LOAD DATA statement that will only import records whose primary key isn't already in the table. This allows you to import multiple files (or even the same file) repeatedly without worrying about duplicate keys.


string importData =
"LOAD DATA LOCAL INFILE 'F:/imports/mls_import_file.txt' "+
"IGNORE "+
"INTO TABLE mls_staging "+
"FIELDS TERMINATED BY '|' "+
"LINES STARTING BY '' "+
"TERMINATED BY '\r\n' "+
"IGNORE 1 LINES; ";

Let me quickly go over the different lines:

  • LOAD DATA LOCAL INFILE 'F:/imports/mls_import_file.txt' causes a bulk load from the F:/imports/mls_import_file.txt file. The LOCAL keyword has the client program read the file and send it to the server. If you omit the LOCAL keyword, then MySQL will try to read the file directly, which is faster, but may have permissions issues.
  • IGNORE tells MySQL to not import any records whose primary key already exists in the destination table
  • INTO TABLE mls_staging is the destination table. It needs to have the same columns as the flat file, otherwise you need to specify which columns to import.
  • FIELDS TERMINATED BY '|' says that the fields are pipe-delimited
  • LINES STARTING BY '' means the records don't start with any special character. Those are two single-quotes, btw. 
  • TERMINATED BY '\r\n' means each record is terminated by a CRLF
  • IGNORE 1 LINES; tells MySQL to skip the first line (e.g. if it contains column header information). And the semicolon indicates the end of a statement, just like in C#.

Now we're actually execute the import statement:


OdbcCommand importCommand = new OdbcCommand(importData, mysqlConnection);
int importRecords = importCommand.ExecuteNonQuery();
Debug.WriteLine(importRecords + " records imported.");

When the LOAD DATA command runs, it'll pull all those rows and load as many into the table as possible, skipping any duplicates. Since there are no foreign key constraints, the main errors we'll see are if the file can't be read or the server is having problems. However, we might see a number of warnings, e.g. missing columns, too-large field values that get truncated, etc. We want to know about all that stuff, so we're first going to get the number of warnings and errors.


OdbcCommand warningCommand = new OdbcCommand("select @@warning_count;", mysqlConnection);
int warningCount = Convert.ToInt32(warningCommand.ExecuteScalar());
OdbcCommand errorCommand = new OdbcCommand("select @@error_count;", mysqlConnection);
int errorCount = Convert.ToInt32(errorCommand.ExecuteScalar());
Debug.WriteLine(String.Format("{0} warnings, {1} errors", warningCount, errorCount));

Now we can inspect the number of warnings and errors, and if there are any, we can log them, email someone, etc. The below code just loops through the warnings and errors and displays them in the output window.


if (warningCount > 0)
{
// show any warnings
OdbcCommand warningListCommand = new OdbcCommand("show warnings;", mysqlConnection);
OdbcDataReader warningList = warningListCommand.ExecuteReader();
while (warningList.Read())
{
Debug.WriteLine(warningList.GetString(0) + " " + warningList.GetString(1) + " " + warningList.GetString(2));
}
warningList.Close();
}

if (errorCount > 0)
{
// show any errors
OdbcCommand errorListCommand = new OdbcCommand("show errors;", mysqlConnection);
OdbcDataReader errorList = errorListCommand.ExecuteReader();
while (errorList.Read())
{
Debug.WriteLine(errorList.GetString(0) + " " + errorList.GetString(1) + " " + errorList.GetString(2));
}
errorList.Close();
}

And lastly we close up shop by calling

mysqlConnection.Close();

Hopefully the above will help you out when importing data in the unholy(?) alliance of MySQL and C#. MySQL's new version bring along a ton of goodies, so don't be surprised if you see MySQL databases popping up more frequently.

 

 

January 17, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Friday, January 13, 2006
 
 

Microsoft has two VM (virtual machine) solutions: Virtual PC 2004, and Microsoft Virtual Server. Since an MSDN subscription comes with both, how do you know which one to use?

Microsoft has published a white paper describing the differences, but in a nutshell the main differences are

  • The "officially supported" operating systems are different. Client OSes are supported on Virtual PC, while server OSes are supported on Virtual Server. In theory, both products should run the same OSes (see the What Works in Virtual PC site), so it's just the "official" support that differs.
  • Virtual PC has sound, Virtual Server doesn't.
  • Virtual PC makes it easier to drag & drop files between the host computer and VMs.
  • Virtual PC has the "shared networking" mode to make it easy for your VMs to connect to the web.
  • Virtual Server has support for multiple CPUs, hyperthreading, 3.6 of RAM, and SCSI drives. It also offers better control over VM CPU & memory utiliization.
  • Virtual Server offers remote administration via WMI, MOM, RDC, the Virual Machine Remote Control (VMRC), and other server management tools.
  • Virtual Server can be controlled via a COM API.
  • Virtual Server offers more networking and multi-server options, including clustering.

So...if you need to emulate a number of servers talking to each other and let them use your beefy dual-CPU box with 4gb of ram, you might want to use Virtual Server. Otherwise you can probably use Virtual PC.

January 13, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [1]



 Monday, January 09, 2006
 
 

I recently got an MSDN Universal subscription via the Microsoft Empower for ISV program ($375 for MSDN Universal), which comes with only all Windows OSes, Visual Studio, SQL Server, Biztalk, Office, and lots of other software. One such program is Microsoft's Virtual PC 2004, which lets you create any number of virtual machines (VMs) each of which acts like its own computer.

Since I'm currently working on 3 different projects (one in .NET 1.1 & SQL Server 2000, one in .NET 2.0 & MySQL, and one in ASP.NET 2.0 & SQL Server 2005), I wanted to have separate development environments for each project to reduce the likelihood of cross-environment contamination (SQL 2000 affecting SQL 2005, .NET 2.0 messing up .NET 1.1, etc.). Not to mention that keeps it cleaner.

Virtual PC Benefits for Developers

Three big benefits for developers from Virtual PC (along with other VM solutions like VMWare and Virtual Server) are

  1. you can easily whip up a VM to try out beta software, etc without messing up your main machine
  2. you can keep different dev environments separate so you can switch between projects without having to uninstall or pollute your files
  3. you can have multiple VMs running at the same time in order to simulate an entire network of computers. For example you could have a VM emulating Windows 2003 & IIS 6, and have that VM communicate with another VM running SQL Server 2005 and Biztalk.

So for me, I'll start by creating a base VM with XP Pro SP2, Firefox, and Office. No dev tools yet. Using that XP Pro VM as a base, I'm then going to make at least three different VMs: one with .NET 1.1 & SQL 2000, one with .NET 2.0 and MySQL, and one with .NET 2.0 and SQL 2005.

When you create a VM based on an existing one, the advantage is you don't have to install anything that's already in the base VM (e.g., I won't have to install XP Pro, Firefox, or Office for my three dev environments). The decision you have to make is whether you want to just make a plain ol' copy of your base VM, or create a new "differencing disk" VM.

Copying your Base VM

Making a copy of a base VM is easy and performs well. You're literally making a copy of the VM files. The downside is it can take up a lot of disk space. To make a copy of a VM:

  • go into My Documents\My Virtual Machines (or whatever your VMs live) and create a new folder for the new VM, e.g. My Documents\My Virtual Machines\NewVMCopy.
  • find the .VHD file of the base VM, and make a copy of it into My Documents\My Virtual Machines\NewVMCopy. Rename it to something like NewVMCopy Hard Disk.VHD.
  • start up Virtual PC 2004, click
    • New->Next
    • Use default settings to create a virtual machine->Next
    • Click Browse, go into BaseVMCopy and enter a name for a new VMC file (e.g. NewVMCopy.VMC)->Next
    • Click Finish
    • The settings dialog will come up, click Hard Disk 1 in the left, check "Virtual Hard disk file:" on the right and browse to the .VHD file you put into the NewVMCopy. Bump up the Memory setting to 256MB RAM or more, and you may want to ensure the Networking option is set to a valid NIC or Shared (NAT).
    • Click OK
  • Your copy is now ready to start up, but before you do, make sure the VM you copied it from isn't running.
  • Now fire up NewVMCopy. Once you get it started, you'll want to give it a new machine name and SID so that it doesn't conflict with any other VMs on the network. To do this, download Sysinternal's NewSID and run it from the command line as "newsid /s <new name>" where "<new name>" should be a new, unique name for this VM. It will run a bit and then automatically restart your VM.

Congratulations, you've made a copy of a VM! Now you can back this VM up (by just backing up the VHD file), install beta software on it, lots of fun stuff. It's "virtually" hassle-free. ;)

Making a Differencing Disk VM

The other way to make a copy of a VM is to create a "differencing disk." The big disadvantage with copying a VM like we did above is that it can take up a lot of space. XP Pro and Office can make a 2gb .VHD file. Copy that .VHD file four more times and you've now got 10 gigs of space taken up.

A differencing disk VHD only stores what's different between itself and the base VHD. So if you create a differencing disk and only install a small program, the VHD file is going to be small, too. The downside is differencing disks can perform more slowly (although that seems to be debated), and if you change anything in a VHD you'll break any differencing disks based on it.

Rather than reinvent the wheel, I'll link to a few good articles on differencing disks. BTW, some sites refer to VMs created in Virtual PC 2004 as VPCs (Virtual PCs).

http://blogs.msdn.com/donsmith/archive/2005/06/16/429700.aspx
http://weblogs.asp.net/cumpsd/archive/2005/03/08/389738.aspx
http://andrewconnell.com/blog/articles/UseVirtualPCsDifferencingDisksToYourAdvantage.aspx

And a special bonus link: Top Ten Tips for Virtual PC 2004

And two more links to Griffin Caprio's thoughts on VMs: Why he likes VMs and Just in time development. And dammit Griffin you should turn on SEO-friendly URLs. :) 

 

January 9, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Friday, January 06, 2006
 
 

Sourcegear has an SCM solution called Vault that has a few big things going for it as a VSS alternative:

  • You can import VSS projects
  • It can work alongside VSS, so you don't have to import all your VSS projects
  • It's easy to use and familiar to VSS users
  • It integrates into the Visual Studio IDE (if you're into that)
  • You can connect to it remotely over HTTP or HTTPS
  • It's cheap (free for a single user, $300 per user after that. VSS is ~$500/user)

I'm working on a small project now where the other developer is using Vault for source control, so this gives me a good chance to check it out. I'll also probably use Subversion and VSS 2005 for other projects.

Code | Tools
January 6, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 
 

Subversion 1.3 was released a few days ago with a number of enhancements. The biggest news for me is the official support for the Windows _svn hack. In a nutshell, Subversion used to create working directories that started with a dot, but some versions of ASP.NET didn't work with those directories. The "hack" was to start those directories with an underscore instead. You can read more about the hack here. Any utilities will need to call the new Subversion API in order to work with the hack. TortoiseSVN (popular Windows explorer shell plugin for Subversion) has a release candidate that works with the new version -- I'd suggest waiting a week or two for a final version of TortoiseSVN.

What this all means is it will soon be much easier to use Subversion for all .NET development. Which is good, since everyone is trying to dump VSS. :)

* When I say "supports" I mean it officially supports the hack that lets Subversion handle ASP.NET projects and let ASP.NET keep working.

Update: TortoiseSVN 1.3.1 is now released and supports Subversion 1.3.

ASP.NET | Code | Tools
January 6, 2006    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]