Lately, I’ve been interested in the use of Virtual Machines, fueled in part by the free-ness of products such as VMWare Server and Virtual PC 2007. For a couple months I’ve been using Microsoft’s IE6Test virtual machine in Virtual PC 2004. I do a lot of freelance web development, and as such, I need to test in various web browsers.

Virtual PC 2004 has gotten the job done for its intended purpose – however, I’ve been annoyed with certain aspects of it. It’s sooo slow, and oftentimes, if I have Firefox and IE7 already open, it will simply fail to start the virtual machine due to a lack of RAM (This partly because I’ve only got 512 measly megs).

Without any particular attachment to VPC, a week ago I stumbled upon VMWare’s Virtual Appliance Marketplace. If you’ve never checked it out, it’s a whole bunch of prepackaged, ready-to-run virtual machines, with the configuring done for you. It’s like buying a brand new computer for free! My interest in VMWare’s offerings was piqued.

Anyway, one thing led to another, and finally today I decided I wanted to give the latest version of Ubuntu (Feisty Fawn) a whirl. Why, what a perfect task for my new totally free VMWare Server!

I decided not to go the prepackaged route, because I wanted to see what installation was like. Also, I decided to go with Xubuntu instead of Ubuntu, because Xubuntu’s system requirements are a bit lower than regular Ubuntu, and as I mentioned above, I’ve only got 512 MB of RAM.

Well, I downloaded the ISO image via a torrent, and fired up VMWare Server to create a new virtual machine. They’ve even got Ubuntu as one of the distros of Linux in the “New Virtual Machine” wizard, which is pretty cool.

I set the disk size to 10 GB and the RAM to 128 MB, as that is the recommended minimum amount of RAM for Xubuntu.

After setting the CD drive to the Xubuntu ISO, I fired up the virtual machine.

Xubuntu (and I’m guessing the other Ubuntu flavors) runs as a Live CD, from which you can install the OS onto the hard disk by running an Installer program that is conveniently located on the desktop. Pretty slick – although potentially confusing for new users, I didn’t have a hard time catching on.

I ran the Installer by double-clicking it, and was a bit annoyed by how slow everything seemed. It took more than a minute before the installer asked me what language I wanted to use. Even after it asked, it took a while before I could click the “Forward” button. All in all, things seemed very unresponsive – not at all what I had been expecting, even if it was in a virtual machine.

A few steps later, the installer was getting ready to partition my virtual hard disk – and it froze. It seemed like it was working, but after leaving it alone for 10 minutes, it was still in the same place. VMWare reported that it was reading the CD like crazy, and my computer’s hard disk was intermittently accessing (presumably the ISO), but it wasn’t moving anywhere. I decided to try rebooting (I know, I know, Windows mentality – it’s hard to kick the habit). This time, the installer froze in the exact same way at the language screen!

At this point, I was a bit frustrated. Then I remembered something that I had forgotten about when I should have been remembering it – using the graphical installer requires 192 MB of RAM! And apparently, it actually does. It would probably be helpful if there was some message in the installer reminding users of this fact.

In any case, I shut down the VM, upped the RAM to 192, and started it back up. And guess what? It installed without a hitch! The installer screens also loaded much quicker, more along the lines of what I was expecting (although there were still some undesirable delays between when a page was viewable and when it was clickable). I’m now in and exploring Xubuntu!

I’ve been doing some graphic design work lately, and I’ve been trying to make a much better effort to do things using vector format rather than raster. Photoshop (Version 6.0, no less!) is still my favorite image editing app, but I’ve realized just how powerful path/shape layers with effects applied to them are.

I found some shapes at the Open Clip Art Library that I wanted to use in Photoshop. All the things at Open Clip Art are available in raster (PNG) and vector (SVG) format. “Okay,” I thought, “I’ll get the SVG version, and copy the paths into Photoshop, getting super high quality paths.” Right? Not quite.

Photoshop (at least version 6 – I can’t speak for later versions) does not import paths from a file. Apparently, the only way you can get paths into Photoshop is by copying and pasting them from certain applications. I’m aware of two applications that Photoshop can import paths from: Adobe Illustrator and Microsoft Expression/Acrylic (aka Creature House Expression). I don’t have Illustrator installed on my machine currently (I’ve got the installation CD somewhere, but I’m not quite sure where…), so that was option was out.

(Side note: Microsoft used to give Expression 3 away for free, but they no longer shows a link to get it. Last time I checked, though, you could get it from them here. It’s a pretty snazzy vector graphics program, but it’s got some issues.)

Too bad that Inkscape wasn’t on that list. Inkscape does, however, save to EPS files, which Expression can supposedly open.

“Sweet,” I thought, “I’ll resave the SVG as an EPS in Inkscape, then just open up the EPS in Expression and copy it over.” Except – all I got when I tried opening the EPS in Expression was a blank page. I opened up the EPS in other programs, and it showed up fine. Expression just doesn’t seem to want to open them.

Back to the drawing board. I tried converting the EPS into various other formats using external tools, all to no avail. Boo.

I stumbled across an article that suggested that Expression could understand WMF data copied out of Microsoft Office products. So I fired up Microsoft Word. I was able to insert the EPS file that I saved in Inkscape into a Word document. From there, I tried copying and pasting into Expression – this time I got a blank box. I then experimented with changing the format of the image using the Paste Special feature of Word, and came across workable results when I pasted it as a WMF and copied THAT into Expression.

So, here are the steps I had to take:

  1. Open up the SVG file in Inkscape.
    • Optional: Get rid of any gradients in the image. SVG has some pretty sweet options for gradients that either WMF or EPS can’t quite use. Solid colors work best.
  2. In Inkscape, save the file as an EPS file.
  3. Insert the EPS file into a blank Word/Office document.
  4. In Word, copy the image, and then Paste Special. Choose “Picture (Windows Metafile)”.
  5. Copy the new image in Word and paste it into a blank Expression document.
  6. To get it into Photoshop, copy it in Expression and paste it into Photoshop. Choose the “Paths” option.

Whew!

My dad has two computers in different parts of the state. He recently got this computer-controlled weather station (sorry, no link at this point) that records all sorts of information about the outdoor and indoor temperature. The station’s software has a “Remote Publishing” feature and e-mail reports, but he wanted the ability to actually see what it’s showing in near-realtime.

He came across the service of GoToMyPC, and thought it was the coolest thing since sliced bread. And I’ll grant that it is pretty slick – you install the server software on your machine(s), and the software will keep in touch with GoToMyPC’s central servers, letting them know of your on/offline status. From any java-enabled web browser, you can then go to the GoToMyPC website, and you can connect to any of your online PCs. It even works through NAT on both ends! (I’m guessing it’s doing something through the central servers in that case, but I’m not sure).

The downside? It’s $19.99/month. Yeow. I’m thinking, That’s just, like, VNC… with a Java client… secured… shouldn’t that be basically free? (FYI, they use a Citrix client, not VNC)

His birthday is in a week, so what better excuse to tinker around with getting the same effect, using free/open source software?

So, we can split this up into a few things that need to be in place:

  1. VNC Server
  2. SSH Tunneling to the VNC Server
  3. Java client

VNC Server
There are a whole bunch of software packages available now for VNC. The servers I’m setting up are Windows machines, so I decided to go with UltraVNC. Why UltraVNC? Mainly because I’m familiar with it. I used it for helpdesk stuff at the University of Michigan, and it’s used at my current place of employment as well. It has a few well-integrated features, like file transfer and chat. And the system tray icon , while somewhat creepy, is very simple to describe to people who are unfamiliar with the program and need to do something like change a password.

  1. Download UltraVNC (http://www.ultravnc.com) on the machine that you want to be remotely accessible. Getting the Setup package will probably make things simpler than the plain ZIP archive.
  2. Install UltraVNC. Leave most options at their defaults. At the “Select Components” screen, you can probably deselect “DSM Encryption Plugin” and “UltraVNC Repeater.” We’ll be using SSH for our encryption. Check “Register UltraVNC Server as a system service” and “Start or restart the UltraVNC service” on the Additional Tasks screen.
  3. When installation is nearly complete, you should receive a prompt that there is no default password set. At this point, the installer will show you the “Default Local System Properties” screen.
  4. Change the default settings to be like the following:

    We’ve made it so that only loopback connections are allowed (so that only SSH-tunneled connections are allowed, basically). The other options are mostly up to your preference. Also, be sure to set a password. You might notice that my password is very short: in fact, it is just vnc. Why the heck am I telling you my password? Because in order to use it, you’d have to have access to my machine (loopback only, remember?). If you’ve got access to my machine (physical or via SSH), you can probably view my registry, and the VNC password is stored there. It’s “encrypted,” but every VNC server uses the same type of encryption and the same encryption key. So I might as well just tell you. This is just to further emphasize my point that we’re not going to rely on VNC to handle any encryption. Besides, you might find it useful to have the same password as me in one of the steps below.

  5. Hit OK. This will start the service.

SSH Tunneling
We now have a VNC server that has absolutely no security, other than the fact that it can only be accessed from the machine it’s running on. Now we need to find a way to let people in over the Internet in a secure way. Enter SSH.

For some background on SSH Tunneling, check out http://www.afp548.com/articles/security/ssh-tunnels.html. There are some great illustrations there. Basically, an SSH Tunnel allows you to create a secure “tunnel” through an otherwise secure network – in our case, the Internet (which is pretty much the least secure of all networks).

In order to set up this tunnel, we need to set up an SSH server. There is a port of OpenSSH for Windows using Cygwin – unfortunately, in my experience it has proven somewhat flaky. I reccently discovered freeSSHd, a closed-source SSH server for Windows. It lets you have a different set of users than your Windows ones, it has a graphical control panel, and, as you could hopefully tell by its name, it is available free of charge.

  1. Download freeSSHd (http://www.freesshd.com).
  2. Install it. Say “Yes” to both of the post-install questions (Create a service and create the keys).
  3. You will now have a freeSSHd icon in your system tray. Click it once to bring up the adminstration tool.
  4. Click on “Users,” and add a new user. Give it a name (I used “sshtunnel”), and select “Password stored as SHA1 hash” as your Authorization. Then you can enter a password. Uncheck all of the “User can use” options, and hit Apply.
  5. Enable the “Tunnel” option in the Users list for the user you just created. Your screen should look like this:

    There’s an apparent bug in the program where if you set the “Tunnel” option outside of the Users list, it doesn’t get saved properly. That’s why we didn’t set it above, but instead set it here.

  6. Click on Apply and Save.

Now we’ve got an SSH server running. However, if you’re running your computer behind a router or other NAT device, there’s a little bit of extra work we need to do. We need to forward on incoming SSH connections to our server computer. How this is done varies from router to router… Often it can be found under the “Port Forwarding” option, though. You may also want to investigate options for reserving IPs for specific computers. This is sort of beyond the scope of this tutorial. Basically, you need to reserve an IP for your server computer, then make sure to forward incoming TCP connections on port 22 to port 22 of your server computer. If you’ve got multiple computers behind the router that you want to access remotely, you need to set your SSH servers to listen on different ports, forward on the appropriate ports, and set your ssh client to connect on the alternate port (more info on that below).

Java Client
3SP put out an open-source Java VNC Client (under their SSHTools project) that automatically tunnels through ssh, taking care of a lot of the intermediate steps that were once annoying/difficult to comprehend. We’re going to put this applet on a webpage to simplify access to our remote server. Note – I leave it up to you to secure your webpage. I would recommend using some sort of authentication at the webpage level to make sure that the fact you’re running a VNC server isn’t advertised openly on the web.

  1. Get the latest SSHVnc-Applet from the SSHTools website (http://sourceforge.net/projects/sshtools/). Grab the .zip version if you’re running on a Windows machine.
  2. Unzip the files somewhere on your hard drive. There’s a sample html file that shows how to use the applet in a webpage. I didn’t find the sample adequate to my needs, so I modified it to make the following changes:
    • Automatically connect to a host.
    • Resize the size of the applet to fill the webbrowser window.
    • Get rid of text and graphics above and below the applet.

Here’s the html file I used (save this as “yourhost-sshvnc-applet.html”):

<html>
<head>
<title>SSHVnc Applet</title>
</head>
<body style="margin: 0; padding: 0">

<applet width="99%" height="99%"
archive="SSHVncApplet-signed.jar,SSHVncApplet-jdkbug-workaround-signed.jar,SSHVncApplet-jdk1.3.1-dependencies-signed.jar"
code="com.sshtools.sshvnc.SshVNCApplet" codebase="." style="border-style:
none; border-width: 0; padding: 0; margin: 0">
<param name="sshapps.connection.host" value="192.168.1.1" />
<param name="sshapps.connection.userName" value="sshtunnel" />
<param name="sshapps.connection.authenticationMethod" value="password" />
<param name="sshapps.connection.connectImmediately" value="true" />
<param name="sshvnc.connection.vncHostDisplay" value="localhost:5900" />
<param name="sshvnc.connection.useCopyRect" value="true" />
<param name="sshvnc.connection.compressLevel" value="9" />
<param name="sshvnc.connection.cursorUpdates" value="1" />
<param name="sshvnc.connection.eightBitColors" value="true" />
<param name="sshvnc.connection.encryptedVncPassword" value="91bc75c18d3d85a7" />
</applet>

</body>
</html>

Things to modify in this file – replace “192.168.1.1” with your IP address or hostname (to find out your IP address, you can just go to http://www.whatismyip.com. Note that this is not your internal IP address, if you’re behind a router). Replace “sshtunnel” with your ssh username. And the encryptedVncPassword (91bc75c18d3d85a7) is the encrypted value of the password “vnc”. So if you used that as your VNC password, you can use this html file to avoid entering an extra password. If you decided to take the high road and use a unique password, you can find it out by going to your registry, browsing to HKEY_LOCAL_MACHINE\SOFTWARE\ORL\WinVNC3\Default, and checking out the Password value. Copy down the hex values shown in the Data field minus the spaces, and you’ve got your “encrypted” VNC password. Alternatively, you can just clear that line from the file, and be prompted for your VNC password.

There are other options available, too. Check out the instructions.htm file that comes with SSHVnc-applet.

To test it out, double-click on the html file you created, and you should get a Java VNC window. Say “yes” to any security questions, and enter your SSH user’s password. You should see your computer screen shortly. If you don’t, try restarting your computer, and making sure all the services are running.

If everything worked, you’re able to put this html file on the web, along with all the appropriate .jar files, and you’ve got a fully-functioning remote VNC file!

As usual, I hope this has been helpful to you. If you have any questions, comments, or whatever, make like a tree and leave ’em.

Image hosted by Photobucket.com

I read a comment on Slashdot yesterday and was intrigued by it. A poster (admittedly off-topic) was lamenting the lack of a really cool and functional drop-down console for Windows, similar to the tilde-enabled console for Quake. I too thought this was a really cool idea, I decided to investigate it myself. I was unable to find any software product currently out there (free or otherwise) that offered a Quake-style console for use in a normal Windows environment. I was, however, able to find a program (called Console, simply enough) that offered a transparent command-line window for Windows, with other options for behavior, but no built-in hotkeys.

So, I was getting all set to modify the open-source Console to do what we all really want out of our console, when I came across a message from the author of the program talking about why he didn’t implement hotkeys. He said that he used a program called PowerPro, and that handled all of his hotkey (and other) automation needs.

So I investigated that, combined with Console. After a little bit of hacking, I have what I believe is a pretty versatile script for sliding down a console window. I’m putting the instructions here, since this is the place for randomness.

Prerequisites:

  1. Get Console – http://sourceforge.net/projects/console
    Install to C:\Program Files\Console
  2. Get PowerPro – http://www.ppro.org
    Install to the default

Now you’re going to have to edit some text files. First, the PowerPro script. Copy the following (in between the BEGIN and END) into a new notepad file, and save it as C:\Program Files\PowerPro\scripts\ShowConsole.powerpro

Edit: Updated the script to reflect problems with my earlier copy/paste work. :-[

Edit 2 (2005-07-30): Again, updated to reflect problems with copy/paste… Is Blogspot truncating my code?
——-BEGIN——–

;; Set animate to 0 to turn off animation, otherwise set to animation speed (lower = faster)

animate = 5
consoleexe = "C:\Program Files\Console\console.exe"
consolewindow = "c=*Console Main Command Window*"

;; END USER-EDITABLE PARAMETERS

If (activewindow(consolewindow) and visiblewindow(consolewindow)) do
Jump SlideOut
ElseIf (visiblewindow(consolewindow))
Window.show(consolewindow)
ElseIf (anywindow(consolewindow)) do
Jump SlideIn
Else
do(consoleexe)
wait.until(anywindow(consolewindow))
EndIf

Quit

@SlideIn
If (animate) do
Window.show(consolewindow)
h = eval(window("height", consolewindow))

newy = 0 - h
incy = h / animate
int = -255 / animate

Window.Position("=", newy, "=", "=", consolewindow)

for (; newy < 0; newy = newy + incy)
Window.Position("=", newy, "=", "=", consolewindow)
endfor

Window.Position("=", 0, "=", "=", consolewindow)
Else
Window.show(consolewindow)
EndIf

Quit

@SlideOut
If (animate) do
h = eval(window("height", consolewindow))

newy = 0
incy = h / animate
targety = 0 - h

for (; newy > targety; newy = newy - incy)
Window.Position("=", newy, "=", "=", consolewindow)
endfor

offscreeny = 0 - yscreen

Window.Position("=", offscreeny, "=", "=", consolewindow)

Window.hide(consolewindow)
Else
Window.hide(consolewindow)
EndIf

Quit

——–END———

Next, you need to run PowerPro. The first time you run, it takes you through a configuration wizard, and things might appear very daunting – the program is VERY powerful. I recommend stepping through it to at least get a little bit of familiarity with the setup of things. When you’re done with the wizard, you’re going to want to go into the “Configure” dialog, and the “Key/Mouse” tab.

Create a new Key/Mouse action. In the “Enter command” dropdown list, choose *Script, then select “RunFile” from the “Script action” dropdown. Select your ShowConsole.powerpro file. Now, if you click on the “Type key” textbox at the top of the window, you can map any key to showing the console (including just a plain old tilde without any extra modifiers!). Hit OK when you’ve mapped a key, apply the settings, and close the Configure dialog.

Now you should be able to open a console window by hitting the key you mapped. Hit the key a few times, to check that it’s hiding and reappearing. Feel free to experiment with the value of the animation variable by editing the script in notepad and saving it. You’ll see the changes immediately after you save and hit your hotkey.

I didn’t find the default settings of the console window quite to my liking. The main things I changed were the transparency/alpha settings and the starting position of the window. You can right-click on the console window, then choose “Edit configuration” to bring up an XML config file. Make changes, save it, then right-click on the window and “Reload settings.”

Feel free to move the console window around. When it comes back down, it will be at the same horizontal position of where you moved it to (but it will be at the top of your monitor). If you want the console to be the width of your monitor, edit the console configuration.

I’m still thinking about maybe modifying the program itself… in the meantime, though, I hope people find this useful/cool. Feel free to leave a comment if you have any questions about it. I’m also interested if you have any suggestions about other places to put this type of thing on the ‘net.