## Tuesday, July 20, 2010

### Using wix3 and heat to create a wxi through xls transform.

Here is a transform file which can be used with wix3 and heat if you want to create a wix include file (wxi) from a wxs fragment.

Update: Added CompnentGroupRef, CompnentGroup and CompnentRef incase -cg flag is used with heat on a fragment.
<xsl:stylesheet exclude-result-prefixes="wix" version="1.0" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output encoding="UTF-8" indent="yes" method="xml">
<xsl:strip-space elements="*">
<xsl:template match="/">
<include>
<xsl:apply-templates>
</xsl:apply-templates></include>
</xsl:template>

<xsl:template match="wix:ComponentGroupRef">
<xsl:element name="{name()}">
<xsl:copy-of select="@*">
<xsl:apply-templates>
</xsl:apply-templates></xsl:copy-of></xsl:element>
</xsl:template>

<xsl:template match="wix:ComponentGroup">
<xsl:element name="{name()}">
<xsl:copy-of select="@*">
<xsl:apply-templates>
</xsl:apply-templates></xsl:copy-of></xsl:element>
</xsl:template>

<xsl:template match="wix:ComponentRef">
<xsl:element name="{name()}">
<xsl:copy-of select="@*">
<xsl:apply-templates>
</xsl:apply-templates></xsl:copy-of></xsl:element>
</xsl:template>

<xsl:template match="wix:DirectoryRef">
<xsl:element name="{name()}">
<xsl:copy-of select="@*">
<xsl:apply-templates>
</xsl:apply-templates></xsl:copy-of></xsl:element>
</xsl:template>

<xsl:template match="wix:Directory">
<xsl:element name="{name()}">
<xsl:copy-of select="@*">
<xsl:apply-templates>
</xsl:apply-templates></xsl:copy-of></xsl:element>
</xsl:template>

<xsl:template match="wix:Component">
<xsl:element name="{name()}">
<xsl:copy-of select="@*">
<xsl:apply-templates>
</xsl:apply-templates></xsl:copy-of></xsl:element>
</xsl:template>

<xsl:template match="wix:File">
<xsl:element name="{name()}">
<xsl:copy-of select="@*">
<xsl:apply-templates>
</xsl:apply-templates></xsl:copy-of></xsl:element>
</xsl:template>

</xsl:strip-space>
</xsl:output>
</xsl:stylesheet>


If you need other elements it should just to copy the templates for File, Directory, Component or DirectoryRef and and rename the match.

To use it, use the -t parameter when calling heat.exe
Example: (above saved as transform_fragment_to_inc.xsl)

heat.exe" dir "files\to\harvest" -gg -g1 -nologo -scom -sfrag -srd -sreg -svb6 -template:fragment -t:"transform_fragment_to_inc.xsl" -out "include_file.wxi"

Note: this xsl doesn't support registry entries or registering of com components when harvested by heat.

## Monday, April 12, 2010

### Wix 3.0 - Windows 7 x64 - votive - Visual Studio 2008

It seems like there is an issue with the installer for Wix 3.0 with the combination of Visual Studio 2008 and Windows 7 x64.

When installing the project aggregator it's installed to c:\IDE\
It should be in
C:\Program Files(x86)\Microsoft Visual Studio 9.0\Common7\IDE\

When installing Wix from the MSI the templates should have been installed to
C:\users\USERNAME\documents\Visual Studio 2008\Templates\ItemTemplates


and
C:\users\USERNAME\documents\Visual Studio 2008\Templates\ProjectTemplates


They are just placed as zip files in C:\Visual Studio 9.0\Common7\IDE\WiX
Unpack WixLibrary.zip, WixMergeModule.zip and WixProject.zip to

Unpack BlankFile.zip, CustomActionCPP.zip, IncludeFile.zip, LocalizationFile.zip, TextFile.zip to
C:\users\USERNAME\documents\Visual Studio 2008\Templates\ItemTemplates


You can now create wix projects using Visual Studio... :)

### Error in MSDN documentation for ssfPROGRAMFILESx86

There is a documentation error here: (or even header error)

http://msdn.microsoft.com/en-us/library/bb774096(VS.85).aspx

When using ssfPROGRAMFILESx86 with the value of 0x30, it gives the administrative tools path, while with a value of 0x2A gives Program Files X86.

Can be tested with the following vbscript:

Const PROGRAM_FILES_XEIGHTYSIX = &H2A&
Const PROGRAM_FILES_XEIGHTYSIXWRONG = &H30&
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.Namespace(PROGRAM_FILES_XEIGHTYSIXWRONG)
Set objFolderItem = objFolder.Self
msgbox ("Wrong Path: 0x30 :"+objFolderItem.Path)
Set objFolder = objShell.Namespace(PROGRAM_FILES_XEIGHTYSIX)
Set objFolderItem = objFolder.Self
msgbox ("Correct Path: 0x2A : "+objFolderItem.Path)


To get the correct path, just use 0x2a instead of 0x30.

## Friday, March 26, 2010

### Styling QWebKit scrollbars

I read some people had problems styling the scrollbars in QWebkit. It's quite simple, if you think of them as CSS (with webkit specific parameters) instead of Qt Scrollbars. Ideally it should be a stylesheet mapping between QStyleSheet and a css, so that it would automatically do the magic.

You need to implement this CSS in all the documents loaded. You can do this modifying the DOM for the document you load. If you are to provide static content, I would recommend putting the CSS into the content instead, as that is easier to modify later.

Here's a small example on how to style the scrollbars:
::-webkit-scrollbar {
width: 42px;
}

::-webkit-scrollbar-track-piece {
background: #CCCCCC;
border: 2px solid #6666CC;
width:20px;
}
::-webkit-scrollbar-thumb:vertical {
height: 40px;
border: 2px solid #6666CC;
background-color: #6666CC;
}

::-webkit-scrollbar-button:end:increment {
height:42px;
width:42px;
background-image: url(arrow-down.png);
background-repeat:no-repeat;
background-color:white;
}
::-webkit-scrollbar-button:start:decrement
{
height:42px;
width:42px;
background-image: url(arrow-up.png);
background-repeat:no-repeat;
background-color:white;
}

::-webkit-scrollbar-button:end:increment:hover {
background-color:green;
}
::-webkit-scrollbar-button:start:decrement:hover
{
background-color:green;
}

:not(.none):not(.double-start)::-webkit-scrollbar-track-piece:vertical:end:single-button,
:not(.none):not(.double-start)::-webkit-scrollbar-track-piece:vertical:end:double-button,
.single::-webkit-scrollbar-track-piece:vertical:end,
.double-end::-webkit-scrollbar-track-piece:vertical:end,
.double-both::-webkit-scrollbar-track-piece:vertical:end
{
margin-bottom: 40px;
}

:not(.none):not(.double-end)::-webkit-scrollbar-track-piece:vertical:start:single-button,
:not(.none):not(.double-end)::-webkit-scrollbar-track-piece:vertical:start:double-button,
.single::-webkit-scrollbar-track-piece:vertical:start,
.double-start::-webkit-scrollbar-track-piece:vertical:start,
.double-both::-webkit-scrollbar-track-piece:vertical:start
{
margin-top: 40px;
}


This is just an example, and you probably want to change it a lot to suite your needs.

## Saturday, February 27, 2010

### Three scripts for running VirtualBox in headless mode (Ubuntu)

I needed some init.d scripts for virtualbox, and I thought I should share them, as I found a lot of information out there that these scripts used ideas from:

Script 1 to start a virtualbox (vbox_start_vm)
Starts and sleeps x number of seconds, but doesn't start it if it's already running!

#!/bin/bash

if [ -z $1 ] ; then echo "SERVER Name is Missing... the number is 42." echo "usage vbox_single_start " exit 1 fi if /usr/bin/VBoxManage -q showvminfo$1 | grep -i running ; then
echo VM Guest $1 is already powered on! exit 1 else echo Starting$1
/usr/bin/VBoxManage startvm $1 --type vrdp if [$2 ] ; then
sleep $2 fi fi exit 0  Script 2 to stop a virtualbox (vbox_stop_vm) This script tries to acpi-shutdown the system, and wait for 240 seconds before forcing it down if all fails. #!/bin/bash MAX_WAIT_TIME=300 # max seconds to wait before doing poweroff (force) function wait_until_machine_shutdown_else_terminate { if /usr/bin/VBoxManage -q list runningvms | grep -i$1 ; then
#echo "sleeping 10 seconds"
sleep 10
let MAX_WAIT_TIME=MAX_WAIT_TIME-10
if [ $MAX_WAIT_TIME -lt 0 ] ; then echo "Had to force the power on the server... Sorry about that!" /usr/bin/VBoxManage controlvm$1 poweroff
sleep 10
else
if [ $MAX_WAIT_TIME -lt 200 ] ; then #try to do another acpipowerbutton /usr/bin/VBoxManage controlvm$1 acpipowerbutton
fi
wait_until_machine_shutdown_else_terminate $1 fi fi } #ensure that the server name is entered if [ -z$1 ] ; then
echo "SERVER Name is Missing... the number is 42."
echo "usage vbox_stop_vm "
exit 1
fi

if /usr/bin/VBoxManage -q showvminfo $1 | grep -i running ; then echo VM Guest$1 is powered on! Will send ACPI shutdown.
/usr/bin/VBoxManage controlvm $1 acpipowerbutton # if parameter for sleep is provided, do here if [$2 ] ; then
sleep $2 fi # wait until it's been shutdown! wait_until_machine_shutdown_else_terminate$1
else
echo Server $1 is not running! exit 1 fi exit 0  Script 3 - the actual init.d script calling the other scripts (call it what you want on your system) #! /bin/sh # some errors with networking, so need to restart at end of init sequence #NOT NEEDED BRIDGE WORKS?!?!?!?! case "$1" in
start)
echo -n "Starting all the VirtualBox VMS"
/etc/init.d/vbox_start_vm "Windows2008_DC" 60
/etc/init.d/vbox_start_vm "Windows2008_Test" 60
/etc/init.d/vbox_start_vm "Ubuntu_Web_Server" 15
/etc/init.d/vbox_start_vm "Ubuntu_DB_Server" 15
/etc/init.d/vbox_start_vm "Ubuntu_Testing_Server" 15
echo "Done";
;;

stop)
echo -n "Stopping all the VirtualBox VMS"
/etc/init.d/vbox_stop_vm "Windows2008_DC"
/etc/init.d/vbox_stop_vm "Windows2008_Test"
/etc/init.d/vbox_stop_vm "Ubuntu_Web_Server"
/etc/init.d/vbox_stop_vm "Ubuntu_DB_Server"
/etc/init.d/vbox_stop_vm "Ubuntu_Testing_Server"
echo "Done";
;;

*)
echo "Usage: /etc/init.d/vbox_vm_startup {start|stop}"

exit 1
;;

esac
exit 0


I needed to implement these functions, as I now have 1 Ubuntu server with Virtualbox on top running all 5 servers at home. I wanted to have a full-blown test environment to play around in without having more than 1 server.

The only problem so far is that the disk controller wasn't fast enough (Dell SAS 6/ir). To help this perform better I added an extra HD outside the SAS controller running the swap spaces and the pagefiles for the Windows servers. That made a huge difference, especially for the windows servers. If you are going to run your vm's on a mirrored raid, I won't recommend the SAS 6/ir if the virtual servers will be accessed by more than 20-25 users. It will feel a bit sluggish... Maybe not so much for the users, but if you do iostat as a admin, you will be in "shock" over the terrible write performance for the SAS 6/ir in mirror mode.

### Testing software

Sometimes I hear people saying: "That software are for handicapped" or "I cannot make this software work for handicapped as well".

I read a great presentation over at slideshare.net: Georgia Tech hacking Accessibility

Highly recommended reading. To summarize: Software developers and companies should think that people with different disabilities are extreme testers. If your application can be accessed and work for them, it will be easier for everyone else. Instead of thinking of it as an obstacle...

An example is how visualization with symbols, text-to-speech and speech recognition now are getting more and more common. In the beginning this was for people that couldn't access computers without help.

For information about symbols: (In Norwegian) www.symboler.no. For english: www.widgit-online.com

## Monday, February 8, 2010

### Move an iscsi target from one windows 2008 server to another

After disconnecting an iscsi target on server A, then getting it connected on server B, it only said: "The disk is offline due to an policy set by the administrator".

I'm the administrator, and I did not set a policy. Well. This one was actually easier than I first thought...

Go into Computer Management -> Storage Right click on the disk and click online. (This does not show up when clicking on the partition, you have to click the grey square on the left)

I went back and forth trying to have the target on both computers, reading about cluster services and stuff, and after googling the error message, although sometimes the solution is easier...

### Moving a Windows 2008 R2 Server from Vmware to Virtualbox

I was afraid this wasn't going to be straight forward, but it isn't too difficult.

One advice: Don't try to run vmware and virtualbox at the same time on the same computer, it might crash everything.

Try to remove vmware tools before you move the vmdk to virtualbox.

Steps:
Make a copy of your vmdk in case anything fails.
Write down all the hardware settings for the vmware instance you are to move.

I had the following settings on vmware to consider and move:
1. SCSI controller LSI Logic
All seemed to be supported on VirtualBox as well, so I started creating the virtualbox
Steps for VBoxManage. (i'm not going into details, as it's better to read the manual for each option, if you wonder)

VBoxManage createvm -name "Windows2008_R2_x64_vbox" -register
VBoxManage modifyvm "Windows2008_R2_x64_vbox" --memory "1200" --acpi on --cpus 1 --pae on --ioapic on
VBoxManage modifyvm "Windows2008_R2_x64_vbox" --hwvirtex on --vtxvpid on
VBoxManage modifyvm "Windows2008_R2_x64_vbox" --nictype1 82540EM
VBoxManage modifyvm "Windows2008_R2_x64_vbox" --nictype2 82540EM
VBoxManage modifyvm "Windows2008_R2_x64_vbox" --ostype Windows2008_64
VBoxManage storagectl "Windows2008_R2_x64_vbox" --name "IDE Controller" --add ide
VBoxManage storageattach "Windows2008_R2_x64_vbox" --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium "/mnt/vboxes/win2008r2x64_vmware.vmdk"


Important not to forget the Virtual RDP:
VBoxManage modifyvm "Windows2008_R2_x64_vbox" --vrdp on --vrdpport 12345 --vrdpmulticon on --vrdpauthtype external


Try booting, and most likely it should all be fine.
Now why did I add a IDE Controller instead of a SCSI Controller?

I tried using SCSI controllers, but I got a blue screen with stop error 7b. This tells me that Windows cannot use the boot device, because of some access problems through the controller. I tried the IDE Controller, as that usually works for clients (Win 7, Vista, XP), and it worked perfect for Win 2008 Server as well.

You will need to check if any old vmware-drivers are still "hanging around" and install the Guest additions.
I don't know if there is a performance increase in using a VDI compared to a VMDK. The good thing about keeping it as a VMDK is that you can always "go back" to evil vmware.
For moving Ubuntu clients. Do similar steps as above, but you can keep the SCSI controller, move to a SATA Controller, or do what you like. Everything just works with Ubuntu!

Update (03.feb-2012): If you have the time, it's better to reinstall. At least I experienced better performance for the servers that were reinstalled instead of converted.

### Why choose VirtualBox over vmware on ubuntu 9.10/9.04 Server x64

After using vmware for about 2 months on a server, to see the performance, I found that vmware server 2.x is more or less useless on an Ubuntu server.

Reasons:
1. iostat ! vmware writes all RAM access to /tmp as well. This is no problem if you just double your ram and put /tmp in RAM. vmware says this is due to how the Linux Kernel is made. well... Real reason: Buy some licenses on the other vmware products, and this won't happen.
2. Web Management Console. Ever experienced it to not crash when you do more than 3-4 settings per session?
3. Memory usage. All VMs are using about 25-35% more than set.
4. vmware tools. Ever tried uninstalling them on a Windows Server 2008 R2 64 bit? Or tried updating them on any client? It's just horrible. Even their "cleanup" utility doesn't clean anything except the installation entry. No support for Ubuntu 9.04 or 9.10.
5. Boot times for vms is more than double of virtualbox.
6. No USB support for vms on ubuntu 9.10 as host os, or 9.04.

After changing to VirtualBox running in headless mode, I thought I would go back to vmware after a week. VirtualBox seems more client-virualization. But I was wrong!

Reasons:

1. iostat. No writing of memory to /tmp = performance increase or more free memory depending on the setup
2. VBoxManage. Anything you need to do can be done through a command line.
3. Memory Usage. 5-10% more than assigned to the VMs. that's a lot less than vmware.
4. VirtualBox Guest Additions. They just work. install, uninstall, update. Ubuntu 9.04, 9.10
5. Boot times is about half of vmware
6. USB just works out of the box.

The main factor is of course the io usage. Even when you have /tmp in RAM, vmware will always write/read every single ram entry twice. Maybe it's better when you have power failure, but a UPS isn't that big investment, and if this is for production, you need a UPS anyhow.

The only thing I find better in vmware is host-only networking. But seeing the slow development of vmware-server and the fast pace of virtualbox, I see only one winner. vmware is still the dinosaur, because they are known in the market, but for everyone that doesn't think a cmd line is complicated: Do yourself a favore and choose virtualbox on Ubuntu 9.04 or 9.10.

I have tried every tip for changing swap behaviour, having swaps on different drives, tmp in ram etc, and I still find VirtualBox performing way better on 1 drive with all swap/tmp and virtual harddrives on the same drive, than vmware with multiple drives, keeping swap/tmp and virtual hdds apart.