Sunday, October 16, 2011

iOS 5 on iPhone4

Last night I decided to upgrade to iOS 5 on my iPhone4. I have to say that contrary to expectations, after reading and hearing of many issues that others have had (TNW), the process was pretty seamless. Other than a few minutes where I was wondering whether the process had stalled (during the app restore stage) it went without a hitch. I now have a shiny new OS on my phone.

I haven't really spent that much time looking for the differences but some things are obviously different. I'm still making up my mind about some of the changes most notably the new toggle buttons, call me a luddite but I think I preferred the old ones.

Sunday, March 20, 2011

VirtualBox - Cloning a VM

NOTE - This was done using VirtualBox 4.0.4 r70112 with a Windows 7 host.

It needs to be fleshed out but this is just to capture the initial process.

I've been using VirtualBox to host some VMs (mainly Linux).

It's a bit of a pain to create a brand new VM each time and I like to have a relatively clean base image to start from when starting a new project. So, I want to be able to clone an image relatively easily.

Here's the steps I took to get a 'template' VM and working copies of it. It may not be the most efficient but it worked for me and may work for you.

  1. Create an initial template VM as for any guest machine. Install the chosen OS and perform any base/initial configuration you want to be captured in the template itself.
  2. Ensure the guest machine is powered off.
  3. Clone the virtual disk for the VM. You can't simply copy the virtual disk file (not if the guest will be used on the same machine) as VirtualBox will see that both images have the same UUID. So, we need to use the clonehd function to copy the image and replace the UUID.
    C:\Program Files\Oracle\VirtualBox\VBoxManage clonehd
    This clones the virtual disk and gives it a new UUID
  4. Create a new guest from within VirtualBox choosing the appropriate hardware settings.
  5. When choosing disks, select to use an existing disk and select the copied image.
  6. Boot the machine and it should start up with the exact same OS behaviour as the original image that was cloned. Voila!

NOTE - Cloning the image also registers it with VirtualBox. If you subsequently want to move/rename it then use the 'Virtual Media Manager' from the File menu within VirtualBox.

NOTE - I'm not aware of an ability to clone the machine description itself (but I haven't actually tried). This may well be possible rather than creating a new machine and setting the hardware settings manually. The machine configuration appears to be held in XML files so it may be as simple as copying/editing these. Whether that is supported is another matter...

That's all for now. I may clean up and add some screenshots at some point... Based on past experience, don't hold your breath! ;-)

Time flies

Well, it never really took off quite as quickly as I expected/hoped. Life got in the way and blogging very much took a back seat.

Anyway, hopefully there will be a few more posts on here soon. Basically I've decided to use this as a staging post for any tidbits of info that I find as I'm conquering various (sometimes trivial) technical challenges.

So, we'll see how we get on...

Saturday, February 21, 2009

Nortel Contivity VPN Client Issue with Belkin F5D8631-4 ADSL Router

I used to be able to connect to my company's VPN and work from home no problems. Recently, I tried connecting and was unable to do so. I was pretty sure the issue was on my end because I was able to connect to the VPN from the wireless network in the office. Anyway, I have resolved the issues and all is now working again.

It turns out that I hadn't attempted to use the VPN since my last router died and I had changed to the Belkin F5D8631-4. Although this router claims to support VPN pass through it wasn't working for me.

There's a compatibility issue between the 2.00.13 firmware and Nortel's Contivity VPN client. There is a pre-release firmware version 2.00.18 available here which resolves the issue. As it's a pre-release firmware it won't be found by the auto update feature in the router itself and so you need to download it manually.

It has resolved my VPN connectivity issues and I haven't yet come across any other issues with the firmware version. So, if you're having similar VPN issues on this router, give this firmware a go.

Tuesday, November 18, 2008

Fedora 8 dual boot configuration with Windows XP and Acronis OS Selector

I've just been battling through getting an old desktop PC to dual boot Windows XP and Fedora 8. It finally works so I figured I'd write up the details here in case it can be of any use to anyone.

These are the results of trawling a number of fora and blogs to attempt to resolve the issues. This was mostly at Linux Forums TheGrub manual at http://www.gnu.org/software/grub/manual/html_node/ was also very useful.

Note - I'm only going to discuss the specifics of my installation and won't be going off onto tangents that may be required for differing configurations. This is for a couple of reasons; firstly to keep the entry as succinct as possible; secondly to avoid confusion for anyone trying to follow from start to finish. I expect that most people will be aware that they will need to change device names etc to match their specific circumstances.

The existing configuration
  • 3 physical drives
  • Windows XP installed on the first primary partition of the first hard drive
  • Acronis OS Selector installed on the MBR of the first hard drive. By default it invokes NTLDR from the first primary partition on the same drive, booting Windows XP by default.

Desired configuration
  • Use the free space in the third hard drive to install Fedora 8. Leave the existing OS selector in place so do not put grub in the MBR of the first drive.
  • I planned to use a separate /boot partition for the kernel and grub and a Logical Volume (LVM) for the root (/) filesystem.

The process....
  1. Boot the PC from the Fedora 8 DVD
  2. Configure the partitions as follows on the empty hard drive. This was done using the partition editor included in the Anaconda installer

    0-200MB - /boot ext3 filesystem
    201-2000MB - SWAP
    2001-20000MB - / ext3 filesystem
    (LVM device is /dev/VolGroup00/LogVol00)

  3. Install Fedora 8 with the desired packages. My install was approx 1200 packages and took 1.5 hours to complete.
  4. Now, due to the existing boot loader installed on the Windows drive, I chose not to install Grub during the initial installation. I now believe this was a mistake as it was a pain to figure out exactly what needed copying across to the boot partition in order to support Grub properly.

    I would advise installing Grub as part of the initial install, but making sure to choose to install it to the Linux /boot partition rather than the MBR of the first drive in the system
  5. Due to the issue in 4 above, I was unable to boot Linux by default....so....
  6. Reboot the machine with the installation/rescue CD in the drive.
  7. Select the option to rescue an existing installation. (I attempted to 'upgrade' an existing installation to copy the boot loader configuration but that failed).
  8. Follow the prompts to set up keyboard, nework and language settings.
  9. When the system is booted, it will detect the Linux installation and mount it under /mnt/sysimage. We need to access it as the root image soexecute the following command
    chroot /mnt/sysimage
  10. We now need to copy the Grub image files across to the boot partition
    mkdir /boot/grub
    cp /usr/share/grub/i386-redhat/*stage* /boot/grub

    This copies the boot loader files (stage1, stage2 and the various stage1.5 files) to the boot partition.
  11. Access the grub command line interface by executing the following command
    grub
  12. We need to determine the root location from where Grub will boot Linux. So (from within the Grub command line) we execute
    grub> find /grub/stage1
    NOTE - We do not specify /boot/grub/stage1 as we have a dedicated boot partition, so relative to the partition, the grub directory is in the root of the partition.

    Also note that the 'grub> ' is the Grub command line prompt not part of the command to be entered

    This will tell us the name (in Grub parlance) of the partition. In my case this was (hd2,0) which as expected is the first partition (0) of the third hard drive (hd2).
  13. Now we have confirmed this, we need to install the Grub bootloader into the partition. From the Grub command line exexcute
    grub> setup (hd2,0)
    This will install Grub into the boot sector of the partition
  14. We now need to create the Grub configuration file which is used by Grub to boot the various operating systems. Using a text editor create a file named grub.conf in /boot/grub/. Below is the content of my file
    default=0
    timeout=10
    splashimage=(hd2,0)/grub/splash.xpm.gz

    title Fedora Core 8 - (2.6.23.1-42.fc8)
    root (hd2,0)
    kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/VolGroup00/LogVol00 rhgb
    initrd /initrd-2.6.23.1-42.fc8.img

    NOTE - The vmlinuz and initrd entries are not prefixed by /boot. This is due to the fact that we have a dedicated /boot partition and these are relative to the root directory of that partition.

    Also note the device name for the root partition becuase we are using a logical volume for the root partition
  15. This should be all the configuration that is required to boot Linux from within Grub. However, it wasn't possible for me to successfully test this in isolation. If I attempted to run grub from within the rescue environment and boot Fedora from the new config file I received errors regarding inconsistent filesystem types (Grub error 16). I believe this may be due to the resuce environment not loading all necessary drivers (perhaps for logical volumes) but I haven't confirmed this.

    So, in order to test I had to configure Acronis OS Selector to chain into Grub.
  16. Reboot, without the Fedora installation DVD in the drive. Acronis OS Selector should boot as normal as it still exists in the MBR of the first drive.
  17. From Tools --> OS Selector add a new operating system by locating the partition containing Grub. Acronis OS Selector should detect the Linux boot loader if pointed at the correct partition.
  18. Choose to boot the Linux OS. Acronis will chain into Grub. You should be presented with the Grub menu with the boot options specified earlier (Fedora 8 only in this case).
  19. Choose to boot Fedora 8. It should boot successfully. The rhgb option we specified to the kernel parameters will use the graphical boot process for Fedora.

I hope that makes sense. I will add screenshots and tidy up the formatting shortly and answer any questions that people may have.

Monday, January 7, 2008

No sooner do you learn one new trick...

...then someone comes along and trumps it.

Chet Haase has blogged on the new animation features in the SceneGraph project being created at https://scenegraph.dev.java.net/. A new and improved version of the Timing Framework...and just as I thought I'd mastered the previous incarnation.

Well, they say you can't stop progress...

Here's the link to Chet's blog entry

Tuesday, December 4, 2007

Timing Framework (part 2) - Triggers

In the last blog, I showed a simple demonstration of how the Timing Framework can help reduce the amount of boilerplate code required to code animations. In this entry I'll show how to use triggers to reduce this even further.

In the last entry we used code like this to start an animation when a button was clicked.
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Animator anim = new Animator(2000, 5,
Animator.RepeatBehavior.REVERSE, new ButtonTimingTarget());
anim.setAcceleration(0.4f);
anim.setDeceleration(0.4f);
anim.start();
}
});
The Timing Framework provides triggers which extend the basic functionality of the framework. The framework provides a number of trigger classes which can trigger animations.

We can simplify the above code using an action trigger which corresponds to ActionEvents and so is perfect to use with a button. The trigger may be instantiated directly by client code but of more convenience is the static addTrigger method which also takes the object on which the trigger should operate.

For example, to add an action trigger to the button we'd do the following:
Animator anim = new Animator(2000, 5,
Animator.RepeatBehavior.REVERSE, new ButtonTimingTarget());
anim.setAcceleration(0.4f);
anim.setDeceleration(0.4f);

ActionTrigger.addTrigger(button, anim);
This may not seem like a huge reduction but it removes the boilerplate of the action listener implementation and removes the need for the anonymous inner class making the code arguably much more readable.

Currently the framework provides four trigger implementations:
  1. ActionTrigger - as shown above, may be used on any component that fires action events.
  2. FocusTrigger - may be used on components that fire focus events such as text fields
  3. MouseTrigger - may be used on components that fire mouse events (pretty much every component) such as when the mouse enters or leaves a component
  4. TimingTrigger - allows sequencing of different animations, for example starting an animation when another animation ends
The ActionTrigger is the simplest of the triggers and takes no special parameters. The more specialised triggers have a corresponding Event class (e.g. FocusTriggerEvent for the FocusTrigger or MouseTriggerEvent for the MouseTrigger) which specify the specific event(s) on which the trigger should operate. The key point is that the trigger class handles the setting of the listeners on the component to fire the animation at the appropriate time. All the developer needs to do is create the animation instance, set the trigger and let the framework ensure that the animation is fired appropriately.

Next time I'll take this a step further and use a property setter to simplify the code even more.