<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>aaron-kelley.net &#187; Software</title>
	<atom:link href="http://aaron-kelley.net/blog/category/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://aaron-kelley.net</link>
	<description>My little corner of the Internet</description>
	<lastBuildDate>Tue, 01 May 2012 19:11:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Plesk: run-parts: /etc/cron.daily/60sa-update exited with return code 1</title>
		<link>http://aaron-kelley.net/blog/2012/04/plesk-run-parts-etc-cron-daily-60sa-update-exited-with-return-code-1/</link>
		<comments>http://aaron-kelley.net/blog/2012/04/plesk-run-parts-etc-cron-daily-60sa-update-exited-with-return-code-1/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 14:41:45 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Parallels Plesk]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=1091</guid>
		<description><![CDATA[Getting a cron error like this from Parallels Plesk Panel? /etc/cron.daily/60sa-update: [: 9: 1: unexpected operator [: 14: 1: unexpected operator run-parts: /etc/cron.daily/60sa-update exited with return code 1 The solution: Open /etc/cron.daily/60sa-update in your favorite text editor and change the top line from &#8220;#!/bin/sh&#8221; to &#8220;#!/bin/bash&#8220;. Credit for this fix goes to this post at Mammuts [...]]]></description>
			<content:encoded><![CDATA[<p>Getting a cron error like this from Parallels Plesk Panel?</p>
<blockquote><p><tt>/etc/cron.daily/60sa-update:<br />
[: 9: 1: unexpected operator<br />
[: 14: 1: unexpected operator<br />
run-parts: /etc/cron.daily/60sa-update exited with return code 1</tt></p></blockquote>
<p>The solution:</p>
<p>Open <tt>/etc/cron.daily/60sa-update</tt> in your favorite text editor and change the top line from &#8220;<tt>#!/bin/sh</tt>&#8221; to &#8220;<tt>#!/bin/bash</tt>&#8220;.</p>
<p>Credit for this fix goes to <a href="http://www.mammuts.es/faq/index.php?action=artikel&amp;cat=5&amp;id=74" target="_blank">this post at Mammuts FAQ</a> (Spanish).</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2012/04/plesk-run-parts-etc-cron-daily-60sa-update-exited-with-return-code-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Upgrade from Ubuntu 11.10 &#8220;Oneiric&#8221; to Ubuntu 12.04 LTS &#8220;Precise&#8221; fails with error: &#8220;Couldn&#8217;t configure pre-depend libtinfo5 for libncurses5, probably a dependency cycle.&#8221;</title>
		<link>http://aaron-kelley.net/blog/2012/04/upgrade-from-ubuntu-11-10-oneiric-to-ubuntu-12-04-lts-precise-fails-with-error-couldnt-configure-pre-depend-libtinfo5-for-libncurses5-probably-a-dependency-cycle/</link>
		<comments>http://aaron-kelley.net/blog/2012/04/upgrade-from-ubuntu-11-10-oneiric-to-ubuntu-12-04-lts-precise-fails-with-error-couldnt-configure-pre-depend-libtinfo5-for-libncurses5-probably-a-dependency-cycle/#comments</comments>
		<pubDate>Thu, 26 Apr 2012 20:55:46 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=1085</guid>
		<description><![CDATA[&#8230;Of course, the error doesn&#8217;t come until after a few hours of downloading all of the new packages. Yet another Ubuntu upgrade bug not solved in time for release.  The details are in the bug report here.  I don&#8217;t understand how this bug has been known since February and not fixed in time for release. [...]]]></description>
			<content:encoded><![CDATA[<p>&#8230;Of course, the error doesn&#8217;t come until after a few hours of downloading all of the new packages.</p>
<p>Yet another Ubuntu upgrade bug not solved in time for release.  The details are in the bug report <a href="https://bugs.launchpad.net/ubuntu/+source/apt/+bug/924079" target="_blank">here</a>.  I don&#8217;t understand how this bug has been known since February and not fixed in time for release.</p>
<p>The workaround: Download and install the Ubuntu 12.04 versions of <tt><a href="http://packages.ubuntu.com/precise/libtinfo5" target="_blank">libtinfo5</a></tt>, <tt><a href="http://packages.ubuntu.com/precise/libncurses5" target="_blank">libncurses5</a></tt>, and <tt><a href="http://packages.ubuntu.com/precise/libncursesw5" target="_blank">libncursesw5</a></tt> (in that order).  You will have unresolved dependencies until you install all three, but you should be able to do them one by one with <tt>dpkg -i</tt>.  (Do not just double-click and use the graphical Ubuntu software manager; use <tt>dpkg -i</tt> from the terminal.) After they are installed, run the distribution upgrade like normal.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2012/04/upgrade-from-ubuntu-11-10-oneiric-to-ubuntu-12-04-lts-precise-fails-with-error-couldnt-configure-pre-depend-libtinfo5-for-libncurses5-probably-a-dependency-cycle/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Migrating an Ubuntu installation from BIOS to UEFI</title>
		<link>http://aaron-kelley.net/blog/2011/12/migrating-an-ubuntu-installation-from-bios-to-uefi/</link>
		<comments>http://aaron-kelley.net/blog/2011/12/migrating-an-ubuntu-installation-from-bios-to-uefi/#comments</comments>
		<pubDate>Fri, 23 Dec 2011 00:44:21 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[GPT]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[UEFI]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=1056</guid>
		<description><![CDATA[For this article, I am assuming that you are comfortable getting around Linux in general and Ubuntu in particular, and are familar with the ins and outs of disk partitioning. I will be describing the steps that I took to make this happen, but not going into too much detail for each individual step. See [...]]]></description>
			<content:encoded><![CDATA[<p>For this article, I am assuming that you are comfortable getting around Linux in general and Ubuntu in particular, and are familar with the ins and outs of disk partitioning. I will be describing the steps that I took to make this happen, but not going into too much detail for each individual step. See the bottom of this post for some useful links if you&#8217;d like to read up on the topic first. Note that it is very possible to lose your partitions when doing this sort of work so proceed carefully and do not blame me if something goes awry.</p>
<p><span id="more-1056"></span>As far as I know, you need the Linux 3.0 kernel or later to boot via UEFI, which means you&#8217;ll need to be using at least Ubuntu 11.10. All of the current 64-bit Ubuntu (11.10) ISO images seem to boot fine via UEFI, so I booted the desktop disc as a &#8220;live CD&#8221; for many of these operations.</p>
<p>If you have a standard Ubuntu installation, your disk has just two partitions: one for the file system and one for swap space. In my case, these were <tt>/dev/sda1</tt> (ext4) and <tt>/dev/sda5</tt> (swap). The disk itself is partitioned using the MBR method.</p>
<p>To switch to UEFI, you&#8217;ll have to convert the disk&#8217;s partition table from MBR to GPT. This can be done non-destructively using <tt><a href="http://www.rodsbooks.com/gdisk/" target="_blank">gdisk</a></tt>. You can install it from the &#8220;Universe&#8221; repository in Ubuntu (<a href="http://packages.ubuntu.com/oneiric/gdisk" target="_blank">here&#8217;s the package page</a>), if you&#8217;ve booted from the Ubuntu Lice CD, you&#8217;ll have to enable this repository. Once you launch <tt>gdisk</tt> from the terminal, you tell it which disk you&#8217;re interested in (<tt>/dev/sda</tt> in my case) and it will proceed with the conversion from MBR to GPT automatically &#8212; you&#8217;ll just need to tell it to write changes and quit. GPT actually stores two copies of the partition table on the disk, and <tt>gdisk</tt> will want to put one at the front and one at the end. For me, it complained that there was no room after the last partition on my disk to store the second partition table, so I had to open GParted and shrink my swap partition a little.</p>
<p>After the conversion to GPT, you&#8217;ll notice that there are some small gaps between your partitions. The reason for this is explained in more detail <a href="http://www.rodsbooks.com/gdisk/mbr2gpt.html" target="_blank">here</a>, but, you can use GParted to move and resize the partitions to your liking after the conversion is done.</p>
<p>Now, UEFI systems need a special boot partition to hold the UEFI boot loader for your OS, called the EFI system partition, or ESP. (It can actually hold several different boot loaders, making multi-booting considerably more simple than before.) Create a 20 MB FAT16 partition at the start of the disk, and use the GParted flag management to enable the &#8220;boot&#8221; flag. I don&#8217;t think that this new partition necessarily has to be the first one on the disk, but I&#8217;m just copying the partition structure that you get from installing Ubuntu on a UEFI system from scratch. Make sure you use the &#8220;MiB&#8221; alignment option when messing with the partitions to keep them aligned properly if you have an SSD, &#8220;advanced format&#8221; 4K-sector drive, or RAID setup.</p>
<p>After the conversion to GPT, I had two partitions on the disk: <tt>/dev/sda1</tt> (ext4) and <tt>/dev/sda2</tt> (swap). When I added the FAT16 partition at the front, it was labeled <tt>/dev/sda3</tt> even though it was the first partition on the disk.</p>
<p>Now, the conversion to GPT is done and the ESP has been set up. All that&#8217;s left is to reinstall grub so that it can boot your machine. First, install the <tt>grub-efi</tt> package. This will remove the <tt>grub-pc</tt> package, and allow us to install grub without having it freak out because your disk is not partitioned with MBR.</p>
<p>The following commands did it for me&#8230; you may have to adjust them if your partitions are labeled the same as mine.</p>
<blockquote><p><tt>sudo mount /dev/sda1 /mnt # Mount the root filesystem in /mnt<br />
sudo mkdir /mnt/boot/efi # Create a directory to mount the ESP in<br />
sudo mount /dev/sda3 /mnt/boot/efi # Mount the ESP<br />
sudo grub-install --root-directory=/mnt /dev/sda # Run the grub install</tt></p></blockquote>
<p>When you&#8217;re done, you should be able to check the ESP (in <tt>/mnt/boot/efi</tt>) to see that the boot loader has been placed there &#8212; <tt>EFI/ubuntu/grubx64.efi</tt>.</p>
<p>Then, reboot and it boots! Depending on your motherboard&#8217;s UEFI implementation, you may have to point it to the Ubuntu boot loader the first time (<tt>EFI/ubuntu/grubx64.efi</tt>). Also, the first time I booted after the conversion, some errors popped up on the screen but the system still came up properly. Subsequent boots did not have any errors, so I&#8217;m not quite sure what that was about.</p>
<p>Be sure to install the <tt>grub-efi</tt> package on your main system too, so that if an update comes along that requires updating grub, it works properly.  Also, I actually ended up deleting and re-creating the swap partition during this process, so its UUID changed.  You may want to check your <tt>/etc/fstab</tt> file and make sure the UUIDs still match up with your partitions.</p>
<p>Resources:</p>
<ul>
<li><a href="http://www.rodsbooks.com/gdisk/" target="_blank">http://www.rodsbooks.com/gdisk/</a> &#8212; the <tt>gdisk</tt> page has a lot of useful information about GPT/UEFI</li>
<li><a href="http://www.thinkwiki.org/wiki/UEFI_Firmware" target="_blank">http://www.thinkwiki.org/wiki/UEFI_Firmware</a> &#8212; a wiki page that describes the process of installing grub for booting via UEFI</li>
<li><a href="https://gitorious.org/tianocore_uefi_duet_builds/pages/Windows_x64_BIOS_to_UEFI" target="_blank">https://gitorious.org/tianocore_uefi_duet_builds/pages/Windows_x64_BIOS_to_UEFI</a> &#8212; a page which discusses a similar migration for a Windows system, which has some additional useful information</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2011/12/migrating-an-ubuntu-installation-from-bios-to-uefi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grub prompt after upgrade to Ubuntu 11.04</title>
		<link>http://aaron-kelley.net/blog/2011/04/grub-prompt-after-upgrade-to-ubuntu-11-04/</link>
		<comments>http://aaron-kelley.net/blog/2011/04/grub-prompt-after-upgrade-to-ubuntu-11-04/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 17:32:29 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=1013</guid>
		<description><![CDATA[I upgraded a couple of machines to Ubuntu 11.04, and after the reboot, they just booted up to a grub prompt.  Like this (except an older version of grub reported): My reading seems to indicate that this happens if you upgrade from Ubuntu 10.10 which itself had been upgraded from Ubuntu 10.04, and grub was [...]]]></description>
			<content:encoded><![CDATA[<p>I upgraded a couple of machines to Ubuntu 11.04, and after the reboot, they just booted up to a grub prompt.  Like this (except an older version of grub reported):</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-1018" title="grub" src="http://aaron-kelley.net/wp-content/uploads/2011/04/grub.png" alt="" width="640" height="480" /></p>
<p><span id="more-1013"></span>My reading seems to indicate that this happens if you upgrade from Ubuntu 10.10 which itself had been upgraded from Ubuntu 10.04, and grub was never reinstalled.</p>
<p>I think it is completely ridiculous that this bug made it all the way to the Ubuntu 11.04 final release &#8212; leaving the system unbootable after an upgrade is a disaster.</p>
<p>The easiest way to fix it is to boot from the Ubuntu 11.04 alternate install CD.  Choose the option to &#8220;Repair a broken system.&#8221;  Go through the prompts and choose which disk has your root file system.</p>
<p>After this, you may have the option to just reinstall grub &#8212; if so, do it, and reboot, and your system should be fine.</p>
<p>If that&#8217;s not an option, choose to start a recovery shell using your root filesystem and then run the commands</p>
<blockquote><p><tt>grub-install /dev/sda<br />
update-grub</tt></p></blockquote>
<p>(possibly adjusting for where your root disk is).  Then reboot and the machine should boot.</p>
<p>If it still doesn&#8217;t, go back to the recovery shell and see if your /boot directory is empty (aside from the &#8220;grub&#8221; directory).  This happened to me on a machine that was set up with LVM.  The /boot folder is actually stored on a different partition and you have to mount it before grub can set itself up right.  Here&#8217;s the commands&#8230;</p>
<blockquote><p><tt>rm -Rf /boot/*<br />
mount /dev/sda1 /boot<br />
grub-install /dev/sda<br />
update-grub</tt></p></blockquote>
<p>Of course, these may need to be adjusted depending on which disk needs grub and which partition contains /boot.  You can use the GUI partition editor on the Live CD to check.</p>
<p>Now, hopefully your machine can boot up.  What a mess.  :-\</p>
<p><strong>Update: May 12, 2011</strong></p>
<p>dzsi posts another way to recover from this situation in the comments below.  This method does not require booting from a CD.</p>
<p>Note that in the commands that follow, &#8220;X&#8221;, &#8220;Y&#8221;, and &#8220;Z&#8221; should be replaced with numbers/letters that represent your boot disk.</p>
<p>At the grub prompt, issue these commands:</p>
<blockquote><p><tt>set root=(hdX,Y)<br />
linux /vmlinuz root=/dev/sdZ ro<br />
initrd /initrd.img<br />
boot</tt></p></blockquote>
<p>Your machine should boot up.  Start a terminal and issue these commands:</p>
<blockquote><p><tt>sudo grub-install /dev/sdZ<br />
sudo update-grub</tt></p></blockquote>
<p>This should fix grub so that you do not have any boot trouble anymore</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2011/04/grub-prompt-after-upgrade-to-ubuntu-11-04/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>OpenSSL on Windows &#8212; Unable to load config info from c:/openssl0.9.8o/ssl/openssl.cnf</title>
		<link>http://aaron-kelley.net/blog/2011/04/openssl-on-windows-unable-to-load-config-info-from-copenssl0-9-8osslopenssl-cnf/</link>
		<comments>http://aaron-kelley.net/blog/2011/04/openssl-on-windows-unable-to-load-config-info-from-copenssl0-9-8osslopenssl-cnf/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 18:32:24 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[OpenSSL]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=1011</guid>
		<description><![CDATA[This is an error message that pops up when trying to do an operation using OpenSSL running on Windows.  It appears, best as I can gather, that the path to OpenSSL&#8217;s config file is hard-coded into the executable, and it won&#8217;t be able to find it if it is not in the expected place.  In [...]]]></description>
			<content:encoded><![CDATA[<p>This is an error message that pops up when trying to do an operation using OpenSSL running on Windows.  It appears, best as I can gather, that the path to OpenSSL&#8217;s config file is hard-coded into the executable, and it won&#8217;t be able to find it if it is not in the expected place.  In this case, I was using the copy of OpenSSL bundled with the Windows version of the Apache web server, but I imagine the error message may show up with other Windows distributions of OpenSSL as well.</p>
<p>The solution is to add an environment variable, <tt>OPENSSL_CONF</tt>, and set it to the complete path to an OpenSSL config file.  (In this case, again, it is located in Apache&#8217;s <tt>conf</tt> directory.)  Then, restart your command prompt instance and all should be good.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2011/04/openssl-on-windows-unable-to-load-config-info-from-copenssl0-9-8osslopenssl-cnf/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Physical interfaces disappearing from the VMware &#8220;Bridge&#8221; network interface after resume from hibernate or sleep</title>
		<link>http://aaron-kelley.net/blog/2011/01/physical-interfaces-disappearing-from-the-vmware-bridge-network-interface-after-resume-from-hibernate-or-sleep/</link>
		<comments>http://aaron-kelley.net/blog/2011/01/physical-interfaces-disappearing-from-the-vmware-bridge-network-interface-after-resume-from-hibernate-or-sleep/#comments</comments>
		<pubDate>Sat, 22 Jan 2011 22:22:11 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Workstation]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=952</guid>
		<description><![CDATA[I&#8217;ve been having an issue where my physical ethernet interface would disappear from the choices of interfaces to bridge to in VMware Workstation for Windows whenever I hibernate my machine.  This is a little annoying, as I have a VM that I would like attached to the physical network. The easy solution to this problem [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been having an issue where my physical ethernet interface would disappear from the choices of interfaces to bridge to in VMware Workstation for Windows whenever I hibernate my machine.  This is a little annoying, as I have a VM that I would like attached to the physical network.</p>
<p>The easy solution to this problem is to open up the virtual network editor and click on the &#8220;Restore Defaults&#8221; button.  This reinstalls the VMware network components and sets everything back up like it would be if your install was brand new.  However, it&#8217;s annoying to have to do this every time I power up the machine.</p>
<p>continuum over at the <a href="http://communities.vmware.com/thread/297952" target="_blank">VMware Communities message boards</a> pointed me towards the solution — restarting the hidden &#8220;<tt>vmnetbridge</tt>&#8221; service also does the trick.  However, again, it&#8217;s annoying to have to do this every time the machine is powered on.</p>
<p>I tried writing a batch file to restart the service and scheduling that to execute at power on but I couldn&#8217;t find an appropriate trigger to have the Windows task scheduler execute it.</p>
<p>So, I wrote a system service in C# that hangs out in the background and restarts the <tt>vmnetbridge</tt> service whenever the machine wakes up from hibernate or sleep.  This handles the problem brilliantly — no effort required after the service is installed, but the VMware &#8220;Bridge&#8221; interface keeps working as expected.  You can download it from its new project page, <a href="/projects/vmnetbridgefix/">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2011/01/physical-interfaces-disappearing-from-the-vmware-bridge-network-interface-after-resume-from-hibernate-or-sleep/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crappy Desktop Wallpaper Compression in Windows 7</title>
		<link>http://aaron-kelley.net/blog/2011/01/crappy-desktop-wallpaper-compression-in-windows-7/</link>
		<comments>http://aaron-kelley.net/blog/2011/01/crappy-desktop-wallpaper-compression-in-windows-7/#comments</comments>
		<pubDate>Wed, 19 Jan 2011 22:51:15 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Image Compression]]></category>
		<category><![CDATA[PNG]]></category>
		<category><![CDATA[Windows 7]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=939</guid>
		<description><![CDATA[This is a problem I noticed many months ago, but did not seriously look in to until just now. I like to use the monthly Mozilla Foxkeh desktop wallpaper.  Right now, I have the January 2011 wallpaper — this nice, large, lossless PNG.  (By the way, the word that he is in the progress of [...]]]></description>
			<content:encoded><![CDATA[<p>This is a problem I noticed many months ago, but did not seriously look in to until just now.</p>
<p>I like to use the monthly <a href="http://foxkeh.jp/downloads/wallpapers/" target="_blank">Mozilla Foxkeh desktop wallpaper</a>.  Right now, I have the January 2011 wallpaper — <a href="http://www.foxkeh.com/downloads/wallpapers/201101/1920x1200_cal_universal_sun.png" target="_blank">this nice, large, lossless PNG</a>.  (By the way, the word that he is in the progress of writing is &#8220;火狐&#8221;, which literally means &#8220;fire fox.&#8221;  How cool!)</p>
<p>Anyway, I noticed that there is crappy compression on the image shown on my desktop, particularly around the numbers that make of the calendar.  This has been occurring in the wallpapers for past months as well.  If I open up the PNG (that I told Windows to use!!) and zoom way in, the image is crystal clear.  But on the desktop, it is junk.  Take a look, I zoomed in on the &#8220;2011&#8243; at the top-left of the calendar.  On the left is the data from the PNG as viewed in any decent graphics application, and on the right is what appears on my desktop.</p>
<p style="text-align: center;"><img class="size-full wp-image-940 aligncenter" title="compression" src="http://aaron-kelley.net/wp-content/uploads/2011/01/compression.png" alt="" width="744" height="216" /></p>
<p>Yuck!</p>
<p><span id="more-939"></span>Now, with perhaps more typical wallpapers like photographs, maybe this wouldn&#8217;t be so noticeable.  But this is still dumb.  If I provide a lossless image, why can&#8217;t Windows use it directly, or at least convert it for use in a lossless manner?</p>
<p>I happen to know that in the registry, the path to your current wallpaper is located at <tt>HKCU\Control Panel\Desktop\Wallpaper</tt>.  Taking a look at the value stored there&#8230;</p>
<p style="text-align: center;"><img class="size-full wp-image-941 aligncenter" title="wallpaper" src="http://aaron-kelley.net/wp-content/uploads/2011/01/wallpaper.png" alt="" width="800" height="404" /></p>
<p>That&#8217;s right, it is pointing at <tt>TranscodedWallpaper.jpg</tt>, located in the depths of my user profile.  So, Windows took my PNG and converted it to JPEG to be used as my wallpaper.  Ugh.  Ugh ugh ugh.</p>
<p>Anyway, there&#8217;s a couple of ways around the problem.  First, you can open the PNG image in Internet Explorer or Firefox or Windows Live Photo Gallery (or perhaps any number of other applications), right-click on it, and select the option to use it as your desktop background.  It will be properly set, without the crappy compression occurring.  (I normally set it through the control panel you get by right-clicking your desktop and clicking &#8220;Personalize.&#8221;  I confirmed that going back there to set it restores the crappy JPEG compression.)</p>
<p>The other option would be to convert the image to BMP and set the path to it manually in the registry, at the value shown above.  Then, log out and log back in to have Windows notice that the wallpaper has changed.</p>
<p>Hopefully this will be addressed in the next major Windows release!  (Not addressed in the forthcoming Windows 7 Service Pack 1, sorry.)</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2011/01/crappy-desktop-wallpaper-compression-in-windows-7/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Have Ubuntu Server hand out &#8220;static&#8221; or &#8220;fixed&#8221; addresses via DHCP</title>
		<link>http://aaron-kelley.net/blog/2011/01/have-ubuntu-server-hand-out-static-or-fixed-addresses-via-dhcp/</link>
		<comments>http://aaron-kelley.net/blog/2011/01/have-ubuntu-server-hand-out-static-or-fixed-addresses-via-dhcp/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 21:28:34 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[DHCP]]></category>
		<category><![CDATA[Ubuntu Server]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=936</guid>
		<description><![CDATA[Nowadays, most local area networks have a DHCP server running on them. This is, of course, how hosts on the network are assigned their IP address and other stuff they need to know (router address, DNS servers, etc.). The DHCP server has a pool of addresses that it is allowed to hand out to clients, [...]]]></description>
			<content:encoded><![CDATA[<p>Nowadays, most local area networks have a DHCP server running on them.  This is, of course, how hosts on the network are assigned their IP address and other stuff they need to know (router address, DNS servers, etc.).</p>
<p>The DHCP server has a pool of addresses that it is allowed to hand out to clients, and it will often hand out these addresses sequentially.  In some cases, the address chosen for a particular client may be based on some sort of hash function on the client&#8217;s MAC address (so that the client will always be assigned the same address, unless there is a hash collision).</p>
<p>Of course, sometimes it&#8217;s nice to assign a particular device on your network a specific IP address (a &#8220;static&#8221; or &#8220;fixed&#8221; IP address).  This way, you will always know without any doubt what the IP address or your printer or file server or whatever is.  Of course, you can just set the address manually on the device, taking care to place it outside of the DHCP pool.</p>
<p><span id="more-936"></span>Another way to go about it is to reserve a specific IP address for your device on your DHCP server using the device&#8217;s physical (or &#8220;MAC&#8221;) address.  This is handy if you have many devices that you would like to assign fixed addresses to – if, for whatever reason, you ever want to change the IP address of something on your network, you just make the change on the DHCP server and you do not have to bother touching the device itself.  The change will take place the next time the device renews its DHCP lease.</p>
<p>Using the DHCP server included with Ubuntu Server, if you would like to assign a fixed address to a particular device, just add some lines like this to <tt>/etc/dhcp3/dhcpd.conf</tt>:</p>
<blockquote><p><tt>host aaron-vmware {<br />
&nbsp;&nbsp;&nbsp;&nbsp;hardware ethernet 00:0c:29:f8:47:3e;<br />
&nbsp;&nbsp;&nbsp;&nbsp;fixed-address 192.168.100.81;<br />
}</tt></p></blockquote>
<p>Restart the DHCP server configuration using <tt>sudo service dhcp3-server restart</tt> and you&#8217;re all set.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2011/01/have-ubuntu-server-hand-out-static-or-fixed-addresses-via-dhcp/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Cannot open file &#8220;C:\ProgramData\VMware\dndlogs\dndlog.conf&#8221;: The system cannot find the path specified.</title>
		<link>http://aaron-kelley.net/blog/2010/12/cannot-open-file-c-programdata-vmware-dndlogs-dndlog-conf-the-system-cannot-find-the-path-specified/</link>
		<comments>http://aaron-kelley.net/blog/2010/12/cannot-open-file-c-programdata-vmware-dndlogs-dndlog-conf-the-system-cannot-find-the-path-specified/#comments</comments>
		<pubDate>Wed, 29 Dec 2010 20:16:14 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[VMware]]></category>
		<category><![CDATA[VMware Workstation]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=927</guid>
		<description><![CDATA[In VMware Workstation, I&#8217;ve been getting this error for a while when I tried to start up a VM using the &#8220;Bridged&#8221; network interface. Cannot open file &#8220;C:\ProgramData\VMware\dndlogs\dndlog.conf&#8221;: The system cannot find the path specified. The network bridge on device VMnet0 is temporarily down because the bridged Ethernet interface is down.  The virtual machine may [...]]]></description>
			<content:encoded><![CDATA[<p>In VMware Workstation, I&#8217;ve been getting this error for a while when I tried to start up a VM using the &#8220;Bridged&#8221; network interface.</p>
<blockquote><p><strong>Cannot open file &#8220;C:\ProgramData\VMware\dndlogs\dndlog.conf&#8221;: The system cannot find the path specified.</strong></p>
<p>The network bridge on device VMnet0 is temporarily down because the bridged Ethernet interface is down.  The virtual machine may not be able to communicate with the host or with other machines on your network.</p></blockquote>
<p>Not too big a deal, usually using the NAT interface works just fine, but it does prevent other machines on the network from talking to the VM which is sometimes a handy feature to have.</p>
<p><span id="more-927"></span>The fix turned out to be simple.  Power down your VMs and open the &#8220;Virtual Network Editor&#8221; from the &#8220;Edit&#8221; menu and click the button to restore default settings.  Wait for a while for the network components to be reinstalled, and then start a VM with the bridged interface again.  Hopefully, it&#8217;s all fixed.</p>
<p style="text-align: center;"><a href="http://aaron-kelley.net/wp-content/uploads/2010/12/vne.png"><img class="alignnone size-full wp-image-928" title="vne" src="http://aaron-kelley.net/wp-content/uploads/2010/12/vne.png" alt="" width="634" height="540" /></a></p>
<p><strong>Update: December 30, 2010</strong></p>
<p>I had this problem happen again after I closed VMware and opened it again the next day.  The &#8220;Restore Default&#8221; button fixed it again, however, why did it come back in the first place?  Further reading indicates that disabling the Visual Studio debugging support should take care of the problem.  (Not sure why it is enabled by default if I did not even choose to install it when installing VMware.)  You can do this in the options for each individual VM, under &#8220;Replay.&#8221;</p>
<p style="text-align: center;"><a href="http://aaron-kelley.net/wp-content/uploads/2010/12/vm-debug.png"><img class="alignnone size-full wp-image-933" title="vm-debug" src="http://aaron-kelley.net/wp-content/uploads/2010/12/vm-debug.png" alt="" width="699" height="618" /></a></p>
<p>Another solution is to simply create an empty &#8220;dndlog.conf&#8221; file in the appropriate location.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/12/cannot-open-file-c-programdata-vmware-dndlogs-dndlog-conf-the-system-cannot-find-the-path-specified/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Lightbox 2.04 – close button on top</title>
		<link>http://aaron-kelley.net/blog/2010/11/lightbox-2-04-close-button-on-top/</link>
		<comments>http://aaron-kelley.net/blog/2010/11/lightbox-2-04-close-button-on-top/#comments</comments>
		<pubDate>Sat, 13 Nov 2010 13:08:54 +0000</pubDate>
		<dc:creator>Aaron</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://aaron-kelley.net/?p=905</guid>
		<description><![CDATA[Here&#8217;s something that I thought would be nice. Lightbox is a nifty little JavaScript/CSS package you can download that allows you to make nifty slideshows on a web page with little effort.  Pretty much, your page has thumbnail images that link to the larger images, with a specific rel attribute on the a tags that [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s something that I thought would be nice.</p>
<p><a href="http://www.lokeshdhakar.com/projects/lightbox2/" target="_blank">Lightbox</a> is a nifty little JavaScript/CSS package you can download that allows you to make nifty slideshows on a web page with little effort.  Pretty much, your page has thumbnail images that link to the larger images, with a specific <tt>rel</tt> attribute on the <tt>a</tt> tags that make the links, and Lightbox takes over to display the large image in a nifty Flash-free box when you click on a thumbnail.  If you have several images, it&#8217;ll make a nifty slide show for you.  You can read more and see it in action if you click the link at the start of this paragraph.</p>
<p>Well, the box with the image in it has a close button at the bottom.  What if I want to put it on the top instead?</p>
<p><span id="more-905"></span>Googling around, <a href="http://www.escapebeyond.net/lightbox/lightbox-close-button-top/" target="_blank">this</a> is the best I could come up with.  This page describes how to make changes to Lightbox 2.03 to move the close button to the top.  However, the current version of Lightbox is 2.04, and if you try to follow the same steps on the page, you&#8217;ll find that the line it says to change in the JavaScript file is nowhere to be found.  Yeah, you could just find a copy of Lightbox 2.03 to use, but there actually really are bugs in 2.03 that are fixed in 2.04 (for instance, 2.03 sometimes uses the wrong box/image size in Google Chrome and doesn&#8217;t notice when new images with links are added to the page via JavaScript, albeit on that second one there is actually a function you can call to get it to re-scan).</p>
<p>Anyway, yeah, we want to use 2.04.  Here&#8217;s how to do it.</p>
<p>First off, <tt>lightbox.css</tt>.  I added this line at the end of the file.</p>
<blockquote><p><tt>#outerImageContainer #bottomNav{ position: absolute; top: 0px; right: 0px; z-index: 200; padding:8px; background-color:#FFFFFF; font-size: 35px; }</tt></p></blockquote>
<p>That&#8217;s pretty much the same as the one mentioned in the page above, except for the <tt>font-size</tt>, which I added to keep the close button from moving slightly up and down when the size of the lightbox changes while switching between images.  Anyway, this pretty much just puts the close button at the top of the lightbox and puts it on top of everything else.</p>
<p>Now for <tt>lightbox.js</tt>, which is way different.  Find the code that actually builds the lightbox, which starts at line 134.  Replace it with this.</p>
<blockquote><p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objBody.appendChild(Builder.node('div',{id:'lightbox'},&nbsp;[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('div',{id:'outerImageContainer'},&nbsp;[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('div',{id:'imageContainer'},&nbsp;[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('img',{id:'lightboxImage'}),&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('div',{id:'hoverNav'},&nbsp;[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('a',{id:'prevLink',&nbsp;href:&nbsp;'#'&nbsp;}),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('a',{id:'nextLink',&nbsp;href:&nbsp;'#'&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('div',{id:'loading'},&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('a',{id:'loadingLink',&nbsp;href:&nbsp;'#'&nbsp;},&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('img',&nbsp;{src:&nbsp;LightboxOptions.fileLoadingImage})<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('div',{id:'bottomNav'},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('a',{id:'bottomNavClose',&nbsp;href:&nbsp;'#'&nbsp;},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('img',&nbsp;{&nbsp;src:&nbsp;LightboxOptions.fileBottomNavCloseImage&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('div',&nbsp;{id:'imageDataContainer'},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('div',{id:'imageData'},<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('div',{id:'imageDetails'},&nbsp;[<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('span',{id:'caption'}),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Builder.node('span',{id:'numberDisplay'})<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]));<br />
</tt></p></blockquote>
<p>This is pretty much the same as the code that was already there, except I moved the <tt>bottomNav</tt> node from the <tt>imageDataContainer</tt> up to the <tt>outerImageContainer</tt>.  This, plus the style change above, moves the close box from the bottom-right to the top-right of the lightbox container.  See for yourself:</p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-906" title="lightbox-bottom" src="http://aaron-kelley.net/wp-content/uploads/2010/11/lightbox-bottom.png" alt="" width="470" height="390" /></p>
<p style="text-align: center;"><img class="alignnone size-full wp-image-907" title="lightbox-top" src="http://aaron-kelley.net/wp-content/uploads/2010/11/lightbox-top.png" alt="" width="470" height="358" /></p>
<p>Anyway, that&#8217;s it, you&#8217;re done.  Now, I&#8217;m going to propose one more fix, if you&#8217;re interested in captions to go along with your slide show.  If you have an image with a caption followed by an image without a caption, Lightbox will not remove the caption when you advance from one image to the next, because it only updates the caption if it is <em>not blank</em>.  See the if statement at line 330 in <tt>lightbox.js</tt>:</p>
<blockquote><p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(this.imageArray[this.activeImage][1]&nbsp;!=&nbsp;""){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.caption.update(this.imageArray[this.activeImage][1]).show();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</tt></p></blockquote>
<p>Add this code right after it to make sure the caption goes away when it should:</p>
<blockquote><p><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.caption.update("").show();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</tt></p></blockquote>
<p>And that&#8217;s all.  If you&#8217;d like, I&#8217;ve uploaded <a href="/wp-content/uploads/2010/11/lightbox2.04.zip">here</a> a copy of Lightbox 2.04 with the modifications mentioned in this post.</p>
]]></content:encoded>
			<wfw:commentRss>http://aaron-kelley.net/blog/2010/11/lightbox-2-04-close-button-on-top/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
	</channel>
</rss>

