<rss version="2.0">	<channel>	<title>Laimonas Blog</title>	<link>http://www.laimisnet.com</link>	<description>Software Development, .NET blog</description>	<language>en-us</language>	<pubDate>Sat, 11 Oct 2008 12:00:54 GMT</pubDate>	<lastBuildDate>Sat, 11 Oct 2008 12:00:54 GMT</lastBuildDate>	<generator>Laimis Custom RSS Engine</generator>	<managingEditor>laimis@gmail.com</managingEditor>	<webMaster>laimis@gmail.com</webMaster><item><title>WinSCP console mode</title><link>http://www.laimisnet.com/default.aspx?entryid=217</link><pubDate>Wed, 24 Sep 2008 15:13:37 GMT</pubDate><guid>http://www.laimisnet.com?entry=217</guid><description>I am sure anyone who has to do a secure copying (scp) from windows to linux machines are mostly using an excellent tool called &lt;a href=&quot;http://winscp.net/eng/index.php&quot; class=&quot;sideLink&quot;&gt;WinSCP&lt;/a&gt;. Well I had been using it for over 3 years and only recently discovered that it has an awesome console mode! To start it in the console mode, in the command prompt run:&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
winscp /console
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
In the console mode use your basic ftp commands to operate (open, put, cd, lcd, pwd, lpwd, etc). You can even feed commands to the winscp in a separate file and it runs them upon startup. Very sweet indeed.</description></item><item><title>Simple things are easy to miss...</title><link>http://www.laimisnet.com/default.aspx?entryid=215</link><pubDate>Tue, 16 Sep 2008 18:46:48 GMT</pubDate><guid>http://www.laimisnet.com?entry=215</guid><description>Check this piece of code:
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
public enum TestEnum
{
    One = 1,
    Two = 2
}

static TestEnum testMe;

&lt;/pre&gt;
&lt;/div&gt;

What's the value of the testMe enum? Is it (TestEnum.One, value of 1)? No, it is zero. I just saw this somewhere being declared and thought I should mention it here. The above behavior is why sometimes I like to put a value of 0 in the enum, like this: Undefined = 0.</description></item><item><title>Firebug on Firefox 3</title><link>http://www.laimisnet.com/default.aspx?entryid=214</link><pubDate>Thu, 28 Aug 2008 14:25:41 GMT</pubDate><guid>http://www.laimisnet.com?entry=214</guid><description>Well was I happy when I accidentally shut down Firefox the other day. On the restart I was notified of a new Firebug version (still 1.2, but I believe it was b15 revision or something like that). One of the biggest reasons why I kept FX2 on my windows instance was that Firebug for FX3 was pretty much unusable and incredibly buggy. Especially when it came to Javascript debugging side of things (would hang trying to debug javascript, could not locate source lines properly from the command-line, etc.). It is looking real good now at least.</description></item><item><title>Current favorite tool</title><link>http://www.laimisnet.com/default.aspx?entryid=213</link><pubDate>Sat, 12 Jul 2008 23:42:34 GMT</pubDate><guid>http://www.laimisnet.com?entry=213</guid><description>'watch' linux utility is so simple yet has been so useful to me lately. I am monitoring several linux machines and this tool has come in very handy. Basically it &quot;Executes a program periodically, showing output full screen&quot;. 
&lt;br /&gt;&lt;br /&gt;
One of the ways I use it is to monitor the log file and make sure that the 'PING' is written to it every x amount of time. 'watch -n 5 tail file.log' will output the last lines of the file.log every 5 seconds.</description></item><item><title>Firefox 3 and Yahoo Sports</title><link>http://www.laimisnet.com/default.aspx?entryid=212</link><pubDate>Wed, 25 Jun 2008 03:52:29 GMT</pubDate><guid>http://www.laimisnet.com?entry=212</guid><description>The &lt;a href=&quot;http://sports.yahoo.com&quot; class=&quot;sideLink&quot;&gt;Yahoo Sports&lt;/a&gt; site was in bad shape (tabs not working, bunch of javascript errors, UI quite messed up) when viewed with Firefox 3.0 for about a week. I was keeping a close eye on the situation simple because of amusement and trying to guess when they gonna fix it. I mean you would think they would run and view their site with beta releases of the browser so that there are no surprises, after all Yahoo Sports is a big site. But I guess they didn't.
&lt;br /&gt;&lt;br /&gt;
I wish I knew what exactly changed that caused the site to be so crippled. And that's another good thing for open source software: they are free to innovate and change things without worrying much about breaking older stuff if the change is really worth it. I guess in short term the devs might suffer (as I am sure yahoo sports had to change their code), but probably all will benefit in the long run with taking advantage of a great browser like firefox.</description></item><item><title>Javascript profiling with Firebug</title><link>http://www.laimisnet.com/default.aspx?entryid=211</link><pubDate>Wed, 18 Jun 2008 05:10:45 GMT</pubDate><guid>http://www.laimisnet.com?entry=211</guid><description>&lt;p&gt;
  I decided to blog today about one of my favorite (and least talked about) Firebug feature: Javascript Profiling. This could be become very relevant with web apps increasing in client side complexity and functionality. Also browsers are starting to support various advanced concepts and controls that will invite even more javascript development.
  I personally don't do javascript profiling often. More likely I will use it to make sure that the rough numbers I see after profiling don't look anything out of ordinary. For instance, one of the web apps I was prototyping, I was using jquery to select various html dom elements in a very inefficient way. Since it was a prototype, I really didn't care as long as I got the functionality in and could see how things worked. Once time came for cleanup, I used profiling to see what places I am making incredible amount of calls needlessly.
  So to get started, with Firebug up and visible (F12), click on &quot;Profile&quot; tab.
  &lt;/p&gt;
  &lt;img src=&quot;images/entries/start.png&quot; alt=&quot;start&quot;/&gt;
  &lt;br /&gt;
  &lt;p&gt;
  Click on &quot;Profile&quot; again to stop it. If you were running this on an empty page, you will see &quot;No activity to profile.&quot; text. But if there was some javascript running (something running periodically for instance), you would see some timing data coming in. This is a great way to see what the site is running on a periodic bases by the way.
  To illustrate time measurement I will use a silly example. Let me create a simple page that when clicked on a button will find all the spans with-in divs with attribute &quot;doHide&quot; set to true and hide them. To do this, I will use jquery for selecting:
  &lt;/p&gt;
  &lt;div class=&quot;code&quot;&gt;
  &lt;pre&gt;
  function hideThem() {
    $(&quot;div &gt; span[@doHide=true]&quot;).hide();
  }
  &lt;/pre&gt;
  &lt;/div&gt;
  &lt;p&gt;
  I will start profiler running, click on the Hide them button and click on &quot;Profile&quot; again to get the results. Here is how they look:
  &lt;/p&gt;
  &lt;img src=&quot;images/entries/profilefirst.png&quot; /&gt;
  &lt;br /&gt;
  &lt;p&gt;
  So, 216 calls to hide some spans. That won't do. How about we just assing a special class to the spans and use that in selecting the spans to hide:
  &lt;/p&gt;
  &lt;div class=&quot;code&quot;&gt;
  &lt;pre&gt;
    $(&quot;.hideSpan&quot;).hide();
  &lt;/pre&gt;
  &lt;/div&gt;
  &lt;p&gt;Results:&lt;/p&gt;
  &lt;img src=&quot;images/entries/profilesecond.png&quot; /&gt;&lt;br /&gt;
  &lt;p&gt;
  Kind of better since total time now is really negligible (unless the number of spans being hidden increases a lot). 168 calls, less, but still a lot. 
  Again, you do this only if you notice something is working slower than it should. Don't get bothered much with optimizing simple javascript, make it readable and cross-browser usable your first priority. But from time to time check your work if you feel that javascript is awefully slow and you are looking to speed it up. By using the profiler you will know where to speed it up.
  &lt;/p&gt;</description></item><item><title>Storing day values</title><link>http://www.laimisnet.com/default.aspx?entryid=210</link><pubDate>Wed, 21 May 2008 04:43:01 GMT</pubDate><guid>http://www.laimisnet.com?entry=210</guid><description>This is very simple trick and I am posting this solely for the purpose that it might help a beginner developer.
&lt;br /&gt;&lt;br /&gt;
While in a process of learning asp.net mvc I am building a sample website where I needed to store user selected days. Imagine input area that looks like this:
&lt;br /&gt;&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;input type=&quot;checkbox&quot; name=&quot;days&quot; value=&quot;Mon&quot; /&gt;Mon
&lt;input type=&quot;checkbox&quot; name=&quot;days&quot; value=&quot;Tue&quot; /&gt;Tue
&lt;input type=&quot;checkbox&quot; name=&quot;days&quot; value=&quot;Wed&quot; /&gt;Wed
&lt;input type=&quot;checkbox&quot; name=&quot;days&quot; value=&quot;Thu&quot; /&gt;Thu
&lt;input type=&quot;checkbox&quot; name=&quot;days&quot; value=&quot;Fri&quot; /&gt;Fri
&lt;input type=&quot;checkbox&quot; name=&quot;days&quot; value=&quot;Sat&quot; /&gt;Sat
&lt;input type=&quot;checkbox&quot; name=&quot;days&quot; value=&quot;Sun&quot; /&gt;Sun
&lt;/div&gt;
&lt;br /&gt;
A good way to store this in your model and storage (DB, files, etc) is in a Flags Enum: 
&lt;br /&gt;&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
[Flags]
public enum Days
{
    None = 0,
    Mon = 1,
    Tue = 2,
    Wed = 4,
    Thu = 8,
    Fri = 16,
    Sat = 32,
    Sun = 64
}
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
Only one field required and no need to do string manipulations, just OR or ANDs to get the value selections. Again, very simple stuff, but might be not so obvious to some.</description></item><item><title>TSearch2 and 'default' configuration</title><link>http://www.laimisnet.com/default.aspx?entryid=209</link><pubDate>Tue, 13 May 2008 03:27:16 GMT</pubDate><guid>http://www.laimisnet.com?entry=209</guid><description>PostgreSQL database has this very neat free text search engine called tsearch2 that used to come as add-on, but now is part of the installation. When emitting a tsearch2 query you can specify which configuration to use (english, german, or something other special) which dictates how the words are parsed etc. Since the 8.3 release of postgresql which includes tsearch2 the 'default' configuration is gone and the existing code can break. I found a quick way to create a default one by duplicating any of the existing configurations (in my case english) by executing this:
&lt;br /&gt;&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;
CREATE TEXT SEARCH CONFIGURATION public.default (
    COPY = pg_catalog.english
);
&lt;/pre&gt;
&lt;/div&gt;

</description></item><item><title>Podcasting and me</title><link>http://www.laimisnet.com/default.aspx?entryid=208</link><pubDate>Tue, 06 May 2008 02:59:02 GMT</pubDate><guid>http://www.laimisnet.com?entry=208</guid><description>So over the course of the last year I really got into podcasting. I recently reviewed my podcast subscriptions and was amazed to find out that I am subscribed to a total of 33 music podcasts! With the help of Mediafly I organized the subscriptions so that my music channel at all times has about 10-14 different episodes. Depending on what I feel like listening I can choose to go with a bit of rock, maybe sometimes with ambient, eclectic, of course Trance (dominating my subscription list), even classical music. I am almost reaching a point where I am thinking to do a review of the best of trance podcasts available with ratings in different areas. Let's see if I ever get around doing that. But I think it would be useful as right now if you are a new podcast listener you might choose shows that are not as well produced or get released very rarely.
&lt;br /&gt;&lt;br /&gt;
Besides music the other big channel I have is Sports and then Comedy.
</description></item><item><title>A visit to a bookstore</title><link>http://www.laimisnet.com/default.aspx?entryid=207</link><pubDate>Fri, 02 May 2008 04:41:35 GMT</pubDate><guid>http://www.laimisnet.com?entry=207</guid><description>Reading is one of my hobbies, but I couldn't remember the last time I went to the bookstore before I did so last weekend. I needed to do a more in-depth check on the book I was considering buying and it being a nice day and all I decided to go to the closest Borders. Well let me tell you, I was amazed at how much the computer book area had changed. That particular borders some years ago had one of the best Software book section volume and quality wise. Now it is much smaller but most importantly the selection is miserable. Nothing beyond basic fluff.
&lt;br /&gt;
Oh well, it didn't upset me at all. On contrary it was good to see a business enterprise adjust to the market conditions and repositioning their business to the changing customer needs (I saw much more open space, more inviting seating areas, cafe, etc that all the bookstore customers now look for).</description></item><item><title>SGEN utility</title><link>http://www.laimisnet.com/default.aspx?entryid=206</link><pubDate>Tue, 29 Apr 2008 14:47:45 GMT</pubDate><guid>http://www.laimisnet.com?entry=206</guid><description>After a long break of silence I am attempting yet again get back into blogging. I will start with sharing something I learned about two months ago related to the object serialization.
&lt;br /&gt;
&lt;br /&gt;
I imagine many intermediate to advanced programmers are well familiar with xml serialization. One of the areas where you can use this is in storing/retrieving configuration files. Take an instance of the class that represents some configuration settings and serialize it upon the save/exit of your application. The next time you run your app again you can deserialize from the hard drive to use in the appliation. However there are some gotchas to watch out for. One of the desktop apps I was working on from time to time was failing while running under Windows Vista. The exception stack trace gave the clues that the problem is with xml serialization, but the actual message was rather confusing, stating that the csc.exe process could not run from the default .net framework installation. I was puzzled thinking why is csc.exe process is being spawned here at all? Well it turns out that that's how XmlSerializer works. When you write the following:
&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;code&quot;&gt;
&lt;pre&gt;  
    XmlSerializer s = new XmlSerializer(typeof(EmailConfig));
    s.Serialize(outputStream, config);
&lt;/pre&gt;
&lt;/div&gt;
&lt;br /&gt;
.NET Framework implementation will actually build a serializer at runtime for your class by inspecting the type's properties and will compile that serializer and run it. I never expected this behavior, but it makes sense. I just wasn't aware of it. If you have many places where you are de/serializing or if your app cannot spawn any other processes you could benefit from this little utility called sgen. It comes with the .net framework installation. Check more in the documentation on sgen options but in short you point sgen to a .net assembly and ask it to generate corresponding xml serialization assembly. Since your assembly might have a lot of types and you serialize only a few you can specify to generate serializers only for the specific type(s). Then, when you ship your application bits ship the serialization assemblies together. The XmlSerializer will first look for the XmlSerialization assemblies (named YOURASSEMBLYNAME.XmlSerializers.dll) and see if it contains the serializer for the type it needs. If it finds it, uses it, otherwise faults back to generating code at run-time with the C# compiler.
&lt;br /&gt;
&lt;br /&gt;
I ended up modifying the build to generate the required serialization assemblies with the needed types as a post-build step. And the mystery exception went away.
</description></item><item><title>Lucene.net is in</title><link>http://www.laimisnet.com/default.aspx?entryid=205</link><pubDate>Mon, 11 Feb 2008 06:14:27 GMT</pubDate><guid>http://www.laimisnet.com?entry=205</guid><description>I just hooked up &lt;a href=&quot;http://incubator.apache.org/lucene.net/&quot; class=&quot;sideLink&quot;&gt;Lucene.net&lt;/a&gt; for running searches for this blog. I generate the search index offline and then uploaded it through FTP. The only thing I am missing is automating the generation and upload process. I shall add that soon as well.
&lt;br /&gt;&lt;br /&gt;
If you want to learn more about Lucene.net, take a look at the documentation written for Java version of Lucene, since Lucene.net is a straight port of it. It might be not obvious at first and you will wonder where all the documentation is located. So just visit the Lucene java pages and you will find most of what you need there.
&lt;br /&gt;&lt;br /&gt;
By the way, ever since I had the site down the last time the blog entries in the google reader are all out of order. Anyone has any ideas what I can do to force google reader to refresh the entries for this blog?</description></item><item><title>Blog entries out of whack</title><link>http://www.laimisnet.com/default.aspx?entryid=204</link><pubDate>Tue, 05 Feb 2008 14:23:45 GMT</pubDate><guid>http://www.laimisnet.com?entry=204</guid><description>So, yesterday I took this blog down, upgraded the DB, and updated the blog code which was rewritten to use NHibernate instead of my own &quot;home grown&quot; ORM written way back in '04. The move went smoothly (although I do have some minor issues editing entries) with one glitch: the google reader subscription went all nuts. This morning I went to the reader and it showed this blog as having 64 new entries and the order is all out of whack. Oh well ... nothing really changed in the RSS output as the entry ids and guids didn't change. Maybe while the blog was down reader did some update and then did another one when it came back.</description></item><item><title>Database versioning related</title><link>http://www.laimisnet.com/default.aspx?entryid=202</link><pubDate>Sat, 02 Feb 2008 16:03:50 GMT</pubDate><guid>http://www.laimisnet.com?entry=202</guid><description>There is a great series of blog posts being released on &lt;a href=&quot;http://www.odetocode.com/&quot; class=&quot;sideLink&quot;&gt;OdeToCode.com&lt;/a&gt; blog starting with &lt;a href=&quot;http://odetocode.com/Blogs/scott/archive/2008/01/30/11702.aspx&quot; class=&quot;sideLink&quot;&gt;&quot;Three Rules for Database Work&quot;&lt;/a&gt; post. In my first workplace we were running under very similar rules and concepts for versioning a database. For a quite large projects and 15-20 developers, it worked rather well. Of course you had to be disciplined as hell and couple of in-house built tools made the job a bit easier and more automated. &lt;br /&gt;&lt;br /&gt; The rules and techniques the blog author is talking about really applies to the systems that are very database intensive, meaning complex DB schema, rules, integrity checks, etc etc etc (basically any solid application that uses database :) ). I have used a different approach to database versioning with Migrator for .NET. It is the port of migrations concept used in rails. The original author had abandoned the project. But just recently I found out that someone else is taking over and right now the source code is on google's code repository. I blogged about using Migrations &lt;a href=&quot;http://www.laimisnet.com/default.aspx?entryid=160&quot; class=&quot;sideLink&quot;&gt;before&lt;/a&gt;.  I guess the official repository for the source and other project information now is located at &lt;a href=&quot;http://code.google.com/p/migratordotnet/&quot; class=&quot;sideLink&quot;&gt;http://code.google.com/p/migratordotnet/&lt;/a&gt; . </description></item><item><title>SlickRun</title><link>http://www.laimisnet.com/default.aspx?entryid=201</link><pubDate>Tue, 29 Jan 2008 01:34:48 GMT</pubDate><guid>http://www.laimisnet.com?entry=201</guid><description>Recently I had to rebuild my development machine, and for the life of me I could not remember the name of one of my favorite and frequently used utilities. And finally I got it today, &lt;a href=&quot;http://www.bayden.com/SlickRun/&quot; class=&quot;sideLink&quot;&gt;SlickRun&lt;/a&gt;. Everywhere I searched &quot;Launchy&quot; utility kept on creeping up. I tried Launchy out, but it was &quot;too fat&quot; for my needs. Launchy looks more impressive than SlickRun with better graphics and additional features (also skins, plugins, etc), but SlickRun suits me better. &lt;br /&gt;&lt;br /&gt; In case you haven't tried SlickRun before, it comes with bunch of shortcuts already configured for you. For me most them are not that useful since they point to the iexplorer combined with some url. To clean the initial shortcut list, go to your drive:\documents and settings\youryousername\Application Data\SlickRun and clear or modify SlickRun.srl file. Restart SlickRun and configure your own shortcuts. </description></item><item><title>Music podcasts</title><link>http://www.laimisnet.com/default.aspx?entryid=200</link><pubDate>Fri, 25 Jan 2008 22:15:57 GMT</pubDate><guid>http://www.laimisnet.com?entry=200</guid><description>UPDATE: the entry has been erased the music widget has been moved to the right column of this blog.</description></item><item><title>Sports Podcasts</title><link>http://www.laimisnet.com/default.aspx?entryid=199</link><pubDate>Wed, 23 Jan 2008 16:27:02 GMT</pubDate><guid>http://www.laimisnet.com?entry=199</guid><description>In the last year or so I got deeply involved in the podcasting area. Besides working for a company that provides software for managing syndicated media, I am an avid listener of many podcasts (right now I have about 50 different subscriptions to podcasts in areas of comedy, education, sports, etc). Here is a cool little widget showing my sports podcast subscriptions:
&lt;br /&gt;&lt;br /&gt;
&lt;!-- START MEDIAFLY WIDGET CODE --&gt;
&lt;div&gt;&lt;script src=&quot;http://www.mediafly.com/widget/widget.aspx?code=PUbwgjmvGEs8yndt&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;
&lt;div class=&quot;mediaflyOutsideNotice&quot;&gt;&lt;a href=&quot;http://www.mediafly.com/&quot;&gt;Powered by Mediafly&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;
&lt;!-- END MEDIAFLY WIDGET CODE --&gt;
&lt;br /&gt;
Widget like shown above is easy to make as long as you have an account with Mediafly. The actual widget creation is still &quot;hidden&quot; from the public, but should become available to all soon.</description></item><item><title>Weekend with HTML and CSS</title><link>http://www.laimisnet.com/default.aspx?entryid=198</link><pubDate>Tue, 22 Jan 2008 22:33:29 GMT</pubDate><guid>http://www.laimisnet.com?entry=198</guid><description>This weekend I spent sometime by reviewing some of the CSS and HTML design techniques. Even though that is about 1% of my job, it cannot hurt to know some styling and design techniques. From time to time I end up having to code up some html. I am not gonna go into details what I learned because I don't feel like blogging much about CSS and HTML (not a big fan of the two), but there is something short and sweet I found out that I thought I should blog about. 
&lt;br /&gt;&lt;br /&gt; 
Not as much now, but in my previous jobs I used to have to create html forms for inputing some user information or contract information, etc. Amazingly, I never used or ran into a &amp;lt;label&amp;gt; html tag. For instance, let's say you want to html that asks for the email address. You could code this as: &lt;p&gt; 
&lt;div class=&quot;code&quot;&gt; 
&lt;pre&gt;     
Email &amp;lt;input type=&quot;text&quot; /&amp;gt;
&lt;/pre&gt; 
&lt;/div&gt; 
&lt;/p&gt;  but it is better to do it like this: 
&lt;p&gt; 
&lt;div class=&quot;code&quot;&gt; 
&lt;pre&gt;     
&amp;lt;label&amp;gt;Email &amp;lt;input type=&quot;text&quot; /&amp;gt; &amp;lt;/label&amp;gt;
&lt;/pre&gt; 
&lt;/div&gt; 
&lt;/p&gt;  It is better from usability stand point as the people using assistive devices can now know for what each information each field is asking. &amp;lt;label&amp;gt; doesn't have to wrap the element, you can have your code be like this as well: 
&lt;p&gt; 
&lt;div class=&quot;code&quot;&gt; 
&lt;pre&gt;    
&amp;lt;label for=&quot;email&quot;&amp;gt;Email&amp;lt;/label&amp;gt; ... some more code&amp;lt;br /&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;email&quot; /&amp;gt;
&lt;/pre&gt; 
&lt;/div&gt; 
&lt;/p&gt; 
Another benefit is that now you can style all the &quot;labels&quot; properly with CSS.  Oh, and I also learned about &amp;lt;em&amp;gt; html element. Again, things like that is easy to miss if you are not in design work. But basically this element is supposed to &lt;em&gt;emphasize&lt;/em&gt; the text between the tags (by rendering it in italics).  OK, this was all simple stuff, but add this to other CSS tricks and HTML crap I learned , I am sure the knowledge will come in handy on some project.</description></item><item><title>Mounting ISOs in windows</title><link>http://www.laimisnet.com/default.aspx?entryid=197</link><pubDate>Mon, 17 Dec 2007 21:44:20 GMT</pubDate><guid>http://www.laimisnet.com?entry=197</guid><description>Today after downloading vs.net 2008, I needed a quick way to mount DVD iso image in windows. Recently I have been mounting all ISOs through Parallels (Mac VM for XP and other OSs) so I had no tool for windows. I found one awesome and simple utility from MS called &quot;Virtual CD-ROM Control Panel&quot;. I found this app in &lt;a href=&quot;http://www.tech-recipes.com/rx/620/xp_small_free_way_to_use_and_mount_images_iso_files_without_burning_them&quot; class=&quot;sideLink&quot;&gt;this page&lt;/a&gt;, you can also download it directly &lt;a href=&quot;http://download.microsoft.com/download/7/b/6/7b6abd84-7841-4978-96f5-bd58df02efa2/winxpvirtualcdcontrolpanel_21.exe&quot; class=&quot;sideLink&quot;&gt;here&lt;/a&gt;. Works great. Just read the Readme.txt file for instructions how to mount/unmount the isos. &lt;br /&gt;&lt;br /&gt; This did make me wonder why windows OSs don't have ISO mounting utility exposed to a user (right click context menu or something), or do they and I am simply not aware of it?  </description></item><item><title>Remove test MSI packages</title><link>http://www.laimisnet.com/default.aspx?entryid=196</link><pubDate>Mon, 12 Nov 2007 17:36:06 GMT</pubDate><guid>http://www.laimisnet.com?entry=196</guid><description>Ah, a sweet little shortcut to uninstall your msi package if you know your product id. 
&lt;br /&gt;&lt;br /&gt;

&lt;div&gt;
msiexec /x{YOURPRODUCTGUID}
&lt;/div&gt;

&lt;br /&gt;

Usually you uninstall by calling 'msiexec /x mymsipackage.mis' command line, but I managed to destroy the mymsipackage before uninstalling. I knew there had to be a way, otherwise 'Add/Remove' control panel dialog would not work unless it kept the installation msi packages, which I don't think it does. A bit of the search in the registry revealed exactly what I was looking for, msiexec /x{GUID} option.</description></item></channel></rss>