VM Ware Fusion - Cleanup Deleted Snapshot Fails - How to get it working again
Posted by Nick Harris on November 14, 2008
Permalink
| Comments (1)
I *love* developing in a VMWare virtual machine. I can tweak and break things in the OS as badly as I want then simply revert back to a snapshot or another backup to get back to a good state. But my VM for Vista is huge and when it gets bloated it takes up even more space.
Starting with VMWare Fusion 2.0 you can now have multiple snapshots. I haven't found a need for this so when I create a new snapshot I delete my old one. When you delete an old snapshot, VMWare will cleanup old files that it no longer needs thus keeping the size of the virtual machine as small as it can be.
Recently I had an error occur when VMWare was cleaning up the deleted files. Ever since then whenever I deleted older snapshots I would get an error saying I didn't have enough disk space to delete older files and my virtual machine continued to take up more and more disk space.
Here's how you get things working again:
1. Copy your virtual machine off to a drive that has plenty of disk space - the recommendation I saw was at least enough free space as the size of your virtual machine. I used one of the external hard drives I keep my virtual machine backups on.
2. Start the copied virtual machine up so that its running from the bigger disk.
3. Take a snapshot.
4. Delete the snapshot you just took - this will cause VMWare to start its cleanup and since its now on a disk with plenty of room it will be able to complete. Cleanup can take a while so be patient.
5. Copy the cleaned up virtual machine back.
For me this shrunk my virtual machine fro 56 Gigs back to 39 - big difference!
My New Role
Posted by Nick Harris on November 11, 2008
Permalink
| Comments (7)
Just as I was gearing up to start work on Inbox 3.1, something happened. One of our great platform developers took a new job, creating a new opportunity for me at NewsGator which I've decided to take on. I'm now the lead developer of the NewsGator API!
For those who don't know my history here, I started just as the API was beginning to take shape. Inbox 2.5 was the first client to use our synchronization system via the new API so I've been intimately involved in its testing and design aspects for years.
I've also built a number of NewsGator client applications that all use the API - Toolbar, ScreenSaver, Desktop, Ticker (not public but very cool). At one point I even took on a brief project manager role that helped synchronized the API's we use at services.newsgator.com with the API's used on the NewsGator Enterprise side of the house.
Our API is very powerful, has both REST and SOAP versions, and is also used by some of the biggest media and news companies in the world, along with being the sync engine for NetNewsWire, FeedDemon, Inbox and NewsGator Go. This is a great opportunity for me to expand my programming experience back on the server side, get involved with SQL again (and our massive database) and - as Greg put it - "scratch that computer sciencey part of my brain that Outlook development does not".
For now I am still the lead developer for my other client products as well, but they'll take a lower priority to API work. I can't say for certain when anything new will come out of those but my intention is to continue working on them since its work I really do enjoy... but if you have concerns that something you love won't be fixed/enhanced please let us know!
Signed. Sealed. Delivered.
Posted by Nick Harris on November 4, 2008
Permalink
| Comments (0)
The girl in the white t-shirt towards the beginning (bottom right) is Anne Hathaway! Really!
Congratulations President Elect Obama
Posted by Nick Harris on November 4, 2008
Permalink
| Comments (0)
SQLite and .Net
Posted by Nick Harris on November 3, 2008
Permalink
| Comments (2)
One part of Inbox that I detest is the back-end storage model it uses to keep track of posts and their states (read state, flag state, current folder). It basically keeps this information in memory then serializes it out into XML files when you shutdown Outlook. It wasn't my decision to write Inbox this way, but I have kept this code and added to it considerably over the years.
One reason I kept it is that I didn't want to deal with installing a database along with an Outlook add-in. Seemed like overkill really. But that was before I played around with SQLite.
SQLite along with System.Data.SQLite make it ridiculously easy to install a back end database with full SQL support. How easy? Include the System.Data.SQLite, then create a connection:
SQLiteConnection sqliteConn =
new SQLiteConnection("Data Source=MyDb.db3;Pooling=true;FailIfMissing=false");
That's it. Database created, ADO object ready, now just populate it. I used SQLite Administrator to create my database schema, then just exported the SQL script to execute in my actual program.
So far so good. Hopefully this works out. Even though users won't *see* a difference they should notice an improvement in performance. And my code will be drastically simpler which is always good... that is if everything works out and I can get everything ported!
What do you want in Inbox 3.1?
Posted by Nick Harris on November 3, 2008
Permalink
| Comments (0)
I'm starting to think about what features should be included in Inbox 3.1. Its only a minor release so there won't be a whole lot new, but here's what I'm thinking...
NewsPage Redesign
Redesign to the NewsPage to make it both easier to use and more visually appealing. This includes giving users the option to change the order/grouping of posts along with the ability to share, flag and tag posts.
Tagging
Tagging is now part of the NewsGator API which means NewsGator users have the ability to tag posts and have those tag synchronized. This means that tags you add in NewsGator Online also get added in NewsGator Inbox. This feature is in the works for FeedDemon as well.
What else? What features would you like to see in a new version of Inbox? Let me know either in the comments of in the forum.
Customized Installers Part Two – Enter WiX
Posted by Nick Harris on August 27, 2008
Permalink
| Comments (0)
Creating a single, fully customized MSI file for this customer wasn’t too hard for me to do in house. I had all the settings they wanted in the ngClientConfig file and I had Install Shield to create the MSI. But what happens when the next customer requires this? And what happens when this customer wants the latest version of our clients? It would be up to me to create the next installer for them. There had to be a better solution.
After a lot of looking, I found WiX. WiX uses XML to design everything about an MSI – from UI to contents, its all in the XML. This means that everything about an MSI could be scripted into the XML using code… or the CIA tool I had already created.
Updating the CIA tool to use WiX also meant that I could move beyond what was offered in the ngClientConfig file for customization and give people the ability to change other files that get installed with our clients. One customer for instance wants the ability to change the icons that are used in the system tray with NewsGator Notifier… now they can change these on their own and include their own custom icons in their own installer.
Giving IT departments the ability to configure and create their own MSI installers for each product is a huge step, but of course they wanted more…
Customized Installers Part One - The Problem
Posted by Nick Harris on August 26, 2008
Permalink
| Comments (0)
Writing desktop client software for enterprise environments presents some interesting technical problems. In the enterprise IT departments have the ultimate say on what servers a client can access, how it will access those servers, as well as what features are available for their end users.
At NewsGator, our solution was an XML file (our ngClientConfig.xml file) that holds all these configuration options. It has a section that holds global settings that all clients use as well as sections for each client and its specific options. Each client was then designed to look for this file in the same directory it’s installed in and set its own configurations accordingly.
This lead to a process of hand creating the ngClientConfig file, installing the client, copying the ngClientConfig file to the appropriate directory and finally running the client. This worked great… until we had our first enterprise customer.
An IT department rolling out thousands of desktop client installations doesn’t want a multistep process. One file that does it all was the next requirement.
My first solution was a self-extracting zip file that included a specialized batch file. When the zip file was executed, it would dump its contents on the client machine then run the batch file which would call the basic installer for the client, copy the ngClientConfig.xml file to the correct directory, and finally run the client.
In order to make it even easier for IT departments, I created an application we call the “Client Installation Administrator” or CIA tool. It’s laid out like a Windows wizard and steps you through setting up all the options in the ngClientConfig.xml file. The last step was then to create the ngClientConfig file, the specialized batch file and finally the self extracting zip (which is an exe).
This solution worked great for a while… until we came across an enterprise customer whose rollout procedure required a single, fully customized MSI file.
What to do now…
Thirty
Posted by Nick Harris on July 30, 2008
Permalink
| Comments (2)
I turn thirty today. Yeah. It's not the end of the world... but this picture I took a few weeks ago sure looks like the end of the earth...
CS IQ and Turing Machines
Posted by Nick Harris on July 22, 2008
Permalink
| Comments (1)
Found a great post in Nick Bradbury's Link Blog this morning titled "Generative Models and Programming Talent" that talks about what makes a good programmer good. The basic argument is that a good programmer is one who can easily visualize the implicit and explicit relationships between things and understands the how changing the state of one effects the others. They (the author of the post and the author he quotes) call this "CS IQ". It's a great read.
It reminded me of one of my favorite classes in college, CS406 Computational Theory. It was the last CS class I took and also the one I did the best in. The part of it I enjoyed the most was building and exploring Turing Machines.
The reason why Turing Machines popped into my head while reading the article was this quote:
[Good] programmers are able to “play computer” in their head (sometimes requiring the aid of a scrap of paper). In other words, we have a model of exactly what the computer does when it executes each statement.
Writing out Turning Machines on paper was extremely easy for me - so much so that it really surprised me. Especially since a portion of the class just didn't get it, and I couldn't understand why. The article seems to explain this by saying that some people instinctively think this way while others don't. I'm not surprised that I do - I wouldn't have kept in this career if I hadn't - but now I kind of get why others had so many problems in that class.
It also gives me some good ideas for interview questions :-)

